信息集查询 SELECT SUM 问题
Infoset query SELECT SUM issue
我正在尝试对所有数量 (MENGE) 行求和,其中采购订单编号 (EBELN) 和相应采购订单 (EBELP) 中的项目编号和移动类型 (BWART)“101”,然后减去等效项 table移动类型为“102”以获得最终数量作为结果。
目前我添加了 2 个自定义字段,一个用于 101,一个用于 102 移动,将其分解并查看结果。使用我当前的代码,报告显示了 101 列的正确数据,但是 returns 102 有很多垃圾:它有正确的数据,但是它 returns numbers/data 在应该有的地方none 我不知道为什么或从哪里提取数字。
下面的代码:
*数据表
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.
变量比我使用的要多,因为我打算进一步构建报告。
问题出在 select 语句中。
您一次使用 EBELN
和 EBELP
的单个值访问 MSEG
,从 wa1
结构中获取值并使用总和。
您不需要 group by
,因为您没有使用多个 EBELN、EBELP 值进行访问。
此外,ENDSELECT
语句在 MSEG DB table 中生成了一种不需要的 "loop"。
尝试使用以下方法:
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'.
同样出于性能原因,您应该在不需要时尝试不访问数据库(您 select 两次使用几乎相同的标准)。
这是一个更好的版本
获取按移动类型(101 或 102)求和的数量 table
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.
然后从内部读取 table 您想要的值。 (如果 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
语句中使用内联声明。 (参见 documentation)
Table lt_quantity
是在执行 select 语句的那一刻动态声明的。您之前不需要声明 table,而是系统会使用适当的结构动态创建它。
要使用这些新功能,您必须在使用的每个变量之前使用 @
符号(使用 @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.
我正在尝试对所有数量 (MENGE) 行求和,其中采购订单编号 (EBELN) 和相应采购订单 (EBELP) 中的项目编号和移动类型 (BWART)“101”,然后减去等效项 table移动类型为“102”以获得最终数量作为结果。
目前我添加了 2 个自定义字段,一个用于 101,一个用于 102 移动,将其分解并查看结果。使用我当前的代码,报告显示了 101 列的正确数据,但是 returns 102 有很多垃圾:它有正确的数据,但是它 returns numbers/data 在应该有的地方none 我不知道为什么或从哪里提取数字。
下面的代码:
*数据表
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.
变量比我使用的要多,因为我打算进一步构建报告。
问题出在 select 语句中。
您一次使用 EBELN
和 EBELP
的单个值访问 MSEG
,从 wa1
结构中获取值并使用总和。
您不需要 group by
,因为您没有使用多个 EBELN、EBELP 值进行访问。
此外,ENDSELECT
语句在 MSEG DB table 中生成了一种不需要的 "loop"。
尝试使用以下方法:
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'.
同样出于性能原因,您应该在不需要时尝试不访问数据库(您 select 两次使用几乎相同的标准)。
这是一个更好的版本
获取按移动类型(101 或 102)求和的数量 table
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.
然后从内部读取 table 您想要的值。 (如果 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
语句中使用内联声明。 (参见 documentation)
Table lt_quantity
是在执行 select 语句的那一刻动态声明的。您之前不需要声明 table,而是系统会使用适当的结构动态创建它。
要使用这些新功能,您必须在使用的每个变量之前使用 @
符号(使用 @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.