Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Consulta entre 2 fechas. (https://www.clubdelphi.com/foros/showthread.php?t=70442)

DeLiRioS 21-10-2010 00:28:39

Consulta entre 2 fechas.
 
Buenas, disculpen amigos se que este tema ya se ha tratado antes y lo he intentado de muchas maneras de las expuestas aki en el clubdelphi y nose cual es el problema. Necesito hacer una consulta entre dos fechas que ingreso mediante dos DateTimePicker utilizo Delphi 7 y MySql. Utilizo los componente, TTable,Tquery, TdataSource. Y si sirve de dato, el campo FechaIngreso es de tipo TimeStamp (YYMMDDHHMMSS). El codigo sql es el siguiente:

Código Delphi [-]
begin
     If Active Then Close;
        SQL.Clear;
        SQL.Add('Select Empleado, Departamento');
        SQL.Add('From Empleados');
        SQL.Add('Where FechaIngreso Between'+DateToStr(FechaIni.Date)+'And'+DateToStr(FechaFin.Date));
        Open;
end;
Pero resulta que el error que me arroja es el siguiente:
Check the manual that correponds to your MySQL server version for the right syntax to user near 'Between01/09/2010And1(

esa fecha que aparece ahi es la fecha de incio que ingreso.
Desde ya gracias.

rgstuamigo 21-10-2010 00:52:41

Bueno segun veo, tu código tiene dos errores principales, el primero es que no has dejado un espacio despues de la clausula 'Between' y tambien debe haber un espacio antes y despues de el "And";).
El segundo error es que MySQL guarda las fechas en éste formato > YYYY-MM-D , es decir : Año-Mes-Día , lo que significa que al utilizar la funcion DateToStr no le estas mandando el formato adecuado para la consulta.;)
Solucion: Para estos menesteres es bueno hacer uso de lo que se llama Parámetros que son una especie de variables alas que se les puede asignar valores y utilizarlas en la consulta SQL, mas o menos de éste forma:
Código Delphi [-]
  begin
    If Active Then Close;
        SQL.Clear;
        SQL.Add('Select Empleado, Departamento');
        SQL.Add('From Empleados');
        SQL.Add('Where FechaIngreso Between :F1 And :F2');{ Al poner los Dos puntos ( : ) Delphi crea 
                                                                                 los parámetros F1 y F2 Automáticamente}
        ParamByName('F1').AsDate:=FechaIni.Date;// asigno el valor de la fecha inicial al parámtro F1
        ParamByName('F2').AsDate:=FechaFin.Date; //asigno el valor de la fecha final al parámtro F2
        Open;
  end;
Nota:Como podrán observar el código anterior ,no me he preocupado por enviar la consulta con el formato adecuado tal como lo guarda MySQL, ésto se debe a que el propio DataSet que ejecuta la consulta ya sabe como hacerlo.;).
Saludos...:)

Caral 21-10-2010 03:42:18

Hola
Es un error frecuente pensar que delphi entiende todo.
Veamos esto:
Código Delphi [-]
        SQL.Add('Select Empleado, Departamento');
        SQL.Add('From Empleados');
        SQL.Add('Where FechaIngreso Between'+DateToStr(FechaIni.Date)+'And'+DateToStr(FechaFin.Date));
Delphi entiende el texto asi:
Select Empleado, DepartamentoFrom EmpleadosWhere FechaIngreso Between'+DateToStr(FechaIni.Date)+'And'+DateToStr(FechaFin.Date));

Esto es logico ya que es texto lo que se ejecuta dentro del add.
Escomo siquisieraque meentendieradelphi que esloquequiero decir.:)
Se entiende lo anterior?, no lo creo o por lo menos cuesta.
Solucion: espacio entre todo esto:
Código Delphi [-]
        SQL.Add('Select Empleado, Departamento ');
        SQL.Add('From Empleados ');
        SQL.Add('Where FechaIngreso Between '+DateToStr(FechaIni.Date)+ ' And ' +DateToStr(FechaFin.Date));
Por eso prefiero usar text y parametros ya que se entiende mejor:
Código Delphi [-]
SQL.text:= 'Select Empleado, Departamento '+
           'From Empleados '+
           'Where FechaIngreso Between :dato1 and :dato2 ';
Saludos

DeLiRioS 21-10-2010 05:31:30

Hola gracias amigos por su atención, hice como me explicaron, con los parametros y respetando los espacios pero ahora me da un nuevo error. Me dice: "Operation not applicable" intente cambiando en el ParamByName().AsDate por Value y el error ya no da pero no arroja nada la consulta, uso este código:

Código Delphi [-]
 
 begin
    If Active Then Close;
        SQL.Clear;
        SQL.Add('Select Empleado, Departamento');
        SQL.Add('From Empleados');
        SQL.Add('Where FechaIngreso Between :F1 And :F2');{ Al poner los Dos puntos ( : ) Delphi crea 
                                                                                 los parámetros F1 y F2 Automáticamente}
        ParamByName('F1').AsDate:=FechaIni.Date;// asigno el valor de la fecha inicial al parámtro F1
        ParamByName('F2').AsDate:=FechaFin.Date; //asigno el valor de la fecha final al parámtro F2
        Open;
  end;

La consulta la hice correr en el MySql-Front donde está la BD y funciona a la perfección, teniendo en cuenta que alli inserto la fecha de incio y de fin.
Pero en delphi me da ese error y es con las fechas probe haciendo otro tipo de consulta y tmb funciona perfecto, parece que es la manera en que paso los parametro o algo asi, tendra algo que ver que es un campo Timestamp? alli guardo fecha y hora. Usando SQL.Text me da el mismito error, disculpen quiizas es algo siemple pero no puedo resolverlo. Gracias de ante mano amigos.

sintornillos 22-04-2013 15:56:13

Consulta entre 2 Fechas
 
Hola amigos, estoy tartando de hacer lo arriba indicado, en mi caso tengo una tabla Mysql, cuya estructura es la siguiente:
Tabla entregas identrega, idbeneficiarios, idmercaderia, fecha
beneficiariosidbeneficiarios, apellido, nombre, dni
mercaderiaidmercaderia,detalle

En el formulario FrmBenefxFecha tengo un Zquery ZQryFecha, dos DateTimePicker, en los cuales ingreso la fecha de inicio y la fecha final y un boton para iniciar la busqueda y un Dbgrid donde muestro el resultado, el código es el siguiente:

with FrmBenefxFec.ZQryFecha do
begin
Close;
Sql.Text:= 'select * ' +
'from entregas ' +
'where Fecha Between :finicio and :ffinal ';


ParamByName('finicio').AsDate:=DateTPDesde.Date;
ParamByName('ffinal').AsDate:=DateTPHasta.Date;
Sql.Add('Order By Fecha');

//Open;
ExecSQL;
end

El código en las propiedades sql del Zquery es el siguiente:

select * from entregas
inner join beneficiarios
on (entregas.idbeneficiarios=beneficiarios.idbeneficiarios)
inner join mercaderia
on (entregas.idmercaderia=mercaderia.idmercaderia);

y al ejecutarlo me sale el siguiente error:
ZQryFecha: Parameter 'finicio' not found

trate de incluir los parametros en las propiedades params de la zquery y tampoco.

Desde ya les agradezco vuestra ayuda.-

Casimiro Notevi 22-04-2013 16:16:41

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

sintornillos 22-04-2013 17:13:17

Consulta entre 2 Fechas
 
Hola Casimiro, si bien había visto la guía de estilo, no había visto lo que me indicas, lo tendré en cuenta para futuras preguntas y/o respuestas.
Gracias por tu atención
¿será necesario que reformule mi consulta??

sintornillos 22-04-2013 17:35:58

Aquí voy de nuevo,(a ver si ahora lo hago bien), ^\||/

Hola amigos, estoy tartando de hacer lo arriba indicado, en mi caso tengo una tabla Mysql, cuya estructura es la siguiente:
Tabla entregas identrega, idbeneficiarios, idmercaderia, fecha
beneficiariosidbeneficiarios, apellido, nombre, dni
mercaderiaidmercaderia,detalle

En el formulario FrmBenefxFecha tengo un Zquery ZQryFecha, dos DateTimePicker, en los cuales ingreso la fecha de inicio y la fecha final y un boton para iniciar la busqueda y un Dbgrid donde muestro el resultado, el código es el siguiente:

Código Delphi [-]
with FrmBenefxFec.ZQryFecha do
    begin
      Close;
      Sql.Text:= 'select * ' +
                 'from entregas ' +
                 'where Fecha Between :finicio and :ffinal ';


      ParamByName('finicio').AsDate:=DateTPDesde.Date;
      ParamByName('ffinal').AsDate:=DateTPHasta.Date;
      Sql.Add('Order By Fecha');

      //Open;
      ExecSQL;
    end

El código en las propiedades sql del Zquery es el siguiente:
Código SQL [-]
select * from entregas
  inner join beneficiarios 
    on (entregas.idbeneficiarios=beneficiarios.idbeneficiarios)
  inner join mercaderia
    on (entregas.idmercaderia=mercaderia.idmercaderia);

y al ejecutarlo me sale el siguiente error:
ZQryFecha: Parameter 'finicio' not found

trate de incluir los parametros en las propiedades params de la zquery y tampoco.

Desde ya les agradezco vuestra ayuda.-

marinaAv 22-04-2013 18:51:24

hola mira yo tengo un codigo parecido al tuyo solo que en la consulta la pongo asi
Código Delphi [-]
Sql.Text:= 'select * ' +            
'from entregas ' +          
 'where Fecha Between  FormatDateTime('yyyy/mm/dd',dt_desde.Date) +' and '+ FormatDateTime('yyyy/mm/dd',dt_hasta.Date);

mi dt_desde es el nombre de mi DateTimePicker y si me funciona espero te sirva

sintornillos 23-04-2013 13:03:06

Gracias MarinaAv por tu pronta respuesta, me olvide de aclarar que estoy trabajando con Delphi XE no se si eso tendrá algo que ver, pues el código que me pasaste me tira un error "E2066 Missing operator or semicolon"
:confused:

Casimiro Notevi 23-04-2013 13:10:48

Usa "open", ya que es un "select", el "execsql" es cuando no devuelve datos: update, insert, etc.

Creo que no estás poniendo el código adecuado para que lo veamos, ya que no puede decirte que no existe el parámetro finicio cuando sí que existe en el código que has pegado.

sintornillos 23-04-2013 15:32:24

Muchas Gracias Casimiro, tenías razón el problema era el execsql lo reemplace por el open y funcionó. ^\||/ :)

marinaAv 26-04-2013 17:12:34

Cita:

Empezado por sintornillos (Mensaje 459109)
Gracias MarinaAv por tu pronta respuesta, me olvide de aclarar que estoy trabajando con Delphi XE no se si eso tendrá algo que ver, pues el código que me pasaste me tira un error "E2066 Missing operator or semicolon"
:confused:


mmm que raro yo tambien estoy con delphi xe y no me marca nada o sabes que ese error es que estas mandando un dato diferente que no lo permite :S

ecfisa 26-04-2013 22:34:24

Cita:

Empezado por marinaAv (Mensaje 459357)
mmm que raro yo tambien estoy con delphi xe y no me marca nada o sabes que ese error es que estas mandando un dato diferente que no lo permite :S

Hola marinaAv.

Seguramente ha sido un desliz al copiar/pegar o redactar el mensaje (a todos nos ha pasado). Pero al código del mensaje #9:
Código Delphi [-]
Sql.Text:= 'select * ' +            
'from entregas ' +          
 'where Fecha Between  FormatDateTime('yyyy/mm/dd',dt_desde.Date) +' and '+ FormatDateTime('yyyy/mm/dd',dt_hasta.Date);
efectivamente le falta una coma como señala el mensaje de error que nos comenta sintornillos.

Código Delphi [-]
Sql.Text:= 'select * ' +            
'from entregas ' +          
 'where Fecha Between ' + FormatDateTime('yyyy/mm/dd',dt_desde.Date) +' and '+ FormatDateTime('yyyy/mm/dd',dt_hasta.Date);

Saludos. :)

marinaAv 29-04-2013 18:36:35

:O cierto una disculpa no me fije bien entonces ya te funciona?


La franja horaria es GMT +2. Ahora son las 16:46:12.

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