+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » Техники расширений системы SAPТема:
|- 8 - A3_Enhancement Spot



Автор Тема: 8 - A3_Enhancement Spot  (Прочитано 2836 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
8 - A3_Enhancement Spot
« : Ноябрь 17, 2016, 10:20:23 pm »
Примечание: Начиная с версии ECC 6.0 появился замечательный механизм расширения функциональности системы (Enhancement spot/section), однако, это и самый простой способ «поломать систему об колено», так как никакого контроля за тем, что и как вы реализуете в точке расширения, система не осуществляет.

Общая концепция.

   Enhancements spot/section – Техника расширения, позволяющая практически выполнить внедрение пользовательского кода в любом месте стандартной бизнес-транзакции. Enhancement-ы в системе разделяются на «явные» и «не явные». Явные точки расширения аналогично технике Customer-exits используют специально введенный оператор, неявные же фактически присутствуют в начале и конце логически завершенных блоков кода или структур данных. Техника Enhancements spot/section позволяет внедрять пользовательский код в контекст выполнения стандартного кода системы. Вы получаете доступ ко всем переменным и можете фактически полностью переопределить логику работы системы, что является очень небезопасным, так как может привести к серьезным сбоям в работе стандартных транзакций, в случае некорректной реализации кода расширения. На данный момент это, с одной стороны- очень мощный механизм расширения функциональности, а с другой стороны- самый небезопасный из всех типов расширений. Общая рекомендация от компании SAP: если существует возможность использования любой другой тип расширения – используйте его, технику Enhancements – используйте только в том случае, если других возможностей влияния на выполняемый код нет.

   Немного теории, сформулированной после прочтения статьи «Новая концепция расширений как метод совершенствования программ SAP без их модификации», автор Майкл Акер (Michael Acker), SAP Professional Journal 2008 год. Остановлюсь только на ключевых моментах. Тем, кого заинтересуют подробности, рекомендую прочтение оригинала статьи или посещения сайта You are not allowed to view links. Register or Login.

   Enhancement Spot, фигурально говоря, – новый механизм экзитов в системе, фактически, система предоставляет новую возможность расширения стандартной функциональности без получения ключей модификации на объекты системы. Так же гарантируется, что ни при каких обновлениях системы, сделанные вами расширения, не будут затерты, хотя при этом и не гарантируется, что они останутся работоспособными. На данный момент, концепция расширений поддерживает следующие расширения объектов системы:

  • Расширение классов — возможно добавление новых необязательных параметров в методы, добавление методов pre и post к существующему методу, которые вызываются перед вызовом самого метода, ну и доступно общее переопределение метода с использованием инструкции overwrite.
  • Расширение функций — возможность добавления новых необязательных параметров к функции. При этом, конечно же, нужно будет использовать функциональность «расширение кода», так как добавленные вами параметры нужно же кому-то и как-то обрабатывать.
  • Расширение исходного кода — как возможность вставки своей логики в определенные позиции исходного кода, так и замещение части кода своей логикой работы. Собственно говоря, этот механизм кажется мне наиболее часто используемым на практике, поэтому примеры в статье построены для демонстрации работы именно этого расширения.
  • Расширение web-экранов — позволяет добавлять новые элементы на экраны пользовательского интерфейса. С этим расширением я пока не сталкивался, но если  кому-то это  интересно и нужно, то идем на You are not allowed to view links. Register or Login, так как имеются в виду web-экраны базирующиеся на парадигме контроллера ракурсов модели (Model View Controller, MVC).
  • Новые BADI — технология BADI внедрений была реализована, начиная с версии 4.6, однако, с появлением технологии расширений, принцип технической реализации BADI стал другой, т. е. с виду использование осталось фактически таким же, но разработчики SAP говорят, что новые BADI стали работать быстрее. Технология BADI стала работать, используя, так называемые, точки расширения основанные на технике Enhancement Spot.
   Благодаря появлению техники Enhancement, в системе стала доступна техника бизнес-расширений функциональности, т.е. когда вы заходите в транзакцию SFW5, Рисунок 1: SFW5-01.png и активируете необходимую вам бизнес-функцию, знайте, что фактически в вашей системе происходит активация иногда сотен точек расширений, которые реализуют функциональность данной бизнес-фукнции.

Расширения классов.

   Любой стандартный класс системы можно дополнить новыми интерфейсами, атрибутами, методами или событиями. При этом, например, методы, можно расширить дополнительными точками входа перед вызовом метода, после вызова или путем полного переопределения метода. Для расширения класса требуется зайти в транзакцию SE24 – Построитель классов, выбрать кнопку «Просмотр», так как если вы выберете «Изменить», то система попросить ключ модификации для объекта. Переходите к просмотру данных класса и по меню выбираете: «Класс» – «Расширить», Рисунок 2: CL-01.png.

   Если вы в первые, расширяете класс, то у вас будет запрошено имя расширения и, если в вы планируете расширить несколько объектов, для реализации одного бизнес-процесса, то желательно их объединить в группу/контейнер расширений,

   Имя расширения, как и имя контейнера, создается согласно стандартным пользовательским соглашениям, т.е. Z или Y, Рисунок 3: CL-02.png.  Если для класса уже существует расширение, тогда вам будет выдан перечень существующих расширений, и вы сможете или выбрать изменение уже существующего или создать новое расширение, однако, если это расширение компании SAP, то конечно же, вы не сможете его использовать для включения своих изменений.

   После подтверждения создания расширения вы получите возможность дополнять класс новыми атрибутами или методами, как видим на Рисунок 4: CL-03.png; в таблицах, открылись поля для ввода необходимой информации по расширению класса. Вы должны понимать, что если вы добавляете новый атрибут или метод в класс, то вы должны обеспечить его реализацию. Ограничения по именам никакого нет, но я рекомендую не выходить за стандартное соглашение по именам, так как, возможно, разработчик тоже захочет расширить свой класс, и при очередном обновлении вы столкнетесь с проблемами совпадения имен. Поэтому я бы называл, свои добавленные атрибуты или методы начиная с префикса «ZZ_». Так сказать. для надежности, Рисунок 5: CL-04.png. Как видим. после добавления нового метода система видит, что в данном случае, метод находится в расширении ZI_CL_SALV_TABLE.

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

   Почему этого не сделал автор класса, я не знаю, наверное, предполагал, что в заголовок будет выводиться одна или две строки, поэтому вполне хватает динамического расчета высоты заголовка. Попробуем немного переопределить поведение класса используя свой метод DISPLAY, но с передачей параметра, определяющего высоту заголовка таблицы. Под высотой заголовка имеется в виду область, обозначенная на Рисунок 6: CL-05.png. Сейчас в ней выведено 4 строки, и по высоте это составляет порядка 87 пикселов (значение взято в ходе отладки из подпрограммы, которая определяет автоматически ширину заголовка).

   В рамках своего метода, вы имеете полный доступ ко всем переменным класса, поэтому можете выполнять такие операции, как переопределение внутренних атрибутов класса или вызов защищенных методов. Например, по умолчанию в новом методе отображения класса я просто скопировал код из стандартного метода:
Код: You are not allowed to view links. Register or Login
METHOD zz_display .
  CHECK me->r_controller IS BOUND.

  me->r_controller->display( ).

ENDMETHOD.
   Как видим, я обращаюсь к переменной, которая является внутренней в классе, Рисунок 7: CL-06.png, и система не выдает никакой ошибки.

   К сожалению, в данном случае выполнить красивую реализацию управления высотой заголовка не представилось возможным. Автор класса, как оказалось, использовал внутри стандартный вызов ФМ: REUSE_ALV_GRID_DISPLAY, причем при вызове, автор класса просто закомментировал параметры, отвечающие за управление высотой заголовка, так же, как и закомментировал событие, вызываемое перед отрисовкой заголовка, поэтому корректно исправить данный класс оказалось невозможно. Поэтому расширить класс мы можем, но вот повлиять на поведение – нет; точнее - можем, но количество добавленных модификаций, по моему мнению, будет слишком большим, и это, как раз, тот случай, когда проще использовать или прямой вызов функционального модуля REUSE_ALV_GRID_DISPLAY или использовать другой класс вывода ALV-таблицы.

   Расширение «перед» или «после» вызова стандартного метода.
   Система позволяет не только добавлять новые атрибуты и методы, но и добавить так называемые предварительные методы, которые будут всегда вызываться перед вызовом любого стандартного метода. Так же можно полностью заместить стандартный метод, хотя смысл этого действия мне не очень понятен, о причинах, почему я так думаю, будет ниже.
   Итак, расширяем класс путем добавления кода, выполняющегося перед вызовом стандартного метода класса. Для этого становимся в поле интересующего нас метода и по меню выбираем: «Класс» – «Расширить», а так как у нас уже есть одно расширение класса, то система попросит нас выбрать имя расширения, в рамках которого будем проводить модификацию, Рисунок 8: CL-07.png.

   Далее устанавливаем курсор на имя метода DISPLAY и по меню выбираем: «Обработать» – «Операции расширения» – «Добавить предварит. метод», Рисунок 9: CL-08.png.

   Если проблем с добавлением не будет, то в колонке «PreExit», будет добавлена кнопка перехода к коду метода, Рисунок 10: CL-09.png

   Так как реализации мы еще не создавали, то в последней колонке «Внедрение расширений» пока пусто, но как только мы перейдем к введению кода, в колонке будет подставлено имя нашего внедренного расширения. При первом входе в ведение предварительного метода, система сгенерирует новый класс, реализующий данный метод. Код класса будет следующим:
Код: You are not allowed to view links. Register or Login
CLASS LCL_ZI_CL_SALV_TABLE DEFINITION.
PUBLIC SECTION.
CLASS-DATA OBJ TYPE REF TO LCL_ZI_CL_SALV_TABLE.
DATA CORE_OBJECT TYPE REF TO CL_SALV_TABLE .
 INTERFACES IPR_ZI_CL_SALV_TABLE.
  METHODS:
   CONSTRUCTOR IMPORTING CORE_OBJECT
     TYPE REF TO CL_SALV_TABLE OPTIONAL.
ENDCLASS.
CLASS LCL_ZI_CL_SALV_TABLE IMPLEMENTATION.
METHOD CONSTRUCTOR.
  ME->CORE_OBJECT = CORE_OBJECT.
ENDMETHOD.

METHOD IPR_ZI_CL_SALV_TABLE~DISPLAY.
*"------------------------------------------------------------------------*
*" Declaration of PRE-method, do not insert any comments here please!
*"
*"methods DISPLAY .
*"------------------------------------------------------------------------*
*
* Реализация PRE-метода
*
ENDMETHOD.
ENDCLASS.
   Как видим, создается класс, в котором объявляется внутренняя переменная CORE_OBJECT. Эта переменная получает ссылку на основную реализацию класса, к которой выполнится вызов.

   Особенности реализации классов для Pre, Post или Overwrite методов.
   Параметры данных методов всегда равны оригинальным параметрам замещаемых методов, которые вы переопределяете, соблюдая требования:
  • Pre-метод – Не должен иметь выходных параметров
  • Post-метод – Не должен иметь входных параметров, при этом выходные параметры (EXPORT) оригинального метода становятся изменяемыми параметрами (CHANGING) в Post-методе. Возвращаемые параметры (RETURNING) становятся так же изменяемыми параметрами (CHANGING).
  • Overwrite – Реализация параметров не изменяется.
   Добавить или изменить набор передаваемых параметров нельзя, а то, что вы получаете в своем локальном классе ссылку на оригинальный объект, в этом как раз и кроется основанная проблема такого метода расширения класса. Она заключается в том, что вы имеете доступ только к задекларированным методам и атрибутам класса. Никакие атрибуты или методы, отмеченные как внутренние, вам в этой реализации расширения не доступны, поэтому область использования данного типа расширения значительно сужается. Особенно мне не очень понятна схема переопределения OverwriteExit. Так как обычно внутри метода вызывается код работающий с внутренними переменными, доступа к которым мы внутри своей реализации класса не имеем. Что мы там можем делать в этой ситуации, мне сложно сказать. Я склоняюсь к мнению, что эти расширения больше нужны самим разработчикам SAP; когда нужно полностью изменить реализацию метода, то они пишут новый метод, например DISPLAY_2. Далее, чтобы не поломать весь код, который использует старый вызов, плюс это может быть код партнеров, они просто реализуют замещение метода DISPLAY, внутри которого вызывают новый метод DISPLAY_2; таким образом, не ломая использование данного класса нигде по системе, и тем самым обеспечивают беспроблемное обновление программ.
« Последнее редактирование: Ноябрь 17, 2016, 10:21:57 pm от Uukrul »

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
8 - A3_Enhancement Spot
« Ответ #1 : Ноябрь 17, 2016, 10:30:10 pm »
Расширение функций.

   Аналогично способу расширения классов система позволяет добавлять собственные параметры к функциональным модулям системы. После добавления новых параметров в систему нужно обязательно добавить также и реализацию их заполнения значениями. Для этого нужно использовать определённую методику модификации исходного кода модулей, о чём будет рассказано ниже. Для расширения функциональных модулей переходите к просмотру необходимого модуля, транзакция SE37, Рисунок 11: FM-01.png, и по меню выбираете: «Функциональный модуль» – «Расширить интерфейс».

   После выбора команды расширения вам будут доступны поля ввода собственных параметров в интерфейс функционального модуля. Соглашение по именам параметров рекомендую такое же, как и при расширении классов, т.е. начинаем наименование полей с префикса ZZ. Все добавляемые параметры буду иметь атрибут – «не обязательный», чтобы не нарушить вызовы данного модуля в уже существующих текстах программ.

Расширения исходного кода.

   После расширения классов, мне кажется это один из самых интересных способов расширения стандартного кода системы. Можно сказать, SAP с одной стороны пошел и причем значительно навстречу к разработчикам, поддерживающим или внедряющим систему у клиента, но с другой стороны, количество проблем, которые могут возникнуть при некачественно написанном коде, просто может стать катастрофическим, вплоть до полной потери системой работоспособности. Поэтому общая рекомендация – хорошо и много подумать, прежде чем, что-либо реализовывать через новые возможности расширения системы.

   История одной проблемы: Лет пять назад попросили в одной системе поискать причину, почему для определенной группы материалов в продуктивной системе при прогоне ППМ не создавались плановые заявки на закупку. До меня там с этой проблемой бодались местные специалисты, потом неделю искали специалисты из SAP AG, собственно один из них и подключил меня. То, что нужно было срочно, стало понятно буквально через час после того, когда мне дали параметры удаленного входа в их продуктивную систему, хотя, по слухам, ранее (до этого случая) на это уходило не меньше пары недель, но тут уж очень было нужно. Я понимал, что искать настройки смысла нет, там уже все искали, и вряд ли я что-то найду неординарное. Поэтому сразу же полез искать по коду и, конечно же мне, наверное, «повезло», потому что через час я нашел вот такую вот точку расширения кода, где для этой группы материалов «в тупую» сбрасывался код создания позиции заявки. Автор изменения был другой консультант SAP AG, причем, когда у него попытались узнать,  собственно, зачем он это сделал и как это оказалось на продуктиве, внятного ответа так и не получили. Итак, будьте очень осторожными при использовании расширений.

Типы точек расширения:
  • Implicit Enhancement Options (Неявная точка расширения): Это - точки вызова расширений в начале и конце блока кода: например, для существующей подпрограммы FORM xxx Implicit Enhancement это – расширение в начале подпрограммы и в конце подпрограммы. Такой тип расширения позволяет добавить дополнительный код к существующим стандартным модулям SAP. Для просмотра неявных точек входа следует в редакторе кода, например, с помощью транзакции SE38, задать режим показа не явных точек. Точки будут показаны (как на Рисунок 12: IEO-1.png). Как видим, точки расширения выделены символом тильда (~). В общем случае, так как это модуль, состоящий из одной подпрограммы, доступны три неявные точки расширения. Первая точка вызывается сразу при входе в подпрограмму ERMITTLUNG_PERIODE, вторая при выходе из подпрограммы ERMITTLUNG_PERIODE, а третья позволяет добавить в целом свой код в модуль LMRMPF0S, например, при выходе из расширяемой подпрограммы вы можете сделать вызов своей подпрограммы, текст которой разместите после текста: endform. "ERMITTLUNG_PERIODE.
  • Explicit Enhancement Options (Явная точка расширения): Это точки вызова, которые могут быть в любом месте кода, при этом такая точка может предполагать как расширение стандартного кода, так и замену его (т.е. ваше расширение полностью заменит какой-то кусок кода системы). Явная точка расширения должна быть предусмотрена разработчиком приложения, который пишет код. Такая точка будет определена специальными операторами: ENHANCEMENT-POINT – точка вставки вашего кода для расширения логики и ENHANCEMENT-SECTION / END-ENHANCEMENT-SECTION – блок кода (операторные скобки), который может быть вами заменен. Пример показан ниже на Рисунок 13: EEO-1.png.
   При объявлении явных точек расширений разработчик может объявить точку как статическую или динамическую, т.е. могут быть следующие объявления:
  • Динамическая точка: enhancement-point lmr1mfa0_01 spots es_saplmr1m DYNAMIC.
  • Статическая точка: enhancement-point lmr1mfa0_01 spots es_saplmr1m static.
   Разница между этими объявлениями заключается в следующем. Статическая точка расширения всегда доступна, код созданный в рамках точки вызывается в ходе работы программы всегда. Если же точка расширения объявлена как динамическая, то вызов реализованного в такой точке расширения кода будет вызваться только в том случае, если активна соответствующая для точки расширения бизнес-функция. В противном случае код вызваться не будет.

   Бизнес функция, может находиться в состоянии "активно" или "в ожидании" (деактивирована), просмотреть статусы бизнес функций можно в транзакции SFW2, Рисунок 13: ENH-01.png. Если бизнес функция не активна, то все привязанные к ней динамические точки расширений не вызываются в ходе работы программы.

Примечание: Техника Enhancement создана в первую очередь для возможности реализации бизнес-функций, а не для нас, простых пользователей системы. С новых версий компания SAP немного, ну скажем, «позаботилась» о пользователях системы и добавила в объявление явной точки расширения набор параметров, которые управляют поведением точки расширения:
  • Многоразовое использование – Если установлен данный признак, это значит, что когда вы создаете реализацию расширения, то ваш реализующий класс полностью автономный, при этом количество таких реализующих классов может быть бесконечным. Система последовательно вызовет все реализации созданные для данной точки расширения. В противном случае, возможна только одна реализация точки расширения. Фактически вы получаете с небольшими исключениями аналог Custome-Exit, т.е. когда все разработчики работают в рамках одного кода.
  • Можно использовать только внутри SAP – Если у точки расширения стоит данный признак, это значит, что пользователи/клиенты системы не могут использовать данную точку, она предназначена только для использования внутри компании SAP, рисунок 14: ES_SAPLMEOUT-01.png. Все было бы не так грустно, если бы данный параметр был статичным, но, к сожалению. это не всегда так, и при очередном обновлении доступная для пользователей точка расширения может стать закрытой. Как следствие, вам придется отказаться от использования такой точки и искать новую, иначе в ходе работы программы вы будете получать сообщение вида E – Ошибка в реализации BADI.
  • Актив. «Невозможно включить ч/з польз. настройку (IMG)» – Без возможности включения через пользовательскую настройку. Необходимо включить данную галку при реализации точки расширения, иначе активация точки не происходит, рисунок 15: ME_BSART_DET.png
   Примечание: Неявные точки расширений допускают создание расширений объявленных структур в программах, например, в коде может встретиться следующее объявление:
Код: You are not allowed to view links. Register or Login
types : begin of stype_totals_header,
          BWKEY              LIKE      MBEW-BWKEY,
          WERKS              LIKE      MSEG-WERKS,
          matnr              like      mbew-matnr,
          CHARG              LIKE      MSEG-CHARG,
          sobkz              like      mslb-sobkz,

          NAME1              like      T001W-NAME1,
          maktx              like      makt-maktx,
""""""""""""""""""""""""$"$\SE:(86) Typ STYPE_TOTALS_HEADER, Выход                                                                                                                           end of stype_totals_header.
   Как видим, в конце структуры есть неявная точка расширения, которая позволяет добавить собственные переменные. Однако на практике, если вы используете это расширение то получите ошибку синтаксиса (выделено красным):
Код: You are not allowed to view links. Register or Login
types : begin of stype_totals_header,
          BWKEY              LIKE      MBEW-BWKEY,
          WERKS              LIKE      MSEG-WERKS,
          matnr              like      mbew-matnr,
          CHARG              LIKE      MSEG-CHARG,
          sobkz              like      mslb-sobkz,

          NAME1              like      T001W-NAME1,
          maktx              like      makt-maktx,
""""""""""""""""$"$\SE:(86) Typ STYPE_TOTALS_HEADER, Выход                                                                                                                   S
*$*$-Start: 9999------------------------------------------------------------$*$*
ENHANCEMENT 1  ZIMM_MB5B_REPORTS_01.    "inactive version
*
ENDENHANCEMENT.
*$*$-End:   9999------------------------------------------------------------$*$*
        end of stype_totals_header.
   Причина очень простая: так как последняя переменная в структуре содержит объявление, заканчивающееся запятой, а объявление расширения вклинивается в эту структуру, то мы получаем проблему, которую в принципе решить невозможно. Хотя, если бы разработчик написал объявление структуры в следующем виде:
Код: You are not allowed to view links. Register or Login
types : begin of stype_totals_header,
          BWKEY              LIKE      MBEW-BWKEY,
          WERKS              LIKE      MSEG-WERKS,
          matnr              like      mbew-matnr,
          CHARG              LIKE      MSEG-CHARG,
          sobkz              like      mslb-sobkz,

          NAME1              like      T001W-NAME1,
          maktx              like      makt-maktx.
"""""""""""""""""""""""""""""""""""""$"$\SE:(86) Typ STYPE_TOTALS_HEADER, Выход                                                                                                                           types: end of stype_totals_header.
   Т.е. поставил бы точку после последнего объявления последней переменной, то мы могли бы использовать неявную точку расширения, а так… точка есть, но использованию не подлежит.

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


   Бизнес-функции представляют собой, собственно говоря, набор Enhancement-тов, т.е. точек расширений, который могут быть декларированы в коде существующих транзакций системы как статические или динамические рисунок 16: EEO-1.png. Так вот, если Enhancement объявлен как статический, но сама бизнес-функция не активирована, вы можете создать реализацию такого энхансмента, и система будет обрабатывать написанный вами код. Если же энхансмент объявлен как динамический и бизнес-фукнция не активирована, то выполнять реализацию кода в таком энхансменте бесполезно, так как вызываться ваш код не будет до тех пор, пока вы не активируете соответствующую бизнес-функцию, в которую включен данный энхансмент.

   На этом с теорией, думаю, можно завершить и следует перейти к примерам реализации. Будут приведены примеры, «близкие к жизни». Хотелось бы сделать одно небольшое уточнение: на первый взгляд, реализация техники расширений, с точки зрения использования, достаточно простая, вы видите включение собственного кода в стандартный код системы, однако техническая сторона реализации данной функциональности достаточно сложна, как и механизмы обработки ваших включений.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
8 - A3_Enhancement Spot
« Ответ #2 : Ноябрь 17, 2016, 10:51:08 pm »
Пример 1. Возврат результата выполнения стандартного отчета в «свою» программу.

   В функциональности ММ, для получения данных по запасам на произвольную дату в прошлых периодах, есть специальный отчет MB5B. Одному из разработчиков потребовалось получить список документов, формирующих остатки, так же как это получает отчет MB5B. Как вариант, можно и самому по таблицам получить такие данные, посмотрев на логику работы отчета, но существует возможность воспользоваться готовым решением. Для этого нам нужно в своей программе вызвать отчет, выполняющийся при вызове транзакции MB5B, например через SUBMIT с параметрами, а затем, после вызова получить данные выбранные отчетом в свою программу. Например, я запустил транзакцию MB5B, с таким вот простым вариантом, Рисунок 17: MB5B.png.

Скорее всего, программа состоит из блока выбора данных, который в конечном итоге заполняет какую-то внутреннюю таблицу и затем блока, который выводит эту таблицу на экран. Путем работы с отладчиком и кодом отчета, довольно быстро можно найти нужное место, это инклуд RM07MLBD_FORM_02 подпрограмма: «Form  LISTAUSGABE1»; теперь если поставить точку останова, то видно, что в данной подпрограмме доступна внутренняя таблица g_t_belege1, которая содержит необходимые данные, Рисунок 18: MB5B-A.png.

Итак, нам надо получить данные этой таблицы в свою программу. Воспользуемся технологией IMPORT/EXPORT и новым предложением от SAP, называемым технология расширений. Идем в транзакцию SE38 и вызываем для просмотра этот модуль. Затем выбираем по меню: "Обработка" – "Операции расширения" – "Показать предполагаемые опции расширения", Рисунок 19: RM07MLBD_FORM_02.png, после чего фактически в каждой подпрограмме будут выделены точки входа, а значит можно туда «вписать» свой код.

   Точки будут подсвечены следующим образом, как на рисунке Рисунок 20: RM07MLBD_FORM_02-ES1.PNG.

   Далее ставим курсор на выбранную точку расширения и выбираем по меню "Программа" – "Расширить" или как на рисунке жмем соответствующую кнопку на панели инструментов (выделено красным). Теперь снова попросим показать точки расширения и должно получиться что-то из Рисунок 21: RM07MLBD_FORM_02-ES2.PNG, т.е. у нас появилась возможность модификации кода программы.

   Затем становимся на нужную нам точку в начале подпрограммы LISTAUSGABE1 (почему в начале, расскажу далее, когда завершим создание точки расширения), и правой кнопкой мыши по контекстному меню выбираем "Enhancement Implemantation" – "Создать расширение", как на рисунке Рисунок 22: RM07MLBD_FORM_02-ES3.PNG.

В появившемся окне система показывает доступные, так называемые, контейнеры точек расширений, Рисунок 23: ES1.png.  Контейнер расширений позволяет сгруппировать несколько созданных нами точек расширений в один блок. Например, нам нужно сделать вставку своего кода в нескольких местах транзакции MB5B: в таком случае, мы создаем контейнер и все созданные точки расширений привязываем к этому контейнеру, это позволяет управлять всеми созданными точками в целом, а не выискивать их по текстам программ. Фактически контейнер несет тот же смысл, что пакеты разработки и запросы.

   Нажимаем кнопку «Создать».

Так как мы создаем первую точку расширения, то контейнера для нее еще не существует, поэтому мы заполняем сначала поля: имя точки расширения и краткий комментарий к точке, Рисунок 24: ES2.png.

Затем в поле Composite Enhancement Implementation мы вносим имя нашего контейнера, после чего нажимаем кнопку «Создать» рядом полем, Рисунок 25: ES0.png. Система запросит имя контейнера, краткий текст.

   Теперь нажимаем ввод, система спросит пакет разработки и запрос на перенос, после чего возвращаемся в экран точек расширений, жмем там ОК и попадаем в основное окно, в котором уже появилась запись для наших точек, Рисунок 26: ES3.png, выбираем нашу созданную запись, после чего точка расширения будет создана и в коде появится запись расширения, где мы можем вносить свой код.


Какой код следует написать в расширении? Так как мы знаем, что результат выбора находится в таблице G_T_BELEGE1, которая выводится в ALV-таблице, нам нужно написать код, который передаст эту таблицу в память, используя оператор EXPORT. Данные, переданные таким образом, останутся в памяти после завершения отчета и возврата в нашу программу, где эти данные можно считать, используя оператор IMPORT. Правильным будет сделать выход из подпрограммы, так как вызывать ALV смысла нет, данные все равно не будут показываться на экране, поэтому мы сделали свое включение в начале программы, чтобы обойти стандартный вызов отображения данных. Правда при этом, чтобы не нарушить отчет, выход должен быть по какому-то из параметров, я предлагаю сделать имя варианта, например с именем /MYBATH, на экране это будет поле выбора "Вариант просмотра", переменная P_VARI. Фокус в том, что так как наше расширение работает в контексте программы, мы имеем доступ ко всем глобальным переменным программы, поэтому в своей точке можем написать примерно такой код:
Код: You are not allowed to view links. Register or Login
*$*$-Start:(1 )------------------------------------------------------------$*$*
ENHANCEMENT 17  YMY_MB5B_EXT.    "active version
* Передача параметров для внешних вызовов
IF p_vari = '/MYBATH'.
  EXPORT G_T_BELEGE1 TO MEMORY ID 'MYBATH'.
  EXIT.
ENDIF.
ENDENHANCEMENT.
*$*$-End:   (1 )------------------------------------------------------------$*$*
   То, как это выглядит в контексте, показано на Рисунок 27: ES4.png.

   Итак, передали в память данные таблицы, затем вышли из подпрограммы без вызова ALV-таблицы. Отчет завершен, в своей программе делаем IMPORT FROM MEMORY ID 'MYBATH' и получаем результат. выполнения отчета Само собой, код нужно активировать, после чего рядом с именем расширения будет добавлена фраза - active version. Скорость работы в этом случае, будет невелика, но если скорость не есть критичный параметр, то вполне можно воспользоваться таким методом для получения расчетных данных без повторения логики работы системы у себя в программах.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
8 - A3_Enhancement Spot
« Ответ #3 : Ноябрь 17, 2016, 10:53:59 pm »
Пример 2. Дополнительная проверка полномочий в отчетах по заявкам ММ.

Пример 1 (довольно специфичный) показывает, как выполнять разработку, используя неявную точку расширения, Пример 2 ближе к практике, опишем задачу. Есть отчеты по заявкам на закупку, транзакции:
  •    ME5A - Просмотр списка заявок;
  •    ME5J - Заявки к проекту;
  •    ME5K - Заявки к контировке;
  •    ME5W - Повторная подача заявки.
   Разные пользователи создают заявки, как вручную, так и при ППМ, при этом в заявках проставлялась, так называемая, группа допуска, каждый пользователь имел свою группу и соответственно должен был видеть только заявки своей группы допуска или группы ниже его по статусу, т.е. группы допуска были иерархическими структурами. В одной заявке разные позиции, могли принадлежать разным группам допуска. В целом, нужно было организовать дополнительную проверку полномочий для отчетов по заявкам. До версии 6.0 без механизма расширений путь был только один: запрещаем использование стандартных транзакций, отчеты по заявкам и пишем свои. Все остальные варианты вели к модификации кода, что не очень хорошо, с точки зрения поддержки и сопровождения. Однако используя механизм расширений, эту задачу можно решить довольно красиво. В ходе отладки было определено, что все отчеты по заявкам в конечном итоге вызывают один и тот же модуль с подпрограммой START. Пример кода:

Модуль   : FM06BF01_START
Со строки   : 1
Код: You are not allowed to view links. Register or Login
*eject
*----------------------------------------------------------------*
*  Listausgabe starten                                           *
*----------------------------------------------------------------*
form start.

*- Daten aus Selektionsreport holen -----------------------------*
  import gs_banf from memory id 'GSFRG'.
  import cueb from memory id 'XYZ'.
  import ban com from memory id 'ZYX'.
  gpfkey = com-gpfkey.
  gfmkey = com-gfmkey.
  zpfkey = com-zpfkey.
  zfmkey = com-zfmkey.

*- Message-Steuerung initialisieren -----------------------------*
  perform init_enaco(sapfmmex).

*- Funktionsberechtigungen initialisieren -----------------------*
  PERFORM init_efube.
   Как видно, данные передаются в этот модуль через память, со строки 10 в переменную BAN[] импортируются все заявки, которые собраны на предыдущем шаге. Так как предполагаемые точки расширений могут быть только в начале или конце программы, то идем в первую подходящую подпрограмму, в которой есть доступ к таблице BAN[], по тексту это PERFORM init_efube. Заходим в подпрограмму и в начале ее вставляем свое расширение (как описано было в первом примере). В данном расширении выполняем LOOP AT BAN. <Код проверки полномочий>. ENDLOOP, где удаляем все позиции заявок, которые не следует показывать пользователю, например, используя свой объект проверки полномочий на группы допуска.

   Наша проблема решена с помощью небольшой модификации. А так как это место работает как единая точка входа для всех программ отчетов по заявкам, то сделав проверку тут, получаем ее во всех стандартных отчетах по заявкам.

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
8 - A3_Enhancement Spot
« Ответ #4 : Ноябрь 17, 2016, 10:56:44 pm »
Пример 3. Явная точка расширения, обновление полей документов при проводке счетов логистики, транзакция MIRO.

   В общем виде проблема была озвучена следующим образом: В таблице RBKP создана дополнительная структура с парочкой полей. При создании фактуры необходимо их заполнять в автоматическом режиме. Предполагалось простое решение: есть определение INVOICE_UPDATE, в интерфейсе 3 метода. Создаем на этом основании внедрение . При создании фактуры вызывается один из методов (CHANGE_BEFORE_UPDATE) и в нем предполагается заполнять нужные поля требуемыми данными. Но все те таблицы, что передаются в метод, увы, закрыты для изменения...

   Анализ кода показал, что сохранение документа в конечном итоге вызывается ФМ MRM_INVOICE_POST. Там со строки 1167, для версии 6.0, стоит такой вот комментарий:
Код: You are not allowed to view links. Register or Login
***********************************************************************
* The invoice document is now ready for posting. Information may      *
* be displayed:                                                       *
* - RBKPV document header                                             *
* - YDRSEG temporary document line items (table)                      *
* - XEKBE PO history update (table)                                   *
* - XEKBZ PO history update (table)                                   *
* - XACCHD FI interface header (structure)                            *
* - XACCIT FI interface line items (table)                            *
* - XACCCR FI interface line items currency info (table)              *
* - XACCFI FI interface onetime vendor info (table)                   *
* - XACCBSET FI interface tax items (table)                           *
***********************************************************************
   Общий смысл: все для проводки счета уже готово и в RBKPV уже есть номер документа, который будет проводится в системе, так как дальше идет обновление вспомогательных данных, типа истории заказа ММ и т.д. Поле rbkpv-belnr, содержт номер документа счета. Если пройти еще ниже по этому тексту, то в строке 1314, можно встретить код:

Код: You are not allowed to view links. Register or Login
ENHANCEMENT-POINT mrm_invoice_post_10 SPOTS es_saplmrmp.
   Т.е. точка входа в явное расширение, куда можно вписать свой код, в котором и вызвать обновление таблицы RBKP своими данными.

   Для реализации расширения механизм используется тот же самый, что и при реализации неявных точек расширений. Сначала нажимаем переход к расширению текста, кнопка на панели инструментов, Рисунок 28: ES5.png.

   Система перейдет в режим редактирования точек расширений. Становимся курсором на строку расширения и правой кнопкой мыши вызываем контекстное меню, Рисунок 29: ES6.png.

   Далее техника работа такая же, как и с неявными точками расширения.

   Примечание: К сожалению, в данном случае, версия системы у клиента оказалась 5.0 и воспользоваться этим механизмом не представилось возможным, техника расширения работает только, начиная с версии 6.0.

   В общем виде основная проблема – как искать точки явных расширений, но это уже другой вопрос, проще всего искать по тексту строки вида ENHANCEMENT-POINT или ENHANCEMENT.

   Курс SAP, в котором читают всю эту «кухню», насколько помню – BC427. Из общих рекомендаций о том, как использовать данный механизм, главная такова: прежде чем использовать механизм точек расширений, убедитесь, что для решения задачи нет подходящих Customerexits (транзакции CMOD/SMOD) или нет подходящих BADI (транзакции SE18/SE19). Дело в том, что точки расширения никак не проверяются системой на допустимость модификации данных и как уже говорилось выше, развалить систему этим механизмом можно за пять минут, а вот восстановить, думаю, будет не всегда возможно. Убедитесь, что у вашего администратора имеется свежая бэкап копия системы, прежде чем использовать механизм расширения.

   Если для вашей реализации бизнес-процесса возникает ситуация: нужно переписать большую часть кода в одном из модулей системы или использовать несколько небольших включений, но например в 10 модулях, разработчики техники Enhancement рекомендуют использовать вариант с десятью небольшими модификациями, чем с одной глобальной, которая перепишет большой кусок стандартного кода. В принципе, это объяснимо, так при изменении функциональности стандартного кода нет гарантии, что вы корректно реализуете все варианты, предусмотренные разработчиками SAP, и соответственно, не внесете ошибок в работу транзакций системы.

   Для контроля за изменениями в системе есть специальные средства, которые позволяют проверить, что и когда и кем было изменено в системе. Иногда бывают ситуации когда такие изменения ломают систему, поэтому с версии SAP ECC 6.0 EHP7 существует специальный отчет, запускаемый транзакций ANST_SEARCH_TOOL, который позволяет проанализировать все созданные и активированные точки расширений. Если у вас система более низкого уровня, тогда можно воспользоваться анализом таблица ENHINCINX \ ENHLOG, а так же программы SAPMSENH и SNIF.