Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18

    Ricerca in una ADO table in Delphi

    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.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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:
    codice:
    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:
    codice:
    ADOTable1.DisableControls;
    try
      ADOTable1.Locate('CITTA', 'Roma', [loCaseInsensitive]);
    finally
      ADOTable1.EnableControls;
    end;
    Buon lavoro!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    Grazie mille. Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    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

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    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?

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    Grazie mille! Adesso funziona tutto correttamente. Scusami per le mie insistenti domande. Grazie ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.