Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas con una consulta en un FDQuery (https://www.clubdelphi.com/foros/showthread.php?t=95496)

jahir1403 16-12-2021 17:14:25

Problemas con una consulta en un FDQuery
 
Buen día a todos...

Soy nuevo en el foto y estuve revisando las diferentes secciones y no se si aquí sea la correcto para postear mi duda, en caso de que no lo sea, una disculpa.

Mi duda es la siguiente, tengo mi componente FDQuery, en la cual tengo una consulta la que anteriormente elabore dentro de mi SQL Server y corre de manera correcta, la paso a mi FDQuery y de igual forma la ejecuta de manera correcta, pero cambie los valores que había puesto por default por un parámetro, ya que mi idea es pasarle una cadena string a un parámetro al FDQuery, cuando hago eso ya no me devulve nada de la consulta. Pondré los ejemplos de la consulta en mi FDQuery (con el parámetro) y mi código donde paso mi cadena string al parámetro del FDQuery.

--------------------------- Consulta FDQuery -------------------------------------------------------------------------
Código SQL [-]
select ISNULL(sp.sol_polizaID,'-') as POLIZA, ISNULL(sc.sco_solicitud,'-') as SOLICITUD, cc.cfd_comprobacion as COMPROBACION, cp.cfd_fechaEmision as FECHA_EMISION, 
cp.cfd_emisor as A_NOMBRE_DE, cp.cfd_uuid as UUID_INGRESO, cp.cfd_tipoDeComprobante as TIPO_DE_COMPROBANTE, cp.cfd_total as MONTO,
ISNULL (cp.cfd_importePagado, 0) as IMPORTE_PAGADO,
ISNULL(cp.cfd_saldoInsoluto, cp.cfd_total) as SALDO_PENDIENTE, ISNULL(sp.sol_folioContabilizacion,'-') as ENLACE_COI, mpr.emp_descripcion as EMPRESA, 
dp.dep_descripcion as DEPARTAMENTO, emp.emp_codigo as CLAVE_USUARIO, 
CONCAT (emp.emp_nombre,' ',emp.emp_appaterno,' ', emp.emp_apmaterno) as USUARIO, st.sta_descripcion as ESTATUS, cp.cfd_uuid_pago as UUID_PAGO,
'-' as FECHA_LIMITE
from cfd_pagos cp
join comprobacion_cfd cc
on cp.cfd_uuid = cc.cfd_uuid
left join solicitud_comprobacion sc
on cc.cfd_comprobacion = sc.sco_comprobacion
join comprobacion_gasto cg
on cc.cfd_comprobacion = cg.com_id
join departamentos dp
on cg.com_depto_id = dp.dep_codigo
join usuarios us
on cg.com_usuario = us.usr_codigo
join empleados emp
on us.usr_empleado = emp.emp_codigo
join empresas mpr
on cg.com_emp_id = mpr.emp_id
join r_status st
on cp.cfd_estatus = st.sta_id
left join solicitud_pago sp
on sc.sco_solicitud = sp.sol_id
where cp.cfd_metodoPago = 'PPD' and cc.cfd_estado = 1 and 
cp.cfd_uuid in (:cadena_parametro)
union all
select '-' as poliza, '-' as solicitud, '-' as comprobacion, cfd_fechaEmision, cfd_emisor, 
cfd_uuid, cfd_tipoDeComprobante, 0 as total, cfd_importePagado as ImportePagado, cfd_saldoInsoluto as saldoInsoluto, '-' as enlaceCOI,
'-' as empresa, '-' as departamento, '-' as clave_usuario, '-' as usuario, sta_descripcion, 
cfd_uuid_pago, '-' as fechaLimite
from cfd_pagos
join r_status
on cfd_estatus = sta_id
where cfd_uuid_pago in (:cadena_parametro) and cfd_tipoDeComprobante = 'P'
order by cfd_uuid_pago

----------------- Codigo donde paso el parametro al FDQuery --------------------------------------

Código Delphi [-]
procedure TFConsultAdminPagos.btnRefrescarClick(Sender: TObject);
  var
  selection, arr_cfd_uuid : String;
  begin
    MClient.FDMCFDPagosXPPD.First;
    while not MClient.FDMCFDPagosXPPD.Eof do
    begin
      if MClient.FDMCFDPagosXPPDcheck_sta.AsInteger =  MOD_ACTIVO then
      begin

        if arr_cfd_uuid <> '' then
          arr_cfd_uuid := arr_cfd_uuid + ', ';

          arr_cfd_uuid := arr_cfd_uuid + QuotedStr(MClient.FDMCFDPagosXPPDcfd_uuid.AsString);

          selection := 'SI';
      end
      else
      begin
        if selection <> 'SI' then
        begin
          selection := 'NO';
        end;
      end;
        MClient.FDMCFDPagosXPPD.Next;
    end;

    if selection = 'NO' then
    begin
      msgbox('INFORMACIÓN','No se puede crear el documento debido a que no hay ningún registro seleccionado.',mtInformation,['OK'])
    end
    else
    begin
      FDQConsultaExportAdminPagos.Close;
      FDQConsultaExportAdminPagos.ParamByName('cadena_parametro').AsString := arr_cfd_uuid;
      FDQConsultaExportAdminPagos.Open();
      FDQConsultaExportAdminPagos.Active := true;
     // DataM.HojaExcel('Consulta Generica',DSExportAdminPagos,DBGExportarAdminPagos);
      msgbox('INFORMACIÓN','Se realizó la exportación de los registros.',mtInformation,['OK']);
    end;
  end;

----------------
el valor que contendría la variable arr_cfd_uuid := '''0D53DAD8-532B'', ''2519088A-ED56-4957'', ''9bc8dfcc-8bfb-4608'''

De antemano agradezco su apoyo y espero haber sido claro en mi explicación.
Saludos.

Casimiro Notevi 16-12-2021 17:24:59

¿Se supone que debes usar = y no in?
Código SQL [-]
where cfd_uuid_pago in (:cadena_parametro) and cfd_tipoDeComprobante = 'P'
where cfd_uuid_pago = (:cadena_parametro) and cfd_tipoDeComprobante = 'P'

jahir1403 16-12-2021 17:40:49

Lo que pasa es que en mi consulta en SQL Server es igual que la que tengo en mi FDQuery donde pongo
where cfd_uuid_pago in ('0D53DAD8-532B', '2519088A-ED56-4957', '9bc8dfcc-8bfb-4608') and cfd_tipoDeComprobante = 'P' y funciona, me retorna los registros que quiero, lo replique en el fdquery donde en vez de pasarle los valores por consulta, se los paso por el parametro, por eso conservo el in. Aclaro, no se si sea la manera correcta o la pregunta sería ¿Cómo puedo pasar una cadena de string a un parametro de un FDQuery.

El valor de ejemplo es este: arr_cfd_uuid := '0D53DAD8-532B', '2519088A-ED56-4957', '9bc8dfcc-8bfb-4608', puede traer más valores como puede traer menos, pero esa es mi duda ¿Cómo puedo pasar una cadena como parametro y que el FDQuery me lo ejecute como lo hace el SQL Server?

Casimiro Notevi 16-12-2021 18:05:00

No lo había entendido, o sea que pueden ir varios valores, por eso usas "in" (valor1, valor2, valor3...)
¿Puede ser el problema las mayúsculas/minúsculas?

aposi 16-12-2021 18:51:53

Hola,
Has comprovado que el valor de la variable arr_cfd_uuid este bien?
'VALOR1','VALOR2','VALOR3'

Y antes del while inicializa la variable arr_cfd_uuid := '';

jahir1403 16-12-2021 20:22:37

Gracias a todos por sus comentarios, ya lo pude resolver, les comparto la solución por si a alguien más le llegase a pasar.


-------------- Consulta SQL --------------------------

Código SQL [-]
declare @arr_cfd_uuid varchar(max)= :arr_cfd_uuid

select ISNULL(sp.sol_polizaID,'-') as POLIZA, ISNULL(sc.sco_solicitud,'-') as SOLICITUD, cc.cfd_comprobacion as COMPROBACION, cp.cfd_fechaEmision as FECHA_EMISION, 
cp.cfd_emisor as A_NOMBRE_DE, cp.cfd_uuid as UUID_INGRESO, cp.cfd_tipoDeComprobante as TIPO_DE_COMPROBANTE, cp.cfd_total as MONTO,
ISNULL (cp.cfd_importePagado, 0) as IMPORTE_PAGADO,
ISNULL(cp.cfd_saldoInsoluto, cp.cfd_total) as SALDO_PENDIENTE, ISNULL(sp.sol_folioContabilizacion,'-') as ENLACE_COI, mpr.emp_descripcion as EMPRESA, 
dp.dep_descripcion as DEPARTAMENTO, emp.emp_codigo as CLAVE_USUARIO, 
CONCAT (emp.emp_nombre,' ',emp.emp_appaterno,' ', emp.emp_apmaterno) as USUARIO, st.sta_descripcion as ESTATUS, cp.cfd_uuid_pago as UUID_PAGO,
'-' as FECHA_LIMITE
from cfd_pagos cp
join comprobacion_cfd cc
on cp.cfd_uuid = cc.cfd_uuid
left join solicitud_comprobacion sc
on cc.cfd_comprobacion = sc.sco_comprobacion
join comprobacion_gasto cg
on cc.cfd_comprobacion = cg.com_id
join departamentos dp
on cg.com_depto_id = dp.dep_codigo
join usuarios us
on cg.com_usuario = us.usr_codigo
join empleados emp
on us.usr_empleado = emp.emp_codigo
join empresas mpr
on cg.com_emp_id = mpr.emp_id
join r_status st
on cp.cfd_estatus = st.sta_id
left join solicitud_pago sp
on sc.sco_solicitud = sp.sol_id
where cp.cfd_metodoPago = 'PPD' and cc.cfd_estado = 1 and 
cp.cfd_uuid in (select convert(varchar(50), value) from string_split(@arr_cfd_uuid, ',') )
union all
select '-' as poliza, '-' as solicitud, '-' as comprobacion, cfd_fechaEmision, cfd_emisor, 
cfd_uuid, cfd_tipoDeComprobante, 0 as total, cfd_importePagado as ImportePagado, cfd_saldoInsoluto as saldoInsoluto, '-' as enlaceCOI,
'-' as empresa, '-' as departamento, '-' as clave_usuario, '-' as usuario, sta_descripcion, 
cfd_uuid_pago, '-' as fechaLimite
from cfd_pagos
join r_status
on cfd_estatus = sta_id
where cfd_uuid_pago in (select convert(varchar(50), value) from string_split(@arr_cfd_uuid, ',') ) and cfd_tipoDeComprobante = 'P'
order by cfd_uuid_pago

--------------------- Código Delphi ------------------------

Código Delphi [-]
procedure TFConsultAdminPagos.btnRefrescarClick(Sender: TObject);
  var
  selection, arr_cfd_uuid : String;
  begin
    MClient.FDMCFDPagosXPPD.First;
    while not MClient.FDMCFDPagosXPPD.Eof do
    begin
      if MClient.FDMCFDPagosXPPDcheck_sta.AsInteger =  MOD_ACTIVO then
      begin
        if arr_cfd_uuid = '' then
        begin
          arr_cfd_uuid := MClient.FDMCFDPagosXPPDcfd_uuid.AsString;
        end
        else
        begin
           arr_cfd_uuid := arr_cfd_uuid + ',' + MClient.FDMCFDPagosXPPDcfd_uuid.AsString;
        end;
        selection := 'SI';
      end
      else
      begin
        if selection <> 'SI' then
        begin
          selection := 'NO';
        end;
      end;
        MClient.FDMCFDPagosXPPD.Next;
    end;

    if selection = 'NO' then
    begin
      msgbox('INFORMACIÓN','No se puede crear el documento debido a que no hay ningún registro seleccionado.',mtInformation,['OK'])
    end
    else
    begin
      FDQConsultaExportAdminPagos.Close;
      FDQConsultaExportAdminPagos.ParamByName('arr_cfd_uuid').AsString := arr_cfd_uuid;
      FDQConsultaExportAdminPagos.Open();
      //FDQConsultaExportAdminPagos.Active := true;
     // DataM.HojaExcel('Consulta Generica',DSExportAdminPagos,DBGExportarAdminPagos);
      msgbox('INFORMACIÓN','Se realizó la exportación de los registros.',mtInformation,['OK']);
    end;
  end;

Espero que si alguien tiene el mismo problema, esto le pueda ayudar.
Saludos y muchas gracias a todos por sus respuestas.


La franja horaria es GMT +2. Ahora son las 22:12:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi