如何在 Microsoft Dynamics 中使用 executeQueryWithParameters 和 SQLBuilderSelectExpression 加入 x++/sql 语句?

问题描述

在 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 并扩展数据源并从中学习。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...