我遇到以下问题。
我想创建一个信息集,该信息集将针对给定的采购订单将VBAK
表中的数据与VBPA
表中的几行重新分组,该行应分派到不同的字段。
示例:对于以下PO 111005229,我想在第一个字段中检索KUNNR
的{{1}}字段,在第二个字段中检索{{1}的PARVW = 'ER'
字段}}。
所需的输出:
我尝试在运行SQ02 TCode时声明2个表ADRNR
和PARVW = 'BP'
并选择所需的字段:
这不起作用:
VBAK
代码部分中使用VBAP
希望将给定PO的行数减少到1时,根本不会返回任何值。我还尝试在SQ02中仅声明CHECK VBPA-PARVW = 'ER'.
表,创建所需的附加字段Record processing
,然后继续将{{1}与VBAK
与{{1 }}与这些特定字段相关的代码。
我创建了附加字段PERNR_ER
和VBAK
,其中嵌入了以下代码:
VBPA
作为输出
我也尝试过
openSQL
但它返回了相同的结果。
我应该如何继续获得预期的结果?
答案 0 :(得分:1)
在同一张表上使用INNER JOIN
,然后通过PARVW
过滤掉不必要的行。
REPORT YYY.
TABLES: vbpa.
START-OF-SELECTION.
vbpa = VALUE #( vbeln = '111005229' parvw = 'SP' kunnr = '100007760' adrnr = '9000002718' ).
INSERT vbpa.
vbpa = VALUE #( vbeln = '111005229' parvw = 'BP' kunnr = '100007760' adrnr = '38110' ).
INSERT vbpa.
vbpa = VALUE #( vbeln = '111005229' parvw = 'PY' kunnr = '100007760' adrnr = '38110' ).
INSERT vbpa.
vbpa = VALUE #( vbeln = '111005229' parvw = 'SH' kunnr = '100007760' adrnr = '38110' ).
INSERT vbpa.
vbpa = VALUE #( vbeln = '111005229' parvw = 'ER' pernr = '8071' ).
INSERT vbpa.
SELECT t1~vbeln, t2~pernr AS field1, t1~adrnr AS field2
FROM vbpa AS t1
INNER JOIN vbpa AS t2
ON t1~vbeln = t2~vbeln
INTO TABLE @DATA(l_tab_vbpa)
WHERE t1~parvw = 'BP'
AND t2~parvw = 'ER'.
LOOP AT l_tab_vbpa ASSIGNING FIELD-SYMBOL(<str_vbpa>).
WRITE: / <str_vbpa>-vbeln, <str_vbpa>-field1, <str_vbpa>-field2.
ENDLOOP.
ROLLBACK WORK.
结果
测试
111005229 00008071 38110
答案 1 :(得分:1)
您可以通过以下简单的双FOR
循环来实现:
TYPES: BEGIN OF ty_res,
vbeln TYPE vbeln,
field1 TYPE vbpa-pernr,
field2 TYPE vbpa-adrnr,
END OF ty_res,
tt_res TYPE STANDARD TABLE OF ty_res WITH EMPTY KEY.
DATA(lt_vbpa) = VALUE tab_vbpa( ).
APPEND VALUE #( vbeln = '111005229' parvw = 'SP' kunnr = '100007760' adrnr = '9000002718' ) TO lt_vbpa.
APPEND VALUE #( vbeln = '111005229' parvw = 'BP' kunnr = '100007760' adrnr = '38110' ) TO lt_vbpa.
APPEND VALUE #( vbeln = '111005229' parvw = 'PY' kunnr = '100007760' adrnr = '38110' ) TO lt_vbpa.
APPEND VALUE #( vbeln = '111005229' parvw = 'SH' kunnr = '100007760' adrnr = '38110' ) TO lt_vbpa.
APPEND VALUE #( vbeln = '111005229' parvw = 'ER' pernr = '8071' ) TO lt_vbpa.
DATA(result) = VALUE tt_res( FOR ls_vbpa_bp IN lt_vbpa WHERE ( parvw = 'BP' )
FOR ls_vbpa_er IN lt_vbpa WHERE ( parvw = 'ER' )
( vbeln = ls_vbpa_bp-vbeln
field1 = ls_vbpa_er-pernr
field2 = ls_vbpa_bp-adrnr ) ).
result
itab包含所需的输出。
但是,这仅在以下特殊情况下有效:您只有{strong> 1个行带有BP
功能,而 1个行带有ER
合作伙伴功能,并附有正确的PERNR/ADRNR
值。在其他情况下,您将需要分组。
答案 2 :(得分:1)
@SandraRossi评论中的这篇技巧对我有帮助:
我认为您不了解外部和内部之间的转换 格式。对于PARVW,如果您使用英语连接, 您会看到ER,它表示内部值ZM(参见表TPAUM)。
我不知道即使使用交易代码SE16N
,字段也可以显示转换后的数据,即以我的语言显示ER
。
因此解决方案是仅对ZM
进行过滤:
SELECT PERNR
INTO PERNR_ER
FROM VBPA
WHERE VBPA~VBELN = VBAK-VBELN AND PARVW = 'ZM'.
ENDSELECT.