Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filtrar datos en una lista (https://www.clubdelphi.com/foros/showthread.php?t=61283)

Lizette 02-11-2008 20:32:50

Filtrar datos en una lista
 
Hola, buen dia.

He encontrado como filtrar datos de una base de datos en un dbgrid, pero lo que pretendo es hacer una busqueda, filtrando datos pero en una lista o cualquier otro componente que me permita seleccionar, para posteriormente poder seleccionar el registro que quiero y al dar enter, que presente la informacion en sus respectivos edit, para poder eliminar o modificar. Dado que en el dbgrid no puedo seleccionar..

Es decir, en un edit teclear "ca" y que me aparezcan todos los registros que comiencen con esta secuencia, al dar enter que me pase el control al componente y poder seleccionar por medio de las flechas arriba o abajo el registro deseado, al darle enter que me aparezca la informacion del registro seleccionado en edits.

marcoszorrilla 02-11-2008 21:44:02

Puedes utilizar SQL y cuando pulses enter o la tecla que tengas designada o un botón...

Activas la consulta:

Código SQL [-]
Select *
From MiTabla
Where MiCampo Like '%CA%'

Esta consulta le conectas un DataSource y a éste último una rejilla.

Un Saludo.

Caro 02-11-2008 22:31:12

Hola Lizette, debes hacer lo que te indica el amigo marcoszorrilla, solo que en tu consulta deberías utilizar solo el % del final.

Código Delphi [-]
Query.Close;
Query.Sql.Text := 'Select * From MiTabla Where MiCampo Like '+QuotedStr(Edit1.Text+'%');
Query.Open;

Y ahora para cuando hagas enter sobre un registro del DBgrid utilizas el evento OnKeyPress del DBGrid.

Código Delphi [-]
procedure TForm1.dbgrid1KeyPress(Sender: TObject; var Key: Char);
begin
 if key=#13 then
  begin
   Edit1.Text := Query.fieldbyname('campo1').asstring;
   Edit2.Text := Query.fieldbyname('campo2').asstring;
   Edit3.Text := Query.fieldbyname('campo3').asstring;
  end;
end;

Saluditos

Lizette 02-11-2008 23:45:25

Gracias Caro y marcoszorrilla, me funcionó de maravilla.. :)

Lizette 04-11-2008 05:39:20

mmmm, el dbgrid no me actualiza los datos, cuando inserto datos y me voy al dbgrid, éste no tiene el registro que inserte..

Le pongo refresh al dbgrid y sigue igual, que puedo hacer?

Caro 04-11-2008 05:58:52

Hola de nuevo, despues de hacer tus cambios, con el query que esta enlazado a tu DBGrid haces lo siguiente:

Código Delphi [-]
Query.Close;
Query.Open;

Saluditos

Lizette 04-11-2008 06:15:18

Ok, gracias Caro.

Lizette 09-11-2008 21:52:31

Tengo otra inquietud, no se me hizo muy adecuado, dar enter al edit y dar enter al dbgrid, estoy tratando de que al darle enter al edit, cuando ya tengo en el dbgrid el dato filtrado, me aparezcan los respectivos datos en los edits de ese registro que se encuentra filtrado en la primera posicion del dbgrid.

Le estuve intentando pero siempre me despliega el primer registro que tengo en la tabla.

Caro 10-11-2008 03:01:11

Hola Lizzete, supongo que tu filtrado lo haces en el evento OnChange de tu Edit, para el enter es solo usar el evento OnKeyPress de ese mismo edit.

Código Delphi [-]
procedure TForm1.EditFiltroKeyPress(Sender: TObject; var Key: Char);
begin
 if key=#13 then
  begin
   Edit1.Text := Query.fieldbyname('campo1').asstring;
   Edit2.Text := Query.fieldbyname('campo2').asstring;
   ...........
  end;
end;

Saluditos

Lizette 10-11-2008 10:33:00

Hola gracias Caro,, tengo otro pequeño problema, cuando estoy filtrando los datos y pongo en el edit "li" me despliega los nombres con esas incidencias, si tengo "rererere" y pongo toda la palabra me la acepta, pero tengo un registro "lizette", si pongo "li" lo acepta y me filtra pero si pongo "liz" no me da nada en el dbgrid, siendo que si tengo un registro con "lizette"..

Aqui anexo el codigo:

Código Delphi [-]
Var
Valor,Valor1 : String;
begin
 if EditNom.Text<>EditVacio.Text then
  begin
 Valor := EditNom.Text;
 Valor1 := Valor;
 inc(Valor1[length(Valor1)]);
 if(ADOtblPaciente.Locate('NombreC', EditNom.Text,[loPartialKey,loCaseInsensitive]))then
 begin
 ADOtblPaciente.Filter := 'NombreC >= '+QuotedStr(Valor)+ ' and NombreC < ' +QuotedStr(Valor1);
 ADOtblPaciente.Filtered := true;
 end
 else
  begin
   Application.MessageBox('El paciente/cliente buscando no se encuentra registrado','No encontrado',Mb_IconWarning);
   EditNom.Text:=EditVacio.Text;
   EditNom.SetFocus;
  end;
 end;
 if EditNom.Text=EditVacio.Text then
  begin
   ADOtblPaciente.Filtered:=False;
  end;

Lizette 10-11-2008 10:38:37

Se me paso comentar:

Que si voy borro letra por letra el edit una vez teniendo "liz", borro la "z" me causa error y me saca del programa.

Gracias

Caro 10-11-2008 17:27:17

Estas mezclando varias cosas amiguita, no esta bien que lo hagas así, habria sido mejor que utilizaras un AdoQuery e hicieras la consulta, pero si quieres hacerlo con Filter, debes utilizar también "Like", el Inc esta demas y el Locate también. Tu codigo quedaría así:

Código Delphi [-]
Var
 Valor : String;
begin
  ADOtblPaciente.Filtered:=False;
  if EditNom.Text<>EditVacio.Text then
   begin
    Valor := EditNom.Text;
    ADOtblPaciente.Filter := 'NombreC like '+QuotedStr(Valor+'%');
    ADOtblPaciente.Filtered := true;
   end
  else
   begin
    Application.MessageBox('El paciente/cliente buscando no se encuentra registrado','No encontrado',Mb_IconWarning);
    EditNom.Text:=EditVacio.Text;
    EditNom.SetFocus;
   end;

Nota.- Si te da algún error en tu codigo, debes indicarnos siempre el error exacto que te esta dando para poder ayudarte mejor.

Saluditos

Lizette 11-11-2008 02:51:34

Gracias por tu ayuda Caro, si me funcionó..


La franja horaria es GMT +2. Ahora son las 10:24:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi