Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247

    [DELPHI] Filtraggio avanzato con sintassi SQL di un DataSet

    Salve a tutti, cercavo di filtrare un dataset con questo codice:

    codice:
    InizioCognome := 'Ros';
    // ......
    DataSet.Filtered := False; 
    DataSet.Filter := 'Cognome LIKE ' + QuotedStr(InizioCognome ) + '%'); 
    DataSet.Filtered := True;
    Quello che voglio fare è filtrare il dataset in modo che vengano mostrati solo i record nei quali il campo "Cognome" inzia con una certa sequenza di caratteri.

    Ma sembra che la sintassi SQL non sia accettata...

    Cos'altro posso fare?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Qual è il database di riferimento? FireBird?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Il database di riferimento è MySQL, a cui accedo via ODBC.

    Mi sa che l'unica cosa che posso fare è utilizzare una query apposita (e non una tabella), oppure cerco dei componenti VCL pensati apposta per lavorare con MySQL.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Scusa, ho letto male, non ho fatto a caso al codice, quindi ti ho fatto in realtà una domanda irrilevante.

    Filtered lavora in modo indipendente dal database, poiché agisce sui dati una volta che sono stati ottenuti lato client.

    Verifica nella Guida in linea la sintassi da utilizzare nella proprietà Filter.

    Nel caso in cui non esista il criterio adatto alle tue esigenze, poiché articolato, complesso o non supportato, puoi sempre usare l'evento OnFilterRecord (al posto della proprietà Filter) per determinare quali sono i record che accetti oppure no.

    Secondo me, però, è meglio inoltrare il filtro direttamente alla query SQL, in modo da evitare lo scaricamento di record non necessari.

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

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Secondo me, però, è meglio inoltrare il filtro direttamente alla query SQL, in modo da evitare lo scaricamento di record non necessari.
    Non è così semplice... Quello che volevo implementare era un "search-as-you-type", ed è inconcepibile fare una nuova query ogni volta che l'utente preme un tasto...

    Ma ho trovato una soluzione. Innanzitutto ho installato in prova i MySQL Data Access Components (http://www.crlab.com), e sto pensando di acquistarli perché sono veramente meravigliosi.
    La classe TMyTable (discendente da TDataSet) contiene la proprietà FilterSQL, che permette di effettuare il filtraggio con un'istruzione SQL, senza tuttavia ricaricare i dati dal server.

    Poi ho creato un thread:

    codice:
    procedure TSQLFilterThread.Execute;
    begin
      try
        while not Terminated do
          begin
            Sleep(750);
            PostMessage(Form1.Handle, WM_FILTER_GRID, 0, 0);
          end;
      except
        on e : Exception do ThreadException := e.Message;
      end;
    end;
    Il thread ogni 750 millisecondi invia alla form un messaggio personalizzato (WM_FILTER_GRID). Il messaggio viene catturato da un apposito handle, che verifica il testo contenuto nel campo di ricerca ed esegue il filtraggio con TMyTable.FilterSQL.

    Il risultato è una sorta di "search-as-you-type".

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da firefox88
    Non è così semplice... Quello che volevo implementare era un "search-as-you-type", ed è inconcepibile fare una nuova query ogni volta che l'utente preme un tasto...
    Dillo subito.

    Originariamente inviato da firefox88
    Ma ho trovato una soluzione. [...]
    Bastava usare l'evento OnFilterRecord sul componente TClientDataSet usando un banale TTimer per la temporizzazione delle ricerche (con una verifica quando l'utente smette di digitare o riprende...).

    Non sono necessari componenti di terze parti per fare quanto chiedi, oppure thread esterni che mandano messaggi sincroni all'applicazione (che sostanzialmente è lo stesso principio di funzionamento del classico "timer" di Windows).

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

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247
    Come sempre hai ragione tu, alka

    Però un lato positivo c'è: ho fatto pratica coi thread e coi "messaggi" (che per me sono stati una scoperta grandiosa).

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.