首页 > 解决方案 > 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.

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

标签: selectsumabap

解决方案


问题出在选择语句中。

您一次访问MSEG单个值,EBELNEBELP结构中获取值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.

推荐阅读