При выполнении программы могут возникать ситуации, которые необходимо донести до пользователя. Обычно это ошибки, предупреждения или просто сообщение об успешном выполнении процедуры. Эти сообщения не должны возникать по отдельности через команду MESSAGE. Их нужно собрать и отобразить все вместе в нужный момент. Такой набор сообщений называется журналом. Журнал содержит как заголовочную информацию (код транзакции, пользователь, дата и время создания и т.п.), так и позиционную (сами сообщения).
Для ведения журнала приложений SAP предоставляет мощный инструмент, называемый BAL (Basis Application Log). Журнал приложений применяется для отладки, поддержки и разработки как стандартный, так и Z-приложений. Лог особенно необходим при отладки фоновых задачах, веб-сервисов, рабочих процессов, т.е. где не всегда удобно, а иногда даже просто невозможно использовать стандартный отладчик.
Просмотреть журнал приложения можно в тр. SLG1.
Реализация журнала приложений содержится в пакете SZAL.
Принцип работы
Весь цикл работы журнала приложений можно свести к 3-м этапам:
- Создание/загрузка журнала. Для создания экземпляра лога используется функциональный модуль BAL_LOG_CREATE. На вход в ФМ передается структура типа BAL_S_LOG, содержащая заголовочную информацию. ФМ возвращает ID журнала приложений BALLOGHNDL.
- Добавление сообщений. Для добавления сообщений используется функциональный модуль BAL_LOG_MSG_ADD. На вход ФМ передается ID журнала BALLOGHNDL, а также структура типа BAL_S_MSG содержащая информацию о сообщении.
- Сохранение/отображение журнала. За отображения лога отвечает функциональный модуль BAL_DSP_LOG_DISPLAY.
Пример простого использования журнала приложений
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
*&---------------------------------------------------------------------* *& Report ZBAL_LOG_EXAMPLE1 *& BAL Log: Журнал приложений SAP *&---------------------------------------------------------------------* *& Пример использования журнала приложений SAP *& http://abap4.ru/?p=283 *&---------------------------------------------------------------------* REPORT zbal_log_example1. START-OF-SELECTION. PERFORM main. FORM main. DATA ls_log TYPE bal_s_log. DATA ls_msg TYPE bal_s_msg. DATA lv_hnd TYPE balloghndl. DATA lt_hnd TYPE bal_t_logh. DATA lv_dummy TYPE string. ls_log-extnumber = 'Журнал приложений'. ls_log-aluser = sy-uname. ls_log-alprog = sy-repid. CALL FUNCTION 'BAL_LOG_CREATE' EXPORTING i_s_log = ls_log IMPORTING e_log_handle = lv_hnd. MESSAGE s191(bl) INTO lv_dummy. ls_msg-msgty = sy-msgty. ls_msg-msgid = sy-msgid. ls_msg-msgno = sy-msgno. ls_msg-msgv1 = sy-msgv1. ls_msg-msgv2 = sy-msgv2. ls_msg-msgv3 = sy-msgv3. ls_msg-msgv4 = sy-msgv4. CALL FUNCTION 'BAL_LOG_MSG_ADD' EXPORTING i_s_msg = ls_msg i_log_handle = lv_hnd. APPEND lv_hnd TO lt_hnd. CALL FUNCTION 'BAL_DSP_LOG_DISPLAY' EXPORTING i_t_log_handle = lt_hnd. ENDFORM. |
Результат работы программы
Структура заголовка
№ | Параметр | Значение |
---|---|---|
1 | EXTNUMBER | Внешний идентификатор. Используется в качестве критериев поиска нужного журнала. |
2 | OBJECT | Имя объекта. Объект журнала приложений, применяется при поиске в тр. SLG1. |
3 | SUBOBJECT | Подобъект. Объект журнала приложений, применяется при поиске в тр. SLG1. |
4 | ALDATE | Дата |
5 | ALTIME | Время |
6 | ALUSER | Имя пользователя |
7 | ALTCODE | Код транзакции |
8 | ALPROG | Имя программы |
9 | ALMODE | Режим работы (B — фоновый; D — диалоговый; I — пакетный ввод; A — авто) |
10 | ALCHDATE | Дата последнего изменения |
11 | ALCHTIME | Время последнего изменения |
12 | ALCHUSER | Пользователь, изменивший журнал |
13 | ALDATE_DEL | Дата истечения срока хранения |
14 | DEL_BEFORE | Журнал сохраняется до истечения срока хранения |
15 | ALSTATE | Статус обработки (1 — подлежит обработке; 2 — в обработке; 3 — исполнено) |
16 | CONTEXT | Контекст. Используется для привязки контекста к сообщению. |
17 | PARAMS | Параметры. Используется для детализации сообщений. |
В журнале приложений эти поля будут выглядеть следующим образом
Структура сообщения
№ | Параметр | Значение |
---|---|---|
1 | MSGTY | Тип сообщения |
2 | MSGID | Класс сообщений |
3 | MSGNO | Номер сообщения |
4 | MSGV1 | Переменная сообщения |
5 | MSGV2 | Переменная сообщения |
6 | MSGV3 | Переменная сообщения |
7 | MSGV4 | Переменная сообщения |
8 | MSGV1_SRC | Происхождение переменных сообщения |
9 | MSGV2_SRC | Происхождение переменных сообщения |
10 | MSGV3_SRC | Происхождение переменных сообщения |
11 | MSGV4_SRC | Происхождение переменных сообщения |
12 | DETLEVEL | Степень детализации (число от 1 до 9) |
13 | PROBCLASS | Класс проблем сообщения (1 — особо важное; 2 — важное; 3 — среднее; 4 — дополнительная информация) |
14 | ALSORT | Критерий сортировки/группировка |
15 | TIME_STMP | Метка времени сообщения |
16 | MSG_COUNT | Число накопленных сообщений |
17 | CONTEXT | Контекст. Используется для привязки контекста к сообщению. |
18 | PARAMS | Параметры. Используется для детализации сообщений. |
Параметры MSGV1_SRC, MSGV2_SRC, MSGV3_SRC, MSGV4_SRC используются для анализа сообщений. В них можно записывать параметры или место запуска программы. Например, у нас есть 2 реализации одной и той же операции. Сообщения в журналах будут одинаковыми. Чтобы отличить происхождения сообщений, можно записать служебную информацию в переменные происхождения.
Параметры DETLEVEL, PROBCLASS, ALSORT используются для фильтрации и сортировки сообщений.
Параметр MSG_COUNT является счетчиком накопленных сообщений, в случае если отправляются одинаковые сообщения.
В журнале приложений эти поля будут выглядеть следующим образом
Пример стандартной демо-программы SBAL_DEMO_01.
Детализация сообщений
Сообщения можно детализировать. Процесс детализации заключается в следующем: в параметр PARAMS заполняются необходимые переменные и программу обратной связи для обработки детализации. При двойном клике на поле детализации вызывается программа обратной связи, в которую передаются необходимые параметры.
Параметр PARAMS является структурой типа BAL_S_PARM.
№ | Параметр | Значение |
---|---|---|
1 | T_PAR | Таблица параметров с именами параметров и их значениями |
2 | CALLBACK | Структура для обратной связи |
3 | ALTEXT | Текст из SE61, в случае если длины текста T100 не достаточно |
Программа обратной связи представляет собой функциональный модуль или подпрограмму, принимающие на вход таблицу I_T_PARAMS типа BAL_T_PAR.
В случае, если необходимо вызывать ФМ, то CALLBACK должна быть заполнена следующим образом:
CALLBACK-USEREXITT = ‘F’.
CALLBACK-USEREXITF = ИМЯ_ФМ.
В случае, если необходимо вызывать подпрограмму, то CALLBACK должна быть заполнена следующим образом:
CALLBACK-USEREXITP = ИМЯ_ПРОГРАММЫ.
CALLBACK-USEREXITF = ИМЯ_ПОДПРОГРАММЫ.
Пример журнала приложений с деталицацией
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
*&---------------------------------------------------------------------* *& Report ZBAL_LOG_EXAMPLE2 *& BAL Log: Журнал приложений SAP *&---------------------------------------------------------------------* *& Пример детализации в журнале приложений SAP *& http://abap4.ru/?p=283 *&---------------------------------------------------------------------* REPORT zbal_log_example2. START-OF-SELECTION. PERFORM main. FORM main. DATA ls_log TYPE bal_s_log. DATA ls_msg TYPE bal_s_msg. DATA lv_hnd TYPE balloghndl. DATA lt_hnd TYPE bal_t_logh. DATA ls_param TYPE BAL_S_PAR. DATA lv_dummy TYPE string. ls_log-aluser = sy-uname. ls_log-extnumber = 'Журнал приложений'. CALL FUNCTION 'BAL_LOG_CREATE' EXPORTING i_s_log = ls_log IMPORTING e_log_handle = lv_hnd. MESSAGE w191(bl) INTO lv_dummy. ls_msg-msgty = sy-msgty. ls_msg-msgid = sy-msgid. ls_msg-msgno = sy-msgno. ls_msg-msgv1 = sy-msgv1. ls_msg-msgv2 = sy-msgv2. ls_msg-msgv3 = sy-msgv3. ls_msg-msgv4 = sy-msgv4. ls_msg-params-callback-userexitp = sy-repid. ls_msg-params-callback-userexitf = 'CALLBACK'. ls_param-parname = 'PAR'. ls_param-parvalue = 'Hello, world!'. APPEND ls_param TO ls_msg-params-t_par. CALL FUNCTION 'BAL_LOG_MSG_ADD' EXPORTING i_s_msg = ls_msg i_log_handle = lv_hnd. APPEND lv_hnd TO lt_hnd. CALL FUNCTION 'BAL_DSP_LOG_DISPLAY' EXPORTING i_t_log_handle = lt_hnd. ENDFORM. FORM callback TABLES i_t_params TYPE bal_t_par. DATA ls_param TYPE bal_s_par. READ TABLE i_t_params INTO ls_param WITH KEY parname = 'PAR'. CHECK sy-subrc EQ 0. MESSAGE ls_param-parvalue TYPE rs_c_info. ENDFORM. |
И результат выполнения
Пример стандартной демо-программы SBAL_DEMO_02.
Привязка контекста
Иногда сообщение имеет смысл только в контексте. Например, сообщение «Документ не может быть удален» возникает при обработке определённого документа. При выводе лога привязка документа теряется. Информация о документе может быть помещена в само сообщение. В этом случае могут возникнуть проблемы при анализе сообщения (в случае если перечень сообщений возвращает пакетный ввод) или число параметром может быть больше чем число переменных сообщения (например, БЕ, завод, склад, год, номер документа, позиция и т.п.).
Журнал приложения предоставляет возможность добавить к сообщениям определенный контекст. В программе просмотра журнала поля контекста можно выводить в отдельном столбце.
Для добавления контекста необходимо заполнить параметр CONTEXT, который является структурой типа BAL_S_CONT.
№ | Параметр | Значение |
---|---|---|
1 | TABNAME | Имя структуры ABAP-словаря (см. SE11) |
2 | VALUE | Данные контекста |
Если контекстом является плоская структура, все элементы которой типа CLIKE, то контекст можно заполнить прямым присвоением структуры в поле VALUE
1 2 3 4 5 |
DATA ls_msg TYPE bal_s_msg. DATA ls_ctx TYPE zs_bal_ctx. ls_msg-context-tabname = 'ZS_BAL_CTX'. ls_msg-context-value = ls_ctx. |
В остальных случаях (например, если контекст содержит числовые поля) можно воспользоваться таким способом
1 2 3 4 5 6 7 8 9 |
DATA ls_msg TYPE bal_s_msg. DATA ls_ctx TYPE zs_bal_ctx. FIELD-SYMBOLS: <lv_ctx> TYPE c. ASSIGN ls_ctx TO <lv_ctx> CASTING. ls_msg-context-tabname = 'ZS_BAL_CTX'. ls_msg-context-value = <lv_ctx>. |
Для вывода полей контекста в ALV журнала приложений, необходимо добавить нужное поле в каталог полей. Отображение журнала происходит через функциональный модуль BAL_DSP_LOG_DISPLAY, в который передается параметр профиля отображения I_S_DISPLAY_PROFILE. В профиле есть поле MESS_FCAT — каталог полей. В него нужно добавить нужные столбцы для отображения.
Пример стандартной демо-программы SBAL_DEMO_02.
Объединение сообщений
Некоторые сообщения отправляются программой несколько раз без предоставления новой информации. Такие сообщения могут быть объединены с помощью BAL_LOG_MSG_CUMULATE. Когда повторяется одно и то же сообщение, новое сообщение не добавляется, счетчик MSG_COUNT для старого сообщения увеличивается.
Функциональный модуль BAL_LOG_MSG_CUMULATE имеет спец. параметры, определяющие критерии объединения:
I_COMPARE_ATTRIBUTES = ‘X’
Атрибуты сообщения (класс проблем PROBCLASS, уровень детализации DETLEVEL, критерий сортировки ALSORT) должны совпадать
I_COMPARE_CONTEXT = ‘X’
Контекст должен совпадать
I_COMPARE_PARAMETERS = ‘X’
Параметры сообщения должны совпадать
Дополнительные возможности добавления сообщений
BAL_LOG_MSG_ADD_FREE_TEXT — добавляет текст в журнал
1 2 3 4 |
CALL FUNCTION 'BAL_LOG_MSG_ADD_FREE_TEXT' EXPORTING i_msgty = 'E' i_text = 'Текст сообщения'. |
BAL_LOG_EXCEPTION_ADD — добавляет исключение в журнал
1 2 3 4 5 6 7 8 9 10 |
DATA ls_exc TYPE bal_s_exc. DATA lr_root TYPE REF TO cx_root. ls_exc-msgty = 'E'. ls_exc-exception = lr_root. CALL FUNCTION 'BAL_LOG_EXCEPTION_ADD' EXPORTING i_log_handle = lv_log_handle i_s_exc = ls_exc. |
Пример стандартной демо-программы SBAL_DEMO_07.
Сохранение журнала приложений
Если журнал нужно сохранять в БД, то при создании лога через BAL_LOG_CREATE в структуру заголовка необходимо передать объект и подобъект (не обязательно).
Создаются объекты и подобъекты в тр. SLG0.
Просматривать журнал можно будет в тр. SLG1.
Чтобы сообщения сохранились нужно вызвать BAL_DB_SAVE, после чего сделать COMMIT WORK.
Просмотр журнала сообщений
За отображения журнала приложений отвечает BAL_DSP_LOG_DISPLAY. На вход нужно передать заполненную структуру BAL_S_PROF. В большинстве случаев, требуется изменить какие-то значения структуры. Чтобы не заполнять профиль целиком, можно считать стандартный профиль и изменить в нем нужные поля. Пример добавляет контекстное поле в ALV.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
FORM log_display. DATA ls_display_profile TYPE bal_s_prof. DATA ls_fcat TYPE bal_s_fcat. CALL FUNCTION 'BAL_DSP_PROFILE_SINGLE_LOG_GET' IMPORTING e_s_display_profile = ls_display_profile EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ls_fcat-ref_table = 'BAL_S_EX01'. ls_fcat-ref_field = 'ID'. ls_fcat-col_pos = 100. APPEND ls_fcat TO ls_display_profile-mess_fcat. ls_display_profile-disvariant-report = sy-repid. ls_display_profile-disvariant-handle = 'LOG'. CALL FUNCTION 'BAL_DSP_LOG_DISPLAY' EXPORTING i_s_display_profile = ls_display_profile EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. |
Отображение журнала в модальном окне
Функциональный модуль BAL_DSP_PROFILE_POPUP_GET возвращает настройки профиля для вывода в модальном окне.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
*&---------------------------------------------------------------------* *& Report ZBAL_LOG_EXAMPLE3 *& BAL Log: Журнал приложений SAP *&---------------------------------------------------------------------* *& Пример детализации в журнале приложений SAP *& http://abap4.ru/?p=283 *&---------------------------------------------------------------------* REPORT zbal_log_example3. START-OF-SELECTION. PERFORM main. FORM main. DATA ls_log TYPE bal_s_log. DATA ls_msg TYPE bal_s_msg. DATA lv_hnd TYPE balloghndl. DATA lt_hnd TYPE bal_t_logh. DATA ls_prof TYPE bal_s_prof. DATA lv_dummy TYPE string. CALL FUNCTION 'BAL_LOG_CREATE' EXPORTING i_s_log = ls_log IMPORTING e_log_handle = lv_hnd. MESSAGE w191(bl) INTO lv_dummy. ls_msg-msgty = sy-msgty. ls_msg-msgid = sy-msgid. ls_msg-msgno = sy-msgno. ls_msg-msgv1 = sy-msgv1. ls_msg-msgv2 = sy-msgv2. ls_msg-msgv3 = sy-msgv3. ls_msg-msgv4 = sy-msgv4. CALL FUNCTION 'BAL_LOG_MSG_ADD' EXPORTING i_s_msg = ls_msg i_log_handle = lv_hnd. CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET' IMPORTING e_s_display_profile = ls_prof. ls_prof-use_grid = abap_true. APPEND lv_hnd TO lt_hnd. CALL FUNCTION 'BAL_DSP_LOG_DISPLAY' EXPORTING i_t_log_handle = lt_hnd i_s_display_profile = ls_prof. ENDFORM. |
Результат будет таким
Информация
Подробную документацию API журнала приложений можно взять тут.
Демо программы:
SBAL_DEMO_01 — простейший вызов журнала приложений
SBAL_DEMO_02 — различные виды сбора сообщений, детализация, контекст
SBAL_DEMO_03 — поиск сообщений в памяти
SBAL_DEMO_04 — разные форматы журнала приложений
SBAL_DEMO_05 — сохранение и загрузка журналов
SBAL_DEMO_06 — добавление комплексных данных к журналу
SBAL_DEMO_07 — добавление исключений
SBAL_DEMO_08 — поиск исключений в памяти
Присоединиться к обсуждению...