Текущее время: Вс, июн 22 2025, 20:05

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Выкладываю программу для отправки по email письма с запросами на перенос
СообщениеДобавлено: Ср, июл 22 2009, 11:58 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, окт 31 2008, 15:58
Сообщения: 70
Программа отображает запросы пользователя, по указанным параметрам в 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.
* --&gt; 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


_________________
С Уважением, Абрамов Виктор.
The devil is in the detail.


Последний раз редактировалось Абрамов Виктор Ср, июл 22 2009, 14:58, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выкладываю программу для отправки по email письма с запросами на перенос
СообщениеДобавлено: Ср, июл 22 2009, 13:37 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, май 14 2007, 13:05
Сообщения: 561
Откуда: Москва
Программа это хорошо.
Но позволю процитировать один из комментов по похожей теме
Pokusannoe_Zubilo написал:
возможно вам будет интерестно, а может вы уже в курсе.,
что в SAP е есть похожий стандартный механизм управления запросами через Transport Workflow

http://help.sap.com/saphelp_nw04/helpda ... ameset.htm

p.s. это не ответ на ваш вопрос, просто инфа ;)
На одном из проектов такая тема была реализована. Удобная вещь :idea:

_________________
Sapere aude!


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

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


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

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


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

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