Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   No funciona la consulta de la fecha (https://www.clubdelphi.com/foros/showthread.php?t=93949)

river_1 22-05-2019 07:01:51

No funciona la consulta de la fecha
 
Buenas a todos, aqui con un problema con respecto a una query donde involucra un campo fecha.
Les explico:
Estoy ejecutando un query donde deseo traerme las facturas vencidas a cierto dia de corte, este dia esta en un DatetimeEdit.
El codigo para traer las facturas vencidas por ejemplo al dia de hoy 21 de Mayo si funciona aqui esta como lo tengo:

Código Delphi [-]
 consulta:='SELECT  admDocumentos.CIDDOCUMENTODE, admDocumentos.CSERIEDOCUMENTO,admDocumentos.CFOLIO, admDocumentos.CFECHA, admDocumentos.CRAZONSOCIAL, admDocumentos.CFECHAVENCIMIENTO, admDocumentos.CIDMONEDA, admDocumentos.CCANCELADO,'+
            ' admDocumentos.CTOTAL, admDocumentos.CPENDIENTE, admDocumentos.CIDCONCEPTODOCUMENTO,admDocumentos.CIDDOCUMENTOORIGEN,admDocumentos.CIDDOCUMENTO';
 consulta:=consulta+' FROM admDocumentos';
 Consulta:=Consulta +' WHERE     (admDocumentos.CIDCONCEPTODOCUMENTO = 21)';
 Consulta:=Consulta +' AND (';
 Consulta:=Consulta +' CCANCELADO=0';
 consulta:=consulta+')';
 Consulta:=Consulta +' and (CFECHAVENCIMIENTO>=';
 consulta:=consulta + FormatDateTime('YYYY-MM-DD',FechaIni.Date);
 consulta:=consulta+')';
 Consulta:=Consulta +' AND (';
 Consulta:=Consulta +' CPENDIENTE<>0';
 consulta:=consulta+')';
 Consulta:=Consulta +' AND (';
 Consulta:=Consulta +' admDocumentos.CIDMONEDA=1';
 consulta:=consulta+')';
todo muy bien ya que me trae todas las facturas vencidas hasta el dia de hoy. Por ejemplo tengo una factura que se vencio el 02-Mayo-19 y la trae.

Pero alli mismo deseo traerme las facturas que no se han vencido , es decir, la contraparte del codigo de arriba.
Por ejemplo tengo una factura que se vence el 25 de Mayo y no la trae se la brinca la consulta, va el codigo.
Código Delphi [-]
 consulta:='SELECT  admDocumentos.CIDDOCUMENTODE, admDocumentos.CSERIEDOCUMENTO,admDocumentos.CFOLIO, admDocumentos.CFECHA, admDocumentos.CRAZONSOCIAL, admDocumentos.CFECHAVENCIMIENTO, admDocumentos.CIDMONEDA, admDocumentos.CCANCELADO,'+
            ' admDocumentos.CTOTAL, admDocumentos.CPENDIENTE, admDocumentos.CIDCONCEPTODOCUMENTO,admDocumentos.CIDDOCUMENTOORIGEN,admDocumentos.CIDDOCUMENTO';
 consulta:=consulta+' FROM admDocumentos';
 Consulta:=Consulta +' WHERE     (admDocumentos.CIDCONCEPTODOCUMENTO = 21)';
 Consulta:=Consulta +' AND (';
 Consulta:=Consulta +' CCANCELADO=0';
 consulta:=consulta+')';
 Consulta:=Consulta +' and (admDocumentos.CFECHAVENCIMIENTO<';
 consulta:=consulta + FormatDateTime('YYYY-MM-DD',FechaIni.Date);
 consulta:=consulta+')';
 Consulta:=Consulta +' AND (';
 Consulta:=Consulta +' CPENDIENTE<>0';
 consulta:=consulta+')';
 Consulta:=Consulta +' AND (';
 Consulta:=Consulta +' admDocumentos.CIDMONEDA=1';
 consulta:=consulta+')';
El truco esta en el campo CFECHAVENCIMIENTO donde si arriba me funciona para las vencidas pues entonces invierto el sigo de "<".
Pero no funciona.
Alguna recomendacion??
Delphi 7 y BD SQL.
Gracias.

Casimiro Notevi 22-05-2019 09:32:22

¿De qué tipo es el campo en la tabla de la base de datos?

Angel.Matilla 22-05-2019 09:38:16

No uso Deplhi, pero es muy similar a Builder. ¿Por qué no usas parámetros en el query? Creo que sería más fácil y no tendrías que hacer conversiones sobre la marcha. En Builder yo construiría así el query:
Código SQL [-]
Query1->Close();
Query1->SQL->Text = "SELECT admDocumentos.CIDDOCUMENTODE, admDocumentos.CSERIEDOCUMENTO, admDocumentos.CFOLIO, admDocumentos.CFECHA,";
Query1->SQL->Add("admDocumentos.CRAZONSOCIAL, admDocumentos.CFECHAVENCIMIENTO, admDocumentos.CIDMONEDA, admDocumentos.CCANCELADO, admDocumentos.CTOTAL,");
Query1->SQL->Add("admDocumentos.CPENDIENTE, admDocumentos.CIDCONCEPTODOCUMENTO, admDocumentos.CIDDOCUMENTOORIGEN, admDocumentos.CIDDOCUMENTO");
Query1->SQL->Add("FROM admDocumentos");
Query1->SQL->Add("WHERE admDocumentos.CIDCONCEPTODOCUMENTO = 21");
Query1->SQL->Add("AND CCANCELADO = 0");
Query1->SQL->Add("AND admDocumentos.CFECHAVENCIMIENTO < :Fecha");
Query1->SQL->Add("AND CPENDIENTE <> 0");
Query1->SQL->Add("AND admDocumentos.CIDMONEDA = 1");
Query1->ParamByName("Fecha")->AsDateTime = FechaIni;
Query1->Open();
Imagino que la forma de hacerlo en Delphi será similar.

ecfisa 22-05-2019 20:06:01

Hola.

Como te indican usar parámetros, mas alla de la seguridad, simplifica la situación. Podrías hacerte una función que indique si deseas o no traer las factura vencidas, por ejemplo:
Código Delphi [-]
// Por defecto filtra la consulta por NO vencidas. "Vencidas" es False si se omite
procedure MakeQuery(Qy: TADOQuery; FechVenc: string; const Vencidas: Boolean = False);
begin
  Qy.Close;
  Qy.SQL.Clear;
  Qy.SQL.Add('SELECT ADM.CIDDOCUMENTODE, ADM.CSERIEDOCUMENTO,');
  Qy.SQL.Add('ADM.CFOLIO, ADM.CFECHA, ADM.CRAZONSOCIAL, ADM.CFECHAVENCIMIENTO,');
  Qy.SQL.Add('ADM.CIDMONEDA, ADM.CCANCELADO, ADM.CTOTAL, ADM.CPENDIENTE,');
  Qy.SQL.Add('ADM.CIDCONCEPTODOCUMENTO, ADM.CIDDOCUMENTOORIGEN, ADM.CIDDOCUMENTO');
  Qy.SQL.Add('FROM ADMDOCUMENTOS ADM');
  Qy.SQL.Add('WHERE (ADM.CIDCONCEPTODOCUMENTO = 21) AND (CCANCELADO = 0)');
  Qy.SQL.Add('AND (CPENDIENTE <> 0) AND (ADM.CIDMONEDA = 1)');
  if Vencidas then
    Qy.SQL.Add('AND (CFECHAVENCIMIENTO < :FVENC)')
  else
    Qy.SQL.Add('AND (CFECHAVENCIMIENTO >= :FVENC)');
  Qy.Parameters.ParamByName('FVENC').Value := FechVenc;
  Qy.Open;
end;

// Ejemplo del uso
procedure TForm1.Button1Click(Sender: TObject);
begin
  MakeQuery(ADOQuery1, DateToStr(DateTimePicker1.Date), CheckBox1.Checked);
end;
Aunque no especificaste que gestor de base de datos y componentes usas, fijándome en tus mensajes anteriores y ví que usaste ADO alguna vez.

Saludos :)


La franja horaria es GMT +2. Ahora son las 04:28:07.

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