DSP

Application Log--使用BAL_DSP_LOG_DISPLAY展现日志

2019-07-13 10:51发布

*&---------------------------------------------------------------------*
*& Report  ZDISPLAY_LOG
*&
*&---------------------------------------------------------------------*
*& 参考资料 http://wiki.sdn.sap.com/wiki/display/Snippets/Using+Application+Log
*& 表:BALHDR BALDAT
*& T-Code: SLG0 维护日志对象;SLG1 显示日志报表
*&---------------------------------------------------------------------*

REPORT  zdisplay_log.

DATA: gv_log_handle TYPE balloghndl."Application Log: Log Handle 22个字符的GUID
DATA: gt_log_header TYPE balhdr_t."作从数据库读取或是删除用

"日志对象信息
DATA: gv_object TYPE balhdr-object VALUE '/GC1/GC',"TCode:SLG0 维护日志对象
      gv_subobject TYPE balhdr-subobject VALUE 'LOG',"TCode:SLG0 维护日志对象子对象
      gv_extnumber TYPE balhdr-extnumber VALUE 'Application Log Demo'.

START-OF-SELECTION.
  PERFORM frm_log_create.

  DATA: l_s_msg TYPE bal_s_msg.

  l_s_msg-msgty     = 'E'.
  l_s_msg-msgid     = 'BL'."BL是系统自带的消息类
  l_s_msg-msgno     = '003'."包含4个参数
  l_s_msg-msgv1     = '文本1'.
  l_s_msg-msgv2     = '文本2'.
  l_s_msg-msgv3     = '文本3'.
  l_s_msg-msgv4     = '文本4'.

  PERFORM frm_log_msg_add USING l_s_msg.

  PERFORM frm_log_msg_add_text USING '测试直接添加文本日志信息'.

  PERFORM frm_log_display.

  PERFORM frm_log_save.

  PERFORM frm_log_refresh.

  PERFORM frm_log_search.

  PERFORM frm_log_load.

  PERFORM frm_log_display.

  PERFORM frm_log_read.

  "PERFORM frm_log_delete.




*&---------------------------------------------------------------------*
*&      Form  frm_log_create
*&---------------------------------------------------------------------*
*       创建日志
*----------------------------------------------------------------------*
FORM frm_log_create.

  DATA: ls_log        TYPE bal_s_log.    "Log header data

* define some header data of this log
  ls_log-extnumber  = gv_extnumber.
  ls_log-object     = gv_object."TCode:SLG0 维护日志对象
  ls_log-subobject  = gv_subobject."TCode:SLG0 维护日志对象子对象
  ls_log-aldate     = sy-datum.
  ls_log-altime     = sy-uzeit.
  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            = gv_log_handle
    EXCEPTIONS
      log_header_inconsistent = 1
      OTHERS                  = 2.

  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.                    "frm_log_create
"
*&---------------------------------------------------------------------*
*&      Form  frm_log_msg_add
*&---------------------------------------------------------------------*
*       向日志里添加消息(1)
*----------------------------------------------------------------------*
FORM frm_log_msg_add USING msg TYPE bal_s_msg.

  CALL FUNCTION 'BAL_LOG_MSG_ADD'
    EXPORTING
      i_log_handle     = gv_log_handle
      i_s_msg          = l_s_msg
    EXCEPTIONS
      log_not_found    = 1
      msg_inconsistent = 2
      log_is_full      = 3
      OTHERS           = 4.

  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.                    "frm_log_msg_add

*&---------------------------------------------------------------------*
*&      Form  frm_log_msg_add_text
*&---------------------------------------------------------------------*
*       向日志里添加消息(2)
*----------------------------------------------------------------------*
FORM frm_log_msg_add_text USING msg TYPE char100.

  CALL FUNCTION 'BAL_LOG_MSG_ADD_FREE_TEXT'
    EXPORTING
      i_msgty          = 'S'
      i_probclass      = '4'"信息级别 1-非常重要;2-重要;3-中等;4-附加信息
      i_text           = msg
    EXCEPTIONS
      log_not_found    = 1
      msg_inconsistent = 2
      log_is_full      = 3
      OTHERS           = 4.

  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.                    "frm_log_msg_add_text

*&---------------------------------------------------------------------*
*&      Form  frm_log_display
*&---------------------------------------------------------------------*
*       显示日志
*----------------------------------------------------------------------*
FORM frm_log_display.

  "设置日志显示方式
  DATA: l_s_display_profile TYPE bal_s_prof.

*BAL_DSP_PROFILE_DETLEVEL_GET    "显示一个界面 空的?
*BAL_DSP_PROFILE_NO_TREE_GET     "显示一个界面
*BAL_DSP_PROFILE_POPUP_GET       "弹出框式
*BAL_DSP_PROFILE_SINGLE_LOG_GET  "显示一个界面 包含TREE
*BAL_DSP_PROFILE_STANDARD_GET    "显示一个界面 包含TREE 需要双击TREE节点才显示日志信息

* get a prepared profile
  CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'
    IMPORTING
      e_s_display_profile = l_s_display_profile
    EXCEPTIONS
      OTHERS              = 1.

* use grid for display if wanted
  l_s_display_profile-use_grid = 'X'.
* 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 FUNCTION 'BAL_DSP_LOG_DISPLAY'
    EXPORTING
      i_s_display_profile  = l_s_display_profile
    EXCEPTIONS
      profile_inconsistent = 1
      internal_error       = 2
      no_data_available    = 3
      no_authority         = 4
      OTHERS               = 5.

  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.                    "frm_log_display

*&---------------------------------------------------------------------*
*&      Form  frm_log_save
*&---------------------------------------------------------------------*
*       保存日志到数据库
*----------------------------------------------------------------------*
FORM frm_log_save.

  CALL FUNCTION 'BAL_DB_SAVE'
    EXPORTING
      i_save_all       = 'X'
    EXCEPTIONS
      log_not_found    = 1
      save_not_allowed = 2
      numbering_error  = 3
      OTHERS           = 4.

  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.                    "frm_log_save

*&---------------------------------------------------------------------*
*&      Form  frm_log_refresh
*&---------------------------------------------------------------------*
*       清空内存中的所有日志
*----------------------------------------------------------------------*
FORM frm_log_refresh.

  CALL FUNCTION 'BAL_LOG_REFRESH'
    EXPORTING
      i_log_handle  = gv_log_handle
    EXCEPTIONS
      log_not_found = 1
      OTHERS        = 2.

  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.                    "frm_log_refresh

*&---------------------------------------------------------------------*
*&      Form  frm_log_search
*&---------------------------------------------------------------------*
*       在数据库里查找日志
*----------------------------------------------------------------------*
FORM frm_log_search.

  DATA: gr_object     TYPE bal_s_obj.
  DATA: gr_extnumber  TYPE bal_s_extn.
  DATA: gs_log_filter TYPE bal_s_lfil."此对象里有很多筛选条件可供使用

* create a filter with all relevant criteria:
  gr_object-sign   = 'I'.
  gr_object-option = 'EQ'.
  gr_object-low    = '/GC1/GC'.
  APPEND gr_object TO gs_log_filter-object.

  gr_extnumber-sign   = 'I'.
  gr_extnumber-option = 'EQ'.
  gr_extnumber-low    = 'Application Log Demo'.
  APPEND gr_extnumber TO gs_log_filter-extnumber.

  REFRESH: gt_log_header.
* search on DB for these logs
  CALL FUNCTION 'BAL_DB_SEARCH'
    EXPORTING
      i_s_log_filter     = gs_log_filter
    IMPORTING
      e_t_log_header     = gt_log_header
    EXCEPTIONS
      log_not_found      = 1
      no_filter_criteria = 2.

  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.                    "frm_log_search

*&---------------------------------------------------------------------*
*&      Form  frm_log_load
*&---------------------------------------------------------------------*
*       从数据库加载日志
*----------------------------------------------------------------------*
FORM frm_log_load.

  IF gt_log_header IS INITIAL.
    MESSAGE '请先调用 BAL_DB_SEARCH 方法检索日志信息' TYPE 'E'.
    EXIT.
  ENDIF.

* load these messages into memory
  CALL FUNCTION 'BAL_DB_LOAD'
    EXPORTING
      i_t_log_header     = gt_log_header"来源于之前的 BAL_DB_SEARCH 方法
    EXCEPTIONS
      no_logs_specified  = 1
      log_not_found      = 2
      log_already_loaded = 3.

  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.                    "frm_log_load

*&---------------------------------------------------------------------*
*&      Form  frm_log_read
*&---------------------------------------------------------------------*
*       从数据库中读取日志信息到内表
*----------------------------------------------------------------------*
FORM frm_log_read.

  DATA: p_number_of_logs LIKE sy-tabix.
* Log header data
  DATA: BEGIN OF p_header_data_tab OCCURS 0.
          INCLUDE STRUCTURE balhdr.
  DATA: END OF p_header_data_tab.
* Log parameters
  DATA: BEGIN OF p_header_para_tab OCCURS 0.
          INCLUDE STRUCTURE balhdrp.
  DATA: END OF p_header_para_tab.
* Log messages
  DATA: BEGIN OF p_message_tab OCCURS 0.
          INCLUDE STRUCTURE balm.
  DATA: END OF p_message_tab.
* Message parameters
  DATA: BEGIN OF p_message_para_tab OCCURS 0.
          INCLUDE STRUCTURE balmp.
  DATA: END OF p_message_para_tab.

  CALL FUNCTION 'APPL_LOG_READ_DB'"有很多筛选条件可供使用
    EXPORTING
      object             = '/GC1/GC'
      subobject          = 'LOG'
      external_number    = 'Application Log Demo'
    IMPORTING
      number_of_logs     = p_number_of_logs
    TABLES
      header_data        = p_header_data_tab
      header_parameters  = p_header_para_tab
      messages           = p_message_tab
      message_parameters = p_message_para_tab.

  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.                    "frm_log_read

*&---------------------------------------------------------------------*
*&      Form  frm_log_delete
*&---------------------------------------------------------------------*
*       删除数据库里的日志
*----------------------------------------------------------------------*
FORM frm_log_delete.

  IF gt_log_header IS INITIAL.
    MESSAGE '请先调用 BAL_DB_SEARCH 方法检索日志信息' TYPE 'E'.
    EXIT.
  ENDIF.

  CALL FUNCTION 'BAL_DB_DELETE'
    EXPORTING
      i_t_logs_to_delete = gt_log_header"来源于之前的 BAL_DB_SEARCH 方法
    EXCEPTIONS
      no_logs_specified  = 1
      OTHERS             = 2.

  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.                    "frm_log_delete


*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
*   请先调用 BAL_DB_SEARCH 方法检索日志信息