sql - 如何使用 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());
解决方案
以下是将代码编写为标准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
并扩展数据源并从中学习。
推荐阅读
- swift - 从键盘扩展 swift ipadOS 中检测物理键盘
- oracle - SSIS 适用于 Visual Studio,但不适用于集成目录
- azure - 服务器重启后登录 Cookie 无效
- r - 根据条件创建 tabsetPanel 会给出 if 语句错误
- javascript - 如何从 WebPack 包中排除目录
- python - 程序应从文件中读取并返回字典但返回类型错误
- python - 与 Iloc 不返回。IndexError:索引 0 超出轴 0 的范围,大小为 0
- css - 我希望能够定位一个包含在 section 标签中的特定 div
- mongodb - 连接多个文档类型存在于单个 MongoDB 集合/容器中
- c# - Kattis 使用 C# 解决 Jumbo Javelin 运行时错误