Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2007
loquillo3 loquillo3 is offline
Miembro
 
Registrado: oct 2007
Posts: 51
Poder: 17
loquillo3 Va por buen camino
Question Búsqueda "incremental" en una base de datos

Hola,
De antemano le anticipo que si este hilo no va aqui lo muevan al debido lugar donde debe de ir.

Lo que intento hacer es realizar una busqueda que cuando vaya poniendo las letras me vaya apareciendo los resultados.

Ejemplo: Si busco un registro por nombre. Busco el nombre Manuel peo que me aparezcan los demas que empieza con m y a medida que siga poniendo las demas letras se vaya reduciendo la lista hasta quedar el que busco.


Salu2.
Responder Con Cita
  #2  
Antiguo 07-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
De antemano le anticipo que si este hilo no va aqui lo muevan al debido lugar donde debe de ir.
Hombre, digo yo, que, antes de publicar el hilo debes mirar en qué subforo cae mejor, apróximadamente. Yo creo que este hilo no va en "Conexión con bases de datos". Tal vez vaya en MySQL, Orable, o la base de datos que uses, pero, como tampoco lo dices... a ver quién ata el cascabel al gato.

De momento quédese el hilo donde está, hasta más ver. Lo que sí he hecho ha sido editar el título del hilo, porque "Búsqueda" sólo quedaba un poco abstracto, por decirlo así. Piensa que en los títulos de los hilos se basan luego las búsquedas que se pueden llevar a cabo en los foros, de ahí la importancia de que tengan un título descriptivo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 07-11-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Puedes usar un simple Locate para posicionarte en el registro que necesites.
El problema de las búsquedas incremetales es la velocidad y los recursos que consumen.
Si es una tabla pequeña, puedes utilizar un ClientDataSet para cargarla en memoria y a partir de ahí realizar la búsqueda.
El problema es si no puedes cargar toda la tabla en memoria (esto no siempre es posible) o es muy grande, porque posiblemente tendrás problemas de velocidad.

Coloca un Edit dobde escribes el texto y una tabla apuntando a la tabla employee de DBDemos ordenada por FirstName; Algo así:

Código SQL [-]
  Select * from employee order by FirstName, LastName

Con este código en el OnChange debería valer.

Código Delphi [-]
  // Busqueda incremental
  ClientDataSet1.Locate('FirstName', Edit1.Text, [loCaseInsensitive, loPartialKey]);

Acabo de subir un ejemplo completo a la sección de ejemplos de mi web. Puedes descargarlo y ver el código fuente.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 08-11-2007
loquillo3 loquillo3 is offline
Miembro
 
Registrado: oct 2007
Posts: 51
Poder: 17
loquillo3 Va por buen camino
Hola,
Neftali probe tu ejemplo y es lo que quiero hacer, intente hacerlo por mi mismo pero no pude.
POr cierto mi base de datos esta hecha en access no se si me puedes dar una manito en eso.

Saludos.
Responder Con Cita
  #5  
Antiguo 08-11-2007
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 20
tefots Va por buen camino
para busquedas incrementales yo uso like

conforme el usuario va escribiendo en un textbox
en el onkeypres del textbox
hago lo siguiente.

if textbox1.text<>'' then begin
dbbrid1.beginupdate
query1.close
query1.sql.add('select from tabla1 where tabla1.campo like '%dato%')
query1.open
dbgrid.endupdate
end;

con esto , el dbgrid se va posicionando localizando el registro correspondiente conforme vamos escribiendo o borrando.
en acces el like creo que no hay que ponerle % , el codigo es solo como funciona , hay que adaptarlo un poco.

nota : para optimizar ,tambien se puede poner un temporizador (y meter el codigo en el temporizador) , y en el onkeypress dehabilitar y habilitar el temporizador , de unos 200/300ms. asi cuando escriba , no se posiciona cada vez que apretemos una tecla sino que lo hace cuando pase x tiempo despues de apretar la ultima tecla.

saludos.
Responder Con Cita
  #6  
Antiguo 08-11-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por loquillo3 Ver Mensaje
...intente hacerlo por mi mismo pero no pude.
¿Exactamente qué pasó?
¿Error?
En principio la Base de Datos no tiene nada que ver, si te fijas en el ejemplo, la búsqueda se hace sobre los datos que ya hay cargados en el DataSet (vía TClientDataSet), por lo tanto es independiente de cómo se carguen los datos.

De todas formas he modificado el ejemplo para permitir cargar los datos desde un XML o desde un MDB.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 08-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por tefots Ver Mensaje
izar ,tambien se puede poner un temporizador (y meter el codigo en el temporizador) , y en el onkeypress dehabilitar y habilitar el temporizador , de unos 200/300ms. asi cuando escriba , no se posiciona cada vez que apretemos una tecla sino que lo hace cuando pase x tiempo despues de apretar la ultima tecla.

saludos.
Yo prefiero al presionar intro en el edit de búsqueda:
Código Delphi [-]

procedure TForm1.Edit1keyDown(...);
begin
   if key = vk_return then
   begin 
      // abrir y cerrar la consulta
   end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 08-11-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Lepe Ver Mensaje
Yo prefiero al presionar intro en el edit de búsqueda...
Eso siempre!!! En eso estoy con Lepe.

Aunque te he dado la solución, tengo que decir que si vas a acabar buscando por Manolo, yo también encuentro una tontería buscar por: m, ma, man, mano, manol y finalmente manolo.
Lo que pasa que queda muy bonito y a los clientes les gusta mucho;
Básicamente a ellos les da igual que para hacerlo así debas generar más tráfico de red de la cuenta o traerte muchos más registros de los necesarios,... Eso sí luego que funcione, que vaya muy rápido y que consuma poco...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 08-11-2007
loquillo3 loquillo3 is offline
Miembro
 
Registrado: oct 2007
Posts: 51
Poder: 17
loquillo3 Va por buen camino
Estaba viendo este codigo que genero marcsc:

Código Delphi [-]
 
interface

  TBuscador = class(TObject)
  private
    FIndiceCampo: Integer;
    FDataSet: TDataSet;
  public
    constructor Create(DS: TDataSet = nil); 
    property DataSet: TDataSet read FDataSet write FDataSet; //Sobre el que se hace la búsqueda
    function Buscar(Texto: String; BuscarBOF: Boolean = True): Boolean;
  end;

implementation

//Como el valor por omisión del parámetro DS es nil, puedes llamar al constructor
//sin parámetros y asignarle posteriormente el DataSet
constructor TBuscador.Create(DS: TDataSet = nil);
begin
  inherited Create;
  FDataSet:= DS;
  FIndiceCampo:= 0;
end;

//El parámetro BuscarEOF, por defecto True, busca el texto desde el inicio del
//DataSet. En caso que se especifique el valor False, buscará incrementalmente
function TBuscador.Buscar(Texto: String; BuscarBOF: Boolean = True): Boolean;
begin
  Result:= False;
  with FDataSet do
  begin
    if BuscarBOF then
    begin
      First;
      FIndiceCampo:= 0;
    end;

    while (not EOF) and (not Result) do
    begin
      while (FIndiceCampo < Fields.Count) and (not Result) do
      begin
        //Esto seria una busqueda absoluta, si quieres opciones de búsqueda
        //parcial, con opciones de mayúsculas etc te lo dejo como mejora 
        Result:= Fields[FIndiceCampo].Text = Texto;
        Inc(FIndiceCampo);
      end;
      FIndiceCampo:= 0;
      Next;
    end;
  end;
end;

Neftali si tu pudieras poner un pequeño ejemplo hecho en access podria guiarme de ahi, ya que vi en el tuyo que usabas un archivo xml.

Saludos
Responder Con Cita
  #10  
Antiguo 08-11-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por loquillo3 Ver Mensaje
Neftali si tu pudieras poner un pequeño ejemplo hecho en access podria guiarme de ahi, ya que vi en el tuyo que usabas un archivo xml.
Ya te lo había comentado antes.

Cita:
Empezado por Neftali Ver Mensaje
De todas formas he modificado el ejemplo para permitir cargar los datos desde un XML o desde un MDB.
Es el mismo sitio donde estaba el otro; Link.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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
Incremental en red jgmarduel Conexión con bases de datos 3 19-12-2005 15:52:36
QRLabel incremental Barzaugc Impresión 3 17-06-2005 11:17:58
Consulta Busqueda Incremental Gustavo Gowdak SQL 1 13-12-2004 09:27:08
respaldo incremental juan hernandez Linux 1 04-12-2004 15:30:30
busqueda incremental con ado slat Conexión con bases de datos 1 11-07-2004 18:32:52


La franja horaria es GMT +2. Ahora son las 14:50:56.


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