Полезные документы:
BP_CustomerSupplier_Enhancement_Cookbook_CustomerEdition_114_final
1) В первую очередь создаем ГФ, в ней подэкран. Создаем модули PBO и PAI, и в соответствующих блоках пишем вызов ФМ
1 2 3 |
MODULE status_9001 OUTPUT. CALL FUNCTION 'BUS_PBO'. ENDMODULE. |
1 2 3 |
MODULE user_command_9001 INPUT. CALL FUNCTION 'BUS_PAI'. ENDMODULE. |
2) Создаем функциональные модули, которые будут отвечать за прием/передачу данных.
SAP диктует следующие шаблоны по наименованию:
<APPL_NAME>_BUPA_PBO_<VIEW_NAME>
<APPL_NAME>_BUPA_PAI_<VIEW_NAME>
<APPL_NAME> и <VIEW_NAME> – данные из настройки, об этом ниже.
3) Начинаем настройку. Наша цель, добавить доп. вкладку на экран закупок для конкретной роли ДП.
на стартовом экране вводим команду BUPT, откроется меню для настройки.
Требования SAP по наименованию настроек:
The central part in the naming for all BDT objects is the application name (<APPL_NAME>) defined in transaction BUS1 (example: ZCUS).
All datasets, screens, sections and views are named with <APPL_NAME>number (example: ZCUS01…ZCUS99).
Создаем приложение (транзакция BUS1):
Создаем набор данных (BUS23):
Создаем группу полей (BUS2):
Тут номер можно брать любой свободный, я взял 702
Заполняем поля в группе полей:
Создаем ракурс (BUS3):
Указываем приложение, набор данных, имя программы (посмотреть можно в ГФ, если кликнуть дважды на ее заголовке), и ФМ для PAI и PBO (работы с данными)
Добавляем в ракурс группу полей
Создаем фрагмент и присваиваем ему ракурс (BUS4):
Создаем экран, и присваиваем ему фрагмент (BUS05) :
SAP говорит, что нужно включать в экран фрагмент BUP009, чтобы корректно отображались общие данные
Создаем последовательность экранов (BUS6):
сначала саму последовательность с присвоением экрана
затем тип последовательности с указанием самой последовательности
Теперь нам нужно включить нашу последовательность, в последовательность Закупки
Это последовательность CVIV01.
Определяем так, заходим в BP, переходим на вкладку закупки, и вводим команду BDT_ANALYZER
Создаем делимость (BUSD), ракурсы ДП:
Т.к. нам надо расширить только для конкретной роли ДП, действуем так:
добавляем сначала наш ракурс в список
Идем в spro по пути:
находим нужную роль, и смотрим какой указан ракурс:
И добавляем наш ракурс в ракурс ДП
так же добавляем вызывающее приложение:
На этом настройка завершена. Переходим к коду.
FM PBO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
FUNCTION zcus01_bupa_pbo_zcus01. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *"---------------------------------------------------------------------- DATA: lt_lfa1 TYPE TABLE OF lfa1. fsbp_bdt_adapter=>data_pbo( EXPORTING i_table_name = gc_tabname-lfa1 IMPORTING e_data_table = lt_lfa1[] ). IF lt_lfa1[] IS NOT INITIAL. lfa1 = VALUE #( lt_lfa1[ 1 ] OPTIONAL ). ENDIF. ENDFUNCTION. |
FM PAI :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
FUNCTION zcus01_bupa_pai_zcus01. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *"---------------------------------------------------------------------- DATA: lt_lfa1 TYPE TABLE OF lfa1. CONSTANTS: lc_bdt_view TYPE bu_sicht VALUE 'ZCUS01', dynp_struc TYPE fsbp_table_name VALUE 'LFA1'. CHECK fsbp_bdt_adapter=>is_direct_input_active( ) = abap_false. fsbp_bdt_adapter=>get_current_bp_data( EXPORTING i_table_name = gc_tabname-lfa1 IMPORTING e_data_table = lt_lfa1 ). IF lt_lfa1 IS NOT INITIAL. READ TABLE lt_lfa1 ASSIGNING FIELD-SYMBOL(<ls_lfa1>) INDEX 1. <ls_lfa1>-zzautocreate = lfa1-zzautocreate. <ls_lfa1>-zzcont_return = lfa1-zzcont_return. ENDIF. fsbp_bdt_adapter=>data_pai( i_table_name = gc_tabname-lfa1 i_data_new = lt_lfa1 i_validate = space i_msg_to_store = fsbp_bdt_adapter=>true i_dynp_struc = dynp_struc i_bdt_view = lc_bdt_view ). ENDFUNCTION. |
В завершение, чтобы поля сохранялись из транзакции, нужно добавить их в CVIS_EI_EXTERN ► VENDOR (LFA1) ► CENTRAL_DATA ► CENTRAL ►
DATA VMDS_EI_VMD_CENTRAL_DATA
DATAX VMDS_EI_VMD_CENTRAL_DATA_XFLAG