27. 5-я программа в SAP. Создание Application Log.

Здесь рассмотрим как можно использовать Application Log. SAP предоставляет стандартную функциональность для записи сообщений и исключений, возникающих в ходе выполнения программы, в лог с возможностью его просмотра в дальнейшем. Создадим Log object – объект где будут сохраняться наши сообщения, транзакция SLG0. Появится сообщение о кроссклиентской таблице.

image_374

Появился экран, где необходимо нажать новые записи (New Entries).

image_375

Появился экран где вводим название нашего объекта  краткий текст. Cохраняем.

image_376

Сохраняем в запрос.

image_377

В строке статуса появится сообщение что данные сохранены.

image_378

Теперь когда объект создан, изменим код нашей программы.

image_379

Добавим следующий код:

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

image_380

 И еще:

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.

image_381

 

*----------------------------------------------------------------------*
***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 и поместим там форму.

image_382

 

*----------------------------------------------------------------------*
***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 сохранились ли сообщения в наш объект.

image_383

Результат выполнения покажет наш лог.

image_384

Теперь сделаем так чтобы лог показывался в виде всплывающего окна.

Добавим в инклуд 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.

image_385

В инклуде INCLUDE zkre_hw5_log_showf01 введем следующий текст. Взят из демо прграммы.

image_386

 

*----------------------------------------------------------------------*
***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

Сохраняем, активируем и запускаем на выполнение нашу программу.

Выскочит окно лога с сообщениями которые возникали во время выполнения программы.

image_387

Позапускав на выполнение программу посмотрев объект лога видим что наши сообщения сохраняются.

image_388

На этом все. Вот таким способом в SAP можно реализовать логгирование сообщений и исключений возникающих в ходе выполнения программы. Следующая тема -  http://fibed.net/X/ это объектно-ориентированный ABAP (Object ABAP).

Комментарии

  • Александра e
    Александра e

    Спасибо за цикл статей.

    С нетерпением жду продолжения.

    on 23.12.2014 13:05
  • A B
    A B

    Еще, еще!!! Выкладывайте еще!!!

    on 14.02.2015 01:52
  • Андрей
    Андрей

    У меня почему при просмотре лога, индикатор серий, а в примере (зеленый и желтый). Почему так получилось?

    on 02.12.2015 08:14
    Егор
    Егор

    Я так думаю, что цвет зависит от класса сообщений: информационное, сообщение об ошибке и т.д. Посмотри здесь http://fibed.net/Q/

    on 02.12.2015 13:36

Чтобы оставить комментарий, необходимо Войти или Зарегистрироваться.