我正在尝试总和所有数量(menge)行,其中po号(ebeln)和相应的po(ebelp)和运动类型(bwart)中的项目编号(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.
变量比我使用的更多,因为我计划进一步构建报告。
问题在选择语句中。
您一次访问具有EBELN
和EBELP
的单个值的MSEG
,从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'.
同样出于性能原因,您应该在不需要时尝试不访问DB(您选择了几乎相同的标准)。
这是一个更好的版本
获取按运动类型(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.
然后从内部表读取所需的值。(如果不存在mov.type,则需要optional
避免执行)
qnt101_menge = value #( lt_quantity[ bwart = '101']-menge optional ).
qnt102_menge = value #( lt_quantity[ bwart = '102']-menge optional ).
编辑:内联声明
从ABAP 7.40开始,您可以将内联声明直接使用到SELECT
语句中。(请参阅文档)
表lt_quantity
即时声明,在执行选择语句的那一刻。您以前不需要声明表,而是系统地使用正确的结构来创建它。
要使用这些新功能,您必须在使用的每个变量之前使用@
符号(也必须在使用@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.