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 21-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Buscar siguiente registro con F3 en un DBGrid usando Locate

Necesito que me echen otra mano...
En una base de datos de Access busco con Locate (con la option loPartialKey) en un campo Apellidos un registro que empiece con determinado apellido que es escrito en el edit1.text.
El locate me encuentra el primer registro que empieza con, por ejemplo, el apellido Mar, y el puntero en el DBGrid se moverá al primer Mar.
Necesito seguir buscando tantos Mar (Martinez, Martin, Maren, Marzan etc) como hayan en la base de datos, y que el puntero se mueva al siguiente o al anterior, pudiera ser programando la tecla F3 o un boton como se hace en Windows y seguir recorriendo la base de datos por cada registro que contenga la cadena del edit1.text.
Sería genial poder hacerlo con F3
Es un lío, pero espero que lo entiendan.
Gracias
Responder Con Cita
  #2  
Antiguo 21-09-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Busca información sobre OnKeyPress, OnKeyUp y OnKeyDown.
Este es un ejemplo de como poder hacerlo
Código Delphi [-]
procedure TForm.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if (Key = ) then
   begin
      // Deshabilito los controles visuales para que no "parpadee"
      DataSet.DisableControls;
      try
         // Salto al siguiente registro para ver si es lo que busco
         DataSet.Next;
         // Si no cumple la condición vuelvo atras
         if (not (CampoBuscado empieza_por EditBusqueda.Text)) then
            DataSet.Prior;
      finally
         DataSet.EnableControls;
      end;
   end;
end;
Responder Con Cita
  #3  
Antiguo 21-09-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.461
Poder: 20
newtron Va camino a la fama
Y.... ¿no quedaría más elegante hacer un select y que solamente quedaran los registros que cumplan la condición?

Saludos
__________________
Be water my friend.
Responder Con Cita
  #4  
Antiguo 21-09-2011
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: ago 2003
Posts: 460
Poder: 21
DarKraZY Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
Y.... ¿no quedaría más elegante hacer un select y que solamente quedaran los registros que cumplan la condición?

Saludos
Hasta podría utilizar: Filtered, Filter... para no volver a lanzar consultas.

Saludos!
Responder Con Cita
  #5  
Antiguo 21-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Ok, muchas gracias.
No es como yo hubiera querido, pero si no hay de otra, lo haré como ustedes me dicen...

Gracias
Responder Con Cita
  #6  
Antiguo 21-09-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No entiendo en qué estáss atorado, ¿en la funcionalidad en sí de recorrer los registros encontrados o en acceder a dicha funcionalidad mediante la tecla F3?

// Saludos
Responder Con Cita
  #7  
Antiguo 21-09-2011
Avatar de alej.villa
alej.villa alej.villa is offline
Miembro
NULL
 
Registrado: may 2011
Ubicación: Caracas, Venezuela
Posts: 76
Poder: 13
alej.villa Va por buen camino
Lightbulb

Considero que con una instruccion select resolverias lo que quieres
quedaria algo asi como esto:
Código SQL [-]
        Query.Close;
        Query.SQL.Clear;
        Query.SQL.Add ('Aqui colocas tu instruccion Select');
        Query.SQL.Add('like :xFiltro');
        Query.Parameters[0].Value:='%'+ Trim(Edit1.text) +'%'; 
//Aqui te filtra todos los campos que se relacionen a los que escribas en el edit1.text
        Query.Open;
          if Query.IsEmpty then
              MessageDlg('Muestras un mensaje al usuario')
          else
            DBGrid1.Enabled:=true;
            while not query.Eof do
              begin
               //Aqui enlazas el dbgrid con el datasource del query
                DBGrid1.DataSource:=dm.dsQuery;
                DBGrid1.Refresh;
                Query.Next;
              end;
Esto lo colocarias en el evento onChange del Edit1.text asi cada vez que tipeen algo el mostrara el resultado
Saludos espero haberte ayudado
Responder Con Cita
  #8  
Antiguo 21-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Si, mira, necesito, en un DBGrid (sin filtrar) que el locate me encuentre los registros, el primero y despues con la Tecla F3 seguir buscando los registros que sean igual a la condicion buscada. Pero no filtrar la base por la condicion, sino mostrar todos los registros e ir moviendo el puntero por cada registro que encuentre el locate segun la condicion dada en un Edit.
Vaya, que si Delphi tuviera el LocateNext sería genial!

Gracias
Responder Con Cita
  #9  
Antiguo 21-09-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Bueno, yo hice alguna vez algo como lo que tú quieres pero fue hace mucho tiempo y ahora que lo reviso me queda la sensación de que debe haber una forma más sencilla.

Básicamente lo que hice fue ejecutar una consulta auxiliar para la búsqueda, es decir, hay una consulta sin filtrar que es la que se enlaza al DBGrid y una segunda consulta (un Query) correspondiente a la búsqueda del usuario.

Cada vez que se aprieta el botón "Siguiente" (o la tecla F3 en tú caso) lo que hago es esto:

1. Ejecuto el método Next de la consulta auxiliar.
2. Leo el valor de la llave primaria del registro actual.
3. Uso ese valor en el método Locate de la consulta principal.

De todas maneras, es algo que ya no haría actualmente. Eso de mostrar al usuario todos los (posiblemente miles de) registros para luego ir buscando entre ellos la información deseada, es cosa del pasado.

Pero tus razones tendrás, así que lo anterior tómatelo sólo como un consejo. El método que te describo debe funcionarte.

// Saludos
Responder Con Cita
  #10  
Antiguo 21-09-2011
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
Cita:
Pero no filtrar la base por la condicion, sino mostrar todos los registros e ir moviendo el puntero por cada registro que encuentre el locate segun la condicion dada en un Edit.
Hola cubanbaker.

No entendía lo que buscabas, pero ahora creo que querés hacer algo similar a una busqueda incremental.

Para eso bastaría que usaras un ADOQuery con un DataSource asociado, un DBGrid asociado al anterior y agregues este código al evento OnChange del Edit:
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
  with ADOQuery1 do
  begin
    Close;
    SQL.Text:= 'SELECT * FROM TU_TABLA WHERE TU_CAMPO LIKE :DATO ORDER BY TU_CAMPO';
    Parameters.ParamByName('DATO').Value:= Edit1.Text+'%';
    Open;
  end;
end;
Donde los nombres TU_TABLA y TU_CAMPO deberás reemplazarlos por los que utilices en tu caso.

Pero como te digo, no sé si te he interpretado bién...

Un saludo.

Edito: Se me olvidó agregar ORDER BY.
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 21-09-2011 a las 20:38:47.
Responder Con Cita
  #11  
Antiguo 21-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Talking

Perfecto! Ahora sí funciona!! Tomé los consejos.
Eso es lo que yo quería. Es que yo lo digo, ustedes son genios!
Gracias a TODOS por la ayuda una vez mas y un abrazo

Manuel
Responder Con Cita
  #12  
Antiguo 21-09-2011
Avatar de alej.villa
alej.villa alej.villa is offline
Miembro
NULL
 
Registrado: may 2011
Ubicación: Caracas, Venezuela
Posts: 76
Poder: 13
alej.villa Va por buen camino
Thumbs up

Te invito a que coloques cual fue la solucion que te ayudo en tu problema, asi por si a otra persona se le presenta el mismo caso sabra que solucion tomar
Responder Con Cita
  #13  
Antiguo 21-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Usé el consejo de Roman en cuanto a hacer una consulta auxiliar para buscar sin filtrar y utilizar el valor en el locate de la consulta principal. (Roman, es que necesito estar viendo todos los registros para comparar...) Ya he tenido problemas con filter y locate, porque el locate ignora el filtro (en mi Delphi)
Además utilice el método de eficsa que me hizo la búsqueda mas efectiva.
Realmente la solución que me dieron dió un producto mejor del que yo había pensado.
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
Buscar siguiente SQL paladincubano SQL 4 12-03-2008 20:06:34
Ubicar el siguiente registro de un LOCATE ?? amadis Conexión con bases de datos 2 13-10-2007 15:58:48
Problemas con Locate Usando DBEdit servicomp Conexión con bases de datos 2 08-04-2006 20:36:20
Locate no buscar parcialmente, por que? URBANO Conexión con bases de datos 13 14-10-2005 20:14:22
Buscar siguiente en Lista con SQL rogeriobeltran Firebird e Interbase 6 23-07-2004 17:02:41


La franja horaria es GMT +2. Ahora son las 16:49:44.


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