PDA

Ver la Versión Completa : Al quitar un filtrado a la tabla el Ggrid se queda vacio.


feliz-58
20-06-2022, 12:41:33
Saludos, les comento algo curioso que me pasa, tengo un DBGrid enlazado a un Query con la siguiente consulta:


with QRecibidas do
Begin
Close;
SQL.Clear;
SQL.Text:='SELECT CodOrden, Fecha, Hora, Estado, Nombre, Entrega_Estimada, Usuario, Nota, '+
'Total, Pagado FROM Ordenes WHERE Estado = ''Recibido''';
Open;
End;


Y luego hago el siguiente filtrado:

if EBuscar.Text <> EmptyStr then
begin
QRecibidas.Filtered:= False;
QRecibidas.Filter := 'Nombre like '+QuotedStr('%'+ EBuscar.Text + '%');
QRecibidas.Filtered:= True;
end
Else
QRecibidas.Filtered:= False;
end;


Resulta que cuando escribo algun nombre que si esta en la tabla, y borro el contenido del Edit todo funciona bien, pero cuando escribo alguna letra o frase de la cual no existe en la tabla y la tabla se queda vacia, y elimino el contenido del edit, el dbgrid se queda vacio a menos que escriba otra cosa(hasta un espacio vacio) que si este en algun registro de la tabla y vuelva a borrar entonces aparecen todos los registros nuevamente.
:confused:

Alguien tiene alguna idea?

oscarac
20-06-2022, 15:59:38
particularmente no uso filtros porque no conozco la cantidad de registros que tendra la tabla
lo que hago es en el query aplicar la busqueda

en el evento onchange del edit genero la cadena del query y lo voy abriendo mientras se escribe, como una busqueda secuencial

Neftali [Germán.Estévez]
21-06-2022, 11:22:29
...y elimino el contenido del edit, el dbgrid se queda vacio a menos que escriba otra cosa(hasta un espacio vacio)

¿Estás seguro de que en ese caso no está ejecutndo una sentencia incorrecta?
No parece que el código que has puesto tenga nada "raro".

feliz-58
21-06-2022, 16:41:53
;547237']¿Estás seguro de que en ese caso no está ejecutndo una sentencia incorrecta?
No parece que el código que has puesto tenga nada "raro".

Lo he revisado y probado de diferentes formas, incluso intente al final cuando se quita la tabla del modo filtrado, cerrandola y abriendola de nuevo y no lo aparecen los registros aun. Es super extraño, sera cosas del IDE? tengo 10.4.

Esta mañana probé esto:

SQL.Text:='SELECT CodOrden, Fecha, Hora, Estado, Nombre, Entrega_Estimada, Usuario, Nota, '+
'Total, Pagado FROM Ordenes WHERE Nombre LIKE :Busq';
Parameters.ParamByName('Busq').Value := QuotedStr('%'+EBuscar.Text+'%');

y de esta forma hace lo mismo, al borrar todo la tabla se queda vacia.
Obviamente lo coloqué en el Onchange del edit....

feliz-58
21-06-2022, 17:10:47
Lo he revisado y probado de diferentes formas, incluso intente al final cuando se quita la tabla del modo filtrado, cerrandola y abriendola de nuevo y no lo aparecen los registros aun. Es super extraño, sera cosas del IDE? tengo 10.4.

Esta mañana probé esto:

SQL.Text:='SELECT CodOrden, Fecha, Hora, Estado, Nombre, Entrega_Estimada, Usuario, Nota, '+
'Total, Pagado FROM Ordenes WHERE Nombre LIKE :Busq';
Parameters.ParamByName('Busq').Value := QuotedStr('%'+EBuscar.Text+'%');

y de esta forma hace lo mismo, al borrar todo la tabla se queda vacia.
Obviamente lo coloqué en el Onchange del edit....

A fin de cuentas, eliminé los componentes en cuestion, los volvi a colocar, y en la consulta utilice esta:
SQL.Text:='SELECT CodOrden, Fecha, Hora, Estado, Nombre, Entrega_Estimada, Usuario, Nota, '+
'Total, Pagado FROM Ordenes WHERE Nombre LIKE ' +quotedstr('%' + EBuscar.Text + '%');

y en el else, utilice esta:
'SELECT CodOrden, Fecha, Hora, Estado, Nombre, Entrega_Estimada, Usuario, Nota, '+
'Total, Pagado FROM Ordenes WHERE Estado = ''Recibido''';

Que es la consulta original, y resolvió todo.
Cosas extrañas de la vida :o

movorack
21-06-2022, 19:57:30
Aunque ya nos dijiste que encontraste una solución te comento lo siguiente para que no quede como una "cosa[s] extraña[s] de la vida"

Por lo que cuentas y muestras, yo pienso que el inconveniente que tienes es por la línea donde validas que el edit tenga algo de texto.


//Aquí estás validando que el edit tenga texto
if EBuscar.Text <> EmptyStr then
begin
QRecibidas.Filtered:= False;
QRecibidas.Filter := 'Nombre like '+QuotedStr('%'+ EBuscar.Text + '%');
QRecibidas.Filtered:= True;
end
Else
QRecibidas.Filtered:= False;
end;


Como el evento se dispara cuando el texto cambia, aunque hayas borrado todo, creo que el filtro queda activo con algún carácter que impide mostrar todo el contenido de la tabla. Es por ello que al agregar una sentencia por defecto en el ELSE obtienes un resultado.

Con el filtro hubieses podido limpiar el filtro cuando el texto estuviese vacío.


if Trim(EBuscar.Text) <> EmptyStr then
begin
QRecibidas.Filtered:= False;
QRecibidas.Filter := 'Nombre like '+QuotedStr('%'+ EBuscar.Text + '%');
QRecibidas.Filtered:= True;
end
ELSE
QRecibidas.Filtered:= False;


Ahora, debes evaluar cual método te es mas conveniente al realizar el cambio de texto. ir a la base de datos y realizar la consulta o realizar un filtro sobre el dataset que ya tienes en memoria. Igual, ambos tienen un costo en recursos y tiempo en la aplicación.

Neftali [Germán.Estévez]
22-06-2022, 08:29:28
Aunque ya funciona y sólo como comentario, cuando utilizas el ParamByName, no hare falta realizar un QuotedStr. Según el tipo del parámetro se añadirán las comillas si hacen falta.