Управление проектами расширений в системах. Техника CustomerExits пользовательские расширения
Техника CustomerExits используется практически в любой функциональности системы. Это наиболее широко используемый вид программных расширений. Реализация технологии заключается в использовании вызовов специальных функциональных модулей системы. Для этого в язык ABAP, был введен отдельный оператор вызова функции расширения: CALL CUSTOMER-FUNCTION “внутренний номер расширения”. Стандартно, если расширение не активно, система пропускает вызов пользовательской функции, даже если внутри содержится реализация. Пользовательские функции система группирует в так называемые компоненты расширений. Компонент может содержать как одну функцию, так и группу функций или экранов пользовательских расширений.
Уважаемые коллеги!
Я продолжаю публикацию на портале SAPLand цикла статей «Техники расширений стандартной системы SAP».
Все статьи цикла приведены внизу публикации.
1. Поиск расширений
Для просмотра и поиска возможных расширений, доступных в системе можно воспользоваться тремя вариантами поиска
1.1. Вариант поиска 1
Использование транзакции просмотра существующих расширений: транзакция SMOD. Эта транзакция позволяет просмотреть содержимое компонента расширения, при этом она обеспечивает поиск самих расширений в привязке к функциональности. Для поиска следует воспользоваться поиском компонентов для поля «Расширения», Рис.1.
Рис.1: SMOD-1
Если вы запускаете транзакцию впервые, то нажав кнопку поиска допустимых значений, вы получите поиск компонентов по информационной системе репозитория, Рис.2, это не очень удобно, если вы даже приблизительно не знаете, как называется компонент, однако сразу переключить поиск на вариант «Приложения SAP» не получится.
Рис.2: SMOD-2
Чтобы достичь цели, сначала выполните поиска по системе репозитория, нажав кнопку F4, (рисунок 2), и в открывшемся окне найденных значений выберите любой компонент. Например, у меня в системе это, какой-то: /CEECV/R – RO Material document item for goods receipt/issue slip. Затем зайдите в просмотр компонента, нажав кнопку , после этого вернитесь на первый экран и снова выберите F4 в поле «Расширение». Теперь система покажет вам окно личного списка значений, из которого вы уже можете выполнить поиск по приложениям SAP, Рис.3.
Рис.3: SMOD-3
Фактически будет выведено дерево компонентов системы, некий аналог транзакции SPRO, в этом дереве можно выполнить поиск необходимых расширений в привязке к функциональности системы, Рис.4. например, компонент, отвечающий за реализацию пользовательских данных в заявках на закупку, из функциональности управления материальными потоками.
Рис.4: SMOD-4
1.2. Вариант поиска 2
Разработчик может воспользоваться одной из Z-разработок, в интернете достаточно тех, которые позволяют найти компоненты расширений в привязке к транзакциям системы. Одним из недостатков варианта является то, что при поиске будут найдены только расширения первого уровня, т.е. если при создании объекта А, он порождает зависимые объекты B и C, то такие программы обычно ищут только расширения, доступные при создании объекта А.
1.3. Вариант поиска 3
Разработчик может использовать инструменты отладки программы. Для этого запускаем интересующую нас транзакцию, после чего переходим в режим отладки системы. Далее устанавливаем точку прерывания по условию, Рис.5.
Рис.5: SMOD-5
В открывшемся окне нужно задать обработку точек прерывания при выполнении оператора CALL CUSTOMER-FUNCTION, Рис.6.
Рис.6: SMOD-6
Теперь продолжим выполнение транзакции. Система будет останавливаться каждый раз, когда в тексте будет встречать вызов пользовательского расширения, причем это не зависит от того, активно оно или нет, Рис.7. Основная проблема при таком методе получения точки пользовательского расширения заключается в том, что вы получаете имя исходного текста, где находится точка, в данном случае это модуль: LBBPKU03, строка кода 79, однако не получаете имя компонента расширения которое нужно указать в транзакции ведения.
Рис.7: SMOD-7
Для получения имени компонента следует перейти в просмотр найденного кода, транзакция SE38, в которой нужно сделать двойной клик мышью на строке вызова пользовательского расширения, для перехода к реализации данной функции, Рис.8.
Рис.8: SMOD-8
Мы переходим в функциональный модуль, который вызывается, в данном контексте; для кода точки расширения 001, будет вызван функциональный модуль EXIT_SAPLBBPK_001, Рис.9.
Рис.9: SMOD-9
Теперь, когда мы знаем реальное имя функционального модуля, достаточно просто найти имя компонента, который нужно активировать чтобы данное расширение вызвалось системой. Для этого переходим в транзакцию просмотра содержимого таблиц (транзакция SE16), затем указываем имя таблицы MODSAP и далее в поле MEMBER, вводим имя нашего функционального модуля, Рис.10.
Рис.10: SMOD-10
Далее выполняем вывод значений и получаем имя компонента, который включает в себя найденное нами расширение, Рис.11.
Рис.11: SMOD-11
2. Реализация расширения. Демонстрационный пример
Получив вышеописанным путём имя расширения, можно приступать к его реализации. Для активации расширений существует отдельная транзакция CMOD, которая служит для создания проектов расширений. Фактически, проект расширения - это объект, который включает в себя набор компонентов расширений, которые мы просматривали в транзакции SMOD или искали в стандартных программах системы. Обычно, в один проект, можно включить различные коды расширений объединённых решением общей задачи.
Внимание: Одно расширение, можно включить только в один проект, поэтому если у вас расширение уже используется, то нужно найти проект, в котором оно находится, далее убедиться, что проект активирован и это значит, что вам остается только добавить свой код реализации расширения. Удалять из чужого, и переносить расширения в свой проект, наверное, не стоит.
2.1. Создание проекта
В качестве практического примера воспользуемся расширением, которое позволяет генерировать инвентарный номер для объектов основных средств. Разработчики SAP определили расширение, которое позволяет пользователю реализовать собственный алгоритм генерации инвентарного номера карточки. Для этого в системе существует расширение AISA0001 – Присвоение инвентарного номера, Рис.12.
Рис.12: CMOD-1
Запускаем транзакцию CMOD, в появившемся окне вводим новое имя расширения на Z или Y, например, создаем расширение ZFIAA001. После ввода имени нажимаем кнопку "Создать", Рис.13.
Примечание: В принципе, имя проекта расширения может начинаться на любую букву, тут нет жесткого ограничения по области наименования пользовательских объектов, так как проекты расширений - это всегда только пользовательские объекты. Однако, лично мне привычнее, называть расширения, ориентируясь на стандартное соглашение по именам объектов SAP.
Рис.13: CMOD-2
Система перейдет к экрану ведения атрибутов расширения, Рис.14. На экране ведения атрибутов проекта расширения, требуется только ввести краткий текст, который описывает назначение создаваемого проекта. Затем нажимаем кнопку "Сохранить" вверху окна. Система запросит имя проекта и запрос, в который необходимо сохранять данные.
Рис.14: CMOD-3
После сохранения проекта необходимо перейти к экрану привязки компонентов расширений, на панели кнопок нажимаем кнопку . Включаем в список нужный нам компонент AISA0001. Если компонент ещё не привязан ни к какому проекту расширения, то система выведет рядом с расширением краткий текст описания, Рис.15. В противном случае, будет выведено сообщение об ошибке, в котором будет указано имя проекта расширения в который уже включен компонент AISA0001.
Рис.15: CMOD-4
Сохраняем данные привязанных к проекту компонентов и переходим к экрану просмотра привязанных компонентов, для чего нажимаем кнопку , Рис.16. Так как проект не активирован, то светофоры, напротив расширений, будут красными. Это значит, что расширение не активно и даже если оно содержит код, система пропускает такие расширения. Это позволяет отключать расширения простой деактивацией проекта в ситуации, например, когда окажется, что текст пользовательского расширения содержит ошибку, которая генерирует ошибку времени выполнения, но требуется срочно провести документ.
Рис.16: CMOD-5
Если сейчас выполнить активацию расширения, то создаваемый код будет выполнятся, при этом если код будет в этот момент некорректным (например, вы его
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти
Обсуждения 5
Комментарий от
Олег Точенюк
| 19 марта 2016, 14:02
Комментарий от
Владимир Дейнеко
| 07 апреля 2016, 11:25
Комментарий от
Владимир Дейнеко
| 07 апреля 2016, 11:27
Владимир Дейнеко 07 апреля 2016, 11:25
Для того чтобы найти компонент совершенно не обязательно идти и смотреть данные в таблице MODSAP. Достаточно воспользоваться средством поиска, указанном на Рис.1. Нужно поставить галочку "ФМ пользователя" и в качестве Имени компонента указать сам функциональный модуль.
Комментарий от
Олег Точенюк
| 08 апреля 2016, 17:08
Владимир Дейнеко 07 апреля 2016, 11:27
Комментарий от
Екатерина Ничик
| 02 августа 2022, 12:08