X++ 奇数计数结果
X++ Odd count result
当我在 X++ 中进行计数时,我遇到了一个非常奇怪的结果,这是我以前从未遇到过的。我正在执行我认为非常简单的计数查询,但我似乎无法获得我想要的结果。
WMSOrderTrans orderTrans;
WMSOrderTrans orderTransChk;
;
select count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX';
info(strFmt('Count is %1', orderTrans.RecId));
while select orderTransChk group by shipmentid where orderTransChk.inventTransRefId == 'XXXXXX' {
info(strFmt('Shipment is %1', orderTransChk.shipmentId));
}
我正在 selecting 的数据集都只有 1 个 shipmentid,所以第一个 select 我期望计数为 1,但我得到的是 4(这是多少行transrefid 存在)。如果我将计数从 'RecId' 更改为 'ShipmentId',那么我得到的不是计数,而是实际的 shipmentId。我只是想让它 return 记录的数量,我相信这是我要求它做的。
我真的看不出我错过了什么。
在 select 期间,我得到了我期望的结果(发货 ID),只有 1 个循环信息日志消息。这告诉我带有 where 子句的 group by 正在工作,但它没有解释为什么第一个 count select 语句没有像我预期的那样运行。
供参考,这是AX2012 R1系统。
我会尝试同步数据库,然后重新启动 AOS。我没有看到任何明显的错误,所以它指向弹跳一切。
尝试通过此方法获取 select 语句(从记忆中检查语法),然后直接查看针对 SQL 的查询。它使用 generateOnly
.
select generateOnly count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX';
info(orderTrans.getSQLStatement());
如果我理解你想要实现的目标,你会希望得到这样的东西 SQL 查询:
select count(distinct shipmentid) from orderTrans
where inventTransRefId = 'XXXXXX'
'distinct' 关键字在 AX select 命令中不可用。 group by 子句将允许您迭代所有不同的值,但不能在其之上使用聚合。
您可以使用 sql 连接来推送您想要的 sql 命令。
在 AX 中,聚合值存储在使用的字段中:Count(RecId),计数将进入 recid 字段,否则系统可能需要在运行时在缓冲区中添加新字段。我不认为你可以在 group by 子句上聚合,因为它的价值很重要。
您可以尝试(我没有 AX 来测试它)使用查询:
Query query = new Query();
QueryRun queryRun;
QueryBuildDataSource qbd;
qbd = query.addDataSource(tablenum(OrderTrans));
qbd.addRange(fieldNum(OrderTrans, InventTransId)).value("xxxx");
qbd.addSortField(fieldNum(OrderTrans, ShipmentId));
qbd.SortOrder(SortOrder::GroupBy);
queryRun = new QueryRun(query);
info(strfmt("Total Records in Query %1",SysQuery::countTotal(queryRun)));
对于可能有兴趣了解我的答案的任何人,它与 Jeff 的回复有关。一天结束的时候,我看数据不够好,查询返回了正确的结果。我最初以为有许多独特的货物,但我错了。我的预期结果是错误的。文件中有 4 行,但这些行对于项目而言是唯一的,而不是货件。他们都在同一批货上。所以真的,我自己的错,它表明人们真的需要仔细查看数据。
感谢所有回复,非常感谢。
当我在 X++ 中进行计数时,我遇到了一个非常奇怪的结果,这是我以前从未遇到过的。我正在执行我认为非常简单的计数查询,但我似乎无法获得我想要的结果。
WMSOrderTrans orderTrans;
WMSOrderTrans orderTransChk;
;
select count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX';
info(strFmt('Count is %1', orderTrans.RecId));
while select orderTransChk group by shipmentid where orderTransChk.inventTransRefId == 'XXXXXX' {
info(strFmt('Shipment is %1', orderTransChk.shipmentId));
}
我正在 selecting 的数据集都只有 1 个 shipmentid,所以第一个 select 我期望计数为 1,但我得到的是 4(这是多少行transrefid 存在)。如果我将计数从 'RecId' 更改为 'ShipmentId',那么我得到的不是计数,而是实际的 shipmentId。我只是想让它 return 记录的数量,我相信这是我要求它做的。
我真的看不出我错过了什么。
在 select 期间,我得到了我期望的结果(发货 ID),只有 1 个循环信息日志消息。这告诉我带有 where 子句的 group by 正在工作,但它没有解释为什么第一个 count select 语句没有像我预期的那样运行。
供参考,这是AX2012 R1系统。
我会尝试同步数据库,然后重新启动 AOS。我没有看到任何明显的错误,所以它指向弹跳一切。
尝试通过此方法获取 select 语句(从记忆中检查语法),然后直接查看针对 SQL 的查询。它使用 generateOnly
.
select generateOnly count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX';
info(orderTrans.getSQLStatement());
如果我理解你想要实现的目标,你会希望得到这样的东西 SQL 查询:
select count(distinct shipmentid) from orderTrans
where inventTransRefId = 'XXXXXX'
'distinct' 关键字在 AX select 命令中不可用。 group by 子句将允许您迭代所有不同的值,但不能在其之上使用聚合。 您可以使用 sql 连接来推送您想要的 sql 命令。
在 AX 中,聚合值存储在使用的字段中:Count(RecId),计数将进入 recid 字段,否则系统可能需要在运行时在缓冲区中添加新字段。我不认为你可以在 group by 子句上聚合,因为它的价值很重要。
您可以尝试(我没有 AX 来测试它)使用查询:
Query query = new Query();
QueryRun queryRun;
QueryBuildDataSource qbd;
qbd = query.addDataSource(tablenum(OrderTrans));
qbd.addRange(fieldNum(OrderTrans, InventTransId)).value("xxxx");
qbd.addSortField(fieldNum(OrderTrans, ShipmentId));
qbd.SortOrder(SortOrder::GroupBy);
queryRun = new QueryRun(query);
info(strfmt("Total Records in Query %1",SysQuery::countTotal(queryRun)));
对于可能有兴趣了解我的答案的任何人,它与 Jeff 的回复有关。一天结束的时候,我看数据不够好,查询返回了正确的结果。我最初以为有许多独特的货物,但我错了。我的预期结果是错误的。文件中有 4 行,但这些行对于项目而言是唯一的,而不是货件。他们都在同一批货上。所以真的,我自己的错,它表明人们真的需要仔细查看数据。
感谢所有回复,非常感谢。