首页 > 解决方案 > 想要显示结果列表中的所有行项目而不是最后一个行项目

问题描述

我有一个带有聚合函数的 SELECT 查询group by。但我的程序只显示最后一行项目。我想显示所有订单项。

预期结果示例:

{"numOfRec":"50",
 "shipmentsDetails":[
   {"orderNum":"1000101730",
    "deliveryOrderNum":"0085099852",
    "prodCode":"OE8002L18",
    "batchCode":"0000029927",
    "qty":"108.000" } , 
   {"orderNum":"1000101730",
    "deliveryOrderNum":"0085099852",
    "prodCode":"OE8407L18",
    "batchCode":"0000029928",
    "qty":"36.000" } , 
   {"orderNum":"1000101730",
    "deliveryOrderNum":"0085099852",
    "prodCode":"SUE9433G1",
    "batchCode":"0000029923",
    "qty":"180.000" }]}

实际结果示例(在 中i_output):

{"numOfRec":"1",
 "shipmentsDetails":[
   {"orderNum":"1000101760",
    "deliveryOrderNum":"0085099889",
    "prodCode":"UE9101G5",
    "batchCode":"20200101E",
    "qty":"10.000" }]}

(虽然有很多订单项,但只显示最后一个订单项)

这是我的代码:

  IF NOT i_vttk IS INITIAL.
    SELECT tknum
           tpnum
           vbeln
      FROM vttp
      INTO TABLE i_vttp
      FOR ALL ENTRIES IN i_vttk
      WHERE tknum = i_vttk-tknum.
    IF sy-subrc EQ 0.
      SORT i_vttp BY tknum tpnum.
    ENDIF.

    IF NOT i_vttp is INITIAL.
      LOOP AT i_vttp INTO wa_vttp.
        SELECT vbeln
               matnr
               charg
               SUM( lgmng ) as lgmng
               meins
          FROM lips
          INTO TABLE i_lips
          WHERE vbeln = wa_vttp-vbeln
            AND aedat LE sy-datum
            AND lfimg <> 0
          GROUP BY vbeln matnr charg meins.
        IF sy-subrc EQ 0.
          "APPEND i_lips.
          "CLEAR i_lips.
          SORT i_lips BY vbeln matnr.
        ENDIF.
      ENDLOOP.
    ENDIF.

    LOOP AT i_lips INTO wa_lips.
      READ TABLE i_vttp
            INTO wa_vttp
        WITH KEY vbeln = wa_lips-vbeln.
      IF sy-subrc = 0.
        wa_output-tknum = wa_vttp-tknum.
        wa_output-vbeln = wa_lips-vbeln. " Added Delivery
        wa_output-matnr = wa_lips-matnr.
        wa_output-charg = wa_lips-charg.
        wa_output-lgmng = wa_lips-lgmng.
      ENDIF.
      APPEND wa_output TO i_output.
      CLEAR: wa_vttp, wa_lips, wa_output.
      l_count = l_count + 1.
    ENDLOOP.

请注意,理想情况下,我想做以下查询来总结总数量(字段lgmng),但 ABAP 不允许使用group bywith for all entries

SELECT vbeln matnr charg SUM( lgmng ) as lgmng meins 
  FROM lips 
  INTO TABLE i_lips 
  FOR ALL ENTRIES IN i_vttp 
  WHERE vbeln = i_vttp-vbeln 
    AND aedat LE sy-datum 
    AND lfimg <> 0
  GROUP BY vbeln matnr charg meins. 

任何帮助,将不胜感激。谢谢你。

标签: abap

解决方案


您的代码有几个问题:

  1. 循环中的选择通常是一个坏主意,因为它增加了数据库访问(你真的不想要)。考虑其他选项,例如joins.

  2. 你只得到最后一行的原因是在每个循环通过(在你执行 select 的循环中)内部表 i_lips 被覆盖,因此在退出循环时,你只得到最后选择的条目。要解决此问题,您可以按如下方式修改您的选择查询:

    SELECT vbeln
       matnr
       charg
       SUM( lgmng ) as lgmng
       meins
     FROM lips
     APPENDING TABLE i_lips
     WHERE vbeln = wa_vttp-vbeln
     AND aedat LE sy-datum
     AND lfimg <> 0
     GROUP BY vbeln, matnr, charg, meins.
    

推荐阅读