Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Buscar siguiente registro con F3 en un DBGrid usando Locate (https://www.clubdelphi.com/foros/showthread.php?t=75820)

cubanbaker 21-09-2011 04:53:44

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

duilioisola 21-09-2011 08:20:02

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;

newtron 21-09-2011 08:32:17

Y.... ¿no quedaría más elegante hacer un select y que solamente quedaran los registros que cumplan la condición?

Saludos

DarKraZY 21-09-2011 08:41:06

Cita:

Empezado por newtron (Mensaje 412817)
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!

cubanbaker 21-09-2011 19:18:05

Ok, muchas gracias.
No es como yo hubiera querido, pero si no hay de otra, lo haré como ustedes me dicen...:(

Gracias

roman 21-09-2011 19:26:31

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

alej.villa 21-09-2011 19:59:10

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

cubanbaker 21-09-2011 20:00:04

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

roman 21-09-2011 20:25:14

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

ecfisa 21-09-2011 20:27:59

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... :rolleyes:

Un saludo.

Edito: Se me olvidó agregar ORDER BY.

cubanbaker 21-09-2011 21:26:40

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

alej.villa 21-09-2011 21:32:11

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 :rolleyes:

cubanbaker 21-09-2011 21:50:10

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!


La franja horaria es GMT +2. Ahora son las 14:08: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