PDA

Ver la Versión Completa : Buscar siguiente registro con F3 en un DBGrid usando Locate


cubanbaker
21-09-2011, 04:53:44
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

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

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

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!