Условное агрегирование полей 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
ценности. В других случаях вам понадобится группировка.