使用AOT查询和X++select语句有什么区别

What is the difference between the use of AOT query and X++ select statement

在AX编程最佳实践中,最好的方法是:

什么时候使用它们中的每一个?

首先,AX 始终在内部使用查询,X++ selects 被转换为查询构造调用,在 运行 时间执行。在第一个 queryRun.next()datasource.executeQuery() 的 运行 时间,查询被翻译成 SQL。因此,使用一个或另一个没有性能差异。

表单也使用查询,大多数情况下它是自动为您构建的,因为 属性 AutoQuery 有一个默认值 Yes。您 可以 executeQuery 方法中使用 X++ select,但我认为这是不好的做法,因为用户将没有可用的过滤器或排序选项。始终在表单中使用查询,更喜欢使用自动查询。如果需要,使用 this.queryBuildDatasource()init 方法中添加范围或排序。始终使用 AOT 查询的列表页除外。

RunBase 类 中更喜欢使用查询,因为用户可以选择更改查询。您可能会在内部循环中使用简单的 X++ select,但如果可能,请考虑将其包含在预构建查询中。

否则,作为程序员,你的首要目标(除了解决问题)是尽量减少代码行数。

AOT 中定义的查询从零代码行开始,这对它们有利。因此,如果有多个 静态 定义的范围、链接或复杂连接,请使用 AOT 查询。你打不过:

QueryRun qr = new QueryRun(queryStr(MyQuery))
qr.query().dataSourceTable(tableNum(MyTable)).findRange(fieldNum(MyTable,MyField)).value('myValue');

有:

Query q = new Query();
QueryRun qr = new QueryRun(q);
QueryBuildDataSource ds = q.addDataSource(tableNum(MyTable));
QueryBuildRange qbr = ds.addRange(fieldNum(MyTable,MyField));
qbr.value('myValue');
qbr.locked(true);

因此在静态情况下更喜欢使用 AOT 查询,然后在 运行 需要时更改查询。另一方面,如果您的 table 仅在 运行 时间已知,则您不能使用 AOT 查询,也不能使用 X++ selects,并且您需要在 [=59] 构建查询=]时间。 table 浏览器就是一个很好的例子。

X++ 还剩下什么?

  • 简单 select 带有小的 where 子句和简单连接或没有连接。
  • 无法使用查询的情况(还),delete_fromupdate_recordsetinsert_recordset 浮现在脑海中。
  • 避免外部依赖(如 AOT 查询)有时可能更为重要。
  • X++ 查询的代码可读性优于查询构造。

在数据库中selecting记录的主要技术如下:

  • select 语句
  • 一个查询

技术本质上是相同的。他们都在一个可以访问的 table 变量中从数据库提供一组记录。

在以下情况下使用 select 语句:

  • select离子标准很复杂。
  • 您正在 select 从 X++ 收集一组记录。用户不会更改 selection 标准。

在以下情况下使用查询:

  • 用户可以选择select编辑哪些记录。
  • 用户可以更改要编辑的记录范围select。
  • selection 标准并不比查询可以容纳的更复杂。
  • 当您使用查询时,在应用程序对象树 (AOT) 中开发它们或在您的代码中从头开始构建它们。在这两种情况下,都可以在代码中修改查询。可以保存在代码中从头开始构建的查询,以便它出现在 AOT 中。但是,通常应避免这种情况。

在以下时间在 AOT 中构建查询:

  • 许多地方都在使用特定的查询定义。 (AOT 中的查询可以重复使用。)
  • 查询必须包含代码。
  • 查询定义比较复杂。 AOT 提供查询的可视化表示。