Добавим Z поле в позицию входящей поставки. Помимо этого, новое поле можно будет заполнять прямо в самой транзакции.
- Расширяем /SCDL/INCL_EEW_DLV_ITEM_STR. Эта структура является includ’ом ко всем необходимым расширениям. После того, как мы ее добавили, поле уже появится в ALV.
- Чтобы появилась возможность редактирования, нужно реализовать BADI /SCWM/EX_DLV_UI_SCREEN.
- Создаем новую группу функций, и в ней экран (подэкран, например 9000).
- В реализующем классе, с помощью метода (/SCWM/IF_EX_DLV_UI_SCREEN~DEFINE_ITEM_EXTENSION) возвращаем программу и номер экрана
123ev_repid = 'SAPLZGR_FUNCTIONS'.ev_dynnr = '9000'.ev_top = abap_true.
ev_top – означает, что наш подэкран будет выше всех стандартных по списку (опционально) - Мэпим на 9000 экран новое поле из /SCDL/INCL_EEW_DLV_ITEM_STR. Это важно для корректной работы экранной логики.
В PBO пишем:
1/scwm/cl_dlv_ui_badi_mgmt=>pbo_item( iv_transaction = 'PRDI' ).
В PAI пишем:
1/scwm/cl_dlv_ui_badi_mgmt=>pai_item( iv_transaction = 'PRDI' ).
Готово!Более подробно по расширениям, можно посмотреть по ссылке.
Казалось бы, задача решена. Но часто для нового поля нужно подтянуть текстовое значение.
Если для экрана 9000 это можно сделать посредством добавления поля вывода (только вывод), и в PBO и PAI логике подтягивать соответствующее значение, то в ALV таким образом поступить не получится.
Дело в том, что добавление текстового поля в /SCDL/INCL_EEW_DLV_ITEM_STR расширит таблицу поставок (а хранить справочные данные в поставках мы точно не планировали).
Я поступил следующим образом:
-
-
- Расширил структуру /SCWM/S_SP_A_ITEM_PRDI, которая используется для формирования каталога полей.
- Расширил структуру /SCDL/S_SP_A_ITEM_EEW_PRD (можно заметить, что в нее включена и /SCDL/INCL_EEW_DLV_ITEM_STR). Эта структура используется для заполнения полей клиента в ALV.
Можно посмотреть в методе COMPOSITION_ITEM класса /SCWM/CL_SP_PRD_INB
- У всех наследников класса /SCMB/CL_BASE есть метод SELECT и SELECT_BY_RELATION, а перед и после них стоит вызов BADI BEFORE_SELECT и AFTER_SELECT с возможностью изменения выбранных данных до и после соответственно. Им и воспользуемся.
Точка расширения /SCDL/SP ► BADI /SCDL/SP_EX_ASPECT. Я выбрал реализующий класс /SCWM/CL_EI_DLV_MD_SP, и в его методе after_select создал implicit enhancement со следующим содержимым
1234567891011121314151617181920212223METHOD /scdl/if_ex_sp_aspect~after_select."""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Класс /SCWM/CL_EI_DLV_MD_SP, Интерфейс /SCDL/IF_EX_SP_ASPECT, Метод AFTER_SELECT, Начало A*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 1 ZENH_AFTER_SELECT_FOR_PRDI. "active versionCHECK sy-tcode = '/SCWM/PRDI '.LOOP AT outrecords ASSIGNING FIELD-SYMBOL(<ls_line>).ASSIGN COMPONENT 'ZZTEXT' OF STRUCTURE <ls_line> TO FIELD-SYMBOL(<lv_zztext>).CHECK sy-subrc = 0.ASSIGN COMPONENT 'ZZNEW_FIELD' OF STRUCTURE <ls_line> TO FIELD-SYMBOL(<lv_zznew_field>).CHECK sy-subrc = 0.SELECT SINGLE descriptionINTO @<lv_zztext>FROM ztext_tabWHERE zznew_field = @<lv_zznew_field>.ENDLOOP.ENDENHANCEMENT.*$*$-End: (1)---------------------------------------------------------------------------------$*$*"#EC NEEDEDENDMETHOD.
Готово. Текстовое поле заполняется в ALV без хранения в /SCWM/PRDI
-