Invoice IDOC status report
- Go to transaction code SE38.
Source Code
REPORT ZSD_INVOICE_IDOC_REPORT.
INITIALIZATION.
**---------------------------------------------------------------------*
** Table Declaration
**---------------------------------------------------------------------*
TABLES : edidc.
**---------------------------------------------------------------------*
** Types Declaration
**---------------------------------------------------------------------*
*!-- Control record (IDoc)
TYPES : BEGIN OF ts_control,
docnum TYPE edidc-docnum, "Doc number
status TYPE edidc-status, "Status of IDoc
direct TYPE edidc-direct, "Direction for IDoc
rcvprn TYPE edidc-rcvprn, "Partner Number of Receiver
credat TYPE edidc-credat, "IDoc Created On
mestyp TYPE edidc-mestyp, "Message Type
END OF ts_control.
*!-- Status Record (IDoc)
TYPES : BEGIN OF ts_status, " Used to display reason for failure in report
docnum TYPE edids-docnum, "Doc number
statxt TYPE edids-statxt, "Text for status code
END OF ts_status.
*!-- IDoc Data Records
TYPES : BEGIN OF ts_data,
docnum TYPE edid4-docnum, "Doc number
sdata TYPE edid4-sdata, "Application data
END OF ts_data.
TYPES : BEGIN OF ts_final,
date TYPE edidc-credat, " Date
customer TYPE e1edka1-partn, " Customer
saloff TYPE e1edk14-orgid, " Sales Office
docnum TYPE edidc-docnum , " IDOC number
irnum TYPE e1edk01-belnr, " Invoice number
iramount TYPE e1eds01-summe, " Invoice amount
ponum TYPE e1edp02-belnr, " PO number
ornum TYPE e1edp02-belnr, " Order number
partner TYPE edidc-rcvprn, " Trading partner
status TYPE edids-status , " Status
error TYPE edids-statxt , " Error
END OF ts_final.
**-----------------------------------------------------------------------*
** Internal table and work area declaration
**-----------------------------------------------------------------------*
DATA : lt_control TYPE TABLE OF ts_control,
ls_control TYPE ts_control,
lt_manual TYPE TABLE OF ts_control. " To capture any idocs not yet manually processed
DATA : lt_status TYPE TABLE OF ts_status , " Used to display reason for failure in report
ls_status TYPE ts_status.
DATA : lt_invoice TYPE TABLE OF ts_data, " To get invoice number
ls_invoice TYPE ts_data,
lt_order TYPE TABLE OF ts_data, " To get Order number
ls_order TYPE ts_data,
lt_po TYPE TABLE OF ts_data, " To get PO number
ls_po TYPE ts_data,
lt_customer TYPE TABLE OF ts_data, " To get Customer number
ls_customer TYPE ts_data,
lt_iramount TYPE TABLE OF ts_data, " To get Invoice amount
ls_iramount TYPE ts_data,
lt_salorg TYPE TABLE OF ts_data, " To get Sales org
ls_salorg TYPE ts_data,
lt_saloffice TYPE TABLE OF ts_data, " To get Sales office
ls_saloffice TYPE ts_data,
lt_final TYPE TABLE OF ts_final, " Output
ls_final TYPE ts_final.
data : lT_ATTACH TYPE STANDARD TABLE OF SOLISTI1 INITIAL SIZE 0
WITH HEADER LINE.
DATA: lv_filename(9),
lv_subject(70).
DATA: lt_message TYPE STANDARD TABLE OF solisti1 INITIAL SIZE 0
WITH HEADER LINE,
lt_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
lt_attachment LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lt_receivers LIKE somlreci1 OCCURS 0 WITH HEADER LINE,
ls_receivers TYPE somlreci1.
* t_receivers LIKE somlreci1 OCCURS 0 WITH HEADER LINE
DATA : gv_error TYPE sy-subrc,
gv_reciever TYPE sy-subrc.
Data : ls_doc_data LIKE sodocchgi1,
lv_cnt TYPE i,
lv_sent_all(1) TYPE c.
**---------------------------------------------------------------------*
** Selection-Screen
**---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-001.
SELECT-OPTIONS : s_credat FOR edidc-credat. "IDoc Created On
SELECT-OPTIONS : s_rcvprn FOR edidc-rcvprn. "Partner Number of Receiver
SELECT-OPTIONS : s_mestyp FOR edidc-mestyp DEFAULT 'INVOIC'. "Message Type
PARAMETERS : p_direct TYPE edidc-direct DEFAULT 1. "Direction for IDoc
SELECT-OPTIONS : s_docnum FOR edidc-docnum. "IDoc number
SELECTION-SCREEN END OF BLOCK blk.
START-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* From table Control record (IDoc)
SELECT docnum status direct rcvprn credat mestyp
FROM edidc
INTO TABLE lt_control " To capture all outbound idocs
WHERE credat IN s_credat
AND rcvprn IN s_rcvprn
AND mestyp IN s_mestyp
AND direct EQ p_direct
AND docnum IN s_docnum.
IF lt_control IS NOT INITIAL.
SELECT docnum status direct rcvprn credat mestyp
FROM edidc
INTO TABLE lt_manual " To capture any idocs not yet manually processed
WHERE credat IN s_credat
AND rcvprn IN s_rcvprn
AND mestyp IN s_mestyp
AND direct EQ p_direct
AND docnum IN s_docnum
AND status EQ 15.
* From table Status Record (IDoc)
IF lt_manual IS NOT INITIAL.
SELECT docnum statxt
FROM edids
INTO TABLE lt_status " Used to display reason for failure in report
FOR ALL ENTRIES IN lt_manual
WHERE docnum EQ lt_manual-docnum
AND status EQ 15.
ENDIF.
* From table IDoc Data Records
SELECT docnum sdata
FROM edid4
INTO TABLE lt_invoice " To get invoice number
FOR ALL ENTRIES IN lt_control
WHERE docnum EQ lt_control-docnum
AND segnam EQ 'E1EDK01'.
SELECT docnum sdata
FROM edid4
INTO TABLE lt_order " To get Order number
FOR ALL ENTRIES IN lt_control
WHERE docnum EQ lt_control-docnum
AND segnam EQ 'E1EDP02'.
SELECT docnum sdata
FROM edid4
INTO TABLE lt_po " To get PO number
FOR ALL ENTRIES IN lt_control
WHERE docnum EQ lt_control-docnum
AND segnam EQ 'E1EDP02'.
SELECT docnum sdata
FROM edid4
INTO TABLE lt_customer " To get Customer number
FOR ALL ENTRIES IN lt_control
WHERE docnum EQ lt_control-docnum
AND segnam EQ 'E1EDKA1'.
SELECT docnum sdata
FROM edid4
INTO TABLE lt_iramount " To get Invoice amount
FOR ALL ENTRIES IN lt_control
WHERE docnum EQ lt_control-docnum
AND segnam EQ 'E1EDS01'.
SELECT docnum sdata
FROM edid4
INTO TABLE lt_salorg " To get Sales org
FOR ALL ENTRIES IN lt_control
WHERE docnum EQ lt_control-docnum
AND segnam EQ 'E1EDK14'.
SELECT docnum sdata
FROM edid4
INTO TABLE lt_saloffice " To get Sales office
FOR ALL ENTRIES IN lt_control
WHERE docnum EQ lt_control-docnum
AND segnam EQ 'E1EDK14'.
ENDIF.
*!--------------------------------------------------------------------
*!--------- Final Data
*!--------------------------------------------------------------------
DATA : ls_e1edk01 TYPE e1edk01, " For Invoice number segment
ls_e1edp02_o TYPE e1edp02, " For Order number segment
ls_e1edp02_p TYPE e1edp02, " For Po number segment
ls_e1edka1 TYPE e1edka1, " For Customer number segment
ls_e1eds01 TYPE e1eds01, " For Invoice amount segment
"ls_salorg TYPE e1edk14, " For Sales org segment
ls_saloff TYPE e1edk14. " For Sales office segment
LOOP AT lt_control INTO ls_control.
*---Date
ls_final-date = ls_control-credat. "Date
*---To get customer
CLEAR ls_customer.
READ TABLE lt_customer
INTO ls_customer
WITH KEY docnum = ls_control-docnum
BINARY SEARCH .
IF sy-subrc EQ 0.
ls_e1edka1 = ls_customer-sdata.
IF ls_e1edka1-parvw EQ 'AG' .
ls_final-customer = ls_e1edka1-partn. "Customer number
ENDIF.
ENDIF.
*---To get sales office
CLEAR ls_saloffice .
READ TABLE lt_saloffice
INTO ls_saloffice
WITH KEY docnum = ls_control-docnum
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_saloff = ls_saloffice-sdata.
IF ls_saloff-qualf EQ '016'.
ls_final-saloff = ls_saloff-orgid. " Sales office
ENDIF.
ENDIF.
*--- To get IDOC number
ls_final-docnum = ls_control-docnum. " Idoc number
*---To get Invoice number
CLEAR ls_invoice.
READ TABLE lt_invoice
INTO ls_invoice
WITH KEY docnum = ls_control-docnum
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_e1edk01 = ls_invoice-sdata.
ls_final-irnum = ls_e1edk01-belnr. " Invoice number
ENDIF.
*---To get Invoice amount
CLEAR ls_iramount.
READ TABLE lt_iramount
INTO ls_iramount
WITH KEY docnum = ls_control-docnum
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_e1eds01 = ls_iramount-sdata.
IF ls_e1eds01-sumid EQ '011'.
ls_final-iramount = ls_e1eds01-summe. "Invoice amount
ENDIF.
ENDIF.
*--- To get PO number
CLEAR ls_po.
READ TABLE lt_po
INTO ls_po
WITH KEY docnum = ls_control-docnum
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_e1edp02_p = ls_po-sdata.
IF ls_e1edp02_p-qualf EQ '001'.
ls_final-ponum = ls_e1edp02_p-belnr. " Po Number
ENDIF.
ENDIF.
*--- Order number
CLEAR ls_order.
READ TABLE lt_order
INTO ls_order
WITH KEY docnum = ls_control-docnum
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_e1edp02_o = ls_order-sdata.
IF ls_e1edp02_o-qualf EQ '002'.
ls_final-ornum = ls_e1edp02_o-belnr. " Order number.
ENDIF.
ENDIF.
*--- partner
ls_final-partner = ls_control-rcvprn . " Partner Number of Receiver
*---Status
ls_final-status = ls_control-status. " Status of Idocs
*-- Error
CLEAR ls_status.
READ TABLE lt_status
INTO ls_status
WITH KEY docnum = ls_control-docnum
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_final-error = ls_status-statxt. " Error
ENDIF.
APPEND ls_final TO lt_final.
CLEAR : ls_control , ls_final ,ls_e1edk01 ,ls_e1edp02_o , ls_e1edp02_p , ls_e1edka1 , ls_e1eds01 , ls_salorg, ls_saloff .
ENDLOOP.
END-OF-SELECTION.
*!-------------------------------------------------------------------
*Build Excel
*!-------------------------------------------------------------------
*If you have Unicode check active in program attributes thnen you will
*need to declare constants as follows
*class cl_abap_char_utilities definition load.
CONSTANTS:
con_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
con_cret TYPE c VALUE cl_abap_char_utilities=>cr_lf.
*-- XLS For header label
CONCATENATE 'Date' 'Customer' 'Sales Office' 'Idoc Number' 'Invoice Number' 'Invoice Amount'
'PO Number' 'Order Number' 'Trading Partner' 'Status' 'Error'
INTO lt_attach
SEPARATED BY con_tab.
CONCATENATE con_cret lt_attach INTO lt_attach.
APPEND lt_attach.
CLEAR : lt_attach , ls_final.
LOOP AT lt_final INTO ls_final.
CONCATENATE ls_final-date ls_final-customer ls_final-saloff ls_final-docnum ls_final-irnum
ls_final-iramount ls_final-ponum ls_final-ornum ls_final-partner ls_final-status ls_final-error
INTO lt_attach
SEPARATED BY con_tab.
CONCATENATE con_cret lt_attach INTO lt_attach.
APPEND lt_attach.
CLEAR : lt_attach ,ls_final .
ENDLOOP.
*&---------------------------------------------------------------------*
*& POPULATE_EMAIL_MESSAGE_BODY
lv_subject = 'Invoice IDOC status Report' .
*! File name has to SAPTECH.txt
CLEAR lv_filename.
CONCATENATE 'SAPTECH' sy-datum INTO lv_filename.
CONDENSE lv_filename.
PERFORM send_file_as_email_attachment
TABLES lt_message
lt_attach
USING lv_subject
'XLS'
'Filename'
lv_filename
' '
' '
CHANGING
gv_error
gv_reciever.
*&---------------------------------------------------------------------*
*& Form SEND_FILE_AS_EMAIL_ATTACHMENT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM send_file_as_email_attachment TABLES plt_message
plt_attach
USING p_mtitle
p_format
p_filename
p_attdescription
p_sender_address
p_sender_addres_type
CHANGING p_gv_error
p_gv_reciever.
DATA: lv_error TYPE sy-subrc,
lv_reciever TYPE sy-subrc,
lv_mtitle LIKE sodocchgi1-obj_descr,
lv_email LIKE somlreci1-receiver,
lv_format TYPE so_obj_tp ,
lv_attdescription TYPE so_obj_nam ,
lv_attfilename TYPE so_obj_des ,
lv_sender_address LIKE soextreci1-receiver ,
lv_sender_address_type LIKE soextreci1-adr_typ,
lv_receiver LIKE sy-subrc,
lv_emailid LIKE somlreci1-receiver. " Email-id
lv_mtitle = p_mtitle.
lv_format = p_format.
lv_attdescription = p_attdescription.
lv_attfilename = p_filename.
lv_sender_address = p_sender_address.
lv_sender_address_type = p_sender_addres_type.
* Fill the document data.
ls_doc_data-doc_size = 1.
* Populate the subject/generic message attributes
ls_doc_data-obj_langu = sy-langu.
ls_doc_data-obj_name = 'SAPRPT'.
ls_doc_data-obj_descr = lv_mtitle .
ls_doc_data-sensitivty = 'F'.
* Fill the document data and get size of attachment
CLEAR ls_doc_data.
READ TABLE lt_attach INDEX lv_cnt.
ls_doc_data-doc_size =
( lv_cnt - 1 ) * 255 + strlen( lt_attach ).
ls_doc_data-obj_langu = sy-langu.
ls_doc_data-obj_name = 'SAPRPT'.
ls_doc_data-obj_descr = lv_mtitle.
ls_doc_data-sensitivty = 'F'.
CLEAR lt_attachment.
REFRESH lt_attachment.
lt_attachment[] = plt_attach[].
* Describe the body of the message
CLEAR lt_packing_list.
REFRESH lt_packing_list.
lt_packing_list-transf_bin = space.
lt_packing_list-head_start = 1.
lt_packing_list-head_num = 0.
lt_packing_list-body_start = 1.
DESCRIBE TABLE lt_message LINES lt_packing_list-body_num.
lt_packing_list-doc_type = 'RAW'.
APPEND lt_packing_list.
* Create attachment notification
lt_packing_list-transf_bin = 'X'.
lt_packing_list-head_start = 1.
lt_packing_list-head_num = 1.
lt_packing_list-body_start = 1.
DESCRIBE TABLE lt_attachment LINES lt_packing_list-body_num.
lt_packing_list-doc_type = lv_format.
lt_packing_list-obj_descr = lv_attdescription.
lt_packing_list-obj_name = lv_attfilename.
lt_packing_list-doc_size = lt_packing_list-body_num * 255.
APPEND lt_packing_list.
* email id
lv_emailid = 'write2sapabap@gmail.com'.
* Add the recipients email address
CLEAR lt_receivers.
REFRESH lt_receivers.
ls_receivers-receiver = lv_emailid.
ls_receivers-rec_type = 'U'.
ls_receivers-com_type = 'INT'.
ls_receivers-notif_del = 'X'.
ls_receivers-notif_ndel = 'X'.
APPEND ls_receivers TO lt_receivers.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
document_data = ls_doc_data
put_in_outbox = 'X'
sender_address = lv_sender_address
sender_address_type = lv_sender_address_type
commit_work = 'X'
IMPORTING
sent_to_all = lv_sent_all
TABLES
packing_list = lt_packing_list
contents_bin = lt_attachment
contents_txt = lt_message
receivers = lt_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.
* Populate zerror return code
lv_error = sy-subrc.
* Populate zreceiver return code
LOOP AT lt_receivers.
lv_receiver = lt_receivers-retrn_code.
ENDLOOP.
IF lv_receiver = 0 AND lv_error = 0 .
MESSAGE 'Email sent successfully' TYPE 'S'.
ENDIF.
ENDFORM.
- Save-> Check->activate.
- Click on Execute.
No comments:
Post a Comment