2

我遇到以下问题。


我想做的事

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

表连接

示例:对于以下 PO 111005229,我想在第一个字段中检索KUNNR哪个字段,PARVW = 'ER'在第二个字段中检索哪个ADRNR字段PARVW = 'BP'

期望的输出:

在此处输入图像描述


我试过的

在 SQ02 中加入两个表

我试图声明 2 个表VBAK,并VBAP在运行 SQ02 TCode 并选择所需的字段:
在此处输入图像描述

这不起作用:

  • 就像在 SE16N 中一样,当需要带有过滤数据的单行时,查询返回采购订单的每一行;
  • CHECK VBPA-PARVW = 'ER'.Record processing代码部分中使用希望这会将给定 PO 的行数减少到 1 时,根本不返回任何值。

在 SQ02 中仅声明 VBAK 表

我还尝试仅VBAK在 SQ02 中声明表,创建PERNR_ER我想要的附加字段并继续加入VBAK与这些特定字段相关的代码VBPAopenSQL

我创建了附加字段PARVW_ERPERNR_ER嵌入了以下代码:

SELECT PARVW
    INTO PARVW_ER
    FROM VBPA
    WHERE VBELN = VBPA~VBELN.
    AND PARVW = 'ER'.
ENDSELECT.

SELECT PERNR
    INTO PERNR_ER
    FROM VBPA
    WHERE VBELN = VBPA~VBELN.
    AND PARVW = 'ER'.
ENDSELECT.

作为输出

在此处输入图像描述

我也试过

TYPES: begin of TY_TABLE,
    PARVW LIKE VBPA-PARVW,
    PERNR LIKE VBPA-PERNR,
    END OF TY_TABLE.

DATA: WA_TABLE TYPE TY_TABLE,
      IT_TABLE  TYPE TABLE OF TY_TABLE.

SELECT PARVW PERNR
    APPENDING CORRESPONDING FIELDS OF TABLE IT_TABLE
    FROM VBPA
    WHERE VBELN = VBPA~VBELN.

LOOP AT IT_TABLE INTO WA_TABLE.
  IF WA_TABLE-PARVW = 'ER'.
    PARVW_ER = WA_TABLE-PARVW.
    PERNR_ER = WA_TABLE-PERNR.
  ENDIF.
ENDLOOP.

但它返回相同。


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

4

3 回答 3

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

于 2019-07-02T11:13:58.760 回答
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.
于 2019-07-04T09:32:07.767 回答
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 ) ).

resultitab 包含您想要的输出。

但是,这仅适用于这种特殊情况,即您只有一条具有BP功能的线和一条具有ER伙伴功能的线,它们附加了适当的PERNR/ADRNR值。在其他情况下,您将需要分组。

于 2019-07-04T00:46:21.587 回答