abap - 想要显示结果列表中的所有行项目而不是最后一个行项目
问题描述
我有一个带有聚合函数的 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 by
with 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.
任何帮助,将不胜感激。谢谢你。
解决方案
您的代码有几个问题:
循环中的选择通常是一个坏主意,因为它增加了数据库访问(你真的不想要)。考虑其他选项,例如
joins
.你只得到最后一行的原因是在每个循环通过(在你执行 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.
推荐阅读
- python-3.x - 用户关闭cmd时是否可以运行命令?
- sql - 查找匹配一个值但不匹配另一个值的行
- flutter - Flutter:如何将 void 函数更改为类?
- python - 运行`generate_unconditional_samples.py`时是否可以使输出文本长度大于1024?
- javascript - Discord.js 批量删除命令
- python - 如何在使用scrapy的网络抓取中修复“ImportError:尝试使用没有已知父包的相对导入”
- php - 如何包含包含的文件(包括嵌套包含)
- lua - 如何获取表的索引
- c# - 在 Combobox 1 (C#. NET) 上选择项目时显示 Combobox 2 列表
- android - 当系统的 WebView 是 Chrome 或 Android 系统 WebView(均为 84 版)时,无法在基于 WebView 的应用程序上获取 uiautomator 转储