cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Send email to partners based on selection parameters

mia_ellis
Discoverer
0 Kudos
561

Hello Experts,

as a beginner I'm working on writing a program that has the following selection parameters:

 • VBELN number

 • Creation date from/to

The program should send an email to the partners of the respective selected offers. The email should have the subject “Offer Cancellation” and a standard text SO10 text called ZRH_ANGEBOTSMAIL as the email content. 

My code so far looks like this, and when I run the test modules 'data_selection' is successful but send_email isn't. I used lt_results_test with mock data just to see if 'send_email' works in this case, and yes it did. Both tests ended successfully. So I'm confused here a bit and would appreciate your tipps/suggestions. I have also read that it's recommended to use cl_document_bcs class for creating and sending emails instead of the function, but I wanted to try it with the function too.  zex04email is a view of the needed tables.

Thanks in advance!

Ellis

 

 

*&---------------------------------------------------------------------*
*& Report ZEX_TEST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZEX_TEST.
 
PARAMETERS:
   p_vbeln TYPE vbak-vbeln OBLIGATORY,   
   p_dt_fr TYPE vbak-erdat,              
   p_dt_to TYPE vbak-erdat.              
 
 
DATA:gt_results       TYPE TABLE OF zex04email,
     gs_results       LIKE LINE OF gt_results,  " Result line
     gt_lines         LIKE STANDARD TABLE OF tline WITH HEADER LINE,
     gt_contents_txt  TYPE TABLE OF solisti1,
     gs_contents_txt  LIKE LINE OF gt_contents_txt,
     gv_betreff       TYPE so_obj_des,
     gv_sent_to_all   TYPE os_boolean,
     gt_receivers     TYPE TABLE OF somlreci1,
     gs_receivers     LIKE LINE OF gt_receivers,
     doc_chng         LIKE  sodocchgi1,
     gt_packing_list  TYPE TABLE OF sopcklsti1,
     gs_packing_list  LIKE LINE OF gt_packing_list.
 
TYPES: tt_results TYPE STANDARD TABLE OF zex04email.
 
START-OF-SELECTION.
 
PERFORM data_selection USING p_vbeln
                             p_dt_fr
                             p_dt_to.
 
IF gt_results[] IS NOT INITIAL.
  PERFORM send_email USING gt_results.
ELSE.
  WRITE: / 'No data found for VBELN:', p_vbeln.
ENDIF.
 
FORM data_selection USING value(iv_vbeln) TYPE vbak-vbeln
                          value(iv_dt_fr) TYPE vbak-erdat
                          value(iv_dt_to) TYPE vbak-erdat.
 
  SELECT  vbak~vbeln
          vbpa~kunnr
          vbak~ernam
          kna1~adrnr
          adr6~smtp_addr
          vbpa~parvw
   INTO CORRESPONDING FIELDS OF TABLE gt_results
   FROM vbak
   INNER JOIN vbpa ON vbak~vbeln = vbpa~vbeln
   INNER JOIN kna1 ON vbpa~kunnr = kna1~kunnr
   INNER JOIN adr6 ON kna1~adrnr = adr6~addrnumber
   WHERE vbak~vbeln = iv_vbeln
   AND vbak~erdat BETWEEN iv_dt_fr AND iv_dt_to
   AND vbak~vbtyp = 'B'
   AND vbpa~parvw = 'AG'.
ENDFORM.
 
 
FORM send_email USING gtres TYPE tt_results.
 
*email content
CALL FUNCTION 'READ_TEXT'
   EXPORTING
     id       = 'ST'
     language = sy-langu
     name     = 'ZRH_ANGEBOTSMAIL'
     object   = 'TEXT'
   TABLES
     lines    = gt_lines
   EXCEPTIONS
     id       = 1
     language = 2
     name     = 3
     not_found = 4
     object   = 5
     OTHERS   = 8.
 
    LOOP AT gt_lines INTO DATA(ls_lines).
      gs_contents_txt-line = ls_lines-tdline.
      APPEND gs_contents_txt TO gt_contents_txt.
    ENDLOOP.
 
   LOOP AT gtres INTO gs_results.
    CLEAR gs_receivers.
    gs_receivers-receiver = gs_results-smtp_addr.
    APPEND gs_receivers TO gt_receivers.
 
   gv_betreff = 'Offer Cancellation'.
 
   doc_chng-obj_name = 'Betreff'.
   doc_chng-obj_descr = gv_betreff.
 
   " Fill the packing list for the email body
    CLEAR gs_packing_list.
    gs_packing_list-transf_bin = ' '.
    gs_packing_list-head_start = 1.
    gs_packing_list-head_num = 0.
    gs_packing_list-body_start = 1.
    gs_packing_list-body_num = LINES( gt_contents_txt ).
    gs_packing_list-doc_type = 'RAW'.
    APPEND gs_packing_list TO gt_packing_list.
 
   " send email
   CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
     EXPORTING
       document_data                = doc_chng
       put_in_outbox                = 'X'
       commit_work                  = 'X'
     TABLES
       packing_list                 = gt_packing_list
       contents_txt                 = gt_contents_txt
       receivers                    = gt_receivers
     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.
*     WRITE: / 'Email sent to:', gs_results-smtp_addr.
*   ELSE.
*     WRITE: / 'Failed to send to:', gs_results-smtp_addr.
*   ENDIF.
  ENDLOOP.
ENDFORM.
 
*************************************UNIT TESTING********************************************
 
CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
 
PRIVATE SECTION.
 
CLASS-DATA: environment TYPE REF TO if_osql_test_environment.
 
CLASS-METHODS: class_setup,
               class_teardown.
 
METHODS: setup,
         teardown,
         test_data_selection FOR TESTING,
         test_email_sending  FOR TESTING.
 
DATA: lt_results_test TYPE STANDARD TABLE OF zex04email,
      ls_results_test LIKE LINE OF lt_results_test,
      lt_vbak TYPE STANDARD TABLE OF vbak,
      lt_vbpa TYPE STANDARD TABLE OF vbpa,
      lt_kna1 TYPE STANDARD TABLE OF kna1,
      lt_adr6 TYPE STANDARD TABLE OF adr6.
 
ENDCLASS.
 
CLASS ltcl_test IMPLEMENTATION.
 
  METHOD class_setup.
    environment = cl_osql_test_environment=>create( i_dependency_list = VALUE #(
                    ( 'VBAK' ) ( 'VBPA' ) ( 'KNA1' ) ( 'ADR6' ) ( 'ZEX04EMAIL' ) ) ).
  ENDMETHOD.
 
  METHOD setup.
    "MOCK-DATA
 
    lt_vbak = VALUE #(
                      ( vbeln = '20000020' erdat = '01.01.2020' vbtyp = 'B' ernam = 'USER' )
                      ( vbeln = '20000022' erdat = '01.01.2022' vbtyp = 'B' ernam = 'USER' )
                     ).
 
    lt_vbpa = VALUE #( ( vbeln = '20000020' kunnr = '1010001' parvw = 'AG' ) ).
    lt_kna1 = VALUE #( ( kunnr = '1010001' adrnr = '23577' ) ).
    lt_adr6 = VALUE #( ( addrnumber = '23577' smtp_addr =  'test@example.com' ) ).
 
    lt_results_test = VALUE #( ( vbeln = '20000020' erdat = '01.01.2020' kunnr = '1010001'
                                 ernam = 'USER' adrnr = '23577' smtp_addr = 'test@example.com'
                                 parvw = 'AG' ) ).
 
    environment->insert_test_data( lt_vbak ).
    environment->insert_test_data( lt_vbpa ).
    environment->insert_test_data( lt_kna1 ).
    environment->insert_test_data( lt_adr6 ).
    environment->insert_test_data( lt_results_test ).
 
  ENDMETHOD.
 
  METHOD test_data_selection.
 
     p_vbeln = '20000020'.
     p_dt_fr = '01.01.2020'.
     p_dt_to = '01.01.2022'.
 
    PERFORM data_selection USING p_vbeln p_dt_fr p_dt_to.
 
    LOOP AT gt_results INTO gs_results.
      cl_abap_unit_assert=>assert_equals(
           act = gs_results-vbeln
           exp = '20000020'
           msg = 'VBELN mismatch'
      ).
      cl_abap_unit_assert=>assert_equals(
          act = gs_results-kunnr
          exp = '1010001'
          msg = 'KUNNR mismatch'
      ).
      cl_abap_unit_assert=>assert_equals(
         act = gs_results-smtp_addr
         exp = 'test@example.com'
         msg = 'Email mismatch'
      ).
    ENDLOOP.
  ENDMETHOD.
 
METHOD test_email_sending.
   PERFORM send_email USING gt_results.
   " Ergebnis überprüfen
   cl_abap_unit_assert=>assert_equals( act = sy-subrc exp = 0 msg = 'email not sent' ).
ENDMETHOD.
 
METHOD teardown.
  CLEAR gt_results.
  environment->clear_doubles( ).
ENDMETHOD.
 
METHOD class_teardown.
   environment->destroy( ).
ENDMETHOD.
 
ENDCLASS.

 

Accepted Solutions (0)

Answers (0)