Ordinamento e filtro dei dati nel codice

Completato

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);