Иногда нам необходимо оповестить пользователя о каком-либо событии по внутренней почте, с возможностью его перехода к заданной транзакции и с учётом контекста оповещения, т.е. с заполнением параметров актуальных для данного оповещения.
Во внутренней почте мы можем сформировать ссылку на бизнес объект (транзакция SWO1), а уже у бизнес объекта реализовать метод display для запуска нужной нам транзакции.
Давайте разберёмся как это сделать.
Для начала переходим в транзакцию SWO1 и создаём новый объект — ZSMTRCALL:
Для запуска транзакции определим ключевое поле — ид. транзакции:
Можно определить на базе стандартной таблицы TSTC:
При запуске необходимо каким-то образом определять контекст запуска, для этого у нашего бизнес объекта определим ключевое поле в виде GUID-a:
Переопределим метод display:
И перейдём к коду:
Код реализации метода display:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
begin_method display changing container. DATA: lt_params TYPE STANDARD TABLE OF tpara. lt_params = VALUE #( ( paramid = 'ZSMGUID' partext = object-key-guid22 ) ). CALL FUNCTION 'CC_CALL_TRANSACTION_NEW_TASK' DESTINATION 'NONE' STARTING NEW TASK space EXPORTING transaction = CONV sy-tcode( object-key-transactioncode ) skip_first_screen = abap_true TABLES paramtab = lt_params EXCEPTIONS error = 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. end_method. |
Переведём статус БО (implemented затем released):
И сгенерируем нажав на красную кнопку генерации.
Исходя из кода, в запускаемой транзакции должен быть SET/GET параметр с ID контекста, назовём его ZSMGUID, перейдём в SE80 и создадим параметр:
В транзакции относительно значения параметра привязанного к SET/GET параметру будет считываться контекст запуска (значения экрана выбора как правило).
Само сохранение и чтение контекста может быть реализовано множеством способов:
- своя Z таблица с хранением значений экрана выбора,
- сохранение варианта в программе, тогда логичнее будет сделать не CALL TRANSACTION, а SUBMIT и ID контекста заменить на ID варианта,
- сохранение в INDX таблице или подобной,
- использовать какое-либо другое стандартное решение.
В данном примере мы только выведем ID контекста, код программы:
1 2 3 4 5 6 7 |
REPORT zsm_demo_call. PARAMETERS: p_guid TYPE swu_form-guid MEMORY ID zsmguid. START-OF-SELECTION. WRITE: `Context ID: `, p_guid. |
Создадим транзакцию к программе — ZSM_CALL_DEMO
Уже сейчас мы можем протестировать наш БО, передав в него ключ в виде Транзакции и ID контекста, после чего вызвать метод display:
Если всё сделано правильно, отобразиться наш отчёт с выводом GUID-a контекста.
Если Вам достаточно лишь запустить транзакцию, необходимости в создании своего БО нет, т.к. есть несколько уже существующих, например: CUST_TRAN.
Далее воспользуемся тестовой программой отправки письма в SBWP чтобы убедиться в корректном запуске транзакции из внутренней почты:
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 |
DATA: lv_transaction TYPE sy-tcode VALUE 'ZSM_CALL_DEMO', lv_guid TYPE guid_22 VALUE '123', lv_object_key TYPE string. TRY. DATA(lo_msg) = NEW cl_bcs_message( ). lo_msg->set_subject( 'Тест отправки письма' ). lo_msg->add_recipient( EXPORTING iv_address = 'DEVELOPER' iv_commtype = 'USR' ). CONCATENATE lv_transaction lv_guid INTO lv_object_key RESPECTING BLANKS. lv_object_key = shift_right( lv_object_key ). lv_object_key = replace( val = lv_object_key regex = '\s' with = '%20' occ = 0 ). lo_msg->set_main_doc( EXPORTING iv_contents_txt = |<html><head></head><body><br/><b>Тестовое сообщение</b><br/><br/>| && |<A HREF="sap-object://ZSMTRCALL { lv_object_key }">| && |Call transaction ZSM_CALL_DEMO</A></body></html>| iv_doctype = 'htm' ). lo_msg->set_send_immediately( abap_true ). lo_msg->send( ). CATCH cx_bcs_send INTO DATA(lx_ex). MESSAGE lx_ex->get_text( ) TYPE 'E'. ENDTRY. |
В программе отправки мы формируем HTML письмо со ссылкой на SAP объект с помощью специального префикса sap-object. После запуска Вы можете зайти в SBWP и убедиться в том, что ссылка работает.
Альтернативное решение
Если Вам не требуется формировать ссылку непосредственно в тексте письма, можно не создавать бизнес объект, а вместо этого сформировать вложение в виде ярлыка для запуска транзакции следующим образом:
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 |
TRY. DATA(lo_msg) = NEW cl_bcs_message( ). lo_msg->set_subject( 'Тест отправки письма' ). lo_msg->add_recipient( EXPORTING iv_address = 'DEVELOPER' iv_commtype = 'USR' ). NEW cl_nwbc_sapgui_shortcut( iv_transaction_code = 'ZSM_CALL_DEMO' iv_skip_initial_screen = abap_true iv_gui_size = cl_nwbc_sapgui_shortcut=>sc_gui_size_maximized it_parameters = VALUE #( ( name = 'p_guid' value = '123' ) ) )->get_shortcut( IMPORTING et_shortcut = DATA(lt_shortcut) ). lo_msg->add_attachment( EXPORTING iv_description = 'Open transaction' iv_filename = 'transaction.sap' iv_contents_txt = concat_lines_of( table = lt_shortcut sep = cl_abap_char_utilities=>cr_lf ) ). lo_msg->set_main_doc( EXPORTING iv_contents_txt = |'Shortcut sample| iv_doctype = 'htm' ). lo_msg->set_send_immediately( abap_true ). lo_msg->send( ). CATCH cx_bcs_send INTO DATA(lx_ex). MESSAGE lx_ex->get_text( ) TYPE 'E'. ENDTRY. |