Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   búsquedas en dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=9015)

edfz 10-04-2004 16:26:04

búsquedas en dbgrid
 
Hola,
Cómo puedo hacer para que al ir escribiendo en un edit, se vaya buscando la palabra en un dbgrid? Teniendo la grilla ya cargada.
Ej.
Tengo un edit y un dbgrid, si yo quiero buscar la palabra "casa", voy escribiendo "c" y en la grilla me tendría que aparacer los que empiecen con "c". Después escribo la "a", y en la grilla tendría que aparecer los que empiecen con "ca". Luego la "s" y en la grilla "cas" y así...
Espero que me entiendan la explicación
Gracias!

yusnerqui 10-04-2004 17:00:06

Pudieras Probar
 
Hola creo que pudieras probar en el evento on change del edit algo así

Var
Valor,Valor1 : String;
begin
valor := Edit1.text;
Valor1 := Valor;
inc(valor1[length(Valor1)]);
Tabla.Filter := 'Campo >= '+QuotedStr(Valor)+ ' and Campo < ' QuotedStr(valor1);
Tabla.Filtered := True

//Donde campo es el campo por donde vas a filtrar
//Se pone lento en dependencia de la cantidad de registros que tenga la tabla.
end;
mas o menos así
Un saludo

edfz 10-04-2004 17:28:22

porqué lento?
 
tengo una duda. cada vez que se pone el filtro en "true", se consulta en la base de datos?

jirbert 05-07-2008 07:11:57

Cita:

Empezado por yusnerqui (Mensaje 37719)
Hola creo que pudieras probar en el evento on change del edit algo así

Var
Valor,Valor1 : String;
begin
valor := Edit1.text;
Valor1 := Valor;
inc(valor1[length(Valor1)]);
Tabla.Filter := 'Campo >= '+QuotedStr(Valor)+ ' and Campo < ' QuotedStr(valor1);
Tabla.Filtered := True
end;

buenas trabajo en algo parecido pero el codigo que das me ha causado error al momento de ejecutar lo cual me dice

[Error]Unit10.pas(1233): Operator not applicable to this operand type
[Error]Unit10.pas(1233): Incompatible types: 'String' and 'Boolean'


tambien estube trabajando con otro codigo que me encontre en el foro pero a la hora del cambio del edit, el dbgrid se coloca en blanco el codigo lo extraje de aqui

gracias por la ayuda que puedan brindarme...
___________________________________
Utilizo delphi6 y tabla dbaseIV

Fenareth 05-07-2008 13:43:04

Hola,

Yo hago algo exactamente igual a lo que pide edfz de esta manera:

En el evento OnChange del TEdit tengo el siguiente código:

Código Delphi [-]
 if Edit.Text <> '' then //Edit de Búsqueda
       begin
                Tabla.Locate('Campo',Edit.Text,loPartialKey,loCaseInsensitive]);
                DBGrid.Visible := true;
       end
       else
                DBGrid.Visible := false;

y funciona de perlas... ;)

jirbert 05-07-2008 16:56:01

hola Fenareth.. bueno con tu codigo me pide que identifique loPartialKey,loCaseInsensitive..
puede que sea nada pero es que no tengo mucha experiencia en delphi .

gracias...

jandok238 05-07-2008 20:04:42

Cita:

Empezado por Fenareth (Mensaje 298455)
Código Delphi [-]
 if Edit.Text <> '' then //Edit de Búsqueda
        begin
                 Tabla.Locate('Campo',Edit.Text,loPartialKey,loCaseInsensitive]);
                 DBGrid.Visible := true;
        end
        else
                 DBGrid.Visible := false;
y funciona de perlas... ;)

yo tambien lo hago asi ... :p:p;);):D

Cita:

Empezado por jirbert (Mensaje 298478)
hola Fenareth.. bueno con tu codigo me pide que identifique loPartialKey,loCaseInsensitive..
puede que sea nada pero es que no tengo mucha experiencia en delphi .

gracias...

necesitas agregar en la seccion USES la unidad 'DB' .... ;)

salu2!!!!!!!

jirbert 05-07-2008 21:15:23

le agregue en uses 'DB' y ahora el error es:
 
le agregue en uses 'DB' y ahora el error es:

[Error] Unit10.pas(1223):Incompatible types: 'TLocateOptions' and 'TLocateOptions'

Delphius 06-07-2008 00:09:23

Hola,
¿Por casualidad no será de que estás olvidando del corchete de apertura:confused:?:
Código Delphi [-]
Locate('que','donde',[]);

Saludos,

jirbert 06-07-2008 00:27:45

gracias Delphius
 
cierto estaba copìando mal
Código Delphi [-]
 if Edit.Text <> '' then //Edit de Búsqueda   
 begin        
 Tabla.Locate('Campo',Edit.Text,loPartialKey,loCaseInsensitive);       
 DBGrid.Visible := true;      
end        
else                 
DBGrid.Visible := false;

y deberia ser
Código Delphi [-]
 if Edit.Text <> '' then //Edit de Búsqueda        
begin                 
Tabla.Locate('Campo',Edit.Text,[loPartialKey,loCaseInsensitive]);  
DBGrid.Visible := true;        
end        
else                 
DBGrid.Visible := false;

Gracias!!!!

jandok238 06-07-2008 00:35:03

Cita:

Empezado por Delphius (Mensaje 298540)
Hola,
¿Por casualidad no será de que estás olvidando del corchete de apertura:confused:?:
Código Delphi [-]
Locate('que','donde',[]);



Saludos,

eso.. eso.. eso... :D:D:D

la 'culpa' la tiene Fenareth :D:D ella fue la que puso el codigo mal ... :p:p

salu2!!!!!!!

jirbert 06-07-2008 00:55:09

pregunta fuera del tema!!
 
donde puedo conseguir los comandos para darle funcion a diferentes teclas del teclado por ejemplo enter #13 lei por ahi que salian de los codigos ascII pero lo que consegui es la manera de llamarlo en la forma hex amenos que esa sea..

gracias...

Fenareth 07-07-2008 20:58:31

Cita:

Empezado por jandok238 (Mensaje 298545)
eso.. eso.. eso... :D:D

la 'culpa' la tiene Fenareth :D:D ella fue la que puso el codigo mal ... :p:p

salu2!!!!!!!

Es cierto :p :o, pero mis intenciones han sido buenas :D, así lo ayudamos a que aprenda también a depurar errores :rolleyes:... jejeje, es broma, fue un errorcillo de dedo

destrukthor 25-07-2008 09:16:26

Agradecido
 
Holas a todos...
solo un comentario para yusss....

Exelente el codigo de filtro...
Me sirvio mucho para este novato...

Gracias nuevamente...

irixita 23-08-2008 06:43:16

Probando la busqueda de yusnerqui
 
Cita:

Empezado por yusnerqui (Mensaje 37719)
Hola creo que pudieras probar en el evento on change del edit algo así

Var
Valor,Valor1 : String;
begin
valor := Edit1.text;
Valor1 := Valor;
inc(valor1[length(Valor1)]);
Tabla.Filter := 'Campo >= '+QuotedStr(Valor)+ ' and Campo < ' QuotedStr(valor1);
Tabla.Filtered := True

//Donde campo es el campo por donde vas a filtrar
//Se pone lento en dependencia de la cantidad de registros que tenga la tabla.
end;
mas o menos así
Un saludo

Hola a todos....

Probando este codigo me da un error en ejecucion, el tema es que cuando borro el ultimo caracter me aparece el siguiente:

Proyect Yuhmak.exe raised eception class EAccessViolation with message 'Access violation at address 004CC87E in module 'Yuhmak.exe'. Write of address FFFFFFFF'. Process stopped. Use Step or Run to continue.

¿Que es eso? y ¿Como se soluciona?

Desde ya muchas gracias... y espero puedan ayudarme

Fenareth 23-08-2008 17:24:43

Hola irixita ! :)

Porqué no pruebas el otro código aquí expuesto ?
Código Delphi [-]
if Edit.Text <> '' then //Edit de Búsqueda        
begin                 
   Tabla.Locate('Campo',Edit.Text,[loPartialKey,loCaseInsensitive]);  
   DBGrid.Visible := true;        
end        
else                 
  DBGrid.Visible := false;

Saluditos

irixita 23-08-2008 17:55:29

Hola Fenareth
 
Buenas Fenareth.... si lo probe... mi pregunta ahora... donde lo pongo... en el boton de busqueda o en el evento onChage del edit?

Si lo probe... pero se me hace que lo estoy poniendo en un lugar distinto.:rolleyes:

Por eso lo probe con otro que habia ahi.... espero que me hayas comprendido...:) esperare respuesta...

Fenareth 23-08-2008 17:57:54

En el evento OnChange del TEdit... ;)

jirbert 23-08-2008 17:59:15

hola irixita

Código Delphi [-]
if Edit.Text <> '' then //Edit de Búsqueda        
begin                 
   Tabla.Locate('Campo',Edit.Text,[loPartialKey,loCaseInsensitive]);  
   DBGrid.Visible := true;        
end        
else                 
  DBGrid.Visible := false;

en rojo colocas el edit donde vas hacer la busqueda!!
en azul la tabla donde se encuetra ubicada

y lo colocas en el on change del edit!
espero poder ayudarte!

jandok238 23-08-2008 18:08:55

Cita:

Empezado por Fenareth (Mensaje 308986)
Hola irixita ! :)

Porqué no pruebas el otro código aquí expuesto ?
Código Delphi [-]
if Edit.Text <> '' then //Edit de Búsqueda
begin
     Tabla.Locate('Campo',Edit.Text,[loPartialKey,loCaseInsensitive]);
     DBGrid.Visible := true;
end
else
     DBGrid.Visible := false;


Saluditos

Ahora si pusiste bien el codigo... :D:D:D no se te pasaron los CORCHETES ... :D:D ;);):D

salu2!!!!!!!

irixita 23-08-2008 18:14:02

ok ya lo hice ahora hay un pequeño inconveniente... al ingresar el codigo del vendedor, no se filtra la lista mostrando solo los registros, es decir que solo apunta al registro, me explico?

gracias por ayudarme realmente les agradezco a todos por esto...:)

Fenareth 23-08-2008 18:17:47

Cita:

Empezado por jandok238 (Mensaje 309000)
Ahora si pusiste bien el codigo... :D:D:D no se te pasaron los CORCHETES ...

salu2!!!!!!!

Jajajaja, si, de hecho lo tomé de la última corrección que se hizo :o :p :D

Fenareth 23-08-2008 18:21:14

Cita:

Empezado por edfz (Mensaje 37716)
Hola,
Cómo puedo hacer para que al ir escribiendo en un edit, se vaya buscando la palabra en un dbgrid? Teniendo la grilla ya cargada.
Ej.
Tengo un edit y un dbgrid, si yo quiero buscar la palabra "casa", voy escribiendo "c" y en la grilla me tendría que aparacer los que empiecen con "c". Después escribo la "a", y en la grilla tendría que aparecer los que empiecen con "ca". Luego la "s" y en la grilla "cas" y así...
Espero que me entiendan la explicación
Gracias!

Cita:

Empezado por irixita (Mensaje 309001)
ok ya lo hice ahora hay un pequeño inconveniente... al ingresar el codigo del vendedor, no se filtra la lista mostrando solo los registros, es decir que solo apunta al registro, me explico?

gracias por ayudarme realmente les agradezco a todos por esto...:)

Pues si, en este hilo se respondía a la búsqueda tal y como la hace este código... creo que la búsqueda que necesitas la estábamos tratando en otro hilo o no ??? :confused:... Y creí haber leído que las sugerencias que te dimos en aquél te habían servido... :confused:

jandok238 23-08-2008 18:21:18

Cita:

Empezado por irixita (Mensaje 309001)
ok ya lo hice ahora hay un pequeño inconveniente... al ingresar el codigo del vendedor, no se filtra la lista mostrando solo los registros, es decir que solo apunta al registro, me explico?

gracias por ayudarme realmente les agradezco a todos por esto...:)

En efecto... asi trabaja el codigo que aqui se mostro... Solo te posiciona en el REGISTRO que coincide con lo que se teclee en el EDIT. ;);)

para VER solo aquellos registros que coincidan, se puede hacer uso de la propiedad FILTER del componente TTable que estes ocupando ;);)

salu2!!!!!!!

irixita 23-08-2008 19:25:12

Cita:

Empezado por Fenareth (Mensaje 309003)
Pues si, en este hilo se respondía a la búsqueda tal y como la hace este código... creo que la búsqueda que necesitas la estábamos tratando en otro hilo o no ??? :confused:... Y creí haber leído que las sugerencias que te dimos en aquél te habían servido... :confused:

Si tenes razon yo tengo el codigo que dijiste en el otro hilo... lo que pasa es que estuve probando donde encajar ese codigo
Código:

modulo1.UModulo.TablaVendedor.Filtered := false;
modulo1.UModulo.TablaVendedor.Filter:='idVendedor =' +QuotedStr(txtCodigo.Text);
modulo1.UModulo.TablaVendedor.Filtered := true;

Pero no me funciona el filtro como deseo....

me explico?... de todos modos voy a intentar buscar la forma de hacerlo, si lo consigo, lo subo ;)

SALUDOS!!!

jandok238 23-08-2008 19:37:05

Cita:

Empezado por irixita (Mensaje 309012)
Si tenes razon yo tengo el codigo que dijiste en el otro hilo... lo que pasa es que estuve probando donde encajar ese codigo
Código:

modulo1.UModulo.TablaVendedor.Filtered := false;
modulo1.UModulo.TablaVendedor.Filter:='idVendedor =' +QuotedStr(txtCodigo.Text);
modulo1.UModulo.TablaVendedor.Filtered := true;

Pero no me funciona el filtro como deseo....

me explico?... de todos modos voy a intentar buscar la forma de hacerlo, si lo consigo, lo subo ;)

SALUDOS!!!

pues... por el nombre del campo 'idVendedor' ... creo que es NUMERICO ... ( indicalo por favor ) ... si es asi... entonces no es necesario poner entre comillas lo que tenga el EDIT ....

No seria necesario QuotedStr() ....

....

pero si ya esta tratado esto en otro hilo ... lo mejor seria que estos problemas/detalles los comentaras allá ....

salu2!!!!!!! ;);)

irixita 23-08-2008 19:43:33

jandok238

Ok voy a buscar el hilo de nuevo...=S ya me olvide como era el titulo :p jeje soy muy nueva en esto y bueno de a poco me ire acostumbrando a este tema.

Nunca me maneje en un foro... y la verdad este me ayuda bastante. no se imaginan todas mis dudas que tengo...:p:p jeje el idVendedor es un codigo de 5 dijitos en los cuales el primero es una letra (la primera del apellido de tal vendedor)...

Gracias chicos!

SALUDOS!!

P/D: Ya lei la guia de estilo. :cool:

jandok238 23-08-2008 20:02:30

bueno... siendo que es un campo de tipo cadena...

el procedimiento que se tiene, nunca te va a dar los resultados como quieres....

Entiendo que quieres que te muestre los Vendedores que coincidan con lo que vayas escribiendo... de tal modo que si vas escribiendo E, solo se vean los que comiencen con la letra E ... y si despues tecleas 5 , se muestren los vendedores que empiecen con E5 .... etc... etc...

El problema radica en que en el FILTER se tiene un = ... entonces...por cada vez que entra al evento... la evaluacion seria idVendedor="E" ... luego idVendedor="E5" .. etc ... etc...

la idea es meter algo como un LIKE de SQL ... pero eso si no se como :o:o

Yo lo que hago es... poner el codigo (antes mencionado) con la funcion LOCATE ... pero ordeno la tabla deacuerdo al campo (idVendedor)... asi me muestra juntos los registros parecidos... ;);):D:D

no se si esto te sirva......

salu2!!!!!!!

irixita 23-08-2008 20:29:10

Hola el codigo me quedo algo asi:
hice una mezcla de los codigos que vi :p

Código Delphi [-]
procedure TFBusVend.txtCodigoChange(Sender: TObject);
Var
Valor,Valor1 : String;
begin
    if (txtCodigo.text <> '') then
         begin
            modulo1.UModulo.TablaVendedor.Locate('idVendedor', txtCodigo.Text,[loPartialKey,loCaseInsensitive]);
            GrillaBusVend.Visible := true;
            Valor := txtCodigo.text;
            Valor1 := Valor;
            inc(Valor1[length(Valor1)]);
            modulo1.UModulo.TablaVendedor.Filter := 'idVendedor >= '+QuotedStr(Valor)+ ' and idVendedor < ' +QuotedStr(Valor1);
            modulo1.UModulo.TablaVendedor.Filtered := True;
         end
     else
         begin
            GrillaBusVend.Visible := false;
         end

end;

eso fue lo que hice y funciona lo que quiero, salvo por una cosita, cdo borro todo se desaparece la tabla, eso es porq del lado del else dice GrillaBusVend.Visible := false; lo que no se es como volver a mostrar todos los registros de vuelta. debe ser facil, pero estuve anoche hasta las 3 am buscando la manera :confused:.

Va mejorando!!!:D jeje

Saluditos!!

jirbert 23-08-2008 20:47:36

hola irixita hice la prueba con tu codigo yme funciona a la perfecion!! no me genero ningun problema!

solo un inconveniente y es por mi culpa que la busqueda me la hace segun lo escrito es decir reconoce MAYUSCULA y minuscula tengo que escribir tal cual como esta en la tabla! alguien me podria ayudar a como hacer que sea indiferente entre mayuscula o minuscula lo que importa es la letra que entre!!

gracias!!!!

irixita 23-08-2008 21:01:46

Cita:

Empezado por jirbert (Mensaje 309026)
hola irixita hice la prueba con tu codigo yme funciona a la perfecion!! no me genero ningun problema!

solo un inconveniente y es por mi culpa que la busqueda me la hace segun lo escrito es decir reconoce MAYUSCULA y minuscula tengo que escribir tal cual como esta en la tabla! alguien me podria ayudar a como hacer que sea indiferente entre mayuscula o minuscula lo que importa es la letra que entre!!

gracias!!!!

Me alegro que te haya funcionado.
para tu problema tenes que poner en el evento onKeyPress del edit la siguiente linea.

Código Delphi [-]
if not (key in ['a'..'z', 'A'..'Z', 'ñ','Ñ',#8,' ']) then key := #0;

Ahora cdo borras todo te aparece la lista completa?

o como te aparece?

Al fin ayudo a alguien!!! :p jeje sos al primero que le saco una duda :D

Saludetes!!!

irixita 23-08-2008 21:07:45

A me habia olvidado. si es para numeros la linea seria:

Código Delphi [-]
if not(key in ['0'..'9',#8])then key := #0;

Espero que te sirva a vos y al que lo necesite!!...

;):)

Fenareth 24-08-2008 05:30:44

Cita:

Empezado por irixita (Mensaje 309023)
Hola el codigo me quedo algo asi:
hice una mezcla de los codigos que vi :p

Código Delphi [-]procedure TFBusVend.txtCodigoChange(Sender: TObject); Var Valor,Valor1 : String; begin if (txtCodigo.text <> '') then begin modulo1.UModulo.TablaVendedor.Locate('idVendedor', txtCodigo.Text,[loPartialKey,loCaseInsensitive]); GrillaBusVend.Visible := true; Valor := txtCodigo.text; Valor1 := Valor; inc(Valor1[length(Valor1)]); modulo1.UModulo.TablaVendedor.Filter := 'idVendedor >= '+QuotedStr(Valor)+ ' and idVendedor < ' +QuotedStr(Valor1); modulo1.UModulo.TablaVendedor.Filtered := True; end else begin GrillaBusVend.Visible := false; end end;


eso fue lo que hice y funciona lo que quiero, salvo por una cosita, cdo borro todo se desaparece la tabla, eso es porq del lado del else dice GrillaBusVend.Visible := false; lo que no se es como volver a mostrar todos los registros de vuelta. debe ser facil, pero estuve anoche hasta las 3 am buscando la manera :confused:.

Va mejorando!!!:D jeje

Saluditos!!

Intenta poniendo la propiedad Filtered en False, en vez de desaparecer el TDBGrid... :)

yusnerqui 30-08-2008 15:05:58

Hola a todos, aqui la correccion a mi codigo, espero que ni sea demaciado tarde
Solo cheqear que el edit no este vacio, pues entonces las operaciones de sumas de caracteres serian inconsistentes :)
Código Delphi [-]
Var
Valor,Valor1 : String;
begin
if Edit1.text = '' then exit
valor := Edit1.text;
Valor1 := Valor;
inc(valor1[length(Valor1)]);
Tabla.Filter := 'Campo >= '+QuotedStr(Valor)+ ' and Campo < ' QuotedStr(valor1);
Tabla.Filtered := True

Con esto debe hacer precisamente lo que buscabas irixita y tanbien lo que buscaba quien origino este hilo

Cita:

Tengo un edit y un dbgrid, si yo quiero buscar la palabra "casa", voy escribiendo "c" y en la grilla me tendría que aparacer los que empiecen con "c". Después escribo la "a", y en la grilla tendría que aparecer los que empiecen con "ca". Luego la "s" y en la grilla "cas" y así...
Espero que me entiendan la explicación

Esperando haber ayudado y pidiendo disculpa por la tardanza les saluda

Yusnerqui

jirbert 31-08-2008 07:37:53

buenas noches como andan haciendo unas correciones a lo planteado por yusnerqui modifique el codigo a mi conveniencia haciendo los que buscaba irixita al igual que mi persona en un principio, haciendo la busqueda letra por letra y reflejandolo, pero le anexe que mientras el edit de busqueda este en blanco muestre todos los registros. aqui se los dejo a mi me funciono de maravilla!! ahora ando buscando como hacer que la busqueda sea indiferente a lo que ingrese es decir asi yo pise 'x' bien sea mayuscula o minuscula me registre todo lo que comience por dicha 'x'...
Código Delphi [-]
Var
Valor,Valor1 : String;
begin
     if Edit1.text = '' then
     begin
     Tabla.Filtered := false;
     exit;
     end;
         Tabla.Locate('campo', edit1.Text,[loPartialKey,loCaseInsensitive]);
         valor := Edit1.text;
         Valor1 := Valor;
         inc(valor1[length(Valor1)]);
         Tabla.Filter := 'campo >= '+QuotedStr(Valor)+ ' and campo < ' +QuotedStr(valor1);
         Tabla.Filtered := true;
          end;

sin mas nada que agregar saludos!!

yusnerqui 01-09-2008 14:03:27

Hola
Bueno en primer lugar no le veo sentido a esta línea:
Código Delphi [-]
  Tabla.Locate('campo', edit1.Text,[loPartialKey,loCaseInsensitive]);
estás haciendo una búsqueda y después un filtrado, es como trabajar dos veces :), por otra parte, he probado el código y he comprobado que efectivamete es insencible a mayusculas y minúscula, es decir que es justo lo que buscas :)

jirbert 01-09-2008 14:51:11

Bueno yusnerqui ami me funciona al pelo lo unico es que toma en cuenta las mayusculas y las minusculas, noc xq ati te da el resultado que yo busco:confused: bueno yo tengo lo siguiente:

1. un edit para hacer la busqueda, al momento de ingresar palabras el verifica si estan guardadas en la tabla.
2. un panel que en si contiene un dbgrid que es donde me refleja la busqueday utiliso el panel, xq contiene otra serie de opciones como modificar o añadir nuevo!

yusnerqui 01-09-2008 19:32:01

que base de datos usas?

jirbert 12-09-2008 01:23:11

hola! Uso Delphi 6 y Tablas dBase IV...

Neftali [Germán.Estévez] 12-09-2008 09:09:42

Cita:

Empezado por edfz (Mensaje 37716)
Cómo puedo hacer para que al ir escribiendo en un edit, se vaya buscando la palabra en un dbgrid? Teniendo la grilla ya cargada.

En mi página web, en la sección de ejemplos, tienes uno titulado:
"Realizar búsqueda incremental y visualizarla sobre un DBGrid"

Creo que te puede servir, si no exactamente, al menos de Guía. Está con el código fuente, así que puedes descargarlo y mirartelo.


La franja horaria es GMT +2. Ahora son las 20:39:29.

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