コードでのデータの並べ替えとフィルター処理

完了

前の例では、データベースからレコードを取得する方法について説明しました。 このデータは、既定では主キーで並べ替えられます。

Find または FindSet ステートメントを実行する前に、データをどのように並べ替えるかを指定できます。 その結果は、特に FindFirst ステートメントでは異なる場合があります。

SetCurrentKey 関数

レコードを並べ替えるには、SetCurrentKey 関数を使用します。このとき、並べ替えの基準にするフィールドを指定できます。

var
    customer: Record Customer;
begin
    customer.SetCurrentKey(City);

    customer.FindFirst();
    Message('%1', customer);

SetRange 関数と SetFilter 関数

並べ替えに加えて、結果をフィルター処理することもできます。 この方法を使用すると、データベースからすべてのデータを取得する必要がないため、パフォーマンスが向上します。

データセットをフィルター処理するための 2 つの可能性は、SetRangeSetFilter です。

SetRange 関数を使用すると、特定のフィールドの開始値と終了値を指定できます。 ただし、SetRange 関数を使用して、フィールド値が特定の値より大きい、または小さいレコードを検索することはできません。

SetRange(Field, [FromValue], [ToValue])

次の例では、SetRange 関数を使用しています。

customer.SetRange("No.", '10000', '40000');
customer.FindSet();
repeat
    Message('%1', customer);
until customer.Next() = 0;

ToValue 関数を省略することは、FieldFromValue と等しいすべてのレコードを検索する必要があることを意味します。

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

複数のフィールドで検索とフィルター処理を行うには、複数の SetRangeSetFilter のステートメントを指定します。

次の例では、番号が 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);