Workflow. Отправка электронных писем (2)

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

См. заметку 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 = 'admin@admin.fr'.
        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 диалоговой задачи нового потока

Тестирование