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

时间:2016-12-08 10:14:28

标签: axapta x++

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

  • 使用从AOT创建的查询
  • 使用带有X ++代码的select语句
  • 使用使用X ++代码创建的查询Query classe ...

什么时候使用它们?

2 个答案:

答案 0 :(得分:9)

首先,AX始终在内部使用查询,X ++选择被转换为查询构造调用,这些调用在运行时执行。查询在运行时在第一个queryRun.next()datasource.executeQuery()上转换为SQL。因此,使用其中一个没有性能差异。

表单也使用查询,通常它是自动构造的,因为属性AutoQuery具有Yes默认值。您可以executeQuery方法中使用X ++选择,但我会考虑这种不好的做法,因为用户没有可用的过滤器或排序选项。始终在表单中使用查询,更喜欢使用自动查询。如果需要,使用initthis.queryBuildDatasource()方法中添加范围或排序。唯一的例外是总是使用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查询,然后在运行时根据需要更改查询。另一方面,如果您的表仅在运行时已知,则不能使用AOT查询,也不能选择X ++,并且您需要在运行时构建查询。表浏览器就是一个很好的例子。

X ++还剩下什么?

  • 使用小的where子句进行简单选择,并使用简单连接或无连接。
  • 您不能使用查询的情况,delete_fromupdate_recordsetinsert_recordset会浮现在脑海中。
  • 避免外部依赖(如AOT查询)有时可能更重要。
  • X ++查询的代码可读性优于查询构造。

答案 1 :(得分:2)

在数据库中选择记录的主要技巧如下:

  • 选择语句
  • 查询

这些技术基本相同。它们都在一个可以访问的表变量中从数据库中提供一组记录。

在以下时间使用select语句:

  • 选择标准很复杂。
  • 您正在从X ++中选择一组记录。用户不会更改选择标准。

在以下情况下使用查询:

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

在以下情况下在AOT中构建查询:

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