PDA

Ver la Versión Completa : Ayuda con Dataset.Filter


donpedro
05-08-2019, 17:07:10
Buenas, bendiciones para todos

Estoy utilizando DElphi 2009 y Sql server. Estoy usando DBEDIT con ADO. En un modulo de registro de pacientes tengo un EDIT para hacer una busqueda. Quiero filtrar el dataset para que en el mismo EDIT se pueda buscar por id, nombres, apellidos o cedula.

Estoy utilizando el siguiente codigo, pero me esta dando error:


if Length(Trim(Ebuscapacientes.text)) > 0 then
begin
DSpacientes.DataSet.Filtered:=false;
DSpacientes.dataset.Filter := '[nombres] like '+''''+'%'+Ebuscapacientes.Text+'%'+'''' or '[apellidos] like '+''''+'%'+Ebuscapacientes.Text+'%'+'''';
DSpacientes.DataSet.Filtered :=true;
end
else
DSpacientes.Dataset.Filtered := False;


Espero que me puedan ayudar. Gracias de antemano

movorack
05-08-2019, 17:21:40
Y... ¿que error genera?

donpedro
05-08-2019, 17:29:13
Ese es el error

[DCC Error] Upacientes.pas(298): E2015 Operator not applicable to this operand type

movorack
05-08-2019, 17:37:58
El OR debería ser parte de la cadena.

Trata de hacer la cadena mas fácil de manejar, tal vez puedas usar format:


DSpacientes.dataset.Filter := '';
if not Trim(Ebuscapacientes.Text).IsEmpty then
DSpacientes.dataset.Filter := Format('([nombres] like ''%%%0:s%%'') or ([apellidos] like ''%%%:0s%%'') or ([cedula] like ''%%%:0s%%'')', [Trim(Ebuscapacientes.text)]);

donpedro
05-08-2019, 17:40:33
A que clase pertenece isEMpty. Porque me da error

movorack
05-08-2019, 17:45:55
Debe ser que usas una versión anterior de Delphi.

isEmpty es una función en el helper del tipo de dato String. Es parte de la VCL desde XE3 en adelante (creo)


Trim(Ebuscapacientes.text).isEmpty = Length(Trim(Ebuscapacientes.text)) = 0


Edito: Si,ya leí que usas Delphi 2009

donpedro
05-08-2019, 18:17:24
Gracias Movorack, me sirvio de mucho.

Asi quedo el codigo de manera funcional


if Length(Trim(Ebuscapacientes.text)) >0 then
begin
DSpacientes.dataset.Filter := Format('([nombres] like ''%%%0:s%%'') or ([apellidos] like ''%%%:0s%%'') or ([numero documento] like ''%%%:0s%%'')', [Trim(Ebuscapacientes.text)]);
DSpacientes.DataSet.Filtered :=true;

end
else
DSpacientes.Dataset.Filtered := False;

end;

donpedro
05-08-2019, 18:22:03
Un detalle se me olvido

Tengo el campo ID int identity en la base de datos, y cuando agrego ese campo en la busqueda me da un error. El error dice: No se puede abrir el filtro

Que puedo hacer ahi??? y disculpa

oscarac
05-08-2019, 23:20:39
creo que el tema de filtros en algun momento se podria lento dependiendo de la cantidad de registros de la tabla

en su lugar porque no utilizas un query para extraer los registros que deseas?

movorack
06-08-2019, 00:25:02
Un detalle se me olvido

Tengo el campo ID int identity en la base de datos, y cuando agrego ese campo en la busqueda me da un error. El error dice: No se puede abrir el filtro

Que puedo hacer ahi??? y disculpa

Debes revisar bien la forma en que armas los filtros con el tipo de dato que deseas filtrar.

movorack
06-08-2019, 00:25:56
creo que el tema de filtros en algun momento se podria lento dependiendo de la cantidad de registros de la tabla

en su lugar porque no utilizas un query para extraer los registros que deseas?

¡Si! Se pone lento cuando son muchos registros. Consultar los datos nuevamente es buena opción.