Здесь рассмотрим как можно использовать Application Log. SAP предоставляет стандартную функциональность для записи сообщений и исключений, возникающих в ходе выполнения программы, в лог с возможностью его просмотра в дальнейшем. Создадим Log object – объект где будут сохраняться наши сообщения, транзакция SLG0. Появится сообщение о кроссклиентской таблице.
Появился экран, где необходимо нажать новые записи (New Entries).
Появился экран где вводим название нашего объекта краткий текст. Cохраняем.
Сохраняем в запрос.
В строке статуса появится сообщение что данные сохранены.
Теперь когда объект создан, изменим код нашей программы.
Добавим следующий код:
DATA:
l_s_msg TYPE bal_s_msg,
l_log_handle TYPE balloghndl,
l_s_log TYPE bal_s_log,
t_logs TYPE bal_t_logh.
l_s_log-object = 'ZKRE_LOG'. "name of object
l_s_log-aluser = sy-uname. "username
И еще:
AT SELECTION-SCREEN.
AUTHORITY-CHECK OBJECT 'ZKRE_AUTH' FOR USER sy-uname
ID 'ACTVT' DUMMY.
IF sy-subrc = 0.
MESSAGE i004 WITH sy-uname.
ELSEIF sy-subrc <> 0.
MESSAGE w005 WITH sy-uname.
LEAVE PROGRAM.
ENDIF.
CASE sscrfields-ucomm.
WHEN 'UC2'.
CLEAR: p_id, p_name, p_quant[], p_desc[].
ENDCASE.
START-OF-SELECTION.
PERFORM log_create.
MESSAGE i002.
PERFORM log_create.
CALL SCREEN 100.
Форма log create еще не создана, по стандартной процедуре двойным кликом создаем. Получили новый инклуд INCLUDE zkre_hw5_log_createf01.
*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_LOG_CREATEF01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form LOG_CREATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM log_create .
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = l_s_log "мы ему на вход - что за лог
IMPORTING
e_log_handle = l_log_handle "он нам - ключ лога
EXCEPTIONS
OTHERS = 1.
l_s_msg-msgid = sy-msgid.
l_s_msg-msgno = sy-msgno.
l_s_msg-msgty = sy-msgty.
l_s_msg-msgv1 = sy-msgv1.
l_s_msg-msgv2 = sy-msgv2.
l_s_msg-msgv3 = sy-msgv3.
l_s_msg-msgv4 = sy-msgv4.
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_log_handle = l_log_handle "ключ лога, который нам дали при создании
i_s_msg = l_s_msg "что туда суем
EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4.
INSERT l_log_handle INTO TABLE t_logs. "сначала суем ключ лога в таблицу t_logs
CALL FUNCTION 'BAL_DB_SAVE' "сохраняем лог
EXPORTING
i_t_log_handle = t_logs
i_save_all = 'X'
EXCEPTIONS
log_not_found = 1
save_not_allowed = 2
numbering_error = 3
OTHERS = 0.
ENDFORM. " LOG_CREATE
Зайдем в инклуд INCLUDE zkre_hw5_user_command_0100i01 и поместим там форму.
*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_USER_COMMAND_0100I01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE PROGRAM.
ENDCASE.
IF amount > 0.
MESSAGE i003 WITH amount.
ELSEIF amount = 0.
MESSAGE w000.
ENDIF.
PERFORM log_create.
ENDMODULE. " USER_COMMAND_0100 INPUT
Сохраняем, проверяем и активируем нашу программу, запускаем на выполнение.
Проверим транзакцией /nslg1 сохранились ли сообщения в наш объект.
Результат выполнения покажет наш лог.
Теперь сделаем так чтобы лог показывался в виде всплывающего окна.
Добавим в инклуд INCLUDE zkre_hw5_user_command_0100i01 следующую строку PERFORM log_show. Форма не создана создадим ее двойным кликом.
*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_USER_COMMAND_0100I01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE PROGRAM.
ENDCASE.
IF amount > 0.
MESSAGE i003 WITH amount.
ELSEIF amount = 0.
MESSAGE w000.
ENDIF.
PERFORM log_create.
PERFORM log_show.
ENDMODULE. " USER_COMMAND_0100 INPUT
В тексте главной программы добавился новый инклуд INCLUDE zkre_hw5_log_showf01.
В инклуде INCLUDE zkre_hw5_log_showf01 введем следующий текст. Взят из демо прграммы.
*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_LOG_SHOWF01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form LOG_SHOW
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form LOG_SHOW .
DATA:
l_s_display_profile TYPE bal_s_prof.
* get a prepared profile
CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'
IMPORTING
e_s_display_profile = l_s_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.
* use grid for display if wanted
* l_s_display_profile-use_grid = p_grid.
* set report to allow saving of variants
l_s_display_profile-disvariant-report = sy-repid.
* when you use also other ALV lists in your report,
* please specify a handle to distinguish between the display
* variants of these different lists, e.g:
l_s_display_profile-disvariant-handle = 'LOG'.
* call display function module
* We do not specify any filter (like I_S_LOG_FILTER, ...,
* I_T_MSG_HANDLE) since we want to display all logs available
CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
EXPORTING
i_s_display_profile = l_s_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. " LOG_SHOW
Сохраняем, активируем и запускаем на выполнение нашу программу.
Выскочит окно лога с сообщениями которые возникали во время выполнения программы.
Позапускав на выполнение программу посмотрев объект лога видим что наши сообщения сохраняются.
На этом все. Вот таким способом в SAP можно реализовать логгирование сообщений и исключений возникающих в ходе выполнения программы. Следующая тема - http://fibed.net/X/ это объектно-ориентированный ABAP (Object ABAP).
Александра e
Спасибо за цикл статей.
С нетерпением жду продолжения.
A B
Еще, еще!!! Выкладывайте еще!!!
Андрей
У меня почему при просмотре лога, индикатор серий, а в примере (зеленый и желтый). Почему так получилось?
Егор
Я так думаю, что цвет зависит от класса сообщений: информационное, сообщение об ошибке и т.д. Посмотри здесь http://fibed.net/Q/