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)
-   -   Problema al filtrar un Query entre fechas (https://www.clubdelphi.com/foros/showthread.php?t=32547)

judit25 08-06-2006 23:11:13

Problema al filtrar un Query entre fechas
 
Buenas tardes!

Tengo un formulario con un TQuery, un Datasource , un TDBGrid enlazado al DataSource del TQuery, varios edit y 2 datetimepicker, apuntando a una base de datos Access conectado desde un ODBC.

Estoy utilizando el siguiente código para ir filtrando los datos que se van a mostrar en el DBGrid mediante el Query.

Código Delphi [-]
Query1.Close();
Query1.SQL.Text := 'SELECT nombres_campos FROM TDocumento WHERE Userscre like '+quotedStr(('%'+Eus.Text)+'%')+ 'and Tipo_Doc like '+quotedStr(('%'+Edit4.Text)+'%')+'and Forma_Pago like '+quotedStr(('%'+Edit5.Text)+'%')+ ' and Fecha_Emision between '+ FormatDateTime('dd/mm/yyyy', EFD.date) + ' and  ' + FormatDateTime('dd/mm/yyyy', EFH.Date) + ' Order By Numero';
Query1.Open();


El problema es que cuando intento filtrar por fecha no me muestra ninguna información. :confused:

Alguien sabe que es lo que estoy haciendo mal? :o

He probado algunas de las soluciones en hilos anteriores y no he podido resolver mi problema.

Gracias anticipadas.

Saludos

vtdeleon 08-06-2006 23:24:09

Usa parametros para esos asuntos.

Ej:
Código Delphi [-]
begin
 Query.Close;
 Query.Sql.Text:='Select campo1, campo2 from tabla1 where campo1=:1parametro and campo2=:2parametro';
  //Se asignan valores a los parametros
  Query.ParamByName('1parametro').AsDate:=now;//Fecha actual en este caso
  Query.paramByname('2parametro'.AsInteger:=2342;
  Query.Open;
End;
Analiza eso, o busca en el foto sobre temas parecidos.

Suerte

judit25 08-06-2006 23:25:42

Gracias

Deja probar nuevamente con parámetros, ya había intentado pero me daba un error deja ver si ahora no lo hace.

Gracias nuevamente

Rayku 09-06-2006 01:57:41

HOLA MAN , ESTO ES BIEN FACIL, ESTE PROBLEMA DE LAS FECHAS SOLO SE PRESENTA CUANDO TRABAJAS CON ACCESS LA SOLUCION ES QUE ANTECEDAS LA PALABRA CDATE('+QuotedStr('01/01/2006')+') ALGO ASI , OK SUERTE ESPERO PODER AYUDARTE MAS COSAS NOS VEMOS

Caro 09-06-2006 16:38:02

Hola Rayku, funciona pero solo en access y no en sqlServer porque no existe dicha función CDate, yo quisiera usar parametros justamente para no depender de una base de Datos y su respectivo formato de fecha, muchisimas gracias por responder.

Saludos

judit25 09-06-2006 16:50:56

Gracias

Probé con la opción que me diste, pero resulta que delphi no reconoce CDATE, seguiré probando a ver si doy con la solución.

PSD: No soy Man, soy Woman :p :rolleyes: ;) :)

Lepe 09-06-2006 17:05:57

La opción de vtdeleon es la "más limpia". Normalmente los motores de bases de datos esperan la fecha en formato mm/dd/yyyy, si no cuadra en ese formato, lo intenta encajar con dd/mm/yyyy, el problema viene cuando se tiene dos parámetros de fecha (fecha_inicio y fecha_fin), las dos pueden encajar en un formato, en los dos formatos, o incluso puede llegar a tomar una fecha en un formato y la otra en el otro formato....

Resumen: Usa la fórmula de vtdeleon y delphi pasará las fechas en el formato adecuado según el motor de bases de datos que uses.

Saludos y espero que te ayude a entender el tema ;).

judit25 09-06-2006 17:23:57

Hola!

Gracias

Aplicando lo de los parámetros como me sugirió vtdeleon y Lepe el código a funcionado, le dejo el código por si alguien tiene el mismo problema.

Código Delphi [-]
Query1.Close();
Query1.SQL.Text := 'SELECT Nombre_Campos FROM TDocumento WHERE Fecha_Emision between :PFechad and :PFechah Order by Numero';
Query1.ParamByName('PFechad').AsDateTime := DateTimePicker1.DateTime;
Query1.ParamByName('PFechah').AsDateTime := DateTimePicker1.DateTime;
Query1.Open();

Para que funcionara con Access tuve que definir los parámetros como DateTime

Saludos

Gracias a todos por sus respuestas :) :D

Caro 09-06-2006 17:31:08

Hola Lepe una preguntita cuando usaba los componentes de BDE con la forma que indica vtdeLeon todo bien me funciono perfectamente, pero ahora que estoy utilizando ADO tuve problemas no me devolvia ningun valor lo hice de la siguiente forma:

Código Delphi [-]
   qry.Close;
   qry.SQL.Text:='SELECT * FROM tabla WHERE fecha=:Param1';
   qry.Parameters.ParamByName('Param1').DataType:=ftDate;
   qry.Parameters.ParamByName('Param1').Value:=datepick1.Date; 
   qry.Open;

de esa forma no me saca ningun resultado pero si hago esto si me devuelve resultados
Código Delphi [-]
   qry.Close;
   qry.SQL.Text:='SELECT * FROM tabla WHERE fecha=:Param1';
   qry.Parameters.ParamByName('Param1').DataType:=ftDate;
   qry.Parameters.ParamByName('Param1').Value:=FormatDateTime ('mm/dd/yyyy',datepick1.Date);
   qry.Open;

dandole formato si muestra resultados hice la prueba con access y sqlServer y funciona, pero a mi me gustaria que funcionara de la otra forma, sin darle el formato asi como lo dices tu

Cita:

Empezado por Lepe
........................................
Resumen: Usa la fórmula de vtdeleon y delphi pasará las fechas en el formato adecuado según el motor de bases de datos que uses.
........................................

Saludos y que tengan un bonito dia

judit25 09-06-2006 17:36:44

Hola Caro!

Intenta en vez de ftDate y datepick1.Date usar ftDateTime y datepick1.DateTime, tuve problema con Access usando solo Date y al utlizar DateTime me funcionó, intenta a ver si eso resuelve tu problema.

Saludos

Caro 09-06-2006 18:08:34

Muchisimas gracias por responder judit25
Cita:

Empezado por judit25
...............
Intenta en vez de ftDate y datepick1.Date usar ftDateTime y datepick1.DateTime,
................
Saludos

hice el cambio pero tampoco me devuelve resultados, por si acaso mis campos si son de tipo Fecha.

Rayku 09-06-2006 18:22:26

Código Delphi [-]
cn.BeginTrans;
    cm := TADOCommand.Create(nil);
    cm.Connection := cn;
    cm.CommandText := ' UPDATE TIngresoDetalle SET '+
                      ' Tipo='+ QuotedStr(Tipo)+ ','+
                      ' Cantidad='+ Cantidad+ ','+
                      ' Monto='+ Monto+
                      ' WHERE  FechaLlegada=CDate('+QuotedStr(FechaLlegada)+') AND SerieF='+ QuotedStr(SerieF)+' AND NroFactura='+ QuotedStr(NroFactura)+' AND SerieG='+ QuotedStr(SerieG)+' AND NroGuia='+ QuotedStr(NroGuia)+'AND IDTipo='+ QuotedStr(IDTipo);
    cm.Execute;
    cn.CommitTrans;

espero q esto te sirva

vtdeleon 10-06-2006 00:33:43

Saludos
Cita:

Empezado por judit
Para que funcionara con Access tuve que definir los parámetros como DateTime

En realidad es asi que debe ser (DateTime) pues AsDate no exites, el codigo que habia puesto lo hice de memoria y no me acordaba.
Cita:

Empezado por Caro
pero si hago esto si me devuelve resultados
Código Delphi [-]
   qry.Close;
   qry.SQL.Text:='SELECT * FROM tabla WHERE fecha=:Param1';
   qry.Parameters.ParamByName('Param1').DataType:=ftDate;
   qry.Parameters.ParamByName('Param1').Value:=FormatDateTime ('mm/dd/yyyy',datepick1.Date);
   qry.Open;
dandole formato si muestra resultados hice la prueba con access y sqlServer y funciona, pero a mi me gustaria que funcionara de la otra forma,

Con Ado es diferente, eso es lo malo que he visto de esos componentes, a veces hay que especificarle el tipo del dato:(.
Cita:

Empezado por Rayku
Código Delphi [-]
cn.BeginTrans;
    cm := TADOCommand.Create(nil);
    cm.Connection := cn;
    cm.CommandText := ' UPDATE TIngresoDetalle SET '+
                      ' Tipo='+ QuotedStr(Tipo)+ ','+
                      ' Cantidad='+ Cantidad+ ','+
                      ' Monto='+ Monto+
                      ' WHERE  FechaLlegada=CDate('+QuotedStr(FechaLlegada)+') AND SerieF='+ QuotedStr(SerieF)+' AND NroFactura='+ QuotedStr(NroFactura)+' AND SerieG='+ QuotedStr(SerieG)+' AND NroGuia='+ QuotedStr(NroGuia)+'AND IDTipo='+ QuotedStr(IDTipo);
    cm.Execute;
    cn.CommitTrans;

espero q esto te sirva

Aqui volvemos al mismo problema de antes, pues estas enviando los datos directamente. Yo insisto en el uso de parametros, dejar que Delphi y la base de datos se encarguen del tipo de dato.

gabriel_romo 17-04-2007 20:10:16

Hola
 
Bueno ante todo dejenme decir que soy unpoco inexperto en esto; pero pues tengo un problema y no se como resolverlo, es con el manejo de fechas en las consultas sql, ya intente paando paramentros, pasando la fecha directamente de la fotma #mm/dd/aa# y la consulta no me regresa nada. el probolemacreo yo esta en la base de datos, porque yo he usado la forma #mm/dd/aa# en bases de datos que yo hago y me funciona bien; una vez me paso lo mismo,pero lo unico quie hice fue borrar la tabla y crearla de nuevo. pero ahora es distinto porque esa base de datos ya estaba y al parecer tiene el mismo problema, y como podrasn imaginarse no puedo borrar la tabla. El problema radica creo yo que el campo de fecha (que esta definido como fecha/hora en la base de datos) tiene algo asi como si la fecha la exigiera en formato mm/dd/aa hh:mm:ss yo que hice es quele envie la fecha #mm/dd/aa hh:mm:ss# pero pues me meraca error de todos modos. si alguien me puediera ayudar con eso, se los agradeceria mucho.
saludos

egostar 17-04-2007 20:16:38

No dices que base de datos estas usando pero asi al vuelo intenta pasando asi los datos.

Cita:

#mm.dd.aaaa hh:mm:ss#
Salud OS.

hach 17-04-2007 21:14:59

Formato fecha
 
Hace rato que no hago nada sobre access (por suerte decidi pasar todos mis desarrollos a firebird) pero creo recordar que tenes que pasar en el query las fechas con formato 'mm/dd/yyyy' no 'dd/mm/yyyy' como estas pasando

Espero que esto se sea de ayuda

Caral 17-04-2007 21:45:08

Hola a todos
Bueno para empezar access es como el juguete en bases de datos, tiene un generador de consultas muy facil de usar.
Para hacer una consulta estimando dos fechas se puede hacer tanto por parametros como ya han indicado los maestros, como por una sencilla sentencia sql.
Para empezar como access es un poco quisquillosa pues le decimos lo que queremos y luego le decimos como queremos que nos presente la fecha asi:
Código Delphi [-]
ADOQuery1.SQL.Add('  Select FechaTransac, CodTransac, Documento From TUTABLA ');
ADOQuery1.SQL.Add(' WHERE  TUTABLA.FechaTransac >= #'+DateToStr(DateTimePicker1.Date)+ '# AND  TUTABLA.FechaTransac <= # '+DateToStr(DateTimePicker2.Date)+'#');
ShortDateFormat := 'dd/mm/yyyy';
Al usar el generador de consultas de access, se vera el codigo sql y facilmente se podra implementar en un query.
Bueno creo que mas facil no se puede.:D
Saludos

gabriel_romo 18-04-2007 17:13:42

Gracias!!!
 
Muchas Gracias!!, si era eso el error. Una disculpa que soy novato :D

Maury Manosalva 20-04-2007 00:03:38

Respuesta para esto
 
Lo realice para MySQL, por si alguien lo necesita

Código Delphi [-]
 
//En las variables
Var formato : TFormatSettings;
 
//En la Consulta
 
Consulta := Consulta +' where a.FecAnuRep between Cast( :fi  as Date) and Cast( :ff as Date)';
 
// Despues de generar la consulta
 
GetLocaleFormatSettings(0, formato);
     formato.ShortDateFormat:= 'yyyy-MM-dd';
     ParamByName('fi').Value := DateToStr(tmrFechaInicial.Date,formato);
     ParamByName('ff').Value := DateToStr(tmrFechaFinal.Date,formato);
     open;

aca utilizo 2 datetimepicker para la fecha inicial y para la fecha final. funciona OK, si tienen dudas con gusto les ayudo.


La franja horaria es GMT +2. Ahora son las 00:04:16.

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