PDA

Ver la Versión Completa : Problema al filtrar un Query entre fechas


judit25
08-06-2006, 23:11:13
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.


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:
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.


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:


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

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


........................................
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

...............
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
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
Para que funcionara con Access tuve que definir los parámetros como DateTimeEn realidad es asi que debe ser (DateTime) pues AsDate no exites, el codigo que habia puesto lo hice de memoria y no me acordaba.
pero si hago esto si me devuelve resultados
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:(.
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
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.


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


Salud OS.

hach
17-04-2007, 21:14:59
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:

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
Muchas Gracias!!, si era eso el error. Una disculpa que soy novato :D

Maury Manosalva
20-04-2007, 00:03:38
Lo realice para MySQL, por si alguien lo necesita



//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.