on 2024 Jul 12 9:36 PM
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.
Request clarification before answering.
| User | Count |
|---|---|
| 18 | |
| 7 | |
| 6 | |
| 6 | |
| 6 | |
| 4 | |
| 3 | |
| 3 | |
| 2 | |
| 2 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.