select - Infoset 查询 SELECT SUM 问题
问题描述
我正在尝试将所有数量 (MENGE) 行相加,其中 PO 编号 (EBELN) 和相应 PO (EBELP) 中的项目编号和运动类型 (BWART) “101”,然后减去运动类型“102”的等效表以获得最终数量作为结果。
目前我添加了 2 个自定义字段,一个用于 101,一个用于 102 移动,将其分解并查看结果。使用我当前的代码,报告显示了 101 列的正确数据,但返回了很多 102 的垃圾:它具有正确的数据,但它返回的数字/数据应该没有,我不知道为什么或它从哪里提取数字。
下面的代码:
*数据选项卡
DATA: itab1 like table of mseg,
wa1 like mseg,
wa2 like mseg.
DATA: *mseg like table of mseg.
DATA: itab3 like table of ekbe,
wa3 like ekbe.
Data: *ekbe like table of ekbe.
data: QNT101_menge like mseg-menge,
QNT102_menge like mseg-menge,
QNT103_MENGE LIKE EKBE-MENGE.`
*记录处理选项卡
if sy-subrc eq 0.
wa1-ebeln = mseg-ebeln.
wa1-menge = mseg-menge.
wa1-ebelp = mseg-ebelp.
wa1-bwart = mseg-bwart.
wa2-ebeln = mseg-ebeln.
wa2-ebelp = mseg-ebelp.
wa2-menge = mseg-menge.
wa2-bwart = mseg-bwart.
Select: sum( menge ) as menge into QNT101_menge
from mseg
where ebeln = wa1-ebeln
and ebelp = wa1-ebelp
and bwart = 101
group by ebeln ebelp.
endselect.
clear *mseg.
Select sum( menge ) as menge into QNT102_menge
from mseg
where ebeln = wa1-ebeln
and ebelp = wa1-ebelp
and bwart = 102
group by ebeln ebelp.
endselect.
append wa1 to itab1.
clear wa1.
endif.
而且我的自定义字段只有一些基本代码,例如
ACTUALQNT2 = QNT102_MENGE.
变量比我使用的要多,因为我计划进一步构建报告。
解决方案
问题出在选择语句中。
您一次访问MSEG
单个值,EBELN
从EBELP
结构中获取值wa1
并使用聚合总和。
您不需要group by
,因为您没有使用多个 EBELN、EBELP 值进行访问。
该ENDSELECT
语句还在 MSEG DB 表中产生了一种不需要的“循环”。
尝试使用以下内容:
Select sum( menge ) as menge into QNT101_menge
from mseg
where ebeln = wa1-ebeln
and ebelp = wa1-ebelp
and bwart = '101'.
Select sum( menge ) as menge into QNT102_menge
from mseg
where ebeln = wa1-ebeln
and ebelp = wa1-ebelp
and bwart = '102'.
同样出于性能原因,您应该在不需要时尝试不访问数据库(您选择了两次几乎相同的标准)。
这里有更好的版本
获取按运动类型(101 或 102)求和的数量表
select bwart, sum( menge ) as menge
from mseg
into table @data(lt_quantity)
where ebeln = @wa1-ebeln
and ebelp = @wa1-ebelp
and bwart in ( '101' , '102' )
group by bwart.
然后从内部表中读取您想要的值。(optional
如果 mov.type 不存在,这里需要避免执行)
qnt101_menge = value #( lt_quantity[ bwart = '101']-menge optional ).
qnt102_menge = value #( lt_quantity[ bwart = '102']-menge optional ).
编辑:内联声明
从 ABAP 7.40 开始,您可以直接在语句中使用内联声明SELECT
。(见文档)
lt_quantity
在执行 select 语句的那一刻,表是动态声明的。您不需要事先声明该表,而是系统以适当的结构动态创建它。
要使用这些新功能,您必须在使用@
每个变量之前使用该符号(使用 时也是如此@wa1
)
如果您的系统版本还不支持这种语法,这里是该语句的经典版本。请注意,经典SELECT
语法也与新语法不同(字段之间没有逗号,没有@
,INTO
在语句底部声明的部分)
types: begin of qty_type,
bwart type mseg-bwart,
menge type mseg-menge,
end of qty_type.
data: lt_quantity type table of qty_type.
select bwart sum( menge ) as menge
from mseg
into table lt_quantity
where ebeln = wa1-ebeln
and ebelp = wa1-ebelp
and bwart in ( '101' , '102' )
group by bwart.
推荐阅读
- logging - 使用 Specflow.MsTest 并行运行测试时对日志进行排序
- pcap - “ValueError”对象没有属性“_render_traceback_”
- docker - 上传docker镜像到谷歌云平台:https://grc.io/v2/: Service Unavailable
- azure-resource-manager - 有没有办法使用 ARM 模板为 webapp 的访问限制指定 IP 地址和子网 ID
- ios - 在 Xcode 中播放音效
- c++ - 如何找到两个直方图的混合拟合函数
- salesforce - 使用广播组切换 LWC 中的内容?
- linux - 如何从 LXC 本身重新启动 LXC?
- symfony - Symfony 5 功能测试 - 缺少环境变量,getenv() 返回 false
- javascript - 如何通过 React JS 中的索引将反应组件推送到映射数组数据中