使用AOT查询和X++select语句有什么区别
What is the difference between the use of AOT query and X++ select statement
在AX编程最佳实践中,最好的方法是:
- 使用从 AOT 创建的查询,
- 使用带有 X++ 代码的 select 语句,
- 使用使用 X++ 代码创建的查询,查询类 ...
什么时候使用它们中的每一个?
首先,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_from
、update_recordset
和 insert_recordset
浮现在脑海中。
- 避免外部依赖(如 AOT 查询)有时可能更为重要。
- X++ 查询的代码可读性优于查询构造。
在数据库中selecting记录的主要技术如下:
- select 语句
- 一个查询
技术本质上是相同的。他们都在一个可以访问的 table 变量中从数据库提供一组记录。
在以下情况下使用 select 语句:
- select离子标准很复杂。
- 您正在 select 从 X++ 收集一组记录。用户不会更改 selection 标准。
在以下情况下使用查询:
- 用户可以选择select编辑哪些记录。
- 用户可以更改要编辑的记录范围select。
- selection 标准并不比查询可以容纳的更复杂。
- 当您使用查询时,在应用程序对象树 (AOT) 中开发它们或在您的代码中从头开始构建它们。在这两种情况下,都可以在代码中修改查询。可以保存在代码中从头开始构建的查询,以便它出现在 AOT 中。但是,通常应避免这种情况。
在以下时间在 AOT 中构建查询:
- 许多地方都在使用特定的查询定义。 (AOT 中的查询可以重复使用。)
- 查询必须包含代码。
- 查询定义比较复杂。 AOT 提供查询的可视化表示。
在AX编程最佳实践中,最好的方法是:
- 使用从 AOT 创建的查询,
- 使用带有 X++ 代码的 select 语句,
- 使用使用 X++ 代码创建的查询,查询类 ...
什么时候使用它们中的每一个?
首先,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_from
、update_recordset
和insert_recordset
浮现在脑海中。 - 避免外部依赖(如 AOT 查询)有时可能更为重要。
- X++ 查询的代码可读性优于查询构造。
在数据库中selecting记录的主要技术如下:
- select 语句
- 一个查询
技术本质上是相同的。他们都在一个可以访问的 table 变量中从数据库提供一组记录。
在以下情况下使用 select 语句:
- select离子标准很复杂。
- 您正在 select 从 X++ 收集一组记录。用户不会更改 selection 标准。
在以下情况下使用查询:
- 用户可以选择select编辑哪些记录。
- 用户可以更改要编辑的记录范围select。
- selection 标准并不比查询可以容纳的更复杂。
- 当您使用查询时,在应用程序对象树 (AOT) 中开发它们或在您的代码中从头开始构建它们。在这两种情况下,都可以在代码中修改查询。可以保存在代码中从头开始构建的查询,以便它出现在 AOT 中。但是,通常应避免这种情况。
在以下时间在 AOT 中构建查询:
- 许多地方都在使用特定的查询定义。 (AOT 中的查询可以重复使用。)
- 查询必须包含代码。
- 查询定义比较复杂。 AOT 提供查询的可视化表示。