Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568

    [DELPHI] Ricerca in database

    Ciao ragazzi. Sempre per quella rubrica che sto facendo.
    Ho creato diversi file database che vengono caricati in diverse dbgrid in diverse pagine di pagecontrol con diversi dataset e datasource.
    Ora devo creare un form per la ricerca nei database. Vorrei fare un form che ricerca il nome. Allora devo prima salvare il nome che è stato scritto in un edit in una stringa, poi devo leggere il primo carattere della stringa e vedere se è una m devo fargli cercare la stringa nel file m.dat altrimenti in un altro file. Come faccio a fare cercare in un database una strnga? Il mio problema è anche fare aprire la pagina m del pagecontrol e spostare il cursore sul nome cercato nella dbgrid. Come faccio?
    Poi per la ricerca di un numero devo fare cercare in tutti i database che ho creato . Come faccio?
    Per favore raga aiutatemi, la rubrica serve a mio padre per lavoro.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Diversi aspetti del tuo procedimento mi lasciano dubbioso. :master:

    Innanzitutto, credo che tu abbia commesso un errore nella progettazione del database. Dovresti avere un unico file in cui sono contenuti tutti i nominativi della rubrica; per effettuare delle ricerche, dovrai poi servirti di un algoritmo (già pronto o da realizzare) che ti estrae dall'intero archivio solo i nominativi che corrispondono al criterio di ricerca che hai specificato.

    Spero che tu non abbia creato un file per ogni lettera dell'alfabeto!

    Quale formato hai utilizzato per la creazione del database? Conoscere il formato è importante per sapere quali strumenti hai già a disposizione senza doverli implementare. I componenti di Delphi ti permettono di eseguire delle "query", cioè di specificare i criteri di ricerca in un comando scritto utilizzando il linguaggio SQL, un linguaggio standardizzato per l'elaborazione dei dati, ottenendo senza fatica i dati cercati. Ovviamente, tutto ciò funziona se hai inserito i tuoi dati in un formato di database diffuso e non proprietario (di tua invenzione)...ma il nome m.dat che hai attribuito al file mi incute terribili sospetti! :sgrat:

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    beh alka siccome io non ho mai usato i database i tuoi sospeti sono fondati. Ma siccome a mio padre serve la rubrica io ci ho provato lo stesso.
    Ho creato file per tutte le lettere dell'alfabeto.
    Perchè volevo caricare i nomi con diverse iniziali in diverse dbgrid presenti nelle pagine del pagecontrol.
    Cioè nella pagina m del pagecontrol, c'è una dbgrid con i nomi che iniziano per m, e lo stesso per le altre pagine.
    Più che altro la rubrica che serve a mio padre è una rubrica che stampi i nomi in formato agendina tascabile ma vuole anche la ricerca
    Sono superconfuso

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Ma come li hai creati i file? Cosa hai utilizzato??
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    ho semplicemente scritto che alla chiusura del form il client data set deve creare i file.dat. Così:
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    SalvaRubrica;
    end;

    procedure Tform1.SalvaRubrica;
    begin
    ClientDataSet1.SaveToFile('a.dat');
    ClientDataSet2.SaveToFile('b.dat');
    ClientDataSet3.SaveToFile('c.dat');
    ClientDataSet4.SaveToFile('d.dat');
    ClientDataSet5.SaveToFile('e.dat');
    ClientDataSet6.SaveToFile('f.dat');
    ClientDataSet7.SaveToFile('g.dat');
    ClientDataSet8.SaveToFile('h.dat');
    ClientDataSet9.SaveToFile('i.dat');
    ClientDataSet10.SaveToFile('l.dat');
    ClientDataSet11.SaveToFile('m.dat');
    ClientDataSet12.SaveToFile('n.dat');
    ClientDataSet13.SaveToFile('o.dat');
    ClientDataSet14.SaveToFile('p.dat');
    ClientDataSet15.SaveToFile('q.dat');
    ClientDataSet16.SaveToFile('r.dat');
    ClientDataSet17.SaveToFile('s.dat');
    ClientDataSet18.SaveToFile('t.dat');
    ClientDataSet19.SaveToFile('u.dat');
    ClientDataSet20.SaveToFile('v.dat');
    ClientDataSet21.SaveToFile('z.dat');

    end;

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    L'uso del TClientDataSet sembra una buona scelta. Quello che dovresti rivedere è la struttura della tua base dati.

    Cerco di darti la mia opinione a livello teorico poichè non posso scriverti un articolo sui database e sulla gestione delle basi di dati qui.

    Ad ogni modo, per rendere efficiente la tua rubrica, utilizza un file solo in cui andrai a inserire tutti i nominativi. Utilizza la proprietà FieldDefs del ClientDataSet per definire la struttura della tabella (campo nome, campo cognome, ecc.) successivamente fai clic con il tasto destro sul componente e scegli "Create Database" per fargli creare la tabella di cui hai bisogno. Imposta la proprietà FileName inserendo il nome del file in cui salvare i dati e la struttura, mantenendo le estensioni predefinite che ti vengono proposte (.xml).
    Sempre con il tasto destro, ti troverai altri comandi da eseguire: "Load from MyBase table...", "Save to MyBase table...", ...usali per salvare e caricare la struttura a designtime.
    MyBase è il nome del particolare formato usato dal ClientDataSet.

    Nel tuo form, disponi una sola griglia che andrà a visualizzare i dati della tabella. Invece di un PageControl, usa un TabControl: è analogo, ma non supporta pagine multiple con diversi controlli. A seconda della pagina selezionata ("a", "b", "c", "d"...) usa in modo appropriato le proprietà Filter e Filtered del ClientDataSet (leggi la Guida in linea per avere informazioni in merito) visualizzando così solo quelli che iniziano per "a", "b", "c", "d" e così via...
    La sintassi di impostazione del filtro la trovi sulla Guida.

    Spero di averti dato qualche utile indicazione...

    In generale, cerca di essere un po' più intraprendente nell'uso dei componenti: inseriscili, modifica le proprietà, richiama dei metodi e vedi l'effetto che ottieni...se ti fermi sempre al primo ostacolo, sarai portato a farlo sempre e non riuscirai a districarti nelle situazioni analoghe se non avrai qualcuno a disposizione a fornirti la soluzione completa.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  7. #7
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    Allora ho provato a fare un nuovo progetto per prova. Ho messo un TClientDataSet, sono andato nella proprieta FieldsDef e ho messo i fields Nome e Telefono, poi ho clikkato sul clientdataset con il tasto destro e ho clikkato su 'create dataset' ma mi ha dato un errore:"Invalid field type", in FileName ho messo il nome agenda.xml.
    Per il tabcontrol, non ho capito come si creano da sole le diverse pagine e come devo gestirle con i filtri, la guida non è chiara.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    L'errore che ti ha restituito il ClientDataSet è dovuto probabilmente al fatto che non hai attribuito un tipo di dati alla definizione del campo. Ogni campo deve avere un tipo di dati associato: stringa, valore intero, a virgola mobile, data/ora, ecc.

    Per il TabControl, forse non ti è chiaro cosa lo differenzia dal PageControl. Entrambi i controlli possono contenere altri controlli, ma il primo è composto da una area comune per tutte le pagine, mentre il secondo fornisce tante aree editabili quante sono le pagine (TabSheet) definite.
    Nel tuo caso, è inutile ripetere il controllo DBGrid duplicandolo n volte nelle varie pagine per ciascuna lettera dell'alfabeto; ti basterebbe disporre sul form un TabControl, inserire al suo interno un unico DBGrid che visualizzi il tuo ClientDataSet. La proprietà Tabs ti permette di definire le pagine del controllo (che saranno le lettere dell'alfabeto). L'evento OnChange ti segnala quando l'utente sceglie una nuova pagina: a quel punto, in base alla lettera corrispondente alla pagina selezionata, imposti il filtro sul ClientDataSet in modo da visualizzare nella DBGrid solo quei nominativi che iniziano con quella lettera.

    Provare...provare...provare...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    pur avendo letto la guida non ho capito come bisogna impostare il filtro!!!
    scusa se ti sembrano sciocche le cose che ti chiedo

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465

    Applicare un filtro al TClientDataSet

    Per il filtro, la guida ti serve solamente per vedere come specificarlo, cioè per conoscere la sintassi di composizione del filtro.

    A livello teorico, ti basta sapere che è possibile limitare il numero di record che il ClientDataSet ti restituisce (e che vedi nella griglia) definendo un criterio che va inserito in qualche modo nella proprietà Filter del ClientDataSet. Quando imposti la proprietà Filtered a True, il filtro entra in azione e i record vengono ricaricati e valutati uno per uno per vedere se corrispondono al filtro specificato. Quando devi cambiare il filtro (ad esempio, quando viene selezionata una nuova lettera iniziale), ti basta impostare Filtered a False, modificare la proprietà Filter e successivamente ripristinare Filtered a True per attivare il nuovo criterio di filtraggio record.

    In alternativa, è possibile anche servirsi dell'evento OnFilterRecord del ClientDataSet che viene richiamato ogni volta che è necessario filtrare un record, cioè valutare se deve essere utilizzato oppure no; in questo evento, ti basta leggere il valore del campo interessato attraverso il parametro DataSet (che rappresenta il ClientDataSet) e impostare il parametro Accept a True se il record deve essere accettato (visualizzato) oppure False se deve essere scartato.

    Un esempio:
    codice:
    procedure TForm1.ClientDataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
    var
      s: string;
    begin
      // Acquisisce il campo NOME del record corrente
      s := DataSet.FieldByName('NOME').AsString;
      // Accetta il record solo se il NOME inizia per "a"
      Accept := (s[1] = 'a');  
    end;
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

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 © 2025 vBulletin Solutions, Inc. All rights reserved.