Текущее время: Пт, апр 19 2024, 12:27

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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