一个查看 SAP CRM One Order 运行时生成的应用日志(Application Log)的小工具

发布时间 2023-11-25 20:53:26作者: JerryWang_汪子熙

方法参数定义:

方法源代码:

  METHOD GET_ORDER_ERROR_MESSAGE_OPT.
    DATA:
      ls_log_filter TYPE bal_s_lfil,
      ls_extnumber  TYPE bal_s_extn,
      ls_object     LIKE ls_extnumber,
      ls_subobject  LIKE ls_extnumber,
      lt_log_header TYPE balhdr_t,
      lt_allmsgs    TYPE bal_t_msgh,
      ls_msg        TYPE bal_s_msg,
      ls_log        TYPE crmt_odata_task_logs,
      ls_protype    LIKE ls_extnumber.

    FIELD-SYMBOLS: <order_guid>  TYPE crmt_object_guid,
                   <msg_handler> LIKE LINE OF lt_allmsgs,
                   <log_header>  LIKE LINE OF lt_log_header.

    LOOP AT it_order_guid_tab ASSIGNING <order_guid>.
      ls_extnumber-sign = 'I'.
      ls_extnumber-option = 'EQ'.
      ls_extnumber-low = <order_guid>.
      APPEND ls_extnumber TO ls_log_filter-extnumber.
    ENDLOOP.

    ls_object-sign = ls_subobject-sign = ls_protype-sign = 'I' .
    ls_object-option = ls_subobject-option = 'EQ'.
    ls_object-low = 'CRM_DOCUMENT'.
    APPEND ls_object TO ls_log_filter-object.

    ls_subobject-low = 'SINGLE'.
    APPEND ls_subobject TO ls_log_filter-subobject.

    ls_protype-option = 'LE'.
    ls_protype-low = '2'. " priority very important & important
    APPEND ls_protype TO ls_log_filter-probclass.

    CALL FUNCTION 'BAL_DB_SEARCH'
      EXPORTING
        i_s_log_filter     = ls_log_filter
      IMPORTING
        e_t_log_header     = lt_log_header
      EXCEPTIONS
        log_not_found      = 1
        no_filter_criteria = 2.

    CHECK sy-subrc = 0.

    CALL FUNCTION 'BAL_DB_LOAD'
      EXPORTING
        i_t_log_header     = lt_log_header
      IMPORTING
        e_t_msg_handle     = lt_allmsgs
      EXCEPTIONS
        no_logs_specified  = 1
        log_not_found      = 2
        log_already_loaded = 3.

    CHECK sy-subrc = 0.

    DATA: lt_logh  TYPE bal_t_logh,
          ls_mfil  TYPE bal_s_mfil,
          lt_cfil  TYPE bal_t_cfil,
          ls_cfil  LIKE LINE OF lt_cfil,
          lr_field LIKE LINE OF ls_cfil-t_range,
          lr_level LIKE LINE OF ls_mfil-detlevel.

    LOOP AT lt_log_header ASSIGNING <log_header>.
      INSERT <log_header>-log_handle INTO TABLE lt_logh.
    ENDLOOP.

    lr_level-sign   = 'I'.
    lr_level-option = 'LE'.
*   default level - employee, refer to FM CRM_ORDER_VALUE_RANGE_CHECK for detail
    lr_level-low    = '3'.
    APPEND lr_level TO ls_mfil-detlevel.

    ls_cfil-tabname   = 'CRMT_MSG_CONTEXT'.
    ls_cfil-fieldname = 'INACTIVE'.

    lr_field-option = 'EQ'.
    lr_field-sign   = 'I'.
    lr_field-low    = space.
    APPEND lr_field TO ls_cfil-t_range.
    APPEND ls_cfil TO lt_cfil.

    CALL FUNCTION 'BAL_GLB_SEARCH_MSG'
      EXPORTING
        i_t_log_handle         = lt_logh
        i_s_msg_filter         = ls_mfil
        i_t_msg_context_filter = lt_cfil
      IMPORTING
        e_t_msg_handle         = lt_allmsgs
      EXCEPTIONS
        msg_not_found          = 1
        OTHERS                 = 2.

    CHECK sy-subrc = 0.

    LOOP AT lt_allmsgs ASSIGNING <msg_handler>.
      CLEAR: ls_msg.
      CALL FUNCTION 'CRM_MESSAGES_GET_MSG_INFO'
        EXPORTING
          is_msg_handle = <msg_handler>
        IMPORTING
          es_msg        = ls_msg
        EXCEPTIONS
          OTHERS        = 99.
      CHECK sy-subrc = 0.
*     message priority and message type are two different perspective so here we still need to filter by message type
      CHECK ls_msg-msgty = 'E'.
      CLEAR ls_log.
      ls_log-msgid = ls_msg-msgid.
      ls_log-msgno = ls_msg-msgno.
      ls_log-msg_type = ls_msg-msgty.
      READ TABLE lt_log_header ASSIGNING <log_header> WITH KEY log_handle = <msg_handler>-log_handle.
      ASSERT sy-subrc = 0.
      ls_log-header_guid = <log_header>-extnumber.
      MESSAGE ID ls_msg-msgid TYPE ls_msg-msgty NUMBER ls_msg-msgno
              WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO ls_log-log_msg.
      APPEND ls_log TO et_messages.
    ENDLOOP.

  ENDMETHOD.

用到的 Function Module BAL_GLB_SEARCH_MSG 介绍:

BAL_GLB_SEARCH_MSG 的参数包括 I_MSGID(消息 ID)、I_MSGNO(消息编号)、I_MSGV1I_MSGV4(消息变量)、E_LOGNUMBER(日志编号)和 E_LOG_HANDLE(日志句柄)。当你使用这个 Function Module 查找消息时,你需要提供消息的 ID 和编号,你也可以选择性地提供消息变量。Function Module 会返回找到的消息的日志编号和日志句柄。

举个例子,假设你在运行某个 SAP 事务时遇到了一个错误消息,这个消息的 ID 是 ZMYMSGID,编号是 001,并且它有一个变量 VAR1。你可以使用 BAL_GLB_SEARCH_MSG 来查找这个消息:

DATA: lv_lognumber TYPE balloghndl,
      lv_log_handle TYPE balloghndl.

CALL FUNCTION 'BAL_GLB_SEARCH_MSG'
  EXPORTING
    i_msgid  = 'ZMYMSGID'
    i_msgno  = '001'
    i_msgv1  = 'VAR1'
  IMPORTING
    e_lognumber  = lv_lognumber
    e_log_handle = lv_log_handle.

IF lv_lognumber IS INITIAL.
  WRITE: '没有找到匹配的消息'.
ELSE.
  WRITE: '找到了匹配的消息,日志编号是 ', lv_lognumber.
ENDIF.

在这个例子中,如果找到了匹配的消息,lv_lognumber 将会被赋予相应的日志编号。如果没有找到匹配的消息,lv_lognumber 将会保持初始值。

BAL_GLB_SEARCH_MSG 是一个非常有用的 Function Module,它可以帮助你在系统中查找特定的消息。但是,你需要注意的是,查找的范围可能会受到你的系统设置的限制。例如,如果你的系统设置为只保留一定时间内的日志,那么你可能无法找到更早期的消息。