问题描述
在 Dynamics 365 for Finance and Operations 中,他们描述了一种将 sql 语句创建为“作为对象,而不是文本”的方法,但这在某种程度上是谎言。他们使用这些对象来创建文本,然后填充 str sqlStatement = selectExpr.getExpression(null);
这个 sqlStatement
然后将提供过时的 statement.executeQuery(sqlStatement);
。
我可以通过使用带有空地图 (executeQueryWithParameters()
) 的 sqlParams::create()
作为第二个参数来消除警告,但这似乎是“作弊”。
有没有办法我可以/应该重构以下内容以正确填充地图?
sqlBuilderSelectExpression selectExpression = sqlBuilderSelectExpression::construct();
selectExpression.parmUseJoin(true);
sqlBuilderTableEntry vendTable = selectExpression.addTableId(tableNum(vendTable));
sqlBuilderTableEntry dirPartyTable = vendTable.addJoinTableId(tableNum(DirPartyTable));
sqlBuilderFieldEntry accountNum = vendTable.addFieldId(fieldNum(vendTable,AccountNum));
sqlBuilderFieldEntry name = dirPartyTable.addFieldId(fieldNum(DirPartyTable,Name));
sqlBuilderFieldEntry dataAreaId = vendTable.addFieldId(fieldNum(vendTable,dataAreaId));
sqlBuilderFieldEntry blocked = vendTable.addFieldId(fieldNum(vendTable,Blocked));
vendTable.addRange(dataAreaId,curext());
vendTable.addRange(blocked,CustvendorBlocked::No);
selectExpression.addSelectFieldEntry(sqlBuilderSelectFieldEntry::newExpression(accountNum,'AccountNum'));
selectExpression.addSelectFieldEntry(sqlBuilderSelectFieldEntry::newExpression(name,'Name'));
str sqlStatement = selectExpression.getExpression(null);
// FIXME:
ResultSet resultSet = statement.executeQueryWithParameters(sqlStatement,sqlParams::create());
解决方法
以下是将代码编写为标准 X++
查询的方法。但是,我必须注意,您正在做的事情可能不是最好的方法。
DirPartyTable
是 AX 中的一个特殊表,因为它支持继承,所以你应该确保你完全理解框架。见:
代码:
VendTable vendTable;
DirPartyTable dirPartyTable;
while select AccountNum from vendTable
where vendTable.Blocked == CustVendorBlocked::No
// DataAreaId along with Partition,are automatically included in the query context depending
// on the company context you're executing the code from
// && vendTable.dataAreaId == curext()
join Name from dirPartyTable
where dirPartyTable.RecId == vendTable.Party
{
info(strFmt("Account: %1; Name: %2",vendTable.AccountNum,dirPartyTable.Name));
}
关于 AOT 查询,查看位于 \Queries\VendTableListPage
的 AOT 并扩展数据源并从中学习。