Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-12-2019
Gregorio Cíber Gregorio Cíber is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Gregorio Cíber Va por buen camino
Busqueda en la BD a partir de un texto tecleado

Hola amigos.
El siguiente código lo utilizo para seleccionar registros dentro de una tabla contenida en una TDBGrid y situarnos en la primera coincidencia.

Dos controles: edt_TablaBuscar (TEdit) y box_TablaBuscar (TComboBox). Este último con ITems = '','Empieza', 'Contiene', 'Termina'.

A medida que se escribe en edt_TablaBusca se ejecuta edt_TablaBuscarChange y si se cambia la propiedad Item de box_TablaBuscar se ejecuta box_TablaBuscarChage. La variable UltimoCampo contiene el campo por el que se busca. Se asigna a partir del TDBGrid cuando se pincha en titulo.

Código Delphi [-]
procedure edt_TablaBuscarChange(Sender: TObject);
var
  f : TDate;
  s : String;
begin
  inherited;

  s := edt_TablaBuscar.Text;

  try
    tbl_Tabla.Locate( UltimoCampo,
                      VarArrayOf([ UpperCase(s) ]),
                      [loCaseInsensitive, loPartialKey] );
    box_TablaBuscarChange(Sender);
  except
    try
      f := StrToDate(s); //StrToDate(edt_TablaBuscar.Text);
      tbl_Tabla.Locate( UltimoCampo,
                        f,
                        [loCaseInsensitive, loPartialKey] );
    except
      //
    end;
  end;
end;


procedure TfP__BaseAC_Tabla_B.box_TablaBuscarChange(Sender: TObject);
var
  s: string;
begin
  inherited;

  case box_TablaBuscar.ItemIndex of
    0: s := '';
    1: s := edt_TablaBuscar.Text + '%';
    2: s := '%' + edt_TablaBuscar.Text + '%';
    3: s := '%' + edt_TablaBuscar.Text;
  end;
  s := UpperCase(s);
  //
  if box_TablaBuscar.ItemIndex > 0 then
    s := '(' + UltimoCampo + ' IS NOT NULL) ' +
         'AND ' +
         '(UPPER (' + UltimoCampo + ') LIKE ''' + s + ''')';
  //
  try
    tbl_Tabla.Filter   := s;
    tbl_Tabla.Filtered := (box_TablaBuscar.ItemIndex > 0);
  except
    //tbl_Tabla.Filtered := False;
    //box_TablaBuscar.ItemIndex := 0;
  end;
  //
  ActiveControl := grd_Tabla;
end;

Hasta aqui todo bien. El código funciona y, aunque estoy pensado en algunas mejoras, no me ha dado problemas a lo largo del tiempo.

Sin embargo adolece de un defecto y es que la tabla debe estar cargada en memoria, lo cual es un proble cuando hay decenas o centenares de miles de registros. Y aquí va la pregunta, ¿cómo prodría hacerse algo parecido pero tirando de la BD directamente?. Es decir, pidiéndole a Firebird que devuelva las fihas que cumplan las condiciones indicadas en cada caso, teniendo en cuenta que debe valer para cualquier tabla y para cualquier campo de ella.

Gracias anticipadas.
Responder Con Cita
  #2  
Antiguo 17-12-2019
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.
Cita:
Empezado por Gregorio Cíber Ver Mensaje
¿cómo prodría hacerse algo parecido pero tirando de la BD directamente?.
Revisa en los enlaces al fin de esta página y en estos,Vas a encontrar mas material buscando por los términos "busqueda incremental" (sin las "").

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 17-12-2019
Gregorio Cíber Gregorio Cíber is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Gregorio Cíber Va por buen camino
Gracias ecfisa. Lo miraré ahora mismo.
Responder Con Cita
  #4  
Antiguo 18-12-2019
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.285
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
Empezaré respondiendo la última.

Cita:
Empezado por Gregorio Cíber Ver Mensaje
¿cómo prodría hacerse algo parecido pero tirando de la BD directamente?.
Utilizando SQL. Puedes lanzar la búsqueda directamente sobre la Base de Datos generanso la sentencia SQl al vue4lo y ejecutándola.

Cita:
Empezado por Gregorio Cíber Ver Mensaje
Sin embargo adolece de un defecto y es que la tabla debe estar cargada en memoria, lo cual es un problema cuando hay decenas o centenares de miles de registros.
Ese es el gran problema aquí(a mi entender).
Ya lo he comentado otras veces. El comportamiento que estás utilizando corresponde a una Base de Datos "local" o de "escritorio". Las que usábamois antiguamente y en las que todos los datos se cargaban en memoria. Podías recorrer todos los datros para hacer búsquedas y era cómodo realizar búsquedas "a medida que el usuario iba escribiendo" (porque todos los datos estaban en memoria).

Hoy en día que trabajamos con SGBD's (Servidores de Bases de Datos) no con Bases de Datos de escritorio este comportamiento no es óptimo. Justo por lo que comentas:

(1) Porque para hacerlo debes cargar TODOS los datos en memoria, cosa que puede ser muy ineficiente.
(2) Porque estás generando muuucho más tráfico del necesario.
(3) porque estás sobrecargando el servidor más de lo necesario.

Si alguien quiere buscar por valores que empiezen por "Barcel", por ejempo, al escribir ese texto, estará realizando 6 búsquedas (B, Ba, Bar, Barc, Barce y Barcel) cuando realmente sólo le interesa la última. Ya no digo nada si el usuario es torpe escribiendo y entre medio escribe 2 letras mal, luego las borra y las vuelve a escribir .

Cita:
Empezado por Gregorio Cíber Ver Mensaje
A medida que se escribe en edt_TablaBusca se ejecuta edt_TablaBuscarChange...
En estos casos lo habitual es sólo ejecutar la búsqueda sólo al final (o sólo cuando el usuario lo especifica). Por ejemplo, cuando se detecta un ENTER, cualndo el usuario pulsa el botón,... (hay mil maneras)
Ejecutar la búsqueda de forma explícita por el usuario.
__________________
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
  #5  
Antiguo 19-12-2019
Gregorio Cíber Gregorio Cíber is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Gregorio Cíber Va por buen camino
Gracias Neftalí.


Efectivamente, no es nada eficiente la búsqueda en la BD con cada pulsación de tecla cuando las tablas no está cargadas en memoria. Ya estaba mirando la posibilidad que comentas, me refiero a lanzar la búsqueda en un determinado momento, pero antes de cambiar nada quería tener la seguridad de que no había otra forma de hacerlo que desconocía, sobre todo cuando tienes que 'lidiar' con todo tipo de usuario: los que comprenden que se introduzcan cambios y los que no lo harán nunca.



Gracias.
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
Mostrar texto de un DBMemo a partir de un caracter exequielmatias1 Varios 6 21-08-2013 16:01:04
Crear Imagen A Partir De Texto (x,y,z) gusspagano Gráficos 17 23-10-2012 22:49:33
Busqueda de texto Gerson12 Varios 40 05-08-2012 20:55:43
Crear un Reporte a partir de archivos de texto franciscobucio Impresión 4 18-01-2007 18:49:09
Se puede optener un listado de direcciones a partir de una busqueda? Alfredo Internet 3 19-10-2005 16:10:31


La franja horaria es GMT +2. Ahora son las 23:34:49.


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