Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: shirakz от Август 03, 2017, 02:29:50 pm
-
Из системы CRM при репликации мы получаем только основные данные деловых партнеров, и один или несколько сбытовых ракурсов. А далее пользователи вручную расширяют дебиторов на БЕ и Сбыт. Необходимо чтоб при репликации автоматически происходило расширение ДП или дебиторов на все БЕ и сбытовые ракурсы.
Сделать это надо как я понимаю либо через 1) BAdI, либо 2) user-exit, либо 3) BTE.
Искал такие ФМ, где есть CHANGING/EXPORT параметры KNB1 (для расширения на все БЕ) и KNVV (для расширения на все сбытовые ракурсы).
1) Есть 2 вроде как подходящие BAdI:
CUSTOMER_ADD_DATA
CUSTOMER_ADD_DATA_BI
Ещё есть CUSTOMER_ADD_DATA_CS, но там нет в её методах CHANGING/EXPORT параметров KNB1 и KNVV.
В CUSTOMER_ADD_DATA есть 2 метода:
PRESET_VALUES_CCODE Preassign KNB1 Dependent of the General Data
PRESET_VALUES_SAREA Preassign KNVV Dependent of the General Data
и в них есть CHANGING параметры E_KNB1 и E_KNVV, но это структуры, а не таблицы, нельзя несколько записей туда вставить, а мне же надо расширять на все БЕ и сбытовые ракурсы.
В CUSTOMER_ADD_DATA_BI есть метод
PROCESS_ALE_OWN_CHANGE_POINTER Evaluate Own Change Pointer
И в нём есть CHANGING параметры-таблицы T_KNB1_KEY и T_KNVV_KEY, но в описании метода что-то про ALE говорится - мне кажется это не подходит - с ALE не сталкивался.
2) user-exit
есть SAPMF02D - но там KNB1 и KNVV передаются как входные параметры
3) BTE есть такие:
00001310 CUSTOMER MASTER DATA: GUI Callup
00001320 CUSTOMER MASTER DATA: Save
00001321 CUSTOMER MASTER DATA: Save with data transfer
00001330 CUSTOMER MASTER DATA: Key texts
00001340 CUSTOMER MASTER DATA: Final checks
00001350 CUSTOMER MASTER DATA: Individual duplication check
00001360 CUSTOMER MASTER DATA: Auth. check: Acct group
Но здесь также как и в юзер экзите KNB1 и KNVV передаются как входные параметры.
-
Ну я через BADI не делал, я в моменте создания запускал в отдельном процессе программу, которая ждала создания записи нового дебитора/кредитора а уже дальше выполняла его расширение, на необходимые мне ракурсы. Из минусов, отдельный процесс мог слететь или не дождаться создания, ну если честно такое было пару раз, когда были в целом проблемы с блокировками объектов, из плюсов, программу можно было запустить в ручном режиме в диалоге, с указанием конкретной записи которую следовало расширить. В общем у меня была такая вот реализация.
-
я в моменте создания запускал
это Вы из юзер экзита или из BTE запускали?
запускал в отдельном процессе программу
это как? я такого не делал ещё
которая ждала создания записи нового дебитора
что-то не слышал про такое в абапе - каким образом абап-программа может ожидать какого-то события?
дальше выполняла его расширение, на необходимые мне ракурсы
с помощью BAPI?
сперва BAPI_CUSTOMER_CREATE, потом BAPI_CUSTOMER_EDIT, так?
P.S.
Из БАДИ и БТЕ нельзя делать COMMIT, то есть нельзя менять стандартные таблицы и запускать бапи типа BAPI_CUSTOMER_CREATE
и из юзерэкзитов скорее всего тоже.
-
это Вы из юзер экзита или из BTE запускали?
Из экзита создания запускалось.
это как? я такого не делал ещё
Это делаются два модуля, модуль обновления и модуль RFC которое запускаются последовательно, при этом RFC запускается уже отдельным потоком.
что-то не слышал про такое в абапе - каким образом абап-программа может ожидать какого-то события?
А чего там слышать то? В модуле RFC пытаетесь проверить возможность установки блокировки на созданного клиента, если получилось значит клиент создан, можно расширять.
с помощью BAPI?
Нет это давно было, поэтому там вообще запускался пакетный ввода через CALL TRANSACTION все делалось.
Из БАДИ и БТЕ нельзя делать COMMIT, то есть нельзя менять стандартные таблицы и запускать бапи типа BAPI_CUSTOMER_CREATE
и из юзерэкзитов скорее всего тоже.
Ну для отдельного процесса в RFC это уже не распространяется, там можно делать что угодно и сколько угодно раз. Это уже отдельный процесс который не зависит от процесса создания запущенного из CRM, в вашем случае.
-
модуль обновления и модуль RFC
что за модуль обновления? через него запускается модуль RFC?
почему нельзя напрямую из BTE запустить модуль RFC?
-
что за модуль обновления? через него запускается модуль RFC?
Обычный модуль обновления, фактически запускается при выполнении команды COMMIT WORK, при этом не важно где физически вставлен вызов такого модуля. В общем фактически вы знаете что если код выполняется значит была выполнена фиксация изменений. В общем в объявлении FM галки правильно расставляем и получим модуль обновления.
почему нельзя напрямую из BTE запустить модуль RFC?
Потому что RFC в новом потоке желательно запустить как можно ближе к коммиту, идаельно после него, поэтому запуск его из модуля обновления в целом говорит, что коммит прошел и можно начинать работать с созданными данными. В общем из практики самый удобный вариант получается.