Workflow. Отправка электронных писем (2)
Workflow. Отправка электронных писем обработчикам диалоговых задач
В этой заметке я хочу рассказать еще об одном способе отправки электронного письма обработчику диалоговой задачи в потоке операций, который может быть применен в проектной деятельности.
См. заметку Workflow. Отправка электронных писем
На этот раз речь пойдет о закладке Program Exits, доступной при работе с задачей непосредственно из построителя потоков операций (транзакция SWDD)
См. Tab Page Programming Exits
You can enter programming exits on this tab page. A programming exit is an ABAP class that the system executes at a specific time during the processing of a workflow. Programming exits enable you to implement your own enhancements and adaptations.
Чтобы начать работать с этим функционалом workflow, необходимо создать реализующий класс, поддерживающий интерфейс IF_SWF_IFS_WORKITEM_EXIT
См. Tab Page Programming Exits
Features
ABAP classes that you specify here as programming exits must implement the interface IF_SWF_IFS_WORKITEM_EXIT. The system executes the classes in the specified order.
The method EVENT_RAISED is executed from every ABAP class as soon as the relevant work item performs a status change defined in the interface.
Необходимо обратить внимание на то, что реализующий класс может отлавливать различные состояния диалоговой задачи (см. входящий параметр IM_EVENT_NAME)
Рассмотрю небольшой пример.
Подготовка потока операций
На ниже представленном видео фрагменте представлена последовательность действий, в результате которой я создаю поток операций и несколько новых элементов контейнера потока, которые затем планирую прочитать в создаваемом классе, прежде чем отправить электронное письмо.
Реализующий класс
Для демонстрации в этой заметке исходный код класса будет выглядеть следующим образом
METHOD if_swf_ifs_workitem_exit~event_raised.
DATA:
value_get TYPE char10,
lv_user TYPE sww_aagent,
lv_email TYPE string,
lo_document TYPE REF TO cl_document_bcs,
sender TYPE REF TO cl_sapuser_bcs,
lv_body TYPE string,
text TYPE bcsy_text,
send_request TYPE REF TO cl_bcs,
recipient TYPE REF TO if_recipient_bcs,
sent_to_all TYPE os_boolean.
DATA(lv_wi_id) = im_workitem_context->get_workitem_id( ).
DATA(lv_heaad) = im_workitem_context->get_header( ).
IF im_event_name EQ swrco_event_after_creation.
CLEAR value_get.
CALL METHOD get_elem(
EXPORTING
im_workitem_context = im_workitem_context
element_name = 'prm1'
IMPORTING
element_value = value_get
).
CLEAR value_get.
CALL METHOD get_elem(
EXPORTING
im_workitem_context = im_workitem_context
element_name = 'prm2'
IMPORTING
element_value = value_get
).
CLEAR value_get.
CALL METHOD get_elem(
EXPORTING
im_workitem_context = im_workitem_context
element_name = 'users'
IMPORTING
element_value = lv_user
).
IF lv_user IS NOT INITIAL.
CALL FUNCTION 'EFG_GEN_GET_USER_EMAIL'
EXPORTING
i_uname = lv_user+2
IMPORTING
e_email_address = lv_email
EXCEPTIONS
not_qualified = 1
user_not_found = 2
address_not_found = 3
OTHERS = 4.
IF sy-subrc <> 0.
lv_email = '[email protected]'.
ENDIF.
lv_body = 'mail from wi id #wi_id#'.
SHIFT lv_wi_id LEFT DELETING LEADING '0'.
REPLACE ALL OCCURRENCES OF '#wi_id#' IN lv_body WITH lv_wi_id.
APPEND lv_body TO text.
send_request = cl_bcs=>create_persistent( ).
lo_document = cl_document_bcs=>create_document(
i_type = 'HTM'
i_text = text
i_subject = 'mail from program exit' ).
CALL METHOD send_request->set_document( lo_document ).
sender = cl_sapuser_bcs=>create( 'WF-BATCH' ).
CALL METHOD send_request->set_sender
EXPORTING
i_sender = sender.
DATA lv_mail TYPE adr6-smtp_addr.
lv_mail = lv_email.
recipient = cl_cam_address_bcs=>create_internet_address(
lv_mail ).
CALL METHOD send_request->add_recipient
EXPORTING
i_recipient = recipient
i_express = 'X'.
CALL METHOD send_request->send(
EXPORTING
i_with_error_screen = 'X'
RECEIVING
result = sent_to_all ).
IF sent_to_all = 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
Добавлю созданный класс на закладке Program Exits диалоговой задачи нового потока