Ordinamento e filtro dei dati nel codice
Gli esempi precedenti hanno mostrato come recuperare record dal database. Per impostazione predefinita, questi dati vengono ordinati in base alla chiave primaria.
È possibile specificare come ordinare i dati prima di eseguire un'istruzione Find o FindSet. Il risultato può variare, soprattutto con un'istruzione FindFirst.
Funzione SetCurrentKey
Per ordinare record, usare la funzione SetCurrentKey in cui è possibile specificare il campo oppure i campi in base ai quali eseguire l'ordinamento.
var
customer: Record Customer;
begin
customer.SetCurrentKey(City);
customer.FindFirst();
Message('%1', customer);
Funzioni SetRange e SetFilter
Oltre all'ordinamento, è possibile filtrare risultati. Con questo metodo, non è necessario recuperare tutti i dati dal database, il che è preferibile per le prestazioni.
Le due possibilità per filtrare il set di dati sono SetRange e SetFilter.
Con la funzione SetRange è possibile impostare i valori iniziale e finale per un campo specifico. La funzione SetRange, tuttavia, non consente di cercare record in cui il valore del campo è maggiore o minore di un valore specifico.
SetRange(Field, [FromValue], [ToValue])
Di seguito è illustrato un esempio d'uso della funzione SetRange.
customer.SetRange("No.", '10000', '40000');
customer.FindSet();
repeat
Message('%1', customer);
until customer.Next() = 0;
Se si omette la funzione ToValue, è necessario cercare tutti i record in cui Field è uguale a FromValue.
Se si omette FromValue, il filtro viene reimpostato e rimosso dal campo specificato.
customer.SetRange("No."); // Removing filter on "No." field
customer.FindSet();
repeat
Message('%1', customer);
until customer.Next() = 0;
Come è noto, la funzione SetRange non consente di cercare valori maggiori o minori di un valore specifico. A tale scopo, tuttavia, si può usare la funzione SetFilter.
La funzione SetFilter accetta un valore stringa dove è possibile specificare le condizioni di filtraggio, ad esempio:
><< ><=>='*'..(intervallo)&(e)|(o) e altro in questa condizione di filtro
SetFilter(Field, String, [Value1], [Value2], …)
Nell'esempio seguente, il filtro recupererà tutti i clienti in cui il campo N. è più grande di 10000 e diverso da 20000.
customer.SetFilter("No.", '> 10000 & <> 20000');
In alternativa, si possono usare i segnaposto.
value1 := '10000';
value2 := '20000';
customer.SetFilter("No.", '>%1&<>%2', value1, value2);
Per eseguire la ricerca e applicare filtri in più campi, specificare più istruzioni SetRange e/o SetFilter.
Nell'esempio seguente vengono recuperati tutti i clienti con il valore del campo Numero compreso fra 10000 e 90000, mentre i campi City iniziano con una lettera B (il segno @ specifica che non viene osservata la distinzione tra maiuscole e minuscole, altrimenti tale distinzione viene sempre applicata) e il campo Country/Region Code inizia con una lettera maiuscola B.
customer.SetRange("No.", '10000', '90000');
customer.SetFilter(City, '@B*');
customer.SetFilter("Country/Region Code", 'B*');
customer.FindSet();
repeat
Message('%1', customer);
until customer.Next() = 0;
L'esempio seguente mostra l'uso di un filtro "o" (|).
customer.SetFilter("No.", '10000|20000|30000');
È possibile usare le istruzioni del filtro con l'istruzione IsEmpty per verificare se i record corrispondono ai filtri.
DocumentNo := '10000';
SalesLine.SetRange("Document No.", DocumentNo);
if (SalesLine.IsEmpty()) then
Message('No sales line records found for document %1', DocumentNo);