对代码中的数据进行排序和筛选
之前的示例展示了如何从数据库中检索记录。 默认情况下,本数据按主键进行排序。
您可以在运行 Find
或 FindSet
语句之前指定对数据进行排序的方式。 结果可能不同,尤其是使用 FindFirst
语句。
SetCurrentKey 函数
要对记录进行排序,请使用 SetCurrentKey
函数,可以在其中指定要排序的一个或多个字段。
var
customer: Record Customer;
begin
customer.SetCurrentKey(City);
customer.FindFirst();
Message('%1', customer);
SetRange 和 SetFilter 函数
除了排序,您还可以筛选结果。 使用本方法,您不需要从数据库中检索所有数据,这样可提升性能。
有两种方式可以筛选数据集,即 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;
以下示例显示“或”(|
) 筛选器的用法。
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);