首页 > 解决方案 > 如何使用 executeQueryWithParameters 和 SQLBuilderSelectExpression 在 Microsoft Dynamics 中加入 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());

标签: sqlselectaxaptax++dynamics-365-operations

解决方案


以下是将代码编写为标准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 查询,查看 AOT\Queries\VendTableListPage并扩展数据源并从中学习。


推荐阅读