Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: Uukrul от Март 03, 2009, 11:12:44 am
-
Таки язык абап имеет данное расширение языка как макросы. К сожалению зачастую пользы от них никакой, поэтому их мало кто использует, хотя есть области, где макрос будет очень в тему. Так же в системе уже существует ряд макросов, которые можно использовать. Так что если у кого есть как вам кажется удачные примеры макросов, делимся.
EXT_TO_INT - Макрос для перевода внешнего представления значения во внутренне. Часто приходится такие преобразования использовать, так что вызов через макрос получается более кратким и более понятным.
DEFINE ext_to_int.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = &1
importing
output = &2.
END-OF-DEFINITION.
Пример вызова:
ext_to_int: lt_screen_5-kostl goodsmvt_item-costcenter,
lt_screen_5-konto goodsmvt_item-gl_account.
-
Кстати в системе есть макросы которые определены на уровне системы, наиболее частым из них наверное будет макрос BREAK, который позволяет задать точку останова активную для определенного пользователя. Т.е. в любой своей программе вы можете задать команду break <ваш логин> и система будет попадать в отладку только если программа будет выполняться под вашим логином. Текст данного макроса как и другие системные макросы можно найти в таблице TRMAC. Например для BREAK это будет:
* USER specific BREAK-POINT
if sy-uname = '&1'
break-point
endif
В таблице есть и другие макросы. Кстати, в эту таблицу можно добавить свои макросы и это избавит вас от вставки описания макроса в каждую свою программу. Хотя тут есть одно ограничение, почему-то строка команды в таблице TRMAC ограничена длиной 40 символов, поэтому к примеру вставить макрос INT_TO_EXT, так просто не получится, там строка вызова ФМ call function 'CONVERSION_EXIT_ALPHA_INPUT' к сожалению 42 символа, поэтому если очень хочется, то нужно этот ФМ обернуть каким-то своим функциональным модулем с более коротким именем, после чего макрос получится вставить в таблицу. Понять почему 40? А не хотя бы 72, к сожалению при всем уважении к индусам так и не смог.
Кстати, опять же я чуток сделал свой макрос типа UBREAK. Так как меня не устраивает в стандартном, то что он вызывается всегда, когда я работаю. Код макроса следующий:
DEFINE ubreak.
DATA : yuuk_br(1) TYPE c.
if sy-uname = &1 and sy-batch <> 'X'.
get parameter id 'YMYBRK' field yuuk_br.
if yuuk_br = 'X'. break-point. endif.
endif.
END-OF-DEFINITION.
Вызов UBREAK 'UUKRUL'.
Затем я создал свой параметр YMYBRK, который могу задавать через данные пользователя (Система - Постоянные значения пользователя - Собственные данные). Соответственно если мне надо где-то провалиться в отладку, я знаю что по моим программам и экзитам рассеяны макросы прерывания программы, я задают значение для YMYBRK = "Х" и я в отладке, в остальное время все работает без прерывания. Кстати,. если программа работает в фоне, то прерывание на отладку игнорируется.
В данном макросе есть один подводный камень, это то что я в нем объявляю переменную, а это значит, что в логическом блоке можно сделать один такой вызов макроса, а иначе получим ошибку дублирования объявления переменной. Ну и самой собой я вставил этот макрос в TRMAC и теперь мне не нужно вставлять данный макрос в топ-инклуды программ, он всегда доступен для вызова.