Infoset查询选择总和



我正在尝试总和所有数量(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.

变量比我使用的更多,因为我计划进一步构建报告。

问题在选择语句中。

您一次访问具有EBELNEBELP的单个值的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.

相关内容

  • 没有找到相关文章

最新更新