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)
-   -   Buscar registro por fecha utilizando filtro de ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=47429)

radiohead 28-08-2007 10:44:11

Buscar registro por fecha utilizando filtro de ClientDataSet
 
Hola!

Tengo un problema al buscar registros por fecha en un programa de facturacion.

Utiliza una tabla grande, por lo que se hace la consulta sql con las condiciones requeridas por los parámetros especificados.

Pero, una vez cargados los datos y visualizados, utilizo la función de filtros e indices propia del ClientDataSet para navegar y buscar los datos que se encuentran en este momento en memoria. No me da ningún problema, excepto cuando busco por un campo de fecha.


Para introducir la fecha utilizo un MaskEdit con la típica máscara: Código Delphi [-]!99/99/0000;1;_

que le facilita al usuario la entrada de una fecha válida.

Luego traslado el valor que me da al texto de filtro de la siguiente forma:


Código Delphi [-]
campo := 'FechaRecibo';
cadena := mkdFecha.Text;
If (campo = 'FechaRecibo') Then
begin
cdsFacturacion.Filtered := False;
cdsFacturacion.Filter := campo + ' = ' + cadena;
cdsFacturacion.Filtered := True;
end






Es entonces cuando me sale el típico mensaje "Type mismach in expresion."

Creo que el formato de los campos de fecha en el ClientDataSet no son los mismos que el simple texto que utilizo para filtrar.

¿Alguien sabe si es posible filtrar por fecha?

Salu2

kuan-yiu 28-08-2007 10:55:09

¿Y por qué no utilizas un componente específico para que el usuario seleccione la fecha? Un TDateTimePicker siempre es mejor que un TEdit para capturar una fecha.

basti 28-08-2007 12:12:59

Creo que te faltan las comillas:
Código Delphi [-]
  cdsFacturacion.Filter := campo + ' = ' + QuotedStr(cadena);

otra cosa que tienes que comprobar es que la base de datos use el mismo formato de fecha que estás introduciendo en el edit.

JosepGA 28-08-2007 13:42:08

Evento OnFilterRecord
 
Hola, si usas este evento podrás filtrar por más de un campo asignando a la variable Accept si el registro es valido o no. Podrás comparar directamente por el/los campo/s de la tabla de la siguiente forma:

Código:

Accept := ( tClientdataset.FieldByName( 'FechaRecibo' ).AsDateTime =
 StrToDate( mkdFecha.Text ) );

Hace tiempo lei que el comportamiento de este evento es similar a la propiedad filter, pero con la ventaja de poder comparar por mas de un campo y poder añadir llamadas a procesos.

Te recomiendo, por algun bug del componente, que la propiedad Filtered la pongas a TRUE despues de abrir la tabla, ya que en ocasiones me ha pasado que si la activo antes de abrir la tabla, no entra en el evento.

radiohead 28-08-2007 19:14:32

Cita:

Empezado por kuan-yiu (Mensaje 226470)
¿Y por qué no utilizas un componente específico para que el usuario seleccione la fecha? Un TDateTimePicker siempre es mejor que un TEdit para capturar una fecha.

Gracias, Kuan-yiu

Es que ya utilizo los TDataTimePicker para la consulta sql.

Pero de con los datos que tengo en memoria hago una serie de búsquedas rápidas y flexibles directamente sobre el clientdataset

radiohead 29-08-2007 09:16:41

Cita:

Empezado por JosepGA (Mensaje 226493)
Código:

Accept := ( tClientdataset.FieldByName( 'FechaRecibo' ).AsDateTime =
 StrToDate( mkdFecha.Text ) );


Una opcion interesante. Pero, si este evento se ejecuta al filtrar, ¿como haces para llamar a una función de filtro?



Por cierto, me funcionó poniendo comillas. En los casos en los que filtro por cualquier campo de texto funciona bien sin ellas.
Pero por lo visto, para la fecha las requiere.

kuan-yiu 29-08-2007 10:19:41

Cita:

Empezado por radiohead (Mensaje 226727)
[...]
Por cierto, me funcionó poniendo comillas. En los casos en los que filtro por cualquier campo de texto funciona bien sin ellas.
Pero por lo visto, para la fecha las requiere.

Claro, si las pones en formato visual, dd/mm/aaaa, si las pasas en formato fecha (milisegundos desde una fecha de referencia) no.

JosepGA 29-08-2007 12:47:57

llamada al filtro
 
en el evento
Código:

OnfilterRecord
pones las funciones de aceptación del registro, despues se activa la tabla y a continuación se pone la propiedad de la tabla
Código:

Filtered=TRUE
, en este momento la tabla aplica el evento
Código:

OnfilterRecord
. Yo por seguridad (o mania, no lo se), después de activar la propiedad
Código:

Filtered
, pongo la tabla en el primer registro con
Código:

First
, me he encontrado a veces que en este momento es cuando realmente realiza el filtro.

radiohead 31-08-2007 10:10:40

RE: Llamada al filtro
 
Gracias, lo probaré. Es interesante filtrar por más de un campo.


La franja horaria es GMT +2. Ahora son las 08:11:00.

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