将VBAK / VBAP字段有条件地聚合到信息集中的单行

时间:2019-07-02 10:17:49

标签: sap abap opensql infoset

我遇到以下问题。


我想做什么

我想创建一个信息集,该信息集将针对给定的采购订单将VBAK表中的数据与VBPA表中的几行重新分组,该行应分派到不同的字段。

Tables join

示例:对于以下PO 111005229,我想在第一个字段中检索KUNNR的{​​{1}}字段,在第二个字段中检索{{1}的PARVW = 'ER'字段}}。

所需的输出:

enter image description here


我尝试过的

在SQ02中加入两个表

我尝试在运行SQ02 TCode时声明2个表ADRNRPARVW = 'BP'并选择所需的字段:
enter image description here

这不起作用:

  • 就像SE16N中一样,当需要单行包含过滤数据的查询时,查询将返回采购订单的每一行;
  • 当在VBAK代码部分中使用VBAP希望将给定PO的行数减少到1时,根本不会返回任何值。

在SQ02中仅声明VBAK表

我还尝试在SQ02中仅声明CHECK VBPA-PARVW = 'ER'.表,创建所需的附加字段Record processing,然后继续将{{1}与VBAK与{{1 }}与这些特定字段相关的代码。

我创建了附加字段PERNR_ERVBAK,其中嵌入了以下代码:

VBPA

作为输出

enter image description here

我也尝试过

openSQL

但它返回了相同的结果。


我应该如何继续获得预期的结果?

3 个答案:

答案 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.