使用 AL 语句从数据库中检索数据
要从数据库中检索数据,可以使用数据访问函数。
可以使用以下数据访问函数获取记录:
Get
Find、FindFirst、FindLast
Next
IsEmpty
Get 函数
Get
函数基于主键检索记录。
如果表具有一个字段的主键,需要为 Get
函数提供一个参数。 如果主键是多个字段的组合键,则需要按主键定义的顺序进行提供。
在以下示例中,从 Customer 表中检索了主键为 30000 的记录。 由于 Customer 表的主键类型为 Code[20]
,因此需要将本值指定为字符串。 最好在 if
语句中使用 Get
函数。
如果找不到记录,并且不是使用 if
语句检查 Get
语句的结果,则代码会抛错。
var
customer: Record Customer;
begin
customer.Get('30000');
if customer.Get('10000') then
Message('%1', customer)
else
Error('Not found');
end;
Find 函数
Find
函数有两个派生函数:FindFirst
和 FindLast
。 在一些标准代码中,会继续使用 Find('-')
和 Find('+')
函数。 Business Central 的旧版本中使用的是这些函数。
Find('-')
和 FindFirst
的结果相同,但请求结果的方式不同。 利用 FindFirst
函数,Business Central 可要求 SQL Server 使用 SELECT TOP 1
SQL 查询检索数据库中的第一个记录。
Find('-')
函数从 SQL Server 请求 SELECT
并检索 Business Central 中的第一个记录。 本流程导致系统性能不佳。 请改用 FindFirst
和 FindLast
函数。
var
customer: Record Customer;
begin
customer.Find('-');
// SELECT * FROM Customer
Message('%1', customer.Name);
customer.Find('+');
// SELECT * FROM Customer Order By No. Desc
Message('%1', customer.Name);
customer.FindFirst();
// SELECT TOP 1 * FROM Customer
Message('%1', customer.Name);
customer.FindLast();
// SELECT TOP 1 * FROM Customer Order By No. Desc
Message('%1', customer.Name);
要检索所有记录(或一组筛选的记录),可以使用 FindSet
函数。
customer.FindSet();
// SELECT * FROM Customer
Next 语句
Next
语句用于获取记录集中的下一个记录。
通常,会在 repeat until
语句中使用 Next
语句。 可以在 Next
语句中包含一个可选参数,用于定义要继续检索的步长。 如果提供的参数值为 3,则系统始终会在列表中每隔三个记录获取一次记录。
customer.FindSet();
// SELECT * FROM Customer
repeat
// process record
Message(customer.Name);
until customer.Next() = 0;
IsEmpty 函数
如果要检查是否存在记录,但不检索该记录,则最好使用 IsEmpty
函数。
SQL Server 上的 AL 数据库方法和性能
AL 语言提供多种检索记录数据的方法。 在 Dynamics 365 Business Central 中,使用多重活动结果集 (MARS) 检索记录。 一般说来,使用 MARS 检索记录的速度比使用服务器端光标更快。 此外,还针对特定用途优化了每个函数。 要实现最佳性能,必须使用最适合给定用途的方法。
Record.Get
针对基于主键值获取单个记录进行了优化。Record.Find
针对根据记录中的主键和已设置的任何筛选器或范围获取单个记录进行了优化。Record.Find('-')
和Record.Find('+')
针对在应用程序可能无法读取所有记录时主要从单个表中读取进行了优化。Find('-')
是通过发出自调式TOP X
调用实现的,其中X
可能会基于读取的行数的统计信息,随时间发生更改。 在以下示例场景中,应使用Find('-')
函数来实现最佳性能:在过帐普通日记帐批处理之前,必须检查所有日记帐行是否有效并验证所有行均已结余。 在发现第一行有错误之后,不必再检索其余行。
如果要履行最近采购中的多个未完成订单,但不知道采购涵盖的订单数。
Record.FindSet(ForUpdate, UpdateKey)
针对读取指定筛选器和范围内的完整记录集进行了优化。 UpdateKey 参数不会影响本方法在 Dynamics 365 Business Central 中的效率,在本产品的旧版本中就是如此。FindSet
不是通过发出TOP X
调用实现的。Record.FindFirst
和Record.FindLast
针对在指定筛选器和范围内查找单个第一条或最后一条记录进行了优化。可随时调用
Record.Next
。 但是,如果不是在检索持续结果集的过程中调用Record.Next
,Business Central 会调用单独的 SQL 语句来查找下一个记录。