Системный подход к реализации замещений SAP FI. Часть II
Активность задач.
Каждая задача замещения может быть отключена или включена посредством специального интерфейса. Специальный интерфейс включает: таблицу, ракурс ее ведения консультантами со специальными полномочиями, сами полномочия, алгоритмы проверки в пуле подпрограмм ZRGGB_ADD и настроенного протоколирования всех ее изменений посредством документов изменений.
Таблица (например, ztrt0015_active) может выглядеть так (Рис.11):
Row |
Field name |
Position |
Key |
Data element |
Domain |
Datatype |
Length |
Domain text |
1 |
MANDT |
1 |
X |
MANDT |
MANDT |
CLNT |
3 |
Мандант |
2 |
BUKRS |
2 |
X |
BUKRS |
BUKRS |
CHAR |
4 |
Балансовая единица |
3 |
MISSION |
3 |
X |
ZMISGGB |
TEXT30 |
CHAR |
30 |
Область активации |
4 |
CHACTIV |
4 |
ACTIV_BF |
XFELD |
CHAR |
1 |
Продукт активен? |
Рис.11. Таблица ведения активности НЕКОТОРЫХ замещений.
Ведение таблицы.
Ведение таблицы осуществляется посредством ракурса ведения (Рис.12). В область активации (MISSION) вносится та или иная задача и ставится метка активности. По умолчанию подразумевается, что все задачи активны. Если в таблице активности в поле MISSION присутствует задача, то она выполняется только в случае, если стоит метка активности.
Рис.12. Ракурс ведения таблицы активности замещений
При инициализации пула подпрограмм ZRGGB_ADD из BTE,RWIN, внешних PERFORM и т.д происходит считывание этой таблицы (ztrt0015_active) в проверочную таблицу gt_check в подпрограмме set_area_activ (Рис.13).
FORM set_area_activ.
DATA: lt_act TYPE ztrt0015_active OCCURS 0 WITH HEADER LINE.
DATA: l_cnd(20).
SELECT * FROM ztrt0015_active INTO TABLE lt_act.
LOOP AT lt_act.
CONCATENATE lt_act-mission lt_act-bukrs INTO l_cnd.
PERFORM set_check_table
USING l_cnd lt_act-chactiv.
ENDLOOP.
ENDFORM. "
*
FORM set_check_table USING i_miss i_char.
gt_check-mission = i_miss.
gt_check-check = i_char.
APPEND gt_check.
SORT gt_check.
DELETE ADJACENT DUPLICATES FROM gt_check.
ENDFORM. "
*
FORM get_check_table USING i_miss.
READ TABLE gt_check WITH KEY mission = i_miss.
ENDFORM.
Рис.13. Пример работы с таблицей активности замещений.
Реализация проверки активности замещения осуществляется в программе ZRGGB_ADD (подрограмме предпосылок) или в самой задаче замещения:
*Rh0019_9 Задача 1 от 05.05.2014 Замена счетов при реализации
FORM rh0019_09_01.
DATA: l_check.
DATA: l_cnd(20).
CHECK <bkpf> IS ASSIGNED.
*Замещение активно?
CONCATENATE 'RH0019_09_01' <bkpf>-bukrs INTO l_cnd.
PERFORM get_check_table USING l_cnd.
IF sy-subrc = 0.
CHECK gt_check-check = 'X'.
ENDIF.
...
ENDFORM. "
Рис.14. Пример вызова проверки активности замещений.
Демонстрационные примеры
Пример 1
Пример демонстрирует структуру вызова задачи замещения, представленную на Рис. 1. Здесь главный вызов - это вызов из события BTE 1025 при g_ch = 'N', где выполняются предпосылки задачи замещения, само замещение счета и сохранение нового значения в таблице памяти GT_MEMRF.
Вспомогательный вызов - это вызовы из конролинга при g_check = '1' и g_check = '2'.
Задача замещения в ZRGGB_ADD (Рис.15):
*Замена счетов при реализации
*Rh0019_8 Задача 4 от 04.04.2014 Иванов Иван.
FORM rh0019_08_04.
DATA: l_check,
...
...
.
IF g_ch = 'N'. "При вызове из 1025 Событие BTE сохранение документа
CHECK <bkpf> IS ASSIGNED.
CHECK <tbseg> IS ASSIGNED.
*Предпосылка для заголовка документа
PERFORM check_precond USING 'RH0019_08_04' CHANGING l_check.
CHECK l_check = 'X'.
...
LOOP AT <tbseg> ASSIGNING <bseg>.
l_buzei = sy-tabix.
CONCATENATE 'RH0019_08_04' l_buzei INTO l_key.
*"Определяем g_check на основе предпосылок для позиций
PERFORM check_precond USING 'RH0019_08_041' CHANGING l_check.
CHECK l_check = 'X'.
**В данном случае g_check была определена в предпосылках
IF g_check = '1'.
<bseg>-hkont = '0091140111'.
ELSEIF g_check = '2'.
<bseg>-hkont = '0091000000'.
ELSEIF g_check = '3' OR g_check = '4'.
<bseg>-hkont = '0091131402'.
ENDIF.
*Сохраняем в таблице памяти (будем потом использовать в подпрограммах rh0019_08_041 и rh0019_08_042 )
PERFORM set_mem_table USING l_key <bseg>-hkont.
ENDLOOP.
ELSEIF g_ch = 'V'. "при вызове из BADI см работа с BADI в публикациях.
IF g_check = '1'.
PERFORM rh0019_08_041.
ELSEIF g_check = '2'.
PERFORM rh0019_08_042.
ENDIF.
ENDIF.
ENDFORM.
Рис.15. Реализованная в пуле подпрограмм ZRGGB_ADD задача замещения.
Вызовы подпрограммы rh0019_08_04
На рисунке (Рис.16) мы видим один главный вызов из события BTE 1025 и один вспомогательный вызов из BADI
Рис.16. Активные вызовы задачи замещения RH0019_08_04.
Главный вызов
Осуществлен из события BTE 1025 - сохранение документа ссылка на Рис.17
FUNCTION zgf_sbt_interface_00001025.
*"----------------------------------------------------------------------
READ TABLE t_bkpf INDEX 1.
*Инициализация в zrggb_add.
*Привязываем t_bkpf и t_bseg[] к указателям в zrggb_add
PERFORM pre_init_d USING t_bkpf 'N' CHANGING t_bseg[].
*Привязываем t_bset[] к указателю в zrggb_add
PERFORM pre_init_bset CHANGING t_bset[].
....
*Идут замещения:
*Замена счетов при реализации
PERFORM rh0019_08_04(zrggb_add).
*Название замещения ..
PERFORM rh0019_09_XX(zrggb_add).
*Название замещения ..
PERFORM rh0019_10_XX(zrggb_add).
*Название замещения ..
PERFORM rh0019_11_XX(zrggb_add).
MODIFY t_bkpf INDEX 1.
....
ENDFUNCTION.
******В ГФ где FUNCTION zgf_sbt_interface_00001025********************
FORM pre_init_d USING i_bkpf TYPE bkpf i_ch CHANGING it_bseg TYPE table.
*Заполним BKPF и BSEG в области памяти zrggb_add
GET REFERENCE OF i_bkpf INTO ref_bkpf.
GET REFERENCE OF it_bseg[] INTO ref_bseg.
*Установим флаг источника вызова
PERFORM set_data(zrggb_add) USING 'g_ch' i_ch.
PERFORM ref_tbl(zrggb_add) USING ref_bkpf ref_bseg.
ENDFORM. "pre_init_d
*
FORM pre_init_bset CHANGING it_bset TYPE table.
GET REFERENCE OF it_bset INTO ref_bset.
PERFORM ref_bset(zrggb_add) USING ref_bset.
ENDFORM. "pre_init_bset
********В программе ZRGGB_ADD*****************************************
FORM ref_tbl USING e_bkpf TYPE REF TO data
e_bseg TYPE REF TO data.
ASSIGN e_bkpf->* TO <bkpf>.
ASSIGN e_bseg->* TO <tbseg>.
ENDFORM. "ref_tbl
*
FORM ref_bset USING e_bset TYPE REF TO data.
ASSIGN e_bset->* TO <tbset>.
ENDFORM.
*
FORM set_data USING i_name i_data.
FIELD-SYMBOLS: <fs> TYPE any.
ASSIGN (i_name) TO <fs>.
CHECK sy-subrc = 0.
<fs> = i_data.
ENDFORM. "set_data
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти