Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problemas con las Fechas en SQL (https://www.clubdelphi.com/foros/showthread.php?t=57794)

Emilio_82 27-06-2008 15:51:42

Problemas con las Fechas en SQL
 
Hola, tengo el siguiente problema no se si les ha pasado:

primero les pongo la siguiente situacion

Tengo una tabla Pedidos.DB que tiene los campos Fecha_Alta y Fecha_Cancel del tipo DATE y son PARADOX 7.

Tengo la tabla y una Query en un Datamodule.

La Query no carga ninguna SQL sino que lo hago x codigo con el add
y lo tengo en un procedure.

Código:

procedure EjecutaSQL(var NroProv, Estd, FAltaA, FAltaB, FCancelA, FCancelB: String);
Begin
  with ModuloDB.Q_Pedidos do begin
  Close;

    with SQL do
    Begin
      clear;
      add('SELECT *  FROM Pedidos A');
      add('LEFT JOIN Proveedores B ON A.Nro_Proveed=B.Nro_Proveed');
      add('WHERE A.Nro_Pedido > 0');

      if (FAltaA<>'') AND (FAltaB<>'') then
      add('AND Fecha_Alta BETWEEN '+QuotedStr(FAltaA)+' AND '+QuotedStr(FAltaB));

      if (FCancelA<>'') AND (FCancelB<>'') then
      add('AND Fecha_Cancel BETWEEN '+QuotedStr(FCancelA)+' AND '+QuotedStr(FCancelB));
    end;

  RequestLive:= true;
  Open;
  end;
End;

Ahora bien desde otro procedure propio del form con un DateTimePicker le permito elegir las FAltaA y FAltaB por ejemplo:

Código:

procedure TForm_Buscar_Pedidos.Btn_BuscarClick(Sender: TObject);
var
NroProv, Estd, FAltaA, FAltaB, FCancelA, FCancelB: String;
begin
FAltaA:='';
FAltaB:='';
FCancelA:='';
FCancelB:='';
NroProv:='';
Estd:='';

//Comienza a comprobar los tipos de busqueda mediante los CheckBox
  if CBox_FAlta.Checked = true then
  begin
    FAltaA:=DateToStr(DTP_Fecha_AltaA.Date);
    FAltaB:=DateToStr(DTP_Fecha_AltaB.Date);
  end;

  if CBox_FCancel.Checked = true then
  begin
    FCancelA:=DateToStr(DTP_Fecha_CancelA.Date);
    FCancelB:=DateToStr(DTP_Fecha_CancelA.Date);
  end;

EjecutaSQL(NroProv, Estd, FAltaA, FAltaB, FCancelA, FCancelB);

end;

Ni se fijen en Estd ni en NroProv xq esos andan solo puse el codigo que genera el problema.

EL PROBLEMA ES EL SIGUIENTE esto me tira un error que me dice algo asi:
Cita:

Project xxxxxx.exe raised exception class EDBEngineError with message 'Type Mismatch in expression.'. Process Stoped. Use Step or Run to Continue.
El caso es que antes de llamar a EjecutaSQL las Fechas del DateTimePicker
estan convertidas a String con el DateToStr.

Asi que no entiendo xq no anda.

Si alguien sabe que puede pasar y como solucionarlo me avisa.

Desde Ya. Muchas Gracias.

ContraVeneno 27-06-2008 16:34:59

puede que el problema esté en el formato de las fechas. Lo mejor sería utilizar parámetros, con eso te evitas el preocuparte por el formato.

Yo cambiaría las siguientes líneas:

Código Delphi [-]
procedure EjecutaSQL(var NroProv, Estd: String; FAltaA, FAltaB, FCancelA, FCancelB: DateTime);
...
       add('AND Fecha_Cancel BETWEEN :FechaA AND :FechaB');
...
 ParamByName('FechaA').AsDateTime := FechaA;
 ParamByName('FechaA').AsDateTime := FechaB;
 // o si usas ADO
 Parameters.ParamByname('FechaA').Value := FechaA;
..
end;...


.....
procedure TForm_Buscar_Pedidos.Btn_BuscarClick(Sender: TObject);
var
NroProv, Estd: String;
FAltaA, FAltaB, FCancelA, FCancelB: DateTime;
.....
    FAltaA:=DTP_Fecha_AltaA.Date;
    FAltaB:=DTP_Fecha_AltaB.Date;
.....

Lo mismo para las "cancel"....

Emilio_82 01-07-2008 00:08:46

Gracias
 
Gracias funciona barbaro.


La franja horaria es GMT +2. Ahora son las 21:14:19.

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