Axapta X++奇数计数结果

Axapta X++奇数计数结果,axapta,microsoft-dynamics,dynamics-ax-2012,x++,Axapta,Microsoft Dynamics,Dynamics Ax 2012,X++,在X++中进行计数时,我遇到了一个非常奇怪的结果,这是我以前从未经历过的。我正在执行一个我认为非常简单的计数查询,但我似乎无法得到我想要的结果 WMSOrderTrans orderTrans; WMSOrderTrans orderTransChk; ; select count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX'; info(strFmt('

在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));
}
我选择的所有数据集只有1个shipmentid,因此我希望第一次选择的计数为1,而不是4,这是该transrefid存在的行数。如果我将计数从'RecId'更改为'ShipmentId',那么我得到的不是计数,而是实际的ShipmentId。我只是想让它返回记录的计数,我相信这是我要求它做的

我真的看不出我错过了什么

在whileselect中,我得到了我所期望的shipmentid,对于循环只有一条infolog消息。这告诉我GROUPBY with where子句起作用了,但它没有解释为什么第一个count select语句的行为与我预期的不一样


作为参考,这是AX2012 R1系统。

我会尝试数据库同步,然后重新启动AOS。我没有看到任何明显的错误,所以它指向反弹的一切

尝试通过此方法从内存中获取select语句,以便检查语法,然后直接查看SQL查询。它一代一代地使用


如果我了解您试图实现的目标,您希望得到类似以下SQL查询的结果:

select count(distinct shipmentid) from orderTrans 
where inventTransRefId = 'XXXXXX'
“distinct”关键字在AX select命令中不可用。GROUPBY子句允许您迭代所有不同的值,但不能在其上使用聚合。 您可以使用sql连接来推送所需的确切sql命令

在AX中,聚合值存储在使用的字段中:CountRecId,计数将进入recid字段,否则系统可能需要在缓冲区中动态添加新字段。我不认为你可以在GROUPBY子句上进行聚合,因为它的价值很重要

您可以尝试我没有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)));

对于任何想知道我答案的人来说,这与杰夫的回答有关。最后,我没有很好地查看数据,查询返回了正确的结果。我最初以为有很多独特的发货,但我错了。我预期的结果是错误的。文件中有4行,但这些行对于项目是唯一的,而不是装运。他们都在同一批货上。所以说真的,是我自己的错,这表明我们确实需要仔细研究数据


感谢所有回复,非常感谢

谢谢,至少我确认我没有发疯:它生成的SQL是:从WMSORDERTRANS T1中选择COUNTT1.RECID,T1.SHIPMENTID,其中DATAAREAID=N'aus'和INVENTTRANSREFID=?groupby T1.SHIPMENTID ORDER BY T1.SHIPMENTID这真的很奇怪,我现在已经完成了数据库同步,并重新启动了AOS,但仍然没有得到预期的结果。这是做我的头,这样一个简单的查询。我看不出我犯了什么愚蠢的错误,但这仍然不在可能的范围之外。任何人还有其他想法吗???这是目标简而言之,我试图得到给定REFID的不同值。我正在尝试获取给定销售订单INVENTTRANSREFID的唯一发货。我知道中的distinct关键字在X++中不可用,这就是我使用GROUPBY子句进行计数的原因。我试图避免使用确切的SQL。不应该这么复杂。我发布的X++查询应该可以工作。如果您注意到它有什么问题,我洗耳恭听。希望您已经解决了这个问题,但如果没有,您的聚合查询组将查看您设置的inventTransRefId记录有多少,以及有多少记录共享一个shipmentID(即使只有一个shipmentID)。如果您知道一个inventTransRefId有4条记录,那么当您将它们分组到ShipmentID下时,您认为它们会去哪里?您的查询并不是为了计算有多少ShipmentID,而是为了计算总共有多少行RecID,因为它们总是唯一的,共享一个inventTransRefId。感谢Jeff指出我的明显缺陷。我知道我一定错过了一些简单的事情,不是一直都是这样吗。这真是一个打击我后脑勺的时刻。我期待4个不同的装运ID,但事实并非如此。1个装运id上有4个不同的项目,因此按装运分组正确合并。我不敢相信我错过了,如此简单和明显,但我却对它视而不见。数据从不撒谎,我只是看得不够近。
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)));