使用 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 函数有两个派生函数:FindFirstFindLast。 在一些标准代码中,会继续使用 Find('-')Find('+') 函数。 Business Central 的旧版本中使用的是这些函数。

Find('-')FindFirst 的结果相同,但请求结果的方式不同。 利用 FindFirst 函数,Business Central 可要求 SQL Server 使用 SELECT TOP 1 SQL 查询检索数据库中的第一个记录。

Find('-') 函数从 SQL Server 请求 SELECT 并检索 Business Central 中的第一个记录。 本流程导致系统性能不佳。 请改用 FindFirstFindLast 函数。

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.FindFirstRecord.FindLast 针对在指定筛选器和范围内查找单个第一条或最后一条记录进行了优化。

  • 可随时调用 Record.Next。 但是,如果不是在检索持续结果集的过程中调用 Record.Next,Business Central 会调用单独的 SQL 语句来查找下一个记录。