Модульная архитектура ABAP: макросы, подпрограммы и функциональные модули.

⚡ Умное резюме

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

  • 🧩 Основной принцип: Модульная единица генерируется так, как если бы ее исходный код физически присутствовал в вызывающей программе, поэтому структура улучшается без затрат во время выполнения.
  • Макро: Определяется с помощью команд DEFINE и END-OF-DEFINITION, может использоваться только внутри программы, которая его определяет, и только после строки определения.
  • 📄 Включить программу: Не имеет интерфейса параметров и существует исключительно для совместного использования исходного кода, например, длинных объявлений данных, между несколькими программами.
  • 🔁 Подпрограмма: Объявляется с помощью FORM и ENDFORM, вызывается с помощью PERFORM и подходит для повторного использования логики локально внутри одной программы.
  • 🧱 Функциональный модуль: Системная процедура с типизированным интерфейсом для импорта, экспорта, изменения параметров таблиц и обработки исключений.
  • 📦 Группа функций: Контейнер, глобальные данные которого используются каждым функциональным модулем внутри него и генерируются автоматически вместе с включенными в него файлами TOP и UXX.
  • 🧭 Правило выбора: Для локальной записи используйте макрос, для локальной логики — подпрограмму, а для обеспечения возможности повторного использования подпрограммы в системе — функциональный модуль.

Модульная структура в ABAP

Что такое модульная структура в ABAP?

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

Необходимость модульности

  • Улучшить структуру программы.
  • Легко читать код
  • Легко поддерживать код
  • Избегайте избыточности и поощряйте повторное использование кода.

Различные методы модуляризации

  • Использование макросов
  • Использование включаемых файлов
  • подпрограммы
  • Функциональные модули

Давайте подробно рассмотрим каждый из них:

SAP- ABAP-макрос

Если вы хотите повторно использовать один и тот же набор операторов в программе более одного раза, вы можете включить их в макрос.

Макрос можно использовать только внутри той программы, в которой он определен, и вызывать его можно только в строках программы, следующих за его определением.

Макросы могут быть полезны для выполнения длительных вычислений или сложных операторов WRITE.

Синтаксис

DEFINE <macro_name>

'Macro Statements

END-OF-DEFINITION

Макросы могут использовать параметры &N где Н = 1,2,3…

Пример:-

DATA: number1 TYPE I VALUE 1.

DEFINE increment.

ADD 1 to &1.

WRITE &1.

END-OF-DEFINITION.

Increment number1.

WRITE number1.

Выход: 2

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

Включить программы

Включаемые программы предназначены исключительно для модуляризации исходного кода и не имеют интерфейса параметров.

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

Синтаксис

Include <include program Name>

Очки для заметок

  • Включаемые программы не могут вызывать сами себя.
  • Включаемые программы должны содержать полные операторы.

Пример:

INCLUDE ZILX0004.

WRITE: / 'User', SY-UNAME,/ 'Date', SY-DATUM.

================================

PROGRAM ZRPM0001.

INCLUDE ZILX0004.

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

подпрограммы

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

Синтаксис-

FORM <Subroutine> [<pass>].

<Statement block>.

ENDFORM.

= Имя подпрограммы

= Передаваемые параметры

Типы подпрограмм

  1. внутренний
    • Подпрограмма, определенная в той же вызываемой программе.
    • Может получить доступ ко всем объектам данных, объявленным в основной программе ABAP/4.
  2. Внешний
    • Подпрограмма, определенная вне вызываемой программы.
    • Необходимо использовать вариант или объявить объекты данных в общих частях памяти.

Вызов подпрограммы

Внутренние подпрограммы

PERFORM <subroutine> [<pass>]

= Имя подпрограммы

= Передаваемые параметры

Данные, заявленные в основной программе, доступны автоматически.

Внешние подпрограммы

PERFORM <subroutine>(<Program>) [<pass>].

PERFORM <subroutine> (<Program>) [<pass>] [IF FOUND].

PERFORM (<subroutine>) IN PROGRAM  (<Program>) [<pass>] [IF FOUND].

PERFORM <index> OF <subroutine1> <subroutine2> <subroutine3> [<pass>].

Очки для заметок

  • В подпрограммах разрешены вложенные вызовы (т. е. PERFORM внутри FORM… ENDFORM).
  • Также возможны рекурсивные вызовы.
  • Чтобы определить локальные данные, используйте оператор DATA после FORM. Каждый раз, когда вы входите в подпрограмму, данные воссоздаются (с начальным значением) и освобождаются в конце (из стека).
  • Чтобы определить глобальные данные, используемые в подпрограмме, используйте оператор LOCAL после FORM. Значения сохраняются при входе в подпрограмму, а затем освобождаются в конце (из стека).

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

Функциональные модули

Функциональные модули — это процедуры ABAP/4 общего назначения, которые может использовать каждый. Фактически, существует большое количество стандартных функциональных модулей.

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

Синтаксис-

FUNCTION <function module>

<Statements>

ENDFUNCTION.

Важная информация, связанная с функциональным модулем

  • АДМИНИСТРАЦИЯ
  • Импорт/Изменение/Экспорт параметров.
  • Параметры/Исключения таблицы.
  • Документация
  • Исходный код – Л У01. это функциональная группа
  • Глобальные данные – L TOP .Глобальные данные для функциональной группы. Доступны для всех функциональных модулей в функциональной группе.
  • Основная программа – SAPл . Содержит список всех включаемых файлов для этой функциональной группы.

Вызов функционального модуля

Чтобы вызвать функциональный модуль, используйте оператор CALL FUNCTION:

CALL FUNCTION <module>

[EXPORTING  f1 = a 1.... f n = a n]

[IMPORTING  f1 = a 1.... f n = a n]

[CHANGING   f1 = a 1.... f n = a n]

[TABLES     f1 = a 1.... f n = a n]

[EXCEPTIONS e1 = r 1.... e n = r n [ERROR_MESSAGE = r E]

[OTHERS = ro]].

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

Функциональные группы

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

Подобно исполняемым программам (тип 1) и пулы модулей (тип M), группы функций могут содержать экраны, экраны выбора и списки.

Очки для заметок

  • Группы функций не могут быть выполнены.
  • Имя функциональной группы может иметь длину до 26 символов.
  • При создании функциональной группы или функционального модуля основная программа и включаемые программы генерируются автоматически.
  • Группы функций инкапсулируют данные.

Как создать функциональную группу

  1. Перейти к транзакции SE80.
  2. Выберите «Программа» в раскрывающемся списке.
  3. Напишите имя функциональной группы, которую вы хотите создать. Обычно группы функций, созданные пользователем, начинаются с буквы «Z». например – . Нажмите Enter.
  4. Обратите внимание, что включение в ТОП создается по умолчанию, если пользователь проверяет опцию создания включения в ТОП.

Как создать функциональный модуль

  1. Создайте группу функций (скажем, «ZCAL»).
  2. Создайте функциональный модуль, задайте атрибуты (группа функций, приложение, краткий текст и тип процесса) и сохраните.
  3. Включаемый файл «LZCALU01» будет содержать исходный код первого функционального модуля.
  4. Включаемый файл «LZCALTOP» будет содержать глобальные данные.
  5. Основная программа»SAPLZCAL» содержит
    • Глобальные данные Включить файл «LZCALTOP»
    • Функциональные модули включают файл «LZCALUXX».
    • Определенные пользователем Включаемые файлы «LZCALF..», «LZCALO..» и «LZCALI..».
  6. Определите параметры интерфейса и исключения
  7. Напишите исходный код
  8. Активировать функциональный модуль
  9. Тестирование функционального модуля – одиночное тестирование и отладка
  10. Документирование и выпуск функционального модуля

Как выбрать подходящую технику модульного строительства

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

Техника Область применения повторного использования Интерфейс параметров Лучше всего подходит для
Макрос Одна программа, после строки определения. Позиционные заполнители от &1 до &9 Короткие повторяющиеся операторы, длинные вычисления, сложный вывод команды WRITE.
Включить программу Любая программа, которая называет включаемые Ничто Общие объявления данных и общий исходный код
Подпрограмма (FORM) Локальный или внешний с помощью PERFORM … IN PROGRAM ИСПОЛЬЗОВАНИЕ, ИЗМЕНЕНИЕ, ТАБЛИЦЫ Логика часто используется повторно внутри одной программы.
Функциональный модуль Вся система, включая удаленные вызовы. ИМПОРТ, ЭКСПОРТ, ИЗМЕНЕНИЕ, ТАБЛИЦЫ, ИСКЛЮЧЕНИЯ Подпрограммы, используемые совместно в разных приложениях и инкапсулированные в группу функций.

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

Часто задаваемые вопросы (FAQ)

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

Функциональный модуль, тип обработки которого установлен как «Удаленно-доступный модуль», может быть вызван из другого модуля. SAP Система или внешнее приложение. Параметры должны передаваться по значению, а исключения обрабатываются как системные сбои.

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

Встроенные в инструменты разработки ABAP помощники по программированию на основе искусственного интеллекта могут создавать каркас функционального модуля, его интерфейс параметров и исключения на основе простого описания. Разработчик по-прежнему проверяет логику, активирует модуль и тестирует его перед переносом.

Инструменты искусственного интеллекта сканируют программу, обнаруживают повторяющиеся блоки и предлагают места, где следует исключить подпрограмму, метод или функциональный модуль.tracТед. Это предложение ускоряет рефакторинг, хотя для подтверждения идентичного поведения по-прежнему необходимы модульные тесты.

Подведем итог этой публикации следующим образом: