+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » SMOD/CMOD - Расширения (Модератор: Dmitriy)Тема:
|- Как отменить выравнивание в конце транзакции F-30/FB05




Автор Тема: Как отменить выравнивание в конце транзакции F-30/FB05  (Прочитано 4524 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн shirakz

  • Newbie
  • *
  • Сообщений: 19
  • Reputation Power: 0
  • shirakz has no influence.
  • YearsYearsYears
Привет!

Вот ТЗ от бизнес консультанта:
***************
Как установить проверку на выравнивание документов, чтоб у выравниваемых документов поля 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.
Народ, ПОМОГИТЕ!

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 685
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
А что в BTE 00001120 тоже не заходит в момент выравнивания?

Оффлайн shirakz

  • Newbie
  • *
  • Сообщений: 19
  • Reputation Power: 0
  • shirakz has no influence.
  • YearsYearsYears
You are not allowed to view links. Register or Login
А что в BTE 00001120 тоже не заходит в момент выравнивания?
Заходит, но в этом BTE нет никакой булевской переменной на выходе для отмены выравнивания

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 685
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Заходит, но в этом BTE нет никакой булевской переменной на выходе для отмены выравнивания
Ну это, а переменная вам то зачем? Выдайте сообщение с ошибкой да всех делов.

Оффлайн shirakz

  • Newbie
  • *
  • Сообщений: 19
  • Reputation Power: 0
  • shirakz has no influence.
  • YearsYearsYears
You are not allowed to view links. Register or Login
Ну это, а переменная вам то зачем? Выдайте сообщение с ошибкой да всех делов.
А какое сообщение, я такого никогда не делал

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 685
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
А какое сообщение, я такого никогда не делал
В смысле вы никогда не писали MESSAGE типа 'E' в абапе? Ну попробуйте должно в принципе оставить выполнение транзакции.

Оффлайн shirakz

  • Newbie
  • *
  • Сообщений: 19
  • Reputation Power: 0
  • shirakz has no influence.
  • YearsYearsYears
You are not allowed to view links. Register or Login
В смысле вы никогда не писали MESSAGE типа 'E' в абапе? Ну попробуйте должно в принципе оставить выполнение транзакции.
ну я не знал что им можно прервать транзакцию, никогда такого не делал ещё, да и юзер экзиты и BTE ещё не использовал :)

Оффлайн shirakz

  • Newbie
  • *
  • Сообщений: 19
  • Reputation Power: 0
  • shirakz has no influence.
  • YearsYearsYears
You are not allowed to view links. Register or Login
ну я не знал что им можно прервать транзакцию, никогда такого не делал ещё, да и юзер экзиты и BTE ещё не использовал :)
вывел
message 'Тестовая ошибка...' type 'E'.
но она выводится в статус баре снизу и сама транзакция не прерывается, правда в ней теперь ничего нельзя сделать только выйти можно без сохранения данных - это нормально? В сапе так нормально?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 685
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
\но она выводится в статус баре снизу и сама транзакция не прерывается, правда в ней теперь ничего нельзя сделать только выйти можно без сохранения данных - это нормально?
Ну вы себе как-то противоречите, нельзя ничего сделать, но можно выйти без сохранения?! Так это вроде как и была ваша цель, не дать сделать операцию. Вы ее достигли. Задача решена.

You are not allowed to view links. Register or Login
В сапе так нормально?
Вопрос, что такое нормально, это из философской категории... задача решена? Ну скажем так не совсем изящное решение, но если она не позволяет выполнить "не правильную" с точки зрения бизнеса операцию, то почему бы и нет? Единственное, нужно бы ошибку описать через класс и номер сообщения с более подробным описанием проблемы.

PS: Выдача ошибки в статусной строке, это нормально!

Оффлайн shirakz

  • Newbie
  • *
  • Сообщений: 19
  • Reputation Power: 0
  • shirakz has no influence.
  • YearsYearsYears
You are not allowed to view links. Register or Login
Ну вы себе как-то противоречите, нельзя ничего сделать, но можно выйти без сохранения?! Так это вроде как и была ваша цель, не дать сделать операцию. Вы ее достигли. Задача решена.
Вопрос, что такое нормально, это из философской категории... задача решена? Ну скажем так не совсем изящное решение, но если она не позволяет выполнить "не правильную" с точки зрения бизнеса операцию, то почему бы и нет? Единственное, нужно бы ошибку описать через класс и номер сообщения с более подробным описанием проблемы.

PS: Выдача ошибки в статусной строке, это нормально!

Да уже сделал так:
MESSAGE e015(z001).

Спасибо за терпение :)