代码之家  ›  专栏  ›  技术社区  ›  Rat

X++奇数计数结果

  •  1
  • Rat  · 技术社区  · 10 年前

    当我在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,而不是计数。我只是想让它返回记录的计数,我相信我已经要求它这么做了。

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

    在while select中,我得到了我所期望的(shipmentid),循环中只有1条信息日志消息。这告诉我where子句的groupby正在工作,但它并不能解释为什么第一个count select语句的行为不像我预期的那样。

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

    3 回复  |  直到 10 年前
        1
  •  2
  •   Rat    10 年前

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

    感谢所有回应,非常感谢。

        2
  •  0
  •   Alex Kwitny    10 年前

    我会尝试数据库同步,然后重新启动AOS。我看不出有什么明显的错误,所以它指向弹跳一切。

    尝试通过此方法(从内存中获取select语句,以便检查语法),然后直接根据SQL检查查询。它使用 generateOnly .

    select generateOnly count(RecId) from orderTrans group by shipmentid where orderTrans.inventTransRefId == 'XXXXXX';
    
    info(orderTrans.getSQLStatement());
    
        3
  •  0
  •   Geoffrey DELMEE    10 年前

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

    select count(distinct shipmentid) from orderTrans 
    where inventTransRefId = 'XXXXXX'
    

    “distinct”关键字在AX select命令中不可用。groupby子句将允许您迭代所有不同的值,但不能在其上使用聚合。 您可以使用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)));