Текущее время: Пт, май 16 2025, 01:26

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Класс CL_MESSAGE_HANDLER_MM
СообщениеДобавлено: Ср, июн 22 2005, 10:23 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Необходимо в формулярах заказа на поставку выводить список сообщений об ошибках/замечаниях, возникших при обработке заказа (см. кнопку "Просмотр сообщений" в тр. ME22N при обработке заказов, имеющих ошибки).
Как понимаю, сохраняется все это хозяйство посредством SBAL_LOG.

При печати стандартных формуляров, настраиваемых через IMG и вызываемых стандартно из транзакции ME22N, нашел удобный класс CL_MESSAGE_HANDLER_MM, для получения списка этих сообщений:

Code:
 
DATA: l_msg_handler TYPE REF TO cl_message_handler_mm,
        l_event TYPE REF TO cl_event_mm,
        l_msg_txt     TYPE string,
        lt_event_list TYPE mmpur_event_list WITH HEADER LINE.

  CALL METHOD cl_message_handler_mm=>get_handler
    IMPORTING
      ex_handler = l_msg_handler.

  CALL METHOD l_msg_handler->getlist
*    EXPORTING
*      IM_EVENT_TYPE            =
*      IM_OBJECT                =
*      IM_NULL_OBJECT_VALID     = MMPUR_NO
*      IM_INCLUDE_CHILD_OBJECTS = mmpur_no
*      IM_SEQUENCE              =
     IMPORTING
       ex_events                = lt_event_list[]
*      EX_EVNT                  =
      .

  REFRESH gt_messages .
  LOOP AT lt_event_list .
    l_event = lt_event_list-event_obj .
    CALL METHOD l_event->to_string
       IMPORTING
         ex_string    = l_msg_txt
*          EX_SIGNATURE =
        .
    APPEND l_msg_txt TO gt_messages .
  ENDLOOP.


Все работает.
Но, здесь этот класс натравливается на нужный заказ на поставку сам, автоматом, в транзакции ME22N, и об этом даже не надо думать.
Но необходимо в другом, теперь уже кустомном, формуляре, печатаемом через отдельную транзакцию, организовать такую же беду. Хотелось бы сделать таким же макаром через тот же класс - но тут уже нужно самому устанавливать класс на нужный заказ на поставку.

Как грамотно, вручную натравить класс на нужный заказ на поставку?
Дебагом что-то не очень пока получается выяснить.

Кто знает - подскажите, плз. Спасибо.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 22 2005, 11:46 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
А почему Вы не хотите воспользоваться функциональными модулями, считывающими журнал приложения напрямую? По-моему, там всё гораздо прозрачней.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 22 2005, 13:14 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
EGF написал(а):
А почему Вы не хотите воспользоваться функциональными модулями, считывающими журнал приложения напрямую? По-моему, там всё гораздо прозрачней.


Хочется сделать все по-правильному. В стандартных транзакциях работа происходит через этот класс.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 22 2005, 13:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Мне кажется, что в лог ничего не пишется (а если и пишется, то CL_MESSAGE_HANDLER_MM этого не знает). И для того, чтобы CL_MESSAGE_HANDLER_MM что-то мог показать или вернуть список, ему его кто-то должен передать.
Вот примерчик для CL_PO_HEADER_HANDLE_MM:
Code:
parameters: ebeln type ebeln.

data:
  my_handler     TYPE REF TO cl_message_handler_mm,
  l_messages     TYPE mepo_t_messages_bapi.

  CALL METHOD cl_message_handler_mm=>get_handler
    IMPORTING
      ex_handler = my_handler.
  CALL METHOD my_handler->set_config_for_mepo( ).
  CALL METHOD my_handler->remove_all( ).
  CALL METHOD my_handler->cleanup( ).

  DATA: l_mfs TYPE REF TO cl_mfs_mm.
  l_mfs = cl_mfs_mm=>get_instance( ).
  CALL METHOD l_mfs->register
    EXPORTING
      im_application     = 'MMPUR_PO_DOC'
    EXCEPTIONS
      already_registered = 0.

  DATA: l_po TYPE REF TO cl_po_header_handle_mm.
  CREATE OBJECT l_po.
  CALL METHOD l_po->po_initialize( ).
  CALL METHOD l_po->set_po_number
    EXPORTING im_po_number = ebeln.

  DATA: l_result TYPE mmpur_bool.
  CALL METHOD l_po->po_read
    EXPORTING
      im_tcode     = 'ME22N'
                   im_trtyp = 'V'
                   im_aktyp = 'V'
                   im_po_number = ebeln
    IMPORTING
      ex_result    = l_result.

  CALL METHOD l_po->po_check.

* В табличку
  l_messages = my_handler->get_list_for_bapi( ).

* На экран
  CALL METHOD my_handler->show( im_popup = 'X'
                                im_amodal = space ).


Но это всё эквивалентно заходу в ME22N и нажатию проверки. Соответственно, если кто-то его заблокировал, то получим сообщение о блокировке.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 22 2005, 14:26 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
T написал:
Мне кажется, что в лог ничего не пишется (а если и пишется, то CL_MESSAGE_HANDLER_MM этого не знает).


Да, точно. Сейчас изучаю - вообще фиг поймешь. Сообщения и локально внутри BAPI могут храниться и никуда не писаться. И в то же время SBAL_LOG все же задействуется для чего-то.

T написал:
И для того, чтобы CL_MESSAGE_HANDLER_MM что-то мог показать или вернуть список, ему его кто-то должен передать.
Вот примерчик для CL_PO_HEADER_HANDLE_MM:


ОК, спасибо большое - кажись то, что нужно.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 22 2005, 14:30 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
111 написал(а):
И в то же время SBAL_LOG все же задействуется для чего-то.


Для отображения. В методе SHOW зовётся ME_LOG_DIALOG, а внутри
BAL_LOG_CREATE и потом BAL_DSP_LOG_DISPLAY .


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 22 2005, 16:30 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Честно говоря, не очень понятно, зачем городить огород с малознакомым недокументированным классом, практически наугад вызывая его методы и передавая туда такие же малознакомые и недокументированные классы, когда есть хорошо знакомые и отлично документированные функциональные модули:
Code:
CONSTANTS:
  gc_ebeln TYPE ebeln VALUE '4500002897'
.
DATA:
  g_txt_msg TYPE bapi_msg
.
DATA:
  gs_filter TYPE bal_s_lfil,
  gs_extn   TYPE bal_s_extn,
  gs_obj    TYPE bal_s_obj,
  gs_sub    TYPE bal_s_sub,
  gs_handle TYPE balmsghndl
.
DATA:
  gt_header TYPE balhdr_t,
  gt_handle TYPE bal_t_msgh
.
gs_extn-sign = 'I'.
gs_extn-option = 'EQ'.
gs_extn-low = gc_ebeln.
APPEND gs_extn TO gs_filter-extnumber.
gs_obj-sign = 'I'.
gs_obj-option = 'EQ'.
gs_obj-low = 'MMPUR'.
APPEND gs_obj TO gs_filter-object.
gs_sub-sign = 'I'.
gs_sub-option = 'EQ'.
gs_sub-low = 'BUS2012'.
APPEND gs_sub TO gs_filter-subobject.

CALL FUNCTION 'BAL_DB_SEARCH'
  EXPORTING
    i_s_log_filter     = gs_filter
  IMPORTING
    e_t_log_header     = gt_header
  EXCEPTIONS
    log_not_found      = 1
    no_filter_criteria = 2
    OTHERS             = 3.
CHECK sy-subrc = 0.

CALL FUNCTION 'BAL_DB_LOAD'
  EXPORTING
    i_t_log_header     = gt_header
  IMPORTING
    e_t_msg_handle     = gt_handle
  EXCEPTIONS
    no_logs_specified  = 1
    log_not_found      = 2
    log_already_loaded = 3
    OTHERS             = 4.
CHECK sy-subrc = 0.

LOOP AT gt_handle INTO gs_handle.
  CALL FUNCTION 'BAL_LOG_MSG_READ'
    EXPORTING
      i_s_msg_handle = gs_handle
    IMPORTING
      e_txt_msg      = g_txt_msg
    EXCEPTIONS
      log_not_found  = 1
      msg_not_found  = 2
      OTHERS         = 3.
  IF sy-subrc = 0.
    WRITE / g_txt_msg.
  ENDIF.
ENDLOOP.

Этот код выдаёт сообщения предварительно сохранённого заказа на поставку с номером gc_ebeln. Может, пригодится...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 22 2005, 17:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
На счёт огорода присоединяюсь :)

Но поковырять этот CL_MESSAGE_HANDLER_MM было забавно :lol:

Кстати тот кусок кода про CL_PO_HEADER_HANDLE_MM выдран из BAPI_PO_CHANGE, если кому вдруг интересно. Только PO_CHECK дёрнул вне очереди, чтобы для любого заказа что-то вывелось, да и проверка полная пройдёт. И, понятное дело, SHOW в BAPI не зовётся.. Ну и лишнее там тоже есть (если требуется только вывести сообщения без новой проверки). Так что "огород" можно ужать до:

Code:
  CALL METHOD cl_message_handler_mm=>get_handler
    IMPORTING
      ex_handler = my_handler.
  CALL METHOD my_handler->set_config_for_mepo( ).

  DATA: l_po TYPE REF TO cl_po_header_handle_mm.
  CREATE OBJECT l_po.
  CALL METHOD l_po->po_initialize( ).

  DATA: l_result TYPE mmpur_bool.
  CALL METHOD l_po->po_read
    EXPORTING
      im_tcode     = 'ME22N'
                   im_trtyp = 'V'
                   im_aktyp = 'V'
                   im_po_number = ebeln
    IMPORTING
      ex_result    = l_result.

* На экран
  CALL METHOD my_handler->show( im_popup = 'X'
                                im_amodal = space ).


Но раз уж из журнала всё нормально читается, то это всё и впрямь на фиг не надо ..


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 24 2005, 17:53 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
А теперь похожая задача, но теперь нужен журнал для входящей фактуры логистики.
Что-то не получается найти ни BAPI подходящих, ни классов :-( .

ФМ из ГФ MRM_BAPI (BAPI_INCOMINGINVOICE_CREATE, BAPI_INCOMINGINVOICE_PARK) не производят требуемых проверок :-( . Собственно, ковыряюсь в чужой проге - там сделано предварительное сохранение с помощью этих ФМ, а уже полное сохранение (при котором происходят требуемые проверки), сделано с помощью BDC (тр. MIR4).

Чтение логов SBAL после выполнения этого BDC тоже ничего не дает :-( .

Code:
      CONCATENATE l_invoicedocnumber '/' l_gjahr INTO header-extnumber
        SEPARATED BY space .
      ls_header-object    = 'RMRB' .
      ls_header-subobject = 'RMRB_BTCH' .
      ls_header-aldate    = sy-datum .
      ls_header-aluser    = sy-uname .
      ls_header-altcode   = 'MIR4' .
      ls_header-alprog    = 'SAPLMR1M' .

      APPEND ls_header TO lt_header .
      CALL FUNCTION 'BAL_DB_LOAD'
       EXPORTING
         i_t_log_header                      = lt_header
*         I_T_LOG_HANDLE                      =
*         I_T_LOGNUMBER                       =
*         I_CLIENT                            = SY-MANDT
*         I_DO_NOT_LOAD_MESSAGES              = ' '
*         I_EXCEPTION_IF_ALREADY_LOADED       =
       IMPORTING
         e_t_log_handle                      = lt_log_handles
*         E_T_MSG_HANDLE                      =
       EXCEPTIONS
         no_logs_specified                   = 1
         log_not_found                       = 2
         log_already_loaded                  = 3
         OTHERS                              = 4
                .


Лог возвращается пустой . Такое ощущение, что он живет только во время выполнения MIR4 .
Чего-то лыжи совсем не едут :-( .

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Последний раз редактировалось 111 Чт, авг 25 2005, 18:17, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 25 2005, 13:54 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Там, кроме класса CL_MESSAGE_HANDLER_MM, исппользуетс еще класс CL_MESSAGE_MM, у к-рого есть методы по добавлению и редактированию сообщений. Я этот вопрос уже поднимал здесь, но мне никто даже не сделал попытки ответить... :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 25 2005, 18:15 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
RoadRunner написал:
Там, кроме класса CL_MESSAGE_HANDLER_MM, исппользуетс еще класс CL_MESSAGE_MM, у к-рого есть методы по добавлению и редактированию сообщений.


Насколько я понял, это класс просто для отдельно взятого сообщения. В данном случае, не знаю, чем он может быть полезен - мне нужно получить весь массив созданных при проверке документа сообщений.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, авг 26 2005, 16:05 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Жаль, не записал - не думал, что пригодится - был там какой-то ф.модуль или класс, к-рый позволяет получить указатель на бизнесс-объект, для которого нам надо получить список сообщений. Ковырял под отладкой в МЕ22N. Но не доковырял и сдался... :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 18 2005, 16:13 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
111 написал(а):
...мне нужно получить весь массив созданных при проверке документа сообщений.

Проблема возникла с добавлением сообщений к логу. В BAdI для РО и в экзите для МИГО выдается обычной командой MESSAGE предупреждающее сообщение, но система его не только не показывает, но и не пишет в журнал. Как добавить к журналу сообщение с типом W?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, окт 18 2005, 17:11 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Используйте метод BAdi CHECK.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 19 2005, 08:36 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Разве PROCESS_ITEM для этого не подходит? Очень удобно выдать сообщение по текущей позиции, с к-рой в данный момент работает усер.
Кроме того, есть определенное ограничение: по тому заданию, что мне дали, эта проверка должна выдавать либо предупреждающее, либо запрещающее сообщение, а проверку нужно делать не для всех позиций, а для тех, к-рые были изменены. Иначе, если пользователь попытается сохранить заказ со "старыми" позициями, созданными до этой проверки, то он не сможет этого сделать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB