信息集查询SELECT SUM问题

时间:2019-03-20 08:03:42

标签: select sum sap abap

我正在尝试汇总所有数量(MENGE)行,其中相应的PO(EBELP)和移动类型(BWART)“ 101”中的PO号(EBELN)和项目编号,然后减去移动类型为“ 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.

由于我计划进一步构建报告,因此变量使用的数量超出了我的使用范围。

1 个答案:

答案 0 :(得分:1)

问题出在选择语句中。

您一次访问df # id var1 var2 # 1 110 21 12 # 2 110 26 234 # 3 110 54 43 # 4 90 9 19 # 5 90 10 32 # 6 90 16 16 # 7 90 18 21 # 8 252 39 44 # 9 252 54 34 MSEG的单个值的EBELN,取自EBELP结构的值,并使用总和。

您不需要wa1,因为您没有使用多个EBELN,EBELP值进行访问。

此外,group by语句在MSEG DB表中产生了不必要的“循环”。

尝试使用以下内容:

ENDSELECT

出于性能原因,您应该尝试在不需要时不访问数据库(您选择了两次使用几乎相同的条件)。

这是一个更好的版本

获取按移动类型(101或102)求和的数量表

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'.

然后从内部表中读取所需的值。 (如果不存在mov.type,则此处需要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

编辑:内联声明

从ABAP 7.40开始,您可以直接在 qnt101_menge = value #( lt_quantity[ bwart = '101']-menge optional ). qnt102_menge = value #( lt_quantity[ bwart = '102']-menge optional ). 语句中使用内联声明。 (请参阅documentation

SELECT在执行select语句的那一刻即被声明。您无需在之前声明表,而是由系统动态创建具有适当结构的表。

要使用这些新功能,必须在使用的每个变量之前使用lt_quantity符号(在使用@时也是如此)

如果您的系统版本尚不支持此语法,则这是该语句的经典版本。请注意,经典的@wa1语法也不同于新的语法(字段之间没有逗号,语句底部没有声明SELECT@部分)

INTO