Axapta AOT查询与X++;select语句
在AX编程最佳实践中,哪种方法是最好的:Axapta AOT查询与X++;select语句,axapta,x++,Axapta,X++,在AX编程最佳实践中,哪种方法是最好的: 使用从AOT创建的查询 在X++代码中使用select语句 使用用X++代码创建的查询,查询类 什么时候使用它们中的每一个?首先,AX总是在内部使用查询,X++选择被转换为查询构造调用,这些调用在运行时执行。查询在运行时在第一个queryRun.next()或datasource.executeQuery()上转换为SQL。因此,使用一个或另一个都不会有性能差异 表单也使用查询,通常是为您自动构造的,因为属性AutoQuery有一个“是”默认值。您可
- 使用从AOT创建的查询
- 在X++代码中使用select语句
- 使用用X++代码创建的查询,查询类
什么时候使用它们中的每一个?首先,AX总是在内部使用查询,X++选择被转换为查询构造调用,这些调用在运行时执行。查询在运行时在第一个
queryRun.next()
或datasource.executeQuery()上转换为SQL。因此,使用一个或另一个都不会有性能差异
表单也使用查询,通常是为您自动构造的,因为属性AutoQuery
有一个“是”默认值。您可以在<代码> ExcUTEQueQue/Cuff>方法中使用X++选择,但我会认为这是一个错误的做法,因为用户将没有可用的过滤器或排序选项。始终在表单中使用查询,更喜欢使用自动查询。如果需要,使用this.queryBuildDatasource()
在init
方法中添加范围或排序。例外情况是始终使用AOT查询的listpages
在RunBase
中,类更喜欢使用查询,因为用户可以选择更改查询。您可能会在内部循环中使用简单的X++选择,但如果可能的话,可以考虑将其包含在预构建的查询中。
否则,作为程序员,您的主要目标(除了解决问题外)是最小化代码行的数量
AOT中定义的查询以零代码行开始,这对它们有利。因此,如果存在多个静态定义的范围、链接或复杂联接,请使用AOT查询。你无法击败:
QueryRun qr = new QueryRun(queryStr(MyQuery))
qr.query().dataSourceTable(tableNum(MyTable)).findRange(fieldNum(MyTable,MyField)).value('myValue');
与:
因此,在静态情况下,您更喜欢使用AOT查询,然后在需要时在运行时更改查询。另一方面,如果您的表仅在运行时已知,则不能使用AOT查询,也不能使用X++选择,并且需要在运行时构建查询。表格浏览器就是一个很好的例子
X++还剩下什么
- 使用小where子句和简单或无连接进行简单选择
- 当您还不能使用查询时,
delete\u from
、update\u recordset
和insert\u recordset
就会浮现在脑海中
- 避免外部依赖(如AOT查询)有时可能更重要
- X++查询的代码可读性优于查询构造
在数据库中选择记录的主要技术如下:
- select语句
- 质询
这些技术基本上是相同的。它们都以可访问的表变量形式从数据库中传递一组记录
在以下情况下使用select语句:
- 选择标准很复杂李>
- 您正在从X++中选择一组记录。用户不会更改选择标准
在以下情况下使用查询:
- 用户可以选择要选择的记录
- 用户可以更改要选择的记录范围李>
- 选择条件并不比查询所能容纳的复杂李>
- 使用查询时,请在应用程序对象树(AOT)中开发它们,或者在代码中从头开始构建它们。在这两种情况下,都可以在代码中修改查询。可以保存代码中从头开始构建的查询,以便在AOT中进行查询。然而,这通常应该避免
在以下情况下在AOT中生成查询:
- 许多地方都在使用特定的查询定义。(可以重用AOT中的查询。)
- 查询必须包含代码李>
- 查询定义更复杂。AOT提供查询的可视化表示
回答得很好。当您说X++选择被转换为查询构造调用时,您如何知道这一点?通过查看CIL生成的XML。实际上,它不是调用,而是特定的操作码。示例bankschecklayout.find
method(第15行):…需要时也应该使用查询。谢谢Jan B.Kjelsen,这是一个非常慷慨的回答。
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);