Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1

    [Delphi]: filtrare i record

    ciao a tutti,

    devo filtrare dei record di una tabella ADO.

    dopo aver cliccato su onfilterecord come posso impostare la procedura per visualizzare nella dbgrid solo i record con il campo "stato" di tipo TWidestring uguale a "Si" ??

    ciao

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Puoi controllare lo stato del campo utilizzando il riferimento al DataSet che ti viene passato come parametro al metodo di gestione dell'evento. Nel tuo caso, puoi scrivere un codice simile al seguente:
    codice:
    procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
    begin
      Accept := DataSet.FieldByName('stato').AsString = 'Si';
    end;
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3

    proverò. Grazie!

    ciao alka,

    provo come mi hai detto

    ciao e grazie

  4. #4

    se voglio aggiungere + filtri??

    ciao Alka,

    come mi hai detto funziona. Però se voglio aggiungere altri filtri (es. record con stato 'No') e sceglierli mediante una combobox come posso fare ??

    ciao

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Scusa per il ritardo nella risposta, ma sono stato un paio di giorni al Webb.it a Padova.

    Puoi inserire nella ComboBox la descrizione testuale di tutti i filtri che metti a disposizione. Quando giunge il momento di applicare il filtro intercettando l'evento OnFilterRecord, puoi controllare quale filtro hai selezionato ispezionando la proprietà ItemIndex del controllo ComboBox e determinare, di conseguenza, il filtro da utilizzare. Cosa vuol dire utilizzare il filtro? Vuol dire usare un if...then per distinguere il filtro selezionato nella ComboBox e, per ciascuno di essi, ispezionare il valore dei campi per vedere se corrispondono alle restrizioni del filtro richiesto. In base all'esito del controllo che fai, imposti il parametro Accept passato all'evento a True se desideri accettare il record, oppure a False se vuoi scartarlo.

    Spero di non essere stato troppo contorto.
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6

    Funziona solo una volta...

    ciao Alka,

    ho seguito le tue istruzioni, solo che il filtro mi funziona solo una volta. Quando vado a selezionare un nuovo filtro con la combo non succede nulla.

    questo il listato della procedura onfilterRecord:

    if form16.combobox1.itemindex=0 then
    accept:=DataSet.FieldByName('stato').AsString = 'Si'

    else

    if form16.combobox1.itemindex=1 then
    accept:=DataSet.FieldByName('stato').AsString = 'Si'



    nella proprietà onchange della combobox:

    filtered:=true;

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Il tuo problema deriva dal principio di funzionamento del filtro.

    Hai diversi modi per filtrare una tabella:
    [list=1][*]utilizzare un componente TQuery che ti permette di estrarre dati da una tabella specificando i criteri di selezione attraverso uno statement SQL (soluzione consigliata);[*]specificare un filtro nella proprietà Filter seguendo determinate regole che puoi leggere nella Guida in linea di Delphi; l'impostazione della proprietà Filtered a True attiva il filtro; se vuoi cambiare il filtro, occorre impostare Filtered a False, modificare opportunamente la proprietà Filter e ripristinare Filtered a True;[*]utilizzare l'evento OnFilterRecord (come hai fatto tu); l'evento viene generato durante la fase di caricamento dei dati in cui, per ogni record, è possibile controllare il contenuto dei campi e stabilire se il record deve essere accettato oppure no.[/list=1]
    Nella tua implementazione, siccome il filtro avviene giudicando ogni record in fase di "fetching" (reperimento), devi fare in modo che i record vengano ricaricati quando cambia il filtro. Prova a chiudere e riaprire la tabella quando l'utente seleziona un filtro diverso dal precedente dall'apposita ComboBox. In questo modo, si rende necessario reperire e filtrare nuovamente i record, ma verrà applicato il nuovo criterio selezionato.

    Ti ho scritto anche altre soluzioni poichè l'uso dei filtri non è il metodo ottimale, in termini di prestazioni, per selezionare dei record, anche se è semplice da utilizzare. Il motivo è che devono essere ispezionati tutti i record (invece dei soli record interessati e selezionati tramite query, ad esempio) per poter decidere se sono validi oppure no.

    Fai qualche prova, poi mi saprai dire.

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

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

  8. #8

    funziona

    ciao Alka,

    disattivando il database e riattivandolo funziona tutto.

    grazie

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Chiudi l'intero database? Non è un po' eccessivo? Basta la tabella.
    O forse ti sei solo espresso male.

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

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

  10. #10

    no la tabella, scusa...Altri tipi di filtri.

    ciao Alka,

    se voglio utilizzare come filtro i valori selezionati da una dblookupcombobox come posso calcolare la accept nella procedura onfilterRecord??

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.