Условное агрегирование полей VBAK/VBAP в одну строку в информационном наборе

Я сталкиваюсь со следующей проблемой.


Что я хочу сделать

Я хочу создать информационный набор, который бы перегруппировал для данного Заказа на поставку данные из VBAK таблица с несколькими строками из VBPA таблица, которая должна быть отправлена ​​в разные поля.

Пример: для следующего PO 111005229 я хотел бы получить в первом поле KUNNR поле для которого PARVW = 'ER' а во втором поле ADRNR поле для которого PARVW = 'BP',

Желаемый вывод:


Что я пробовал

Объединение обеих таблиц в SQ02

Я пытался объявить 2 таблицы VBAK а также VBAP при запуске SQ02 TCode и выберите нужные поля:

Это не работает:

  • так же, как в SE16N, запрос возвращает каждую строку заказа на покупку, когда требуется одна строка с отфильтрованными данными;
  • при использовании CHECK VBPA-PARVW = 'ER'. в Record processing Часть кода, надеясь, что это сократит количество строк до 1 для данного PO, никакого значения вообще не возвращается.

Объявление только таблицы VBAK в SQ02

Я также пытался объявить только VBAK таблица в SQ02, создайте дополнительное поле PERNR_ER что я хочу и приступить к присоединению VBAK с участием VBPA с участием openSQL код, связанный с этими конкретными полями.

Я создал дополнительные поля PARVW_ER а также PERNR_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.

но он вернул то же самое.


Как мне поступить, чтобы получить ожидаемый результат?

3 ответа

Используйте 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

Этот совет из комментария @SandraRossi помог мне:

Я думаю, что вы не знаете о преобразованиях между внешним и внутренним форматом. Для PARVW, если вы подключены к английскому языку, когда вы видите ER, это означает внутреннее значение ZM (см. Таблицу TPAUM).

Я не знал, что даже с кодом транзакции SE16N, поля могут отображать преобразованные данные, т.е. ER на моем языке.

Таким образом, решение было просто отфильтровать ZM:

SELECT PERNR
    INTO PERNR_ER
    FROM VBPA
    WHERE VBPA~VBELN = VBAK-VBELN AND PARVW = 'ZM'.
ENDSELECT.

Вы можете достичь этого с помощью этого простого двойного 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 содержит желаемый результат.

Тем не менее, это будет работать только в этом особом случае, когда у вас есть только одна строка с BP функция и одна с ER функции партнера, которые связаны с надлежащим PERNR/ADRNR ценности. В других случаях вам понадобится группировка.

Другие вопросы по тегам