对代码中的数据进行排序和筛选

已完成

之前的示例展示了如何从数据库中检索记录。 默认情况下,本数据按主键进行排序。

您可以在运行 FindFindSet 语句之前指定对数据进行排序的方式。 结果可能不同,尤其是使用 FindFirst 语句。

SetCurrentKey 函数

要对记录进行排序,请使用 SetCurrentKey 函数,可以在其中指定要排序的一个或多个字段。

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

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

SetRange 和 SetFilter 函数

除了排序,您还可以筛选结果。 使用本方法,您不需要从数据库中检索所有数据,这样可提升性能。

有两种方式可以筛选数据集,即 SetRangeSetFilter

利用 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;

以下示例显示“或”(|) 筛选器的用法。

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