コードでのデータの並べ替えとフィルター処理
前の例では、データベースからレコードを取得する方法について説明しました。 このデータは、既定では主キーで並べ替えられます。
Find または FindSet ステートメントを実行する前に、データをどのように並べ替えるかを指定できます。 その結果は、特に FindFirst ステートメントでは異なる場合があります。
SetCurrentKey 関数
レコードを並べ替えるには、SetCurrentKey 関数を使用します。このとき、並べ替えの基準にするフィールドを指定できます。
var
customer: Record Customer;
begin
customer.SetCurrentKey(City);
customer.FindFirst();
Message('%1', customer);
SetRange 関数と SetFilter 関数
並べ替えに加えて、結果をフィルター処理することもできます。 この方法を使用すると、データベースからすべてのデータを取得する必要がないため、パフォーマンスが向上します。
データセットをフィルター処理するための 2 つの可能性は、SetRange と SetFilter です。
SetRange 関数を使用すると、特定のフィールドの開始値と終了値を指定できます。 ただし、SetRange 関数を使用して、フィールド値が特定の値より大きい、または小さいレコードを検索することはできません。
SetRange(Field, [FromValue], [ToValue])
次の例では、SetRange 関数を使用しています。
customer.SetRange("No.", '10000', '40000');
customer.FindSet();
repeat
Message('%1', customer);
until customer.Next() = 0;
ToValue 関数を省略することは、Field が FromValue と等しいすべてのレコードを検索する必要があることを意味します。
FromValue も省略する場合は、フィルターをリセットし、指定されたフィールドのフィルターを削除します。
customer.SetRange("No."); // Removing filter on "No." field
customer.FindSet();
repeat
Message('%1', customer);
until customer.Next() = 0;
SetRange 関数を使用して、特定の値より大きい、または小さい値を検索できないことは既に説明しました。 ただし、SetFilter 関数をその目的で使用できます。
SetFilter 関数は、次のようなフィルター条件を指定できる文字列の値を取得します。
><< ><=>='*'..(範囲)&(および)|このフィルター条件での (または) およびそれ以上
SetFilter(Field, String, [Value1], [Value2], …)
次の例では、フィルターにより 番号フィールドが 10000 より大きいが 20000 ではないすべての顧客が取得されます。
customer.SetFilter("No.", '> 10000 & <> 20000');
代わりに、プレースホルダーを使用することもできます。
value1 := '10000';
value2 := '20000';
customer.SetFilter("No.", '>%1&<>%2', value1, value2);
複数のフィールドで検索とフィルター処理を行うには、複数の SetRange や SetFilter のステートメントを指定します。
次の例では、番号が 10000 から 90000 の間にあり、City フィールドが文字 B (@ 記号は大文字と小文字を区別することを示すが、そうでない場合は常に大文字小文字を区別する) で始まり、Country/Region Code が大文字の 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;
次の例は、使用される「or」(|) フィルターを示しています。
customer.SetFilter("No.", '10000|20000|30000');
IsEmpty ステートメントでフィルター ステートメントを使用して、いずれかのレコードがフィルターに一致しているかを確認します。
DocumentNo := '10000';
SalesLine.SetRange("Document No.", DocumentNo);
if (SalesLine.IsEmpty()) then
Message('No sales line records found for document %1', DocumentNo);