Привет!
Вот ТЗ от бизнес консультанта:
***************
Как установить проверку на выравнивание документов, чтоб у выравниваемых документов поля ZUONR и VERTN имели одинаковое значение. Через проверку, которую мы делаем в FI это не получается сделать, т.к. тут нужно помимо позиций документов, еще учитывать данные из заголовка документа, и после этих ограничений поля ZUONR и VERTN становятся не доступны для выбора.
Необходима проверка, что у документов которые выравниваем поля Присвоения и Номер договора(ZUONR и VERTN) имели одинаковые значения. Если BKPF-TCODE=F-30/FB05, тогда при проводке документа если поля BSEG-KUNNR равнозначны в разных(не обязательно во всех, могут быть и другие позиции)BSEG-BUZEI(может быть любое количество до 999), тогда поля BSEG-ZUONR и BSEG-VERTN также должны иметь одинаковые значения.
Не допускать выравнивания документов с различными значениями полей ZUONR и VERTN.
При сохранении нужно выводить запрещающее сообщение.
***************
Что сделал:
1) Нашёл все юзер экзиты (User exits), которые относятся к транзакциям F-30/FB05:
SAPLF051
RFKORIEX
RFEPOS00
RFAVIS01
FEDI0001
FARC0002
F180A001
F050S007
F050S006
F050S005
F050S004
F050S003
F050S002
F050S001
Во всех из них, где есть хоть какие-то булевские поля EXPORTING или CHANGING или даже внутри TABLES (индикаторы), которые по названию можно определить как отмену выравнивания + на входе в ФМ должны передаваться BKPF и BSEG, вот самый подходящий F050S006 - в нём вызывается ФМ EXIT_SAPLF050_010:
FUNCTION EXIT_SAPLF050_010.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" REFERENCE(MESSAGE_TYPE) LIKE EDMSG-MSGTYP
*" TABLES
*" FI_DOCUMENT_HEADER STRUCTURE BKPF
*" FI_DOCUMENT_ITEM STRUCTURE BSEG
*" CHANGING
*" REFERENCE(NO_AUGBL) LIKE BOOLE STRUCTURE BOOLE OPTIONAL
*" REFERENCE(SET_AUGBL_BY_USER) LIKE BOOLE STRUCTURE BOOLE
*" OPTIONAL
*" REFERENCE(SET_AUGBL_ALL_BY_USER) LIKE BOOLE STRUCTURE BOOLE
*" OPTIONAL
*"----------------------------------------------------------------------
INCLUDE ZX050U10 .
ENDFUNCTION.
На вход есть BKPF и BSEG, на выходе есть NO_AUGBL типа BOOLE - в описании написано, то что мне надо - 'X': Do Not Clear FI Document (Customers/Vendors).
В инклуде ZX050U10 прописал BREAK-POINT. Но при запуске транзакции точка останова не срабатывает.
Так же поставил точки останова во многих юзерэкзитах из указанных выше:
F050S002 - EXIT_SAPLF050_004
F050S003 - EXIT_SAPLF050_006
F050S001 - EXIT_SAPLF050_001
F050S004 - EXIT_SAPLF050_007
F050S005 - EXIT_SAPLF050_008
F050S007 - EXIT_SAPLF050_011
SAPLF051 - EXIT_SAPLF051_003
Итого не проставил точки останова в RFKORIEX, RFEPOS00, RFAVIS01, FEDI0001, FARC0002, F180A001. Но у них на входе либо совсем нет BKPF, BSEG или хотя бы их ключевых полей, либо на выходе нет никакой булевской переменной, в которой я мог бы проставить 'X' и прервать выравнивание. В итоге в изменённых юзер экзитах нигде не происходит остановки программы.
Далее начал искать все BAdI вызывающиеся в конце FB05 (при сохранении).
Для этого поставил точку останова в классе cl_exithandler (se24) внутри метода get_instance на строке
CALL METHOD cl_exithandler=>get_class_name_by_interface
следил за переменной exit_name - это и есть вызываемый BAdI.
Итого получились следующие бади:
FISPLIT
BADI_FMDERIVE
FM_AUTH_OLD_ACTIVITY
FMFG_FUNDMSG_DRV_DEF
FAGL_SEGMENT_BS_ACC
BADI_FM_USE_ASSIGN
FAGL_DERIVE_SEGMENT
FAGL_DERIVE_PSEGMENT
CHECK_COBL_ADDON
FI_RES_ITEM_CURRENCY
AC_QUANTITY_GET
FMRI
SMOD_SAPLFMRI
FM_AUTHORITY_CHECK
FMRE_BUS_PROCESS
FAGL_SET_SEGMENT
EXIT_XFMPR1_001
BADI_PRKNG_NO_UPDATE
FM_POP_CORE
FM_POP_DERIVE
BUAVC_CHECK_RESTRICT
FMAVC_DECO 1
FM_FYC_RECOVERY_POST 1
UKM_R3_ACTIVATE
CO_DOCUMENT_INFO
UKM_R3_ACTIVATE
UKM_FILL
Во всех из них искал по тому же принципу, что и в юзер экзитах, нашёл единственный подходящий:
FI_RES_ITEM_CURRENCY (se18)
В нём метод CALL_FI_REPOST_OP => в нём таблица CH_POSTAB типа POSTAB_TAB и в ней поле RFOPS типа XRAGL (Индикатор: выравнивание отменено). Как мне кажется то что надо. И на вход есть BKPF и BSEG. Но в свойствах бади в se18 стоит галочка "Внутри SAP". И при попытке создать свой бади через se19 выходит сообщение:
"Определение BAdI FI_RES_ITEM_CURRENCY предусмотрено только для использования внутри SAP"
Эта галочка снимается БЕЗ запроса ключа разработчика, но, погуглив, эту ошибку найдёте, что народ не советует её снимать.
Это при том что не факт что этот бади сработает.
Далее искал все BTE. Для этого поставил точки прерывания в ФМ BF_FUNCTIONS_FIND и в PC_FUNCTION_FIND (se37) на строках
CALL FUNCTION 'BF_FUNCTIONS_READ'
и
CALL FUNCTION 'PC_FUNCTIONS_READ'
соответственно
следил за переменными I_EVENT и I_PROCS соответственно - это и есть вызываемые BTE (разница только в их типе "P/S модули" или "Модули процесса" - см. транзакцию FIBF)
Итого получились следующие BTE:
00000940
00001140
00001005
00001010
00001011
00001005
00001010
00001011
00001005
00001011
00001020
00001130
00001120
00001150
00001025
00005012
00001170
00001030
00005011
00005011
00005011
00005012
00005012
00005012
00005012
00005010
00005010
00005012
00005012
00005030
00005040
00005030
00005040
Фуф. Короче самые подходящие:
00001040 ОТМЕНА ВЫРАВНИВАНИЯ: После стандартного обновления
00001041 СБРОС ВЫРАВНИВАНИЯ: со сторно док-та выравнивания
Но на них FB05 не останавливается, на них останавливается FBRA - я так удалял созданные в F-30/FB05 документы.
Другие BTE останавливаются, но у них либо нет выходной булевской переменной/индикатора либо нет на входе данных по BKPF и BSEG.
Народ, ПОМОГИТЕ!