Автор | Сообщение |
---|---|
Заголовок сообщения: Журнал ошибок в тр-ии ME21N Добавлено: Ср, дек 08 2004, 08:36 |
|
Гость |
Добрый день! Подскажите, пожалуйста, каким образом происходит добавление записей в журнал сообщений тр-ии ME21N. И как можно самому добавить запись в журнал, ну , например из юзерекзита? Спасибо!
|
Вернуться к началу | |
EGF |
Заголовок сообщения: Добавлено: Ср, дек 08 2004, 11:18 |
||
|
Я думаю, пригодится
|
||
Вернуться к началу |
|
||
Loyso |
Заголовок сообщения: Добавлено: Ср, май 24 2006, 13:29 |
|
EGF написал(а): Я думаю, пригодится Народ, кто может пояснить как это делается. впервые столкнулся с BAdI. С помощью какой транзакции можно их дорабатывать? Вот в этом конкретном случае. (Кстати говоря, если я правильно понял, то журнал ошибок — это окно, вываливающееся после нажатия ‘SAVE’?).
|
Вернуться к началу |
|
Mike1 |
Заголовок сообщения: Добавлено: Ср, май 24 2006, 13:33 |
|
se19/se18
|
Вернуться к началу |
|
Loyso |
Заголовок сообщения: Добавлено: Ср, май 24 2006, 13:45 |
|
Mike1 написал: se19/se18 тханкс, а нет какой нить доки на мыло кинуть?
|
Вернуться к началу |
|
OlegDm |
Заголовок сообщения: Добавлено: Ср, май 24 2006, 13:56 |
||
|
Вот для простоты, например, проверка обязательности заполнения какого-нить поля в заголовке заказа: Code: method IF_EX_ME_PROCESS_PO_CUST~CHECK. * ———————————————— ls_mepoheader = im_header->get_data( ). if ls_mepoheader-bstyp = ‘F’. mmpur_remove_messages_by_id ls_mepoheader-id. if ls_mepoheader-<ИмяПоля> is initial. mmpur_business_obj_id ls_mepoheader-id. endif. endif. с проверкой позиций чуток посложней. Последний раз редактировалось OlegDm Ср, май 24 2006, 14:03, всего редактировалось 1 раз.
|
||
Вернуться к началу |
|
||
Loyso |
Заголовок сообщения: Добавлено: Ср, май 24 2006, 14:01 |
|
ага, поримерно понял. спасибо. будем посмотреть.
|
Вернуться к началу |
|
Loyso |
Заголовок сообщения: Добавлено: Пт, май 26 2006, 14:58 |
|
отлично, mepoheader — это заголовок. Блин, народ, как достучаться до значения поля Site в позициях???? Всё ясно, пятница вечер, какой там АБАП. И правда — чёрт с ним, в понедельник доделаю:) Но помощь всё равно нужна. Народ, будет время, подскажите плиз!
|
Вернуться к началу |
|
bossjohn |
Заголовок сообщения: Добавлено: Пт, июл 28 2006, 10:32 |
||
|
А каким образом можно с помощью ME_PROCESS_PO_CUST в поле Вид оценки заменить средство поиска? Как я понимаю при нажатии F4 ни один из методов не срабатывает.
|
||
Вернуться к началу |
|
||
trop |
Заголовок сообщения: re Добавлено: Пт, июл 28 2006, 20:45 |
|
попахивает изменением стандарта )
|
Вернуться к началу |
|
bossjohn |
Заголовок сообщения: Добавлено: Чт, авг 17 2006, 15:05 |
||
|
А может кто знает каким образом в тр. me21n получить данные заголовка и элементов (l_header и l_item). Сам Сап делает что-то типа этого Code: DATA: call_subscreen TYPE sy-dynnr, «#EC NEEDED CALL METHOD cl_framework_mm=>get_instance дальше в handle_event вызывается метод POV, в котором: Code: CALL METHOD POV_LIST( IM_MODEL = MY_MODEL и уже внем путем Code: l_item ?= im_model. вытягиваем данные элементов Весь вопрос в том как мне получить ту самую MY_MODEL из которой можно все вытянуть???
|
||
Вернуться к началу |
|
||
OlegDm |
Заголовок сообщения: Добавлено: Пн, авг 21 2006, 07:38 |
||
|
bossjohn написал(а): А может кто знает каким образом в тр. me21n получить данные заголовка и элементов (l_header и l_item). Не совсем понял вопрос… ведь EGF уже подсказал соответствующие BADI. Возьмем, например, ME_PROCESS_PO_CUST и метод CHECK. В нем можно легко, как уже писал выше, получить данные заголовка: Code: DATA: ls_mepoheader TYPE mepoheader. ls_mepoheader = im_header->get_data( ). Здесь же можно достучаться и до позиций заказа
|
||
Вернуться к началу |
|
||
bossjohn |
Заголовок сообщения: Добавлено: Пн, авг 21 2006, 10:53 |
||
|
Так вначале и делал. Но потом оказалось что енто БАДИ отрабатывает не всегда и возникла необходимость сделать по другому. ВОт извращаюсь.
|
||
Вернуться к началу |
|
||
creo |
Заголовок сообщения: Добавлено: Ср, окт 04 2006, 15:06 |
|
Никому не довелось удалять записи из журнала сообщений тр-ии ME21N?
|
Вернуться к началу |
|
OlegDm |
Заголовок сообщения: Добавлено: Чт, окт 05 2006, 07:03 |
||
|
creo написал(а): Никому не довелось удалять записи из журнала сообщений тр-ии ME21N? выше уже было: OlegDm написал(а): Вот для простоты, например, проверка обязательности заполнения какого-нить поля в заголовке заказа: Code: method IF_EX_ME_PROCESS_PO_CUST~CHECK. * ———————————————— ls_mepoheader = im_header->get_data( ). if ls_mepoheader-bstyp = ‘F’. mmpur_remove_messages_by_id ls_mepoheader-id. if ls_mepoheader-<ИмяПоля> is initial. mmpur_business_obj_id ls_mepoheader-id. endif. endif. с проверкой позиций чуток посложней. макрос mmpur_remove_messages_by_id ls_mepoheader-id в вышеприведенном коде как раз удаляет сообщения. сам макрос находится в инклуде mm_messages_mac
|
||
Вернуться к началу |
|
||
При выполнении программы могут возникать ситуации, которые необходимо донести до пользователя. Обычно это ошибки, предупреждения или просто сообщение об успешном выполнении процедуры. Эти сообщения не должны возникать по отдельности через команду MESSAGE. Их нужно собрать и отобразить все вместе в нужный момент. Такой набор сообщений называется журналом. Журнал содержит как заголовочную информацию (код транзакции, пользователь, дата и время создания и т.п.), так и позиционную (сами сообщения).
Для ведения журнала приложений SAP предоставляет мощный инструмент, называемый BAL (Basis Application Log). Журнал приложений применяется для отладки, поддержки и разработки как стандартный, так и Z-приложений. Лог особенно необходим при отладки фоновых задачах, веб-сервисов, рабочих процессов, т.е. где не всегда удобно, а иногда даже просто невозможно использовать стандартный отладчик.
Просмотреть журнал приложения можно в тр. SLG1.
Реализация журнала приложений содержится в пакете SZAL.
Принцип работы
Весь цикл работы журнала приложений можно свести к 3-м этапам:
- Создание/загрузка журнала. Для создания экземпляра лога используется функциональный модуль BAL_LOG_CREATE. На вход в ФМ передается структура типа BAL_S_LOG, содержащая заголовочную информацию. ФМ возвращает ID журнала приложений BALLOGHNDL.
- Добавление сообщений. Для добавления сообщений используется функциональный модуль BAL_LOG_MSG_ADD. На вход ФМ передается ID журнала BALLOGHNDL, а также структура типа BAL_S_MSG содержащая информацию о сообщении.
- Сохранение/отображение журнала. За отображения лога отвечает функциональный модуль BAL_DSP_LOG_DISPLAY.
Пример простого использования журнала приложений
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
*&———————————————————————* *& Report ZBAL_LOG_EXAMPLE1 *& BAL Log: Журнал приложений SAP *&———————————————————————* *& Пример использования журнала приложений SAP *& http://abap4.ru/?p=283 *&———————————————————————* REPORT zbal_log_example1. START-OF-SELECTION. PERFORM main. FORM main. DATA ls_log TYPE bal_s_log. DATA ls_msg TYPE bal_s_msg. DATA lv_hnd TYPE balloghndl. DATA lt_hnd TYPE bal_t_logh. DATA lv_dummy TYPE string. ls_log—extnumber = ‘Журнал приложений’. 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 = lv_hnd. MESSAGE s191(bl) INTO lv_dummy. ls_msg—msgty = sy—msgty. ls_msg—msgid = sy—msgid. ls_msg—msgno = sy—msgno. ls_msg—msgv1 = sy—msgv1. ls_msg—msgv2 = sy—msgv2. ls_msg—msgv3 = sy—msgv3. ls_msg—msgv4 = sy—msgv4. CALL FUNCTION ‘BAL_LOG_MSG_ADD’ EXPORTING i_s_msg = ls_msg i_log_handle = lv_hnd. APPEND lv_hnd TO lt_hnd. CALL FUNCTION ‘BAL_DSP_LOG_DISPLAY’ EXPORTING i_t_log_handle = lt_hnd. ENDFORM. |
Результат работы программы
Структура заголовка
№ | Параметр | Значение |
---|---|---|
1 | EXTNUMBER | Внешний идентификатор. Используется в качестве критериев поиска нужного журнала. |
2 | OBJECT | Имя объекта. Объект журнала приложений, применяется при поиске в тр. SLG1. |
3 | SUBOBJECT | Подобъект. Объект журнала приложений, применяется при поиске в тр. SLG1. |
4 | ALDATE | Дата |
5 | ALTIME | Время |
6 | ALUSER | Имя пользователя |
7 | ALTCODE | Код транзакции |
8 | ALPROG | Имя программы |
9 | ALMODE | Режим работы (B — фоновый; D — диалоговый; I — пакетный ввод; A — авто) |
10 | ALCHDATE | Дата последнего изменения |
11 | ALCHTIME | Время последнего изменения |
12 | ALCHUSER | Пользователь, изменивший журнал |
13 | ALDATE_DEL | Дата истечения срока хранения |
14 | DEL_BEFORE | Журнал сохраняется до истечения срока хранения |
15 | ALSTATE | Статус обработки (1 — подлежит обработке; 2 — в обработке; 3 — исполнено) |
16 | CONTEXT | Контекст. Используется для привязки контекста к сообщению. |
17 | PARAMS | Параметры. Используется для детализации сообщений. |
В журнале приложений эти поля будут выглядеть следующим образом
Структура сообщения
№ | Параметр | Значение |
---|---|---|
1 | MSGTY | Тип сообщения |
2 | MSGID | Класс сообщений |
3 | MSGNO | Номер сообщения |
4 | MSGV1 | Переменная сообщения |
5 | MSGV2 | Переменная сообщения |
6 | MSGV3 | Переменная сообщения |
7 | MSGV4 | Переменная сообщения |
8 | MSGV1_SRC | Происхождение переменных сообщения |
9 | MSGV2_SRC | Происхождение переменных сообщения |
10 | MSGV3_SRC | Происхождение переменных сообщения |
11 | MSGV4_SRC | Происхождение переменных сообщения |
12 | DETLEVEL | Степень детализации (число от 1 до 9) |
13 | PROBCLASS | Класс проблем сообщения (1 — особо важное; 2 — важное; 3 — среднее; 4 — дополнительная информация) |
14 | ALSORT | Критерий сортировки/группировка |
15 | TIME_STMP | Метка времени сообщения |
16 | MSG_COUNT | Число накопленных сообщений |
17 | CONTEXT | Контекст. Используется для привязки контекста к сообщению. |
18 | PARAMS | Параметры. Используется для детализации сообщений. |
Параметры MSGV1_SRC, MSGV2_SRC, MSGV3_SRC, MSGV4_SRC используются для анализа сообщений. В них можно записывать параметры или место запуска программы. Например, у нас есть 2 реализации одной и той же операции. Сообщения в журналах будут одинаковыми. Чтобы отличить происхождения сообщений, можно записать служебную информацию в переменные происхождения.
Параметры DETLEVEL, PROBCLASS, ALSORT используются для фильтрации и сортировки сообщений.
Параметр MSG_COUNT является счетчиком накопленных сообщений, в случае если отправляются одинаковые сообщения.
В журнале приложений эти поля будут выглядеть следующим образом
Пример стандартной демо-программы SBAL_DEMO_01.
Детализация сообщений
Сообщения можно детализировать. Процесс детализации заключается в следующем: в параметр PARAMS заполняются необходимые переменные и программу обратной связи для обработки детализации. При двойном клике на поле детализации вызывается программа обратной связи, в которую передаются необходимые параметры.
Параметр PARAMS является структурой типа BAL_S_PARM.
№ | Параметр | Значение |
---|---|---|
1 | T_PAR | Таблица параметров с именами параметров и их значениями |
2 | CALLBACK | Структура для обратной связи |
3 | ALTEXT | Текст из SE61, в случае если длины текста T100 не достаточно |
Программа обратной связи представляет собой функциональный модуль или подпрограмму, принимающие на вход таблицу I_T_PARAMS типа BAL_T_PAR.
В случае, если необходимо вызывать ФМ, то CALLBACK должна быть заполнена следующим образом:
CALLBACK-USEREXITT = ‘F’.
CALLBACK-USEREXITF = ИМЯ_ФМ.
В случае, если необходимо вызывать подпрограмму, то CALLBACK должна быть заполнена следующим образом:
CALLBACK-USEREXITP = ИМЯ_ПРОГРАММЫ.
CALLBACK-USEREXITF = ИМЯ_ПОДПРОГРАММЫ.
Пример журнала приложений с деталицацией
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
*&———————————————————————* *& Report ZBAL_LOG_EXAMPLE2 *& BAL Log: Журнал приложений SAP *&———————————————————————* *& Пример детализации в журнале приложений SAP *& http://abap4.ru/?p=283 *&———————————————————————* REPORT zbal_log_example2. START-OF-SELECTION. PERFORM main. FORM main. DATA ls_log TYPE bal_s_log. DATA ls_msg TYPE bal_s_msg. DATA lv_hnd TYPE balloghndl. DATA lt_hnd TYPE bal_t_logh. DATA ls_param TYPE BAL_S_PAR. DATA lv_dummy TYPE string. ls_log—aluser = sy—uname. ls_log—extnumber = ‘Журнал приложений’. CALL FUNCTION ‘BAL_LOG_CREATE’ EXPORTING i_s_log = ls_log IMPORTING e_log_handle = lv_hnd. MESSAGE w191(bl) INTO lv_dummy. ls_msg—msgty = sy—msgty. ls_msg—msgid = sy—msgid. ls_msg—msgno = sy—msgno. ls_msg—msgv1 = sy—msgv1. ls_msg—msgv2 = sy—msgv2. ls_msg—msgv3 = sy—msgv3. ls_msg—msgv4 = sy—msgv4. ls_msg—params—callback—userexitp = sy—repid. ls_msg—params—callback—userexitf = ‘CALLBACK’. ls_param—parname = ‘PAR’. ls_param—parvalue = ‘Hello, world!’. APPEND ls_param TO ls_msg—params—t_par. CALL FUNCTION ‘BAL_LOG_MSG_ADD’ EXPORTING i_s_msg = ls_msg i_log_handle = lv_hnd. APPEND lv_hnd TO lt_hnd. CALL FUNCTION ‘BAL_DSP_LOG_DISPLAY’ EXPORTING i_t_log_handle = lt_hnd. ENDFORM. FORM callback TABLES i_t_params TYPE bal_t_par. DATA ls_param TYPE bal_s_par. READ TABLE i_t_params INTO ls_param WITH KEY parname = ‘PAR’. CHECK sy—subrc EQ 0. MESSAGE ls_param—parvalue TYPE rs_c_info. ENDFORM. |
И результат выполнения
Пример стандартной демо-программы SBAL_DEMO_02.
Привязка контекста
Иногда сообщение имеет смысл только в контексте. Например, сообщение «Документ не может быть удален» возникает при обработке определённого документа. При выводе лога привязка документа теряется. Информация о документе может быть помещена в само сообщение. В этом случае могут возникнуть проблемы при анализе сообщения (в случае если перечень сообщений возвращает пакетный ввод) или число параметром может быть больше чем число переменных сообщения (например, БЕ, завод, склад, год, номер документа, позиция и т.п.).
Журнал приложения предоставляет возможность добавить к сообщениям определенный контекст. В программе просмотра журнала поля контекста можно выводить в отдельном столбце.
Для добавления контекста необходимо заполнить параметр CONTEXT, который является структурой типа BAL_S_CONT.
№ | Параметр | Значение |
---|---|---|
1 | TABNAME | Имя структуры ABAP-словаря (см. SE11) |
2 | VALUE | Данные контекста |
Если контекстом является плоская структура, все элементы которой типа CLIKE, то контекст можно заполнить прямым присвоением структуры в поле VALUE
DATA ls_msg TYPE bal_s_msg. DATA ls_ctx TYPE zs_bal_ctx. ls_msg—context—tabname = ‘ZS_BAL_CTX’. ls_msg—context—value = ls_ctx. |
В остальных случаях (например, если контекст содержит числовые поля) можно воспользоваться таким способом
DATA ls_msg TYPE bal_s_msg. DATA ls_ctx TYPE zs_bal_ctx. FIELD—SYMBOLS: <lv_ctx> TYPE c. ASSIGN ls_ctx TO <lv_ctx> CASTING. ls_msg—context—tabname = ‘ZS_BAL_CTX’. ls_msg—context—value = <lv_ctx>. |
Для вывода полей контекста в ALV журнала приложений, необходимо добавить нужное поле в каталог полей. Отображение журнала происходит через функциональный модуль BAL_DSP_LOG_DISPLAY, в который передается параметр профиля отображения I_S_DISPLAY_PROFILE. В профиле есть поле MESS_FCAT — каталог полей. В него нужно добавить нужные столбцы для отображения.
Пример стандартной демо-программы SBAL_DEMO_02.
Объединение сообщений
Некоторые сообщения отправляются программой несколько раз без предоставления новой информации. Такие сообщения могут быть объединены с помощью BAL_LOG_MSG_CUMULATE. Когда повторяется одно и то же сообщение, новое сообщение не добавляется, счетчик MSG_COUNT для старого сообщения увеличивается.
Функциональный модуль BAL_LOG_MSG_CUMULATE имеет спец. параметры, определяющие критерии объединения:
I_COMPARE_ATTRIBUTES = ‘X’
Атрибуты сообщения (класс проблем PROBCLASS, уровень детализации DETLEVEL, критерий сортировки ALSORT) должны совпадать
I_COMPARE_CONTEXT = ‘X’
Контекст должен совпадать
I_COMPARE_PARAMETERS = ‘X’
Параметры сообщения должны совпадать
Дополнительные возможности добавления сообщений
BAL_LOG_MSG_ADD_FREE_TEXT — добавляет текст в журнал
CALL FUNCTION ‘BAL_LOG_MSG_ADD_FREE_TEXT’ EXPORTING i_msgty = ‘E’ i_text = ‘Текст сообщения’. |
BAL_LOG_EXCEPTION_ADD — добавляет исключение в журнал
DATA ls_exc TYPE bal_s_exc. DATA lr_root TYPE REF TO cx_root. ls_exc—msgty = ‘E’. ls_exc—exception = lr_root. CALL FUNCTION ‘BAL_LOG_EXCEPTION_ADD’ EXPORTING i_log_handle = lv_log_handle i_s_exc = ls_exc. |
Пример стандартной демо-программы SBAL_DEMO_07.
Сохранение журнала приложений
Если журнал нужно сохранять в БД, то при создании лога через BAL_LOG_CREATE в структуру заголовка необходимо передать объект и подобъект (не обязательно).
Создаются объекты и подобъекты в тр. SLG0.
Просматривать журнал можно будет в тр. SLG1.
Чтобы сообщения сохранились нужно вызвать BAL_DB_SAVE, после чего сделать COMMIT WORK.
Просмотр журнала сообщений
За отображения журнала приложений отвечает BAL_DSP_LOG_DISPLAY. На вход нужно передать заполненную структуру BAL_S_PROF. В большинстве случаев, требуется изменить какие-то значения структуры. Чтобы не заполнять профиль целиком, можно считать стандартный профиль и изменить в нем нужные поля. Пример добавляет контекстное поле в ALV.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
FORM log_display. DATA ls_display_profile TYPE bal_s_prof. DATA ls_fcat TYPE bal_s_fcat. CALL FUNCTION ‘BAL_DSP_PROFILE_SINGLE_LOG_GET’ IMPORTING e_s_display_profile = ls_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. ls_fcat—ref_table = ‘BAL_S_EX01’. ls_fcat—ref_field = ‘ID’. ls_fcat—col_pos = 100. APPEND ls_fcat TO ls_display_profile—mess_fcat. ls_display_profile—disvariant—report = sy—repid. ls_display_profile—disvariant—handle = ‘LOG’. CALL FUNCTION ‘BAL_DSP_LOG_DISPLAY’ EXPORTING i_s_display_profile = ls_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. |
Отображение журнала в модальном окне
Функциональный модуль BAL_DSP_PROFILE_POPUP_GET возвращает настройки профиля для вывода в модальном окне.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
*&———————————————————————* *& Report ZBAL_LOG_EXAMPLE3 *& BAL Log: Журнал приложений SAP *&———————————————————————* *& Пример детализации в журнале приложений SAP *& http://abap4.ru/?p=283 *&———————————————————————* REPORT zbal_log_example3. START-OF-SELECTION. PERFORM main. FORM main. DATA ls_log TYPE bal_s_log. DATA ls_msg TYPE bal_s_msg. DATA lv_hnd TYPE balloghndl. DATA lt_hnd TYPE bal_t_logh. DATA ls_prof TYPE bal_s_prof. DATA lv_dummy TYPE string. CALL FUNCTION ‘BAL_LOG_CREATE’ EXPORTING i_s_log = ls_log IMPORTING e_log_handle = lv_hnd. MESSAGE w191(bl) INTO lv_dummy. ls_msg—msgty = sy—msgty. ls_msg—msgid = sy—msgid. ls_msg—msgno = sy—msgno. ls_msg—msgv1 = sy—msgv1. ls_msg—msgv2 = sy—msgv2. ls_msg—msgv3 = sy—msgv3. ls_msg—msgv4 = sy—msgv4. CALL FUNCTION ‘BAL_LOG_MSG_ADD’ EXPORTING i_s_msg = ls_msg i_log_handle = lv_hnd. CALL FUNCTION ‘BAL_DSP_PROFILE_POPUP_GET’ IMPORTING e_s_display_profile = ls_prof. ls_prof—use_grid = abap_true. APPEND lv_hnd TO lt_hnd. CALL FUNCTION ‘BAL_DSP_LOG_DISPLAY’ EXPORTING i_t_log_handle = lt_hnd i_s_display_profile = ls_prof. ENDFORM. |
Результат будет таким
Информация
Подробную документацию API журнала приложений можно взять тут.
Демо программы:
SBAL_DEMO_01 — простейший вызов журнала приложений
SBAL_DEMO_02 — различные виды сбора сообщений, детализация, контекст
SBAL_DEMO_03 — поиск сообщений в памяти
SBAL_DEMO_04 — разные форматы журнала приложений
SBAL_DEMO_05 — сохранение и загрузка журналов
SBAL_DEMO_06 — добавление комплексных данных к журналу
SBAL_DEMO_07 — добавление исключений
SBAL_DEMO_08 — поиск исключений в памяти
Часто возникает необходимость вывода списка сообщений пользователю SAP. В журнал сообщений ABAP может выводится информация о ходе выполнения программы SAP. Также он необходим для вывода списка ошибок, возникших в результате её выполнения. В результате разберём набор ФМ, предназначенных для вывода журнала сообщений ABAP.
Варианты реализации – это глобальная переменная в программе ABAP или атрибут класса. И в ходе выполнения программы в эту переменную сохраняются сообщения. По окончанию выполнения программы выводится журнал сообщений. Либо происходит сохранение журнала в системе SAP с возможностью просмотра в транзакции SLG1.
Этапы работы с журналом сообщений SAP.
Создание журнала сообщений ABAP.
Создание экземпляра журнала сообщений SAP происходит с использованием функционального модуля BAL_LOG_CREATE.
DATA: ls_log TYPE bal_s_log, lv_log_h TYPE balloghndl. CALL FUNCTION ‘BAL_LOG_CREATE’ EXPORTING i_s_log = ls_log IMPORTING e_log_handle = lv_log_h EXCEPTIONS log_header_inconsistent = 0. |
Добавление сообщений в журнал SAP.
Добавить новые сообщения в журнал можно используя функциональный модуль BAL_LOG_MSG_ADD.
DATA: ls_msg TYPE bal_s_msg, lv_log_h TYPE balloghndl. ls_msg—msgid = ‘ESH_TAU_MSG’. ls_msg—msgno = ‘000’. ls_msg—msgty = ‘E’. CALL FUNCTION ‘BAL_LOG_MSG_ADD’ EXPORTING i_log_handle = lv_log_h i_s_msg = ls_msg. |
Вывод журнала сообщений на экран.
Для вывода журнала сообщений ABAP на экран в виде всплывающего окна используется ФМ BAL_DSP_LOG_DISPLAY.
» Заполняем переменную окна журнала CALL FUNCTION ‘BAL_DSP_PROFILE_STANDARD_GET’ IMPORTING e_s_display_profile = ls_prof. » Устанавливаем размеры окна ls_prof—start_row = 5. ls_prof—end_row = 25. ls_prof—start_col = 10. ls_prof—end_col = 150. ls_prof—show_all = abap_true. » Выводим окно на экран CALL FUNCTION ‘BAL_DSP_LOG_DISPLAY’ EXPORTING i_s_display_profile = ls_prof. |
Удаление из памяти журнала сообщений.
Для удаления из памяти журнала сообщений ABAP используется ФМ BAL_LOG_REFRESH. По идентификатору журнала сообщений i_log_handle он находит журнал и удаляет его из памяти.
DATA: lv_log_h TYPE balloghndl. CALL FUNCTION ‘BAL_LOG_REFRESH’ EXPORTING i_log_handle = lv_log_h EXCEPTIONS LOG_NOT_FOUND = 0. |
Шаблон вывода журнала сообщений ABAP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
DATA: ls_log TYPE bal_s_log, ls_prof TYPE bal_s_prof, lv_log_h TYPE balloghndl. » Заполняем переменную журнала CALL FUNCTION ‘BAL_LOG_CREATE’ EXPORTING i_s_log = ls_log IMPORTING e_log_handle = lv_log_h EXCEPTIONS OTHERS = 0. » В цикле добавляем сообщения в журнал LOOP AT mt_msg REFERENCE INTO DATA(lr_msg). CALL FUNCTION ‘BAL_LOG_MSG_ADD’ EXPORTING i_log_handle = lv_log_h i_s_msg = lr_msg—>*. ENDLOOP. » Заполняем переменную окна журнала CALL FUNCTION ‘BAL_DSP_PROFILE_STANDARD_GET’ IMPORTING e_s_display_profile = ls_prof. » Устанавливаем размеры окна ls_prof—start_row = 5. ls_prof—end_row = 25. ls_prof—start_col = 10. ls_prof—end_col = 150. ls_prof—show_all = abap_true. CALL FUNCTION ‘BAL_DSP_LOG_DISPLAY’ EXPORTING i_s_display_profile = ls_prof. CALL FUNCTION ‘BAL_LOG_REFRESH’ EXPORTING i_log_handle = lv_log_h. » Чистим глобальную переменную сообщений CLEAR mt_msg. |
В коде используются конструкции:
- DATA(lr_msg) – Инлайновая декларация ABAP
Готово. В результате получаем на экране журнал сообщений. И в каждой строке есть индикатор в зависимости от типа сообщения с текстом. Также есть возможностью просмотреть подробности каждого сообщения. Можно использовать вариант и без глобальной переменной. Например, мы можем сразу создать объекта сообщений ABAP и сохранять сообщения сразу в журнал. Это подойдёт при фоновом выполнении. Так же на необходимость глобальной переменной влияет нужен полный список сообщений в конце выполнения.
Так же много интересных примеров можно найти в SBAL_DEMO*.
Сайт ABAP программирование YouCoder – это сборник статей и видео о языке программирования ABAP и работе в SAP системе. Есть как уроки abap для начинающих так и новый синтаксис в ABAP и SAP обучение для консультантов SAP.
Что такое системный мониторинг?
Мониторинг системы – это ежедневное рутинное занятие, и этот документ предоставляет систематическую пошаговую процедуру для мониторинга сервера. Он дает обзор технических аспектов и концепций для упреждающего мониторинга системы. Немногие из них:
- Проверка серверов приложений.
- Мониторинг общесистемных рабочих процессов.
- Мониторинг рабочих процессов для отдельных экземпляров.
- Контроль блокировки записей.
- Загрузка процессора
- Доступное пространство в базе данных.
- Мониторинг процессов обновления.
- Журнал системы мониторинга.
- Буферная статистика
Некоторые другие:
- Мониторинг пакетных заданий
- Мониторинг запросов буфера.
- Количество запросов на печать
- Анализ дампов ABAP.
- Монитор производительности базы данных.
- Проверка базы данных.
- Мониторинг пользователей приложения.
Почему ежедневные базовые проверки / мониторинг системы?
Как мы осуществляем мониторинг системы SAP?
Проверка серверов приложений (SM51)
Эта транзакция используется для проверки всех активных серверов приложений.
Здесь вы можете увидеть, какие службы или рабочие процессы настроены в каждом случае.
Мониторинг рабочих процессов для отдельных экземпляров SM50:
Отображает все запущенные, ожидающие, остановленные и PRIV процессы, связанные с конкретным экземпляром. На этом этапе мы проверяем все процессы; состояние процесса всегда должно быть ожидающим или работающим . Если какой-либо процесс имеет состояние, отличное от ожидающего или запущенного, мы должны проверить этот конкретный процесс и сообщить об этом.
Эта транзакция отображает много информации, как:
- Состояние рабочего процесса (занят или нет)
- Если рабочий процесс запущен, вы можете увидеть его действие в столбце «Действие».
- Вы можете над какой таблицей работать
Некоторые из типичных проблем:
- Пользователь занимает много времени, чтобы войти / не в состоянии войти / онлайн транзакции очень медленно. Это может быть результатом того, что рабочие процессы ОВД полностью используются. Это также может быть результатом длительных заданий (красный индикатор под столбцом «Время»). При необходимости вы можете отменить сеанс, выбрав задания, а затем перейти к процессу> Отмена без ядра. Это отменит работу и освободит рабочий процесс для другого пользователя / процесса
- Некоторые пользователи могут иметь статус PRIV в столбце Причина . Возможно, пользовательская транзакция настолько велика, что требует больше памяти. Когда это произойдет, рабочий процесс DIA будет «принадлежать» пользователю и не позволит другим пользователям использовать. Если это произойдет, обратитесь к пользователю и, если возможно, запустите задание в качестве фонового задания.
- Если в процессе работы SPO есть длинная работа печати, исследуйте проблему. Это может быть проблема, связанная с сервером печати или принтером.
Мониторинг общесистемных рабочих процессов (SM66)
Проверяя нагрузку рабочего процесса с помощью глобального обзора рабочего процесса, мы можем быстро исследовать потенциальную причину проблемы производительности системы.
Мониторинг загрузки рабочего процесса на всех активных экземплярах в системе.
С помощью экрана Global Work Process Overview можно сразу увидеть:
- Статус каждого сервера приложений
- Причина, по которой он не работает
- Был ли он перезапущен
- Процессор и время выполнения запроса
- Пользователь, который вошел в систему и клиент, к которому они вошли
- Отчет, который работает
Пользователь приложения мониторинга (AL08 и SM04)
Эта транзакция отображает всех пользователей активных экземпляров.
Мониторинг процессов обновления (SM13)
Выполните транзакцию SM13, введите ‘ * ‘ в поле USER и нажмите кнопку.
Если записи обновлений не ожидают или обновления не выполняются, эта очередь будет пустой, как показано на снимке экрана ниже.
Но если обновление не активно, найдите следующую информацию:
-
Активно ли обновление, если нет, было ли оно деактивировано системой или пользователем?
- Нажмите на кнопку и получите информацию.
- Нажмите на кнопку и получите следующую информацию:
- Любое обновление отменено?
- Длинная очередь ожидающих обновлений старше 10 минут?
Мониторинг записей блокировки (SM12)
Выполните транзакцию SM12 и введите «*» в поле «Имя пользователя».
SAP предоставляет механизм блокировки, чтобы другие пользователи не могли изменять записи, над которыми вы работаете. В некоторых ситуациях блокировки не снимаются. Это может произойти, если пользователи отключены, то есть из-за проблем с сетью, прежде чем они смогут снять блокировку.
Эти старые блокировки необходимо очистить, иначе это может помешать доступу или изменениям в записях.
Мы можем использовать статистику блокировок для мониторинга блокировок, установленных в системе. Мы записываем только те записи блокировки, которые имеют отметку даты и времени предыдущего дня.
Журнал системы мониторинга (SM21)
Мы можем использовать журнал, чтобы точно определить и исправить ошибки, возникающие в системе и ее среде.
Мы проверяем журнал за предыдущий день со следующим выбором / опцией:
- Введите дату и время.
- Выбор проблем и предупреждений переключателей
- Нажмите Перечитать системный журнал.
Резюме мелодии (ST02)
Шаг 1: Перейдите к ST02, чтобы проверить сводку мелодии.
Шаг 2: Если вы видите какие-либо значения красного цвета, в SWAPS дважды нажмите на то же самое.
Шаг 3: На приведенном ниже экране нажмите на вкладку « Текущие параметры »
Шаг 4: Запишите значение и параметры профиля
Шаг 5: Перейдите к RZ10 (для изменения значений параметров профиля).
Шаг 6: Сохраните изменения.
Шаг 7: Перезагрузите сервер, чтобы изменения вступили в силу.
Загрузка ЦП (ST06)
Коэффициент использования CPU вхолостую должен составлять 60-65%, если он превышает значение, мы должны начать проверять, по крайней мере, следующие вещи:
- Запустите команды уровня ОС – top и проверьте, какие процессы занимают больше всего ресурсов.
- Перейти к SM50 или SM66. Проверьте наличие каких-либо длительных заданий или выполняемых запросов на обновление.
- Перейдите на SM12 и проверьте записи блокировки
- Перейдите к SM13 и проверьте обновление активного состояния.
- Проверьте на ошибки в SM21.
ABAP Dumps (ST22)
Здесь мы проверяем свалки за предыдущий день
Мониторинг запроса буфера (SP01)
Для мониторинга запроса спула выполните SP01 и выберите, как показано ниже:
- Поставьте ‘*’ в поле Создано
- Нажмите на кнопку выполнить.
Здесь мы записываем только те запросы, которые заканчиваются проблемами.
Мониторинг пакетных заданий (SM37)
Для мониторинга фоновых заданий выполните SM37 и выберите, как показано ниже:
- Put «*» в поле User Name и имя задания
- В разделе Статус работы выберите: Запланированные, Отмененные, Отпущенные и Завершенные запросы.
Транзакционное управление RFC (SM58)
Транзакционный RFC (tRFC, также первоначально известный как асинхронный RFC) – это асинхронный метод связи, который выполняет вызываемый функциональный модуль на сервере RFC только один раз.
Нам нужно выбрать период отображения, для которого мы хотим просмотреть tRFC, и затем выбрать «*» в поле имени пользователя, чтобы просмотреть все вызовы, которые не были выполнены правильно или ожидают в очереди.
Администрирование QRFC ( исходящая очередь -SMQ1)
Мы должны указать здесь имя клиента и посмотреть, есть ли какие-либо исходящие qRFC в состоянии ожидания или ошибки.
Администрация QRFC ( входящая очередь -SMQ2)
Мы должны указать здесь имя клиента и посмотреть, есть ли входящие qRFC в состоянии ожидания или ошибки.
Администрирование базы данных (DB02)
После того, как вы выберете Current Sizes на первом экране, мы перейдем к экрану ниже, который показывает нам текущее состояние всех табличных пространств в системе.
Если какое-либо из табличных пространств превышает 95%, а автоматическое экстент отключено, нам нужно добавить новый файл данных, чтобы база данных не была заполнена.
Мы также можем определить историю табличных пространств.
Мы можем выбрать Месяцы, Недели или Дни здесь, чтобы увидеть изменения, которые происходят в табличном пространстве.
Мы можем определить рост табличного пространства, анализируя эти значения.
Журналы резервного копирования базы данных (DB12)
По этой транзакции мы могли определить, когда было выполнено последнее успешное резервное копирование системы. Мы можем просмотреть резервные копии предыдущего дня и посмотреть, все ли в порядке или нет.
Мы также можем просмотреть файлы журналов повторов и посмотреть, было ли успешное резервное копирование журналов повторов.
Быстрый обзор
Задачи ежедневного мониторинга
- Критические задачи
- Система SAP
- База данных
Критические задачи
нет |
задача | Сделка | Процедура / Замечание |
---|---|---|---|
1 |
Убедитесь, что система R / 3 работает. | Войдите в систему R / 3 | |
2 |
Убедитесь, что ежедневное резервное копирование выполняется без ошибок | DB12 | Проверьте резервную копию базы данных. |
Система SAP
нет |
задача | Сделка | Процедура / Замечание |
---|---|---|---|
1 |
Убедитесь, что все серверы приложений работают. | SM51 | Убедитесь, что все серверы работают. |
2 |
Проверьте рабочие процессы (начиная с SM51). | SM50 | Все рабочие процессы со статусом «работает» или «ожидают» |
3 |
Обзор глобального рабочего процесса | SM66 | Убедитесь, что рабочий процесс не выполняется более 1800 секунд |
3 |
Ищите любые неудачные обновления (обновление прекращается). | SM13 |
|
4 |
Проверьте системный журнал. | SM21 | Установите дату и время до последнего просмотра журнала. Проверить:
|
5 |
Обзор отмененных вакансий. | SM37 | Введите звездочку (*) в поле «Идентификатор пользователя». Убедитесь, что все важные задания выполнены успешно. |
6 |
Проверьте «старые» замки. | SM12 | Введите звездочку (*) для идентификатора пользователя. |
7 |
Проверьте пользователей в системе. | SM04AL08 | Просмотрите неизвестный или другой идентификатор пользователя и терминал. Эту задачу следует выполнять несколько раз в день. |
8 |
Проверьте наличие проблем с катушкой. | SP01 | Введите звездочку (*) для Created ByLook для заданий спулинга, которые выполнялись более часа. |
9 |
Проверьте журнал работы | SM37 | Проверить:
|
10 |
Просмотрите и устраните дампы. | ST22 | Ищите чрезмерное количество свалок. Ищите отвалы необычной природы. |
11 |
Просмотрите статистику буфера. | ST02 | Ищите перестановки. |
База данных
нет |
задача | Сделка | Процедура / Замечание |
---|---|---|---|
1 |
Проверьте журнал ошибок на наличие проблем. | ST04 | |
2 |
Индексы роста базы данных | DB02 | Если табличное пространство используется более чем на 90%, добавьте в него новый файл данных. Восстановите недостающие индексы. |
3 |
Журнал статистики базы данных | DB13 |
Всем привет!
В этой статье вы узнаете как добавить в вашу программу хороший журнал с сообщениями об ошибках и/или предупреждениями.
Журнал о котором пойдет речь строится с помощью класса cl_hrpadru_log, который используется например в HRULTAB0 Табель учета рабочего времени (форма Т-13), HRUL4FSS Форма 4-ФСС, HRULNDFL Подоходный налог (2-НДФЛ) и пр.
Выглядит журнал вот так:
Для того, чтобы его создать достаточно сделать следующее:
- Создать объект класса cl_hrpadru_log
- В необходимых вам местах программы вызвать методы add_message_to_log_and_table( ) и add_employee_node( )
- Для отображения журнала вызвать метод display_log2( ) на вход которому подать форму (FORM) для Call-back вызова
- Profit!
Ниже показан пример простой программы, в которой формируется сообщение типа ‘W’ если у пользователя не заполнено поле p0002-inits.
Результат:
P.S.
Вот здесь хорошо описан еще более мощный журнал.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.