+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » Техники расширений системы SAPТема:
|- 6 - BTE - Business Transaction Events



Автор Тема: 6 - BTE - Business Transaction Events  (Прочитано 1755 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 636
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
6 - BTE - Business Transaction Events
« : Апрель 27, 2016, 06:21:47 pm »
    BTE - Business Transaction Events

    BTE – Работа с бизнес событиями транзакций – это техника расширения, позволяющая выполнить дополнительную проверку значений данных в момент ввода документа в систему или выполнить обновление данных в собственных таблицах при выполнении определённых операций (транзакций). Появление этой техники должно было сгладить проблемы использования одной точки расширения разными разработчиками. В некотором роде, для событий проверки значений данных это удалось сделать, однако реализация события обновления является единственной. Техника бизнес событий используется как разработчиками SAP, партнерами SAP, так и клиентами, хотя для клиентов, часть событий ограничена к использованию.

    Использование техники BTE стало возможным, начиная с версии SAP ERP 4.0 . Эта техника обеспечивает интерфейс (точку выхода) в стандартной программе с пользовательским расширением (приложением), выполняющим дополнительные пользовательские проверки или обновление пользовательских данных. Технику BTE используют, как правило, для функциональностей:
    • главная книги FI-GL,
    • бухгалтерия поставщиков FI-AP,
    • бухгалтерия клиентов  FI-AR,
    • модуля сбыта SD.

    Техника BTE реализуется с помощью предопределенных интерфейсов между стандартной программой и расширением, позволяющих вызвать «дополнительную» (пользовательскую) функциональность. Для реализации бизнес расширения вы должны создать модуль с предопределенными параметрами и именами, для каждого бизнес-события это будет отдельная реализация со своим набором параметров. Система SAP вызывает функциональные модули OPEN_FI_PERFORM_* или OUTBOUND_CALL_*, которые в свою очередь проверяют, есть ли «активные» BTE события из указанных в настройках системы.

    Существует два типа интерфейсов (в технике BTE):
    • Publish & Subscribe interfaces (P/S Modules) – в этом типе интерфейса нельзя обновлять данные в БД, но возможно существование нескольких (очередь) активных «инстанций», вызываемых последовательно.
    • Process interfaces (Process Modules) – этот тип интерфейса позволяет выполнять обновление данных в БД, но ограничением его использования является то, что активной может быть одна «инстанция» данного типа.

    Для нахождения существующих в коде стандартных программ «триггерных точек» BTE можно пойти следующими путями:
    1) Поиск в тексте стандартной программы вызовов:
    • "OPEN_FI_PERFORM" для нахождения «точки вызова» с интерфейсом P/S Modules;
    • "OUTBOUND_CALL" для нахождения «точки вызова» с интерфейсом Process Modules;
    2) Использовать транзакцию FIBF и далее по меню: «Параметры настройки» – «P/S Модули» или «Модули процессов», для соответствующих типов интерфейсов. Рисунок 1: BTE-1.png.
    • Использование отладчики системы, для этого необходимо установить точку останова в функциональном модуле BF_FUNCTIONS_FIND.

    Для каждого типа интерфейса существует три варианта использования:
    • Вариант для стандартных событий системы SAP-приложения, изменять которые не рекомендуется, так как это сфера ответственности разработчиков компании SAP.
    • Вариант для событий партнеров (прим. автора. Среднестатистический разработчик вряд ли является партнером)
    • Вариант для событий «обычных клиентов».

    Как мы видим для практического применения на проекте внедрения или при поддержке остаётся только последний пункт, выбрав который, мы можем приступить к реализации собственных BTE-расширений. Для получения информации по существующим событиями в конкретной транзакции перейдите по меню «Среда» – «Инфо-система P/S» или «Инфо-система (процессы)». После чего получите список всех доступных событий каждого типа, рисунок 2: BTE-2.png

    Примечание: Наиболее «любимый» тип интерфейса для BTE, это событие с номером 1120 – замещение полей в заголовке и позициях документа. Фактически разрешено выполнять изменение полей заголовка и позиций документа, когда он полностью сформирован, это - аналог замещения с типом события «0003 – документ полностью», но в отличии от указанного замещения, событие 1120 имеет место для всех создаваемых FI-документов.

    Для получения шаблона реализации функционального модуля, можно скопировать его из окна справки, или же нажать на панели инструментов кнопку  "Функц. модуль-образец", после нажатия которой будет вызвана транзакция SE37 – создание функционального модуля. В поле ввода имени функции будет подставлен шаблон реализации выбранного интерфейса рисунок 3: BTE-4.png. Если требуется только просмотреть параметры функции, то можно выбрать кнопку  "Интерфейс", при нажатии на которую, рисунок 5: BTE-41.png, будут выведены параметры функционального модуля.

    Следует скопировать этот шаблон в собственный функциональный модуль начинающийся с Z_ или Y_. Например, модуль SAMPLE_INTERFACE_00001120 можно скопировать в модуль Z_SAMPLE_PROCESS_00001120, рисунок 5: BTE-5.png, в собственной группе функций, например  Z_BFFMSMPL2.

    В таком случае после копирования мы получим шаблон модуля с входными и выходными параметрами, где можем написать собственную реализацию, пример кода ниже:

    [/list]
    Код: You are not allowed to view links. Register or Login
    FUNCTION z_sample_process_00001120.
    *"--------------------------------------------------------------------
    *"*"Локальный интерфейс:
    *"  IMPORTING
    *"     VALUE(I_BKDF) TYPE  BKDF OPTIONAL
    *"  TABLES
    *"      T_BKPF STRUCTURE  BKPF
    *"      T_BSEG STRUCTURE  BSEG
    *"      T_BKPFSUB STRUCTURE  BKPF_SUBST
    *"      T_BSEGSUB STRUCTURE  BSEG_SUBST
    *"      T_BSEC STRUCTURE  BSEC OPTIONAL
    *"  CHANGING
    *"     REFERENCE(I_BKDFSUB) TYPE  BKDF_SUBST OPTIONAL
    *"--------------------------------------------------------------------
      break tochenyuk.
    ENDFUNCTION.

    Пока собственную реализацию разрабатывать не будем, а поставим только команду остановки, и перейдем к активации вызова нашей функции.

    Для начала, требуется создать, так называемую, запись кода продукта. Фактически это признак объединения для группы событий, например, если для реализации какого-то процесса вам нужно задействовать несколько бизнес-событий, то таким образом вы можете сгруппировать используемые бизнес функции и проводить активацию разработки одним нажатием мыши, включая или отключая разработку. Для этого в транзакции FIBF переедем по меню: «Параметры настройки» – «Продукты» – «…клиента», рисунок 6: BTE-6.png.

    Вполне возможно, что в таблице уже будут другие активные продукты («инстанции»). Если не знаем, что это за продукты, то просто создаем новый собственный тип продукта и «ставим галку» активации, если заранее знаем код продукта, например, это созданный нами ранее продукт, тогда создавать новый продукт не требуется, он уже создан. Для создания новой группы нажимаем кнопку «Новые записи», рисунок 7: BTE-7.png

    Теперь сохраняем собственный продукт и переходим к его связыванию с функциональным модулем, созданным ранее. Так как это был модуль обновления данных, то идем по пути: «Параметры настройки» – «Модули процесса» – «…клиента», где добавляем модуль, созданный ранее с нашим типом продукта, рисунок 8: BTE-8.png, после чего, сохраняем данные ввода.

    Теперь наш модуль будет вызываться системой при формировании любого документа FI. Исходя из ключей таблицы событий для процесса обновления, событие может быть только одно, для страны и типа приложения. Если бизнес имеет место в разных странах, то в общем можно выполнить реализацию реакции системы на событие в зависимости от страны. Код продукта в ключ таблицы не входит. Для процессов типа P/S Modules, код продукта входит в ключ таблицы, поэтому событий типа «подписка» может быть зарегистрировано более чем одно.
    « Последнее редактирование: Апрель 27, 2016, 06:37:34 pm от Uukrul »

    Оффлайн Uukrul

    • SAP ECC 6.0 Ehp(*)
    • Administrator
    • Epic Member
    • *****
    • Сообщений: 3 636
    • Reputation Power: 2
    • Uukrul barely matters.Uukrul barely matters.
    • Пол: Мужской
    • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
      • Sapforum.BIZ
    6 - BTE - Business Transaction Events
    « Ответ #1 : Апрель 27, 2016, 06:35:24 pm »
    Демонстрационный пример и некоторые выводы

    Для примера вызова, проведем документ движения материала, рисунок 9: BTE-8.png. В момент сохранения документа система перейдет в режим отладки, где вы имеете полный доступ к заголовку и позициям документа, рисунок 10: BTE-10.png.

    Однако, если вы будете изменять какие-то поля документа, например, в заголовке документа решите изменить поле текст заголовка в таблице T_BKPF, то ваши изменения не будут «видны» программе, так как перед вызовом события система сохраняет значения таблиц, в локальные переменные. После выхода из события система выполняет восстановление всех ваших изменений:
    Код: You are not allowed to view links. Register or Login
      L_BSEG[]  = T_BSEG[].
      L_BKPF[]  = T_BKPF[].                                "end:note530655
      L_BSEC[]  = T_BSEC[].                                "Note 569711.

    Ранее система сохраняла значения этих таблиц в памяти операциями:
    Код: You are not allowed to view links. Register or Login
      memid+6 = '00001120P'.
      export t_bkpf t_bseg to memory id memid.            "start:note530655

    При этом была возможность в событии прочитать значения переменных из памяти, и выполнить там изменения, но с ноты 530655 такая возможность уже закрыта. На самом деле вы можете изменять только поля, перечисленные в следующих структурах:
    • Для заголовка BKPF_SUBST
    • Для позиций BSEG_SUBST

    Количество полей в данных структурах ограничено, например, в системе IDES присутствуют только следующие поля, рисунок 11: BTE-11.png. Текст функционального модуля, приведённый ниже, заполняет заголовок и ссылочный номер в документе текстовыми константами, если переданные значения пустые.
    Код: You are not allowed to view links. Register or Login
    FUNCTION z_sample_process_00001120.
    *"--------------------------------------------------------------------
    *"*"Локальный интерфейс:
    *"  IMPORTING
    *"     VALUE(I_BKDF) TYPE  BKDF OPTIONAL
    *"  TABLES
    *"      T_BKPF STRUCTURE  BKPF
    *"      T_BSEG STRUCTURE  BSEG
    *"      T_BKPFSUB STRUCTURE  BKPF_SUBST
    *"      T_BSEGSUB STRUCTURE  BSEG_SUBST
    *"      T_BSEC STRUCTURE  BSEC OPTIONAL
    *"  CHANGING
    *"     REFERENCE(I_BKDFSUB) TYPE  BKDF_SUBST OPTIONAL
    *"--------------------------------------------------------------------
      LOOP AT t_bkpfsub.
        IF t_bkpfsub-xblnr = space. t_bkpfsub-xblnr = 'TEST XBLNR'. ENDIF.
        IF t_bkpfsub-bktxt = space. t_bkpfsub-bktxt = 'TEST BKTXT'. ENDIF.
        MODIFY t_bkpfsub.
      ENDLOOP.
    ENDFUNCTION.

    Пример результата работы этого модуля показан на рисунке 12: BTE-12.png. Любые другие поля, находящиеся в основных таблицах системы, типа T_BKPF, не будут изменены. Компания SAP, считает, что другие поля не должны быть доступны для изменений.

    Внимание! Далее будет описана методика, которая позволяет включить возможность изменения стандартный полей финансового документа. Использование этого механизма может привести к некоторым проблемам при обновлениях системы. Эти проблемы разрешимы, но следует помнить, что они могут иметь место.

    Как было написано выше, система позволяет изменять значения полей, которые описаны в структурах BKPF_SUBST и BSEG_SUBST. Фактически, если просмотреть код вызова события, то значения из этих структур передаются в поля финансового документа используя команду MOVE-CORRESPONDING. Поэтому, например, в заголовке FI-документа есть поле «№ требования» (BKPF-LOTKZ), которое не разрешено к изменениям, но мы хотим его изменять. В таком случае заходим в ведение структуры BKPF_SUBST и путем добавления дополнительной структуры добавляем это поле, рисунок 13: BTE-13.png. После этого в программу реализации события можно добавить строку формирующую поле BKPF-LOTKZ.
    Код: You are not allowed to view links. Register or Login
    FUNCTION z_sample_process_00001120.
    *"--------------------------------------------------------------------
    *"*"Локальный интерфейс:
    *"  IMPORTING
    *"     VALUE(I_BKDF) TYPE  BKDF OPTIONAL
    *"  TABLES
    *"      T_BKPF STRUCTURE  BKPF
    *"      T_BSEG STRUCTURE  BSEG
    *"      T_BKPFSUB STRUCTURE  BKPF_SUBST
    *"      T_BSEGSUB STRUCTURE  BSEG_SUBST
    *"      T_BSEC STRUCTURE  BSEC OPTIONAL
    *"  CHANGING
    *"     REFERENCE(I_BKDFSUB) TYPE  BKDF_SUBST OPTIONAL
    *"--------------------------------------------------------------------
      break tochenyuk.

      LOOP AT t_bkpfsub.
        IF t_bkpfsub-xblnr = space. t_bkpfsub-xblnr = 'TEST XBLNR'. ENDIF.
        IF t_bkpfsub-bktxt = space. t_bkpfsub-bktxt = 'TEST BKTXT'. ENDIF.

        IF t_bkpfsub-lotkz = space. t_bkpfsub-lotkz = 'TEST LOTKZ'. ENDIF.
        MODIFY t_bkpfsub.
      ENDLOOP.
    ENDFUNCTION.

    Если теперь провести документ движения материала, то в сформированном финансовом документе, поле «№ требования» (BKPF-LOTKZ), будет заполнено, рисунок 14: BTE-14.png.

    Какие могут возникнуть проблемы при использовании такого решения? Только одна:  разработчики SAP решат добавить в функциональность возможность изменения поля BKPF-LOTKZ. В таком случае, возникнет ситуация, что пакет обновления будет применен с ошибкой, так как поле уже существует в структуре BKPF_SUBST. Для разрешения такой ситуации, скорее всего, потребуется удалить это поле из своего расширения, в данном случае ZZZ_ADDFI, после чего применить пакет изменений от SAP.

    Выводы.

    Создавая механизм, реализующий технику Business Transaction Events, компания SAP попыталась решить коллизию: с одной стороны, наличие единого модуля, который меняют разные разработчики, а с другой - решение проблемы группировки набора пользовательского кода, решающего одну бизнес-задачу. Такая ситуация возникает при решении бизнес-проблемы проблемы, когда требуется активировать несколько бизнес-событий, например, бизнес-события проверки значений в связке с бизнес-событием обновления данных в таблицах системы. В целом этот механизм решает задачу, хотя есть определённые проблемы с видимостью полей, которые можно изменять, а также для события обновления не решен вопрос совместного доступа к коду. Однако, на момент появления (год 1998-99) это было очень прогрессивно по сравнению с существующими на тот момент технологиями.