PDA

Visualizza la versione completa : Ricerca in una ADO table in Delphi


Alterisi
07-09-2003, 17:52
Ho un grosso problema. Essendo alle prime armi con i db sono riuscito a connettere dopo vari tentativi un db acces in delphi.
Ho utilizzato i segeni componenti: ADOConnection, ADOTable, DataSource e DBGrid.
Adesso vorrei eseuire una ricerca su tutti i field della tabella allo scopo di trovare dei valori di testo particolari.

Ad esempio nel mio db ho dei field che contengono un campo 'citta' adesso vorrei trovare i field che contengono nel campo città ad esmpio il valore 'Roma' e leggere le infomazioni degli altri campi dei field così identificati.

Spero di essere stato chiaro.

alka
08-09-2003, 02:10
Puoi utilizzare il metodo Locate del componente ADOTable per localizzare un record in base al contenuto di un campo della tabella.

Il metodo accetta 3 parametri: il primo richiede il campo (o i campi) sui quali effettuare la ricerca, il secondo permette di specificare i valori da ricercare nel campo (o nei campi), il terzo consente di specificare opzioni aggiuntive per la ricerca.

Ad esempio, supponiamo di dover ricercare nella tabella il valore "Roma" nel campo CITTA, scriveremo:


ADOTable1.Locate('CITTA', 'Roma', [loCaseInsensitive]);


C'è da precisare una cosa: il metodo Locate sposta il cursore del DataSet (la ADOTable) sul record corrispondente al criterio di ricerca; siccome possiedi una DBGrid associata, anch'essa si adeguerà alla selezione spostando il puntatore della riga corrente sul record individuato. E' una precisione importante poichè se intendi svolgere più di una ricerca per elaborare i dati nei singoli record, la griglia rifletterà ogni spostamento mostrandone l'effetto a video (che potrebbe essere spiacevole) e rallentando le operazioni.
Come soluzione, potresti adottare una seconda ADOTable non legata ad una griglia oppure disabilitare l'aggiornamento dei DataControl usando i metodi appositi EnableControls e DisableControls:


ADOTable1.DisableControls;
try
ADOTable1.Locate('CITTA', 'Roma', [loCaseInsensitive]);
finally
ADOTable1.EnableControls;
end;


Buon lavoro! :ciauz:

Alterisi
08-09-2003, 09:09
Grazie mille. Ciao

Alterisi
08-09-2003, 19:24
Scusa se ti disturbo di nuovo, il metodo locate posiziona il corsore sul primo record che rispecchia la caratteristiche richesta dalla parola da ricercare nel field, vorrei sapere se è possbile accedere anche agli altri record posizionati dopo il primo individuato e che rispettano il vincolo imposto da field: in buona sostanza vorrei che la ricerca potesse "continuare" dopo l'individuazione del primo risultato.

Se torniamo all'esempio di Citta->Roma come potrei accedere a tutti i record che contengono Roma nel campo città?
Ti rignrazio per la pasienza. Ciao

alka
08-09-2003, 19:37
Purtroppo non credo che esista un metodo adatto alle tue esigenze, almeno nella ADOTable. Altre tipologie di DataSet supportano metodi come LocateNext, ma non credo che sia presente nella ADOTable.

Un suggerimento potrebbere essere quello di impostare un filtro per visualizzare solo i record richiesti, oppure navigare via codice nel DataSet (tramite i metodi First, Next, ecc.) e verificare l'uguaglianza dei record confrontando il contenuto dei campi (ai quali puoi accedere tramite il metodo FieldByName).

Alterisi
08-09-2003, 19:43
Ho provato ad impostare un filtro, ma il metodo locate sembra eseguire la ricerca su tutti i record ignorando il filtraggio. Se questo metodo potesse essere reso efficiente risolverei tutti i miei problemi. Esiste un modo perchè questo si verifichi?

alka
08-09-2003, 19:48
Il suggerimento del filtro era una soluzione alternativa alla ricerca dei record e permetteva di ottenere solamente quei record che rispettavano il criterio di ricerca, senza doversi necessariamente posizionare su ciascun record.

Se quello che ti serve è un posizionamento progressivo su un record e poi sui successivi che rispettano il criterio di ricerca, credo che l'unica soluzione sia evitare l'uso del metodo Locate e scorrere la tabella manualmente, tramite codice, usando i metodi che ti ho suggerito, provvedendo autonomamente a confrontare il contenuto del campo con il criterio di ricerca e proseguendola se il confronto da esito negativo.

Alterisi
08-09-2003, 20:02
Grazie mille! Adesso funziona tutto correttamente. Scusami per le mie insistenti domande. Grazie ciao.

Loading