Skip to content

Instantly share code, notes, and snippets.

@RiverSongFox
Last active October 26, 2015 12:40
Show Gist options
  • Save RiverSongFox/97a5d35920b5300372d7 to your computer and use it in GitHub Desktop.
Save RiverSongFox/97a5d35920b5300372d7 to your computer and use it in GitHub Desktop.
Find and export SAP Application Logs messages
z00_log_header_tab = standard table of z00_log_header
LOGNUMBER BALOGNR
OBJECT BALOBJ_D
SUBOBJECT BALSUBOBJ
DATE BALDATE
TIME BALTIME
USER BALUSER
z00_log_message_tab = standard table z00_log_message
LOGNUMBER BALOGNR
SEQUENCE INTEGER
TIMESTAMP BALTIMSTMP
TYPE SYMSGTY
TEXT STRINGVAL
FUNCTION z00_extract_logs.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(IV_OBJECT) TYPE BALOBJ_D OPTIONAL
*" VALUE(IV_SUBOBJECT) TYPE BALSUBOBJ OPTIONAL
*" VALUE(IV_DATE_FROM) TYPE ALDATE
*" VALUE(IV_DATE_TO) TYPE ALDATE
*" VALUE(IV_TIME_FROM) TYPE ALTIME DEFAULT '000000'
*" VALUE(IV_TIME_TO) TYPE ALTIME DEFAULT '235959'
*" EXPORTING
*" VALUE(ET_HEADER) TYPE Z00_LOG_HEADER_TAB
*" VALUE(ET_MESSAGES) TYPE Z00_LOG_MESSAGE_TAB
*" EXCEPTIONS
*" NOT_FOUND
*" NO_MESSAGES
*"----------------------------------------------------------------------
DEFINE die.
clear: et_header[],
et_messages.
raise &1.
END-OF-DEFINITION.
"
" Основная логика
"
DATA: lt_log_headers TYPE balhdr_t,
lt_msg_handles TYPE bal_t_msgh.
" Поиск заголовков журналов
PERFORM find_logs
USING
iv_object
iv_subobject
iv_date_from
iv_date_to
iv_time_from
iv_time_to
CHANGING
lt_log_headers[].
IF lt_log_headers[] IS INITIAL.
die not_found.
ELSE.
" Заполнить выходную таблицу заголовков журналов
PERFORM fill_exp_headers
USING
lt_log_headers[]
CHANGING
et_header[].
ENDIF.
" Выгрузка журналов
CALL FUNCTION 'BAL_DB_LOAD'
EXPORTING
i_t_log_header = lt_log_headers[]
IMPORTING
e_t_msg_handle = lt_msg_handles[]
EXCEPTIONS
no_logs_specified = 1
log_not_found = 2
log_already_loaded = 3
OTHERS = 4.
CLEAR sy-subrc.
IF lt_msg_handles[] IS INITIAL.
die no_messages.
ELSE.
" Заполнить выходную таблицу сообщений журналов
PERFORM fill_exp_messages
USING
lt_log_headers[]
lt_msg_handles[]
CHANGING
et_messages[].
ENDIF.
ENDFUNCTION.
*&---------------------------------------------------------------------*
*& Form FIND_LOGS
*&---------------------------------------------------------------------*
* Поиск журналов по заданным критериям
*----------------------------------------------------------------------*
* -->IV_OBJECT Объект журнала
* -->IV_SUBOBJECT Подобъект журнала
* -->IV_DATE_FROM Начальная дата
* -->IV_DATE_TO Конечная дата
* -->IV_TIME_FROM Начальное время
* -->IV_TIME_TO Конечное время
* -->CT_LOG_HEADERS Заголовки найденных журналов
*----------------------------------------------------------------------*
FORM find_logs USING iv_object TYPE balobj_d
iv_subobject TYPE balsubobj
iv_date_from TYPE aldate
iv_date_to TYPE aldate
iv_time_from TYPE altime
iv_time_to TYPE altime
CHANGING ct_log_headers TYPE balhdr_t.
DATA: ls_filter TYPE bal_s_lfil.
DEFINE cond_append.
if &1 is not initial.
append &1 to &2.
endif.
END-OF-DEFINITION.
cond_append iv_object ls_filter-object.
cond_append iv_subobject ls_filter-subobject.
ls_filter-date_time-date_from = iv_date_from.
ls_filter-date_time-date_to = iv_date_to.
ls_filter-date_time-time_from = iv_time_from.
ls_filter-date_time-time_to = iv_time_to.
CALL FUNCTION 'BAL_DB_SEARCH'
EXPORTING
i_s_log_filter = ls_filter
IMPORTING
e_t_log_header = ct_log_headers[]
EXCEPTIONS
log_not_found = 1
no_filter_criteria = 2
OTHERS = 3.
IF sy-subrc <> 0.
CLEAR: ct_log_headers[].
ENDIF.
ENDFORM. "FIND_LOGS
*&---------------------------------------------------------------------*
*& Form FILL_EXP_HEADERS
*&---------------------------------------------------------------------*
* Заполнение выходной таблицы заголовков журналов
*----------------------------------------------------------------------*
* -->IT_HEADERS Данные BAL_DB_SEARCH
* -->CT_HEADERS Выходная таблица
*----------------------------------------------------------------------*
FORM fill_exp_headers USING it_headers TYPE balhdr_t
CHANGING ct_headers TYPE z00_log_header_tab.
DATA: lr_log_header TYPE REF TO balhdr,
lr_exp_header TYPE REF TO z00_log_header.
CLEAR: ct_headers[].
LOOP AT it_headers[] REFERENCE INTO lr_log_header.
APPEND INITIAL LINE TO ct_headers[] REFERENCE INTO lr_exp_header.
IF sy-subrc = 0.
lr_exp_header->lognumber = lr_log_header->lognumber.
lr_exp_header->object = lr_log_header->object.
lr_exp_header->subobject = lr_log_header->subobject.
lr_exp_header->date = lr_log_header->aldate.
lr_exp_header->time = lr_log_header->altime.
lr_exp_header->user = lr_log_header->aluser.
ENDIF.
ENDLOOP.
ENDFORM. "FILL_EXP_HEADERS
*&---------------------------------------------------------------------*
*& Form FILL_EXP_MESSAGES
*&---------------------------------------------------------------------*
* Заполнение выходной таблицы сообщений журналов
*----------------------------------------------------------------------*
* -->IT_LOG_HEADERS Данные BAL_DB_SEARCH
* -->IT_MSG_HANDLES Данные BAL_DB_LOAD
* -->CT_MESSAGES Выходная таблица с обработанными сообщениями
*----------------------------------------------------------------------*
FORM fill_exp_messages USING it_log_headers TYPE balhdr_t
it_msg_handles TYPE bal_t_msgh
CHANGING ct_messages TYPE z00_log_message_tab.
DATA: lr_log_header TYPE REF TO balhdr,
lr_msg_handle TYPE REF TO balmsghndl,
lr_exp_message TYPE REF TO z00_log_message,
ls_msg_info TYPE bal_s_msg,
lv_msg_text_c TYPE text8192,
lv_msg_text TYPE string.
LOOP AT it_msg_handles[] REFERENCE INTO lr_msg_handle.
APPEND INITIAL LINE TO ct_messages[] REFERENCE INTO lr_exp_message.
CALL FUNCTION 'BAL_LOG_MSG_READ'
EXPORTING
i_s_msg_handle = lr_msg_handle->*
IMPORTING
e_s_msg = ls_msg_info
e_txt_msg = lv_msg_text_c
EXCEPTIONS
log_not_found = 1
msg_not_found = 2
OTHERS = 3.
IF sy-subrc = 0.
READ TABLE it_log_headers[] REFERENCE INTO lr_log_header
WITH KEY log_handle = lr_msg_handle->log_handle.
IF sy-subrc = 0.
lr_exp_message->lognumber = lr_log_header->lognumber.
lr_exp_message->sequence = lr_msg_handle->msgnumber.
lr_exp_message->timestamp = ls_msg_info-time_stmp.
lr_exp_message->type = ls_msg_info-msgty.
lr_exp_message->text = lv_msg_text_c.
CONDENSE lr_exp_message->text.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "FILL_EXP_MESSAGES
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment