Программа отображает запросы пользователя, по указанным параметрам в alv
и позволяет тут же сформировать письмо и отправить на нужные адреса с просьбой о переносе.
Почта может быть как внутрення так внешняя.
На многих проектах существует регламент, и запросы переносит базисник только по письму.
Заполняем параметры селекционника. Возможно фильтровать по дате и типу запросов и имени пользователя.
После запуска формируется alv со списком запросов удовлетворяющих условиям.
Затем, мы выделяем нужные и нажимам на кнопку "отправить запросы".
По адресам указанным на селекционнике будет совершенна отправка.
Для работы требуется создать 100 экран и раскомментировать логику.
Хотел сделать программу наиболее мобильной. Возможно, выложу еще одну версию, с доп. функционалом.
Code:
*&---------------------------------------------------------------------*
*& Report ZAVV_REQUESTS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zavv_send_requests.
TYPE-POOLS: trwbo.
DATA: ok_code TYPE sy-ucomm.
*----------------------------------------------------------------------*
* CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
TYPE-POOLS: trwbo.
PUBLIC SECTION.
METHODS: constructor IMPORTING
im_user TYPE any
im_type TYPE trfunction
im_status TYPE trexreqhd-status
im_begda TYPE begda
im_endda TYPE endda
im_rec TYPE bubas_t_receiver
im_mandt TYPE mandt
im_target TYPE char15 ,
refresh
.
METHODS:
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive "#EC NEEDED
,
* implement user commands
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm
.
DATA: grid2 TYPE REF TO cl_gui_alv_grid.
DATA: gv_et_requests TYPE TABLE OF trexreqhd.
DATA: ls_layout TYPE lvc_s_layo.
PROTECTED SECTION.
METHODS:
get_selected_rows "#EC CALLED
EXPORTING
ex_sel_rows TYPE trwbo_request_headers ,
crt_email EXPORTING ex_message TYPE STANDARD TABLE
,
send IMPORTING im_message TYPE STANDARD TABLE.
DATA: lt_et_requests TYPE TABLE OF trexreqhd.
DATA: gt_rec TYPE bubas_t_receiver.
DATA: gv_target TYPE char15,
gv_mandt TYPE mandt.
ENDCLASS. "lcl_alv DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
METHOD constructor.
gt_rec = im_rec.
gv_target = im_target.
gv_mandt = im_mandt.
DATA: lv_author TYPE tr_as4user.
lv_author = im_user.
DATA:
* es_msg TYPE tr004-msgtext ,
ev_exception TYPE tr007-exception.
CALL FUNCTION 'TR_EXT_GET_REQUESTS'
EXPORTING
iv_author = lv_author
iv_req_status = im_status
iv_req_type = im_type
iv_req_attr = ' '
iv_attr_ref = ' '
iv_all_req_and_all_own_task = ' '
iv_all_req_with_own_task = ' '
IMPORTING
* es_msg = es_msg
ev_exception = ev_exception
TABLES
et_requests = gv_et_requests.
IF ev_exception IS NOT INITIAL.
MESSAGE 'Ошибка получения запросов'(101) TYPE 'E'. "#EC *
ENDIF.
DELETE gv_et_requests WHERE
changedate >= im_endda OR changedate <= im_begda.
CREATE OBJECT grid2
EXPORTING
i_parent = cl_gui_container=>screen0.
ls_layout-sel_mode = 'A'.
CALL METHOD grid2->set_table_for_first_display
EXPORTING
i_structure_name = 'TREXREQHD'
is_layout = ls_layout
CHANGING
it_outtab = gv_et_requests.
SET HANDLER me->handle_toolbar FOR grid2.
SET HANDLER me->handle_user_command FOR grid2.
refresh( ).
ENDMETHOD. "constructor
METHOD refresh.
CALL METHOD grid2->refresh_table_display
EXCEPTIONS
finished = 1
OTHERS = 2.
IF sy-subrc <> 0.
*--Exception
MESSAGE 'Ошибка обновления экрана'(102) TYPE 'E'. "#EC *
ENDIF.
ENDMETHOD. "refresh
METHOD handle_toolbar.
DATA: ls_toolbar TYPE stb_button.
CLEAR ls_toolbar.
MOVE 'SEND' TO ls_toolbar-function.
* --> This function code is evaluated in 'handle_menu_button'
MOVE icon_short_message TO ls_toolbar-icon.
MOVE 'Отослать запросы'(200) TO ls_toolbar-quickinfo. "#EC *
MOVE 'Отослать запросы'(201) TO ls_toolbar-text. "#EC *
MOVE 0 TO ls_toolbar-butn_type.
MOVE space TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
METHOD handle_user_command.
DATA lt_selected_rows TYPE lvc_t_roid .
DATA ls_selected_row TYPE lvc_s_roid .
FIELD-SYMBOLS: <ls_et_requests> TYPE trexreqhd.
CALL METHOD grid2->get_selected_rows
IMPORTING
et_row_no = lt_selected_rows.
READ TABLE lt_selected_rows INTO ls_selected_row INDEX 1 .
IF sy-subrc NE 0 .
MESSAGE s000(su) WITH 'Запросы не выбраны'(203) . "#EC *
EXIT.
ENDIF .
CASE e_ucomm .
WHEN 'SEND' .
CLEAR: lt_et_requests.
LOOP AT lt_selected_rows INTO ls_selected_row.
READ TABLE gv_et_requests ASSIGNING <ls_et_requests>
INDEX ls_selected_row-row_id.
APPEND <ls_et_requests> TO lt_et_requests.
CLEAR ls_selected_row.
ENDLOOP.
DATA: lt_message TYPE TABLE OF solisti1.
me->crt_email( IMPORTING ex_message = lt_message ).
me->send( EXPORTING im_message = lt_message ).
ENDCASE .
ENDMETHOD. "handle_user_command
METHOD get_selected_rows.
DATA lt_selected_rows TYPE lvc_t_roid .
DATA ls_selected_row TYPE lvc_s_roid .
CLEAR: ex_sel_rows.
CALL METHOD grid2->get_selected_rows
IMPORTING
et_row_no = lt_selected_rows.
DATA: ls_et_requests TYPE trexreqhd.
DATA: ls_sel_rows TYPE trwbo_request_header.
LOOP AT lt_selected_rows INTO ls_selected_row.
READ TABLE gv_et_requests INTO ls_et_requests INDEX ls_selected_row-row_id.
ls_sel_rows-as4text = ls_et_requests-text .
ls_sel_rows-tardevcl = ls_et_requests-req_id .
APPEND ls_sel_rows TO ex_sel_rows.
CLEAR: ls_selected_row, ls_et_requests.
ENDLOOP.
ENDMETHOD. "get_selected_rows
METHOD send.
*Internal table to get email_if with address number
TYPES: BEGIN OF ts_vemail,
email TYPE adr6-smtp_addr,
END OF ts_vemail.
* DATA : it_vemail TYPE TABLE OF ts_vemail.
*Emiail subject
DATA : psubject(40) TYPE c .
*Data declaration for mail FM
DATA: it_packing_list TYPE TABLE OF sopcklsti1 ,
ls_packing_list TYPE sopcklsti1 ,
gd_sent_all(1) TYPE c, "#EC NEEDED
gd_doc_data TYPE sodocchgi1
.
psubject = 'Перенос запроса'(101). "#EC *
* Fill the document data.
gd_doc_data-doc_size = 1.
* Populate the subject/generic message attributes
gd_doc_data-obj_langu = sy-langu.
gd_doc_data-obj_name = 'SAPRPT'.
gd_doc_data-obj_descr = psubject.
gd_doc_data-sensitivty = 'F'.
* Describe the body of the message
CLEAR it_packing_list.
REFRESH it_packing_list.
ls_packing_list-transf_bin = space.
ls_packing_list-head_start = 1.
ls_packing_list-head_num = 0.
ls_packing_list-body_start = 1.
DESCRIBE TABLE im_message LINES ls_packing_list-body_num.
ADD 2 TO ls_packing_list-body_num.
ls_packing_list-doc_type = 'RAW'.
APPEND ls_packing_list TO it_packing_list.
* Call the FM to post the message to SAPMAIL
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = gd_doc_data
put_in_outbox = 'X'
commit_work = 'X'
IMPORTING
sent_to_all = gd_sent_all
TABLES
packing_list = it_packing_list
contents_txt = im_message
receivers = gt_rec
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
MESSAGE 'Сообщение отправлено'(103) TYPE 'S'. "#EC *
ENDIF.
ENDMETHOD. "send
METHOD crt_email.
*internal table for message body
DATA: it_message TYPE STANDARD TABLE OF solisti1 ,
it_messagewa TYPE solisti1 .
* Mail Text
CLEAR it_message.
REFRESH it_message.
it_messagewa = 'Здравствуйте.'(104). "#EC *
APPEND it_messagewa TO it_message.
APPEND 'Перенесите, пожалуйста, следующие запросы:'(105) TO "#EC *
it_message.
CLEAR it_messagewa.
FIELD-SYMBOLS: <ls_et_requests> TYPE trexreqhd.
LOOP AT lt_et_requests ASSIGNING <ls_et_requests>.
CONCATENATE <ls_et_requests>-req_id <ls_et_requests>-text
INTO it_messagewa SEPARATED BY space.
APPEND it_messagewa TO it_message.
ENDLOOP.
CONCATENATE 'Цель переноса:'(106) gv_target gv_mandt INTO it_messagewa "#EC *
SEPARATED BY space.
CONCATENATE it_messagewa '.' INTO it_messagewa.
APPEND it_messagewa TO it_message.
DATA: user_usr03 TYPE usr03.
CALL FUNCTION 'SUSR_SHOW_USER_DETAILS'
EXPORTING
bname = sy-uname
mandt = sy-mandt
no_display = 'X'
CHANGING
user_usr03 = user_usr03.
CONCATENATE 'С Уважением,'(107) user_usr03-name2 user_usr03-name1 INTO it_messagewa SEPARATED BY "#EC *
space.
CONCATENATE it_messagewa '.' INTO it_messagewa.
APPEND it_messagewa TO it_message.
ex_message[] = it_message[].
CLEAR: it_message[].
ENDMETHOD. "crt_email
ENDCLASS. "lcl_alv IMPLEMENTATION
*INCLUDE zavv_requests3_cl.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tuser.
PARAMETER: p_user LIKE sy-uname DEFAULT sy-uname. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) ttype.
PARAMETER: p_type TYPE trfunction MEMORY ID typ OBLIGATORY. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tstatus.
PARAMETER: p_status TYPE trexreqhd-status MEMORY ID sta OBLIGATORY. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tbegda.
PARAMETER: p_begda TYPE begda DEFAULT '18000101'. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tendda.
PARAMETER: p_endda TYPE endda DEFAULT '99991231'. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) temail1.
PARAMETER: p_email1 TYPE so_recname DEFAULT sy-uname. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tmailt1.
PARAMETER: p_mailt1 TYPE so_escape DEFAULT 'B'. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) temail2.
PARAMETER: p_email2 TYPE so_recname . "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tmailt2.
PARAMETER: p_mailt2 TYPE so_escape . "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) temail3.
PARAMETER: p_email3 TYPE so_recname . "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tmailt3.
PARAMETER: p_mailt3 TYPE so_escape . "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) temail4.
PARAMETER: p_email4 TYPE so_recname . "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tmailt4.
PARAMETER: p_mailt4 TYPE so_escape . "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tdev.
PARAMETER p_dev AS CHECKBOX. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tqas.
PARAMETER p_qas AS CHECKBOX. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tprd.
PARAMETER p_prd AS CHECKBOX. "#EC *
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tmandt.
PARAMETER: p_mandt TYPE mandt. "#EC *
SELECTION-SCREEN END OF LINE.
INITIALIZATION.
tuser = 'Имя пользователя'(301). "#EC *
ttype = 'Тип запроса'(302). "#EC *
tstatus = 'Статус'(303). "#EC *
tbegda = 'С даты'(304). "#EC *
tendda = 'По дату'(305). "#EC *
temail1 = 'Адрес получателя 1'(306). "#EC *
tmailt1 = 'Тип получателя 1'(307). "#EC *
temail2 = 'Адрес получателя 2'(308). "#EC *
tmailt2 = 'Тип получателя 2'(309). "#EC *
temail3 = 'Адрес получателя 3'(310). "#EC *
tmailt3 = 'Тип получателя 3'(311). "#EC *
temail4 = 'Адрес получателя 4'(312). "#EC *
tmailt4 = 'Тип получателя 4'(313). "#EC *
tdev = 'DEV'(314). "#EC *
tqas = 'QAS'(315). "#EC *
tprd = 'PRD'(316). "#EC *
tmandt = 'Мандант переноса'(317). "#EC *
START-OF-SELECTION.
DATA: lcl_alv TYPE REF TO lcl_alv.
SET SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
IF lcl_alv IS INITIAL.
DATA: lt_rec TYPE bubas_t_receiver, "#EC *
ls_rec TYPE somlreci1. "#EC *
DATA: lv_count TYPE n, "#EC *
lv_email TYPE char8, "#EC *
lv_mailt TYPE char8. "#EC *
FIELD-SYMBOLS: <fs_adr> TYPE ANY,
<fs_type> TYPE ANY.
DO .
lv_count = sy-index.
CONCATENATE 'P_EMAIL' lv_count INTO lv_email.
CONCATENATE 'P_MAILT' lv_count INTO lv_mailt.
ASSIGN (lv_email) TO <fs_adr>.
ASSIGN (lv_mailt) TO <fs_type>.
IF sy-subrc = 0 AND <fs_adr> IS NOT INITIAL AND
<fs_type> IS NOT INITIAL.
ls_rec-receiver = <fs_adr>.
ls_rec-rec_type = <fs_type>.
ls_rec-com_type = 'INT'.
ls_rec-notif_del = 'X'.
ls_rec-notif_ndel = 'X'.
ls_rec-express = 'X'.
APPEND ls_rec TO lt_rec.
CLEAR: ls_rec.
ELSE.
EXIT.
ENDIF.
ENDDO.
DATA: lv_target TYPE char15. "#EC *
IF p_dev = 'X'.
CONCATENATE 'DEV' lv_target INTO lv_target SEPARATED BY space.
CONDENSE lv_target.
ENDIF.
IF p_qas = 'X'.
CONCATENATE 'QAS' lv_target INTO lv_target SEPARATED BY space.
CONDENSE lv_target.
ENDIF.
IF p_prd = 'X'.
CONCATENATE 'PRD' lv_target INTO lv_target SEPARATED BY space.
CONDENSE lv_target.
ENDIF.
CREATE OBJECT lcl_alv
EXPORTING
im_user = p_user
im_type = p_type
im_status = p_status
im_begda = p_begda
im_endda = p_endda
im_rec = lt_rec
im_mandt = p_mandt
im_target = lv_target.
ELSE.
lcl_alv->refresh( ).
ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100_EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100_exit INPUT.
LEAVE TO SCREEN 0.
ENDMODULE. " USER_COMMAND_0100_EXIT INPUT