Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filtrar en DBGrid para Access (https://www.clubdelphi.com/foros/showthread.php?t=77159)

javier.m866 28-12-2011 16:46:42

Filtrar en DBGrid para Access
 
Hola, tengo una Base de Datos en Access llamada Base de datos.mdb conectada a mi aplicación mediante un Adotable (Adotable1) y un DataSource (DataSource1) con una tabla llamada Choferes, la cual se muestra mediante un DBGrid (DBGrid1) mi pregunta es la siguiente:
Quisiera realizar un Filtrado por la columna "Nombre" de manera tal que al escribir en un Edit cualquier letra ej "ier" me muestre todos los campos que contengan dichas letras ejemplo: Javier, Reinier, Iercos, etc... y que al borrar las letras del Edit, se vuelvan a mostrar todos los Campos de la Tabla. Muchas gracias de antemano y feliz año nuevo para todos.

Neftali [Germán.Estévez] 28-12-2011 17:53:37

Revisa este ejemplo y el código que hay en mi página a ver si es lo que buscas.
Si revisas el FTP, sección de ejemplos, es posible que también encuentres alguno más.

javier.m866 28-12-2011 18:08:18

No entendí nada
 
Disculpa ignorancia, pero no entendí nada, yo he buscado entre otras dudas ya planteadas y todo el mundo pregunta sobre el filtrado con ADOQuery y esas cosas, yo estoy utilizando ADOTABLE y DATASOURCE en un DBGRID conectado a una tabla de Access, pero sobre eso no he visto nada. Gracias de todos modos, seguiré intentándolo. Feliz fin de año.

Neftali [Germán.Estévez] 28-12-2011 18:19:31

Perdona, yo mismo me hice un lío leyendo "rápido"; Si estás utilizando ADOTable, busca en la ayuda sobre Filtered y Filter del TADOTable.
De todas formas tengo dudas de si con estas propiedades vas a poder conseguir el filtro que necesitas (que contengan....)

De todas formas, para un filtro de tipo LIKE, como el que necesitas, creo que lo más sencillo es que conviertas el ADOTable en un ADOQuery y utilices el código que te he pasado

javier.m866 28-12-2011 18:39:15

Ya me funciona, pero tengo un problema...
 
El Filtrado me funciona bien con el siguiente código:

procedure TForm1.Edit1Change(Sender: TObject);
begin
If (Edit1.text <> '') then
Adotable1.Filter := 'Nombre Like '''+ Edit1.Text + '*''';
end;

Pero tengo un problema, al borrar el texto escrito en el Edit1, en lugar de regresar todos los campos, se queda tal y cómo está el filtrado, lo que necesito es que si busco "ier" salgan todos los nombres que contengan esas letras, pero al borrar "ier" del edit, que vuelvan a aparecer todos.

ecfisa 28-12-2011 19:16:00

Hola Javier.

Por favor cuando pongas código en tus mensajes utiliza TAG's, la imágen siguiente explica su uso:



Ahora en referencia a tu pregunta, probá de este modo:
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Edit1.Text > '' then
  begin
    ADOTable1.Filter:= 'Nombre LIKE ' + QuotedStr(Edit1.Text+ '*');
    ADOTable1.Filtered:= True;
  end
  else
    ADOTable1.Filtered:= False;
end;

Saludos.

javier.m866 28-12-2011 19:44:01

Me da el siguiente error
 
Probé con ese código, pero me dá el siguiente error: Proyect DatosChoferes.exe raised exception class EOleException with message "No se encontró el elemento en la colección que corresponde con el nombre o el ordinal pedido". Process stopped. use Step or Run to continue.

ecfisa 28-12-2011 19:53:32

Hola Javier.

El código anterior lo escribí en el aire, pero acabo de probarlo y filtra sin error. Por el tipo de error que te arroja diría que revises que el campo Nombre exista o esté bién escrito.

Este es el código exácto de la prueba que hice ahora y funciona correctamente:
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
 if Edit1.Text > '' then
  begin
    ADOTable1.Filtered:= False;
    ADOTable1.Filter:= 'Name LIKE ' + QuotedStr(Edit1.Text+ '*');
    ADOTable1.Filtered:= True;
  end
  else
    ADOTable1.Filtered:= False;
end;

Saludos.

javier.m866 28-12-2011 20:20:08

Si, funciona...
 
Es cierto que funciona, disculpa fué un error mío a la hora de escribir. Pero De esta manera el filtrado sólo se puede hacer por los nombres tal y como comienzan.
Javier
Roberto
Carlos
Reinier
si yo escribo en el edit "javier" no sale nada, porque debe de iniciar con mayúscula.
si yo escribo "ier" no filtra nada, cuando debería filtrar Javier y Reinier.
De cualquier forma te agradezco tu ayuda.

Caral 28-12-2011 21:29:01

Hola
El problema que veo es que el filtro va buscando letra a letra, osea de principio a fin de la palabra buscada.
Si filtras Javier, buscara la J primero, la a segundo y asi sucesivamente.
Para que filtre sin selección se tendría que usar la funcion AnsiContainsStr que ademas distingue entre mayúsculas y minúsculas.

No se me ocurre como filtrar la tabla asi, tal vez practicando esta funcion encontraras una solucion.
Este es un ejemplo de uso:

Código Delphi [-]
uses  StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
   If AnsiContainsStr(Edit1.text, Edit2.text) then
   Showmessage('si');
end;

Aqui compara el contenido del edit1 y del 2.
Seguro que algun maestro te dira como usar esto en el filtro.
Saludos

javier.m866 29-12-2011 14:32:55

¿Como puedo contactar a un maestro? ¿O espero a que ellos escriban?
 
Bueno, si alguien conoce como utilizar esa función, se los agradeceré. Feliz fin de año.

Chogo 31-12-2011 19:34:33

yo hago esto, espero que te sirva

Código Delphi [-]

procedure TFrmDlgBusquedaPrefacturas.EditClienteChange(Sender: TObject);
begin

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

end;


La franja horaria es GMT +2. Ahora son las 16:24:32.

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