Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-03-2012
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Encontrar texto intermedio en un DBGrid

Hola a todos

tengo que encontrar un texto en un dbgrid que no necesariamente se encuentra al principio del campo, es decir, tengo un grid que puede tener 5 campos dentro de los cuales se encuentra el campo "Nombre" y en ese campo puedo tener lo siguiente

pedro perez hernandez
ana maría ramirez
daniel fernandez

Estoy utilizando Locate con LoPartialKey en el onchange de un edit1, pero el problema es que solo me encuentra la información si está al principio del registro, es decir, si coloco en el edit: daniel, encuentra el tercer registro inmediatamente, pero si escribo ramirez no busca nada, he buscado en los foros y no he encontrado nada al respecto, solo que puedo usar la instrucción like pero me parece un poco largo que cada vez que vaya a chequear un caracter en el onchange tenga que ejecutar una consulta con el like, entonces por eso quiero hacerlo mejor con Delphi, pero no veo la forma.

Gracias por su apoyo
__________________
Oskar
Responder Con Cita
  #2  
Antiguo 19-03-2012
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Podrias crear un StringGrid (invisible) que contenga la informacion que saques del dato del campo.
Con esta funcion separas la cadena:
Código Delphi [-]
function SepararCadena(const Cadena: string; const Delim: Char): TStringList;
begin
  Result:= TStringList.Create;
  Result.Delimiter:= Delim;
  Result.DelimitedText:= Cadena;
end;

despues generas el resultado, en este caso proviene de un edit pero puede probenir de un campo string:

Código Delphi [-]
var
  TS: TStrings;
  i, a : integer;
begin
  a:= 1;
  TS:= SepararCadena(Edit1.Text,' ');
  try
    for i:= 0 to TS.Count -1 do
    begin
   StringGrid1.RowCount := StringGrid1.RowCount + 1;
   StringGrid1.Cells[i+1,a] := TS[i];
    end;
   finally
    TS.Free;
  end;

Si quieres probar el ejemplo coloca un stringgrid un boton y un edit, pon en el edit el nombre, apellido1 y apellido2, pon el segundo codigo en el boton.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 19-03-2012
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Hola Caral, muchas gracias por tu pronta respuesta.

Tal vez no me he explicado bien, realmente no quiero sacar texto del grid, lo que quiero es poder encontrar un registro en un grid más rápido que haciéndolo con las flechas de arriba y abajo.

imagina una ventana de clientes, donde puedo ver en un dbgrid todos los clientes que se encuentran en el sistema hasta este momento, estos clientes son nombres de empresas. Pero la lista es un poco larga e incomoda para buscar un cliente determinado, sobre todo porque los nombres de empresas comienzan por Inversiones... o Corporación.... Representaciones..... etc.

Entonces tengo un edit para colocar el nombre de la empresa a buscar en el evento Onchange del edit, de forma que vaya buscando de una vez a medida que voy colocando caracteres en ese edit, pero el problema es que tal vez el usuario no recuerda como comienza el nombre de la empresa, a lo mejor la empresa se llama "Representaciones Siglo XXI Decoraciones, SRL" lo que necesito es que si coloco XXI por ejemplo, el dbgrid haga focus inmediatamente en el registro que acabo de escribirte, pero actualmente el Locate que uso no lo encuentra porque solo encuentra la primera palabra con la que comienza la descripción, es decir..., "Representaciones".

Agradezco tu apoyo
__________________
Oskar
Responder Con Cita
  #4  
Antiguo 19-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Oscar.

Un problema del método Locate, es que si no es aplicado sobre un campo índice, realiza la búsqueda secuencialmente y no te permite como bién lo has mencionado encontrar caracteres en cualquier posición del campo.

Particularmente veo mucho más símple utilizar una consulta para lo que deseas hacer:
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
  with tuQry do
  begin
    Close;
    SQL.Clear;
    SQL.Text:= 'SELECT * FROM TU_TABLA WHERE NOMBRE LIKE :BUSCADO';
    ParamByName('BUSCADO').AsString:= '%'+Edit1.Text+'%';
    Open;
  end;
end;
De todos modos las búsquedas incrementales de ninguna manera son eficientes, e incrementan mucho el tráfico en el servidor.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 19-03-2012 a las 04:23:19.
Responder Con Cita
  #5  
Antiguo 19-03-2012
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Ecfisa, gracias por tu respuesta

Estoy haciendo las pruebas con lo me explicaste pero lo tuve que ajustar un poco porque no me dejaba compilar y lo hice de la siguiente manera

with BuscaIntermedio do
begin
Close;
SQL.Clear;
SQL.Text:= 'SELECT * FROM dm.clientes WHERE cnombre LIKE=:BUSCADO';
Parameters.paramByName('BUSCADO').Value:= '%'+Edit1.Text+'%';
Open;
end;

y Ahora si me deja compilar, pero cuando voy a buscar en el edit, apenas voy a colocar el primer caracter me muestra el siguiente error:
"BuscaIntermedio Parameter BUSCADO not found"

Sabrás a que se debe?

gracias
__________________
Oskar
Responder Con Cita
  #6  
Antiguo 19-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Oscar.

Si. En principio estás utilizando en la sentencia SQL una referencia al módulo de datos: SELECT * FROM dm.clientes ..., y lo que corresponde es el nombre de tabla.

Es decir que tu código debería quedar más o menos así:
Código Delphi [-]
  with BuscaIntermedio do
  begin
    Close;
    SQL.Clear;
    SQL.Text:= 'SELECT * FROM CLIENTES WHERE CNOMBRE LIKE = :BUSCADO';
    Parameters.ParamByName('BUSCADO').Value:= '%'+Edit1.Text+'%';
    Open;
 end;
Dentro de la sentencia SQL, asumo que CLIENTES es el nombre de la tabla y CNOMBRE el nombre del campo sobre el que realizas la búsqueda. De no ser estos los nombres, cambialos por los que correspondan.

Aprovecho también para pedirte que cuando incluyas código en tus mensajes hagas uso de los TAG's. Te pongo una imágen que explica el uso:




Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 19-03-2012
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Ecfisa, gracias, no sabía que se mostraba el código de esa manera

He estado tratando con lo que me pasaste, incluso ahora ya no tengo el query en el datamodule (dm) sino en el propio form de clientes, pero aún así todavía me sigue presentando el error "BuscaIntermedio Parameter BUSCADO not found"

que extraño todo parece en orden

__________________
Oskar
Responder Con Cita
  #8  
Antiguo 19-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Oscar.

Se me deslizó un error en el código anterior, el signo '=' no corresponde (eso me pasa por hacerlo en el aire... ), así que sería:
Código Delphi [-]
with BuscaIntermedio do
  begin
    Close;
    SQL.Clear;
    SQL.Text:= 'SELECT * FROM CLIENTES WHERE CNOMBRE LIKE :BUSCADO';
    Parameters.ParamByName('BUSCADO').Value:= '%'+Edit1.Text+'%';
    Open;
 end;
Para que puedas ver un ejemplo en funcionamiento, te adjunto uno con ADO, me dí cuenta que estás usando esos componentes por Parameters .
Crea una carpeta y descomprimelo allí. El ejemplo usa la tabla country de dbdemos.mdb que viene con Delphi (que te incluyo).

Saludos.
Archivos Adjuntos
Tipo de Archivo: zip Oscar.zip (65,6 KB, 10 visitas)
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DBGrid. Al actualizar los datos 'No pude encontrar la fila para su actualizacion' juliannemiro Varios 2 02-02-2012 04:30:02
Autoajustar Dbgrid al texto ingabraham Varios 1 12-02-2010 18:04:07
Seleccion de un Texto en un DBGrid rjsitruiz Varios 2 31-05-2004 17:58:19
texto en un MEMO ...encontrar comparar sakuragi OOP 4 27-02-2004 17:24:28
TDBCheckBox aparece en estado intermedio marcado y no marcado. setry2 OOP 4 09-05-2003 05:55:57


La franja horaria es GMT +2. Ahora son las 05:25:36.


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
Copyright 1996-2007 Club Delphi