Service Invoice Upload For FB70 (BAPI)
My requirement is to create an FB70 document using a BAPI in SAP ABAP.
*& Report ZFI_SERVICE_INVOICE_UPLOAD
*&---------------------------------------------------------------------*
*& Program : ZFI_SERVICE_INVOICE_UPLOAD
*& Author : King Of abap
*& Created on : 02.01.2025
*& Requested By : ?
*& Project : ?
*& Transport-No : ?
*& Description : Service Invoice Upload For FB70
*& T-Code : ?
*&
*&---------------------------------------------------------------------*
REPORT zfi_service_invoice_upload.
INCLUDE zfi_service_invoice_top.
INCLUDE zfi_service_invoice_sel.
INCLUDE zfi_service_invoice_f01.
START-OF-SELECTION.
*** Get File Date from Flat file
PERFORM get_file_data.
*** Process the Service Invoice using BAPI
PERFORM create_bapi.
*** Display Error/Success LOG
PERFORM display_log.
*&---------------------------------------------------------------------*
*& Include ZFI_SERVICE_INVOICE_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
TYPES : BEGIN OF gty_final,
sno TYPE i,
doc_date TYPE bldat, "char10, " Document Date
post_date TYPE budat, "char10, " Posting Date
currency_key TYPE waers, " Currency
head_txt TYPE bktxt, " Header Text
cust_accnt TYPE kunnr, " Customer Account
amount TYPE wmwst, "wrbtr, " Amount in document currency
tax_code TYPE mwskz, " Tax Code
bus_place TYPE bupla, " Business Place
assignment TYPE dzuonr, " Assignment
short_txt TYPE sgtxt, " Text
gl_accnt TYPE newko, " Account
plant TYPE field, " Plant
prt_centr TYPE prctr, " Profit Centre
hsn_code TYPE secco, " HSN Code
END OF gty_final.
DATA: it_data TYPE TABLE OF gty_final,
it_data1 TYPE TABLE OF gty_final,
wa_data TYPE gty_final,
message TYPE string,
count TYPE i,
t_raw TYPE truxs_t_text_data,
fnam TYPE string,
cnt(2) TYPE n,
t_cnt(2) TYPE n,
h_excel TYPE ole2_object, " Excel object
h_mapl TYPE ole2_object, " list of workbooks
h_map TYPE ole2_object, " workbook
h_zl TYPE ole2_object, " cell
h_f TYPE ole2_object, " font
h TYPE i.
DATA: lv_s TYPE i,
lv_h TYPE i.
TYPES : BEGIN OF ty_msg,
sno TYPE i,
type TYPE char10, "bapi_mtype,
doc_no TYPE belnr_d,
msg TYPE bapi_msg,
END OF ty_msg.
DATA: it_msg TYPE TABLE OF ty_msg,
wa_msg TYPE ty_msg.
*&---------------------------------------------------------------------*
*& Include ZFI_SERVICE_INVOICE_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file TYPE rlgrap-filename,
p_check AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN: END OF BLOCK b1.
SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
SELECTION-SCREEN: PUSHBUTTON 20(54) cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREEN: END OF BLOCK b2.
INITIALIZATION.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = icon_xxl
text = 'Generate Template'
info = 'Generate Excel File Template'
IMPORTING
result = cmdgen
EXCEPTIONS
OTHERS = 0.
AT SELECTION-SCREEN.
CASE sscrfields.
WHEN 'A_GEN'.
PERFORM generate_template.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file .
*** File Upload
PERFORM file_upload.
*&---------------------------------------------------------------------*
*& Include ZFI_SERVICE_INVOICE_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
FORM file_upload .
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = 'P_FILE '
IMPORTING
file_name = p_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& *& Form get_file_data
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
FORM get_file_data .
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
i_line_header = 'X'
i_tab_raw_data = t_raw
i_filename = p_file
TABLES
i_tab_converted_data = it_data.
IF it_data IS INITIAL.
MESSAGE 'No data uploaded' TYPE 'E'.
ENDIF.
REFRESH:it_msg.
IF p_check EQ abap_true OR p_check NE abap_true..
LOOP AT it_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
IF <lfs_data>-bus_place IS INITIAL.
wa_msg-sno = <lfs_data>-sno.
wa_msg-msg = 'Business Place is Mandotory'. "wa_return-message.
wa_msg-type = icon_led_red.
APPEND: wa_msg TO it_msg.
CLEAR: wa_msg.
ENDIF.
IF <lfs_data>-hsn_code IS INITIAL.
wa_msg-sno = <lfs_data>-sno.
wa_msg-msg = 'HSN Code is Mandotory'. "wa_return-message.
wa_msg-type = icon_led_red.
APPEND: wa_msg TO it_msg.
CLEAR: wa_msg.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_bapi
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM create_bapi .
DATA: wa_docheader LIKE bapiache09,
wa_accntgl TYPE bapiacgl09,
wa_acc_rec TYPE bapiacar09,
wa_curr TYPE bapiaccr09,
wa_tax TYPE bapiactx09,
wa_accntwt TYPE bapiacwt09,
wa_return TYPE bapiret2,
ls_extension2 TYPE bapiparex.
DATA: it_accntgl TYPE TABLE OF bapiacgl09,
it_acc_rec TYPE TABLE OF bapiacar09,
it_curr TYPE TABLE OF bapiaccr09,
lt_criteria TYPE bapiackec9_tab,
it_tax TYPE TABLE OF bapiactx09,
it_accntwt TYPE TABLE OF bapiacwt09,
it_return TYPE TABLE OF bapiret2,
*** Extension fill for HSN Code
lt_extension2 TYPE TABLE OF bapiparex.
DATA: lv_obj_key LIKE bapiache09-obj_key,
lv_itemno TYPE posnr_acc,
lv_taxtot TYPE bset-fwste,
lv_taxded TYPE bset-fwste,
it_mwdat TYPE TABLE OF rtax1u15,
lv_cust_amt TYPE wrbtr,
lv_net_amt TYPE wrbtr.
CONSTANTS: co_doc_type TYPE blart VALUE 'SE',
co_cc TYPE bukrs VALUE '****'.
REFRESH: it_data1.
it_data1[] = it_data[].
SORT it_data BY sno.
DELETE ADJACENT DUPLICATES FROM it_data COMPARING sno.
LOOP AT it_data ASSIGNING FIELD-SYMBOL(<wfs_data>).
IF it_msg IS INITIAL.
wa_docheader-comp_code = co_cc.
wa_docheader-doc_type = co_doc_type.
wa_docheader-header_txt = <wfs_data>-head_txt.
wa_docheader-username = sy-uname.
wa_docheader-doc_date = <wfs_data>-doc_date.
PERFORM convert_date USING wa_docheader-doc_date .
wa_docheader-pstng_date = <wfs_data>-post_date.
PERFORM convert_date USING wa_docheader-pstng_date .
LOOP AT it_data1 ASSIGNING FIELD-SYMBOL(<gs_data>) WHERE sno = <wfs_data>-sno.
*** gl Account Line Item
IF <gs_data>-gl_accnt IS NOT INITIAL.
APPEND INITIAL LINE TO it_accntgl ASSIGNING FIELD-SYMBOL(<ls_gl_acc>).
<ls_gl_acc>-itemno_acc = lv_itemno = lv_itemno + 1.
<ls_gl_acc>-gl_account = |{ <gs_data>-gl_accnt ALPHA = IN }|.
<ls_gl_acc>-item_text = <gs_data>-short_txt.
<ls_gl_acc>-comp_code = co_cc.
<ls_gl_acc>-plant = <gs_data>-plant.
<ls_gl_acc>-alloc_nmbr = <gs_data>-assignment.
<ls_gl_acc>-tax_code = <gs_data>-tax_code.
<ls_gl_acc>-profit_ctr = |{ <gs_data>-prt_centr ALPHA = IN }|.
<ls_gl_acc>-businessplace = <gs_data>-bus_place.
<ls_gl_acc>-itemno_tax = 1.
APPEND INITIAL LINE TO it_curr ASSIGNING FIELD-SYMBOL(<ls_curr>).
<ls_curr>-itemno_acc = lv_itemno.
<ls_curr>-currency = <gs_data>-currency_key.
<ls_curr>-amt_doccur = <gs_data>-amount * -1.
<ls_curr>-curr_type = '00'.
SELECT SINGLE *
FROM ska1
INTO @DATA(ls_ska1)
WHERE saknr = @<ls_gl_acc>-gl_account
AND ktopl = @co_cc.
SELECT SINGLE *
FROM cskb
INTO @DATA(ls_cskb)
WHERE kstar = @<ls_gl_acc>-gl_account
AND kokrs = @co_cc.
IF ls_ska1-xbilk = abap_false.
IF ls_cskb-katyp = '11'.
APPEND INITIAL LINE TO lt_criteria ASSIGNING FIELD-SYMBOL(<ls_criteria>).
<ls_criteria>-itemno_acc = lv_itemno.
<ls_criteria>-fieldname = 'WERKS'.
<ls_criteria>-character = <gs_data>-prt_centr.
ELSEIF ls_cskb-katyp = '01'.
* <ls_gl_acc>-costcenter = |{ <gs_data>-cost_center ALPHA = IN }|.
ENDIF.
ENDIF.
ENDIF.
*** Calculation tax code decalrations
CLEAR:lv_taxtot,lv_taxded.
REFRESH:it_mwdat.
IF <gs_data>-tax_code IS NOT INITIAL .
EXPORT lv_bupla FROM <gs_data>-bus_place TO MEMORY ID 'BUPLA'.
CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
EXPORTING
i_bukrs = co_cc
i_mwskz = <gs_data>-tax_code
i_waers = <gs_data>-currency_key "'INR'
i_wrbtr = <gs_data>-amount
IMPORTING
e_fwste = lv_taxtot
e_fwast = lv_taxded
TABLES
t_mwdat = it_mwdat
EXCEPTIONS
bukrs_not_found = 1
country_not_found = 2
mwskz_not_defined = 3
mwskz_not_valid = 4
ktosl_not_found = 5
kalsm_not_found = 6
parameter_error = 7
knumh_not_found = 8
kschl_not_found = 9
unknown_error = 10
account_not_found = 11
txjcd_not_valid = 12
tdt_error = 13
txa_error = 14
OTHERS = 15.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
**** Tax Calculation
LOOP AT it_mwdat ASSIGNING FIELD-SYMBOL(<wfs_mwdat>).
CHECK <wfs_mwdat>-wmwst NE 0.
lv_itemno = lv_itemno + 1.
APPEND INITIAL LINE TO it_tax ASSIGNING FIELD-SYMBOL(<ls_acctax>).
IF <ls_acctax> IS ASSIGNED.
<ls_acctax>-itemno_acc = lv_itemno.
<ls_acctax>-gl_account = <wfs_mwdat>-hkont.
<ls_acctax>-tax_code = <gs_data>-tax_code.
<ls_acctax>-tax_rate = <wfs_mwdat>-msatz. .
<ls_acctax>-cond_key = <wfs_mwdat>-kschl.
<ls_acctax>-acct_key = <wfs_mwdat>-ktosl.
<ls_acctax>-direct_tax = abap_true.
<ls_acctax>-itemno_tax = lv_itemno. "1
APPEND INITIAL LINE TO it_curr ASSIGNING FIELD-SYMBOL(<ls_curr_amt>).
IF <ls_curr_amt> IS ASSIGNED.
<ls_curr_amt>-itemno_acc = lv_itemno .
<ls_curr_amt>-curr_type = '00'.
<ls_curr_amt>-currency = <gs_data>-currency_key.
<ls_curr_amt>-amt_doccur = <wfs_mwdat>-wmwst * -1 .
<ls_curr_amt>-amt_base = <wfs_mwdat>-wmwst .
ENDIF.
ENDIF.
ENDLOOP.
lv_cust_amt = lv_cust_amt + lv_taxtot + <gs_data>-amount.
ENDLOOP.
*** Customer Line Item
IF <wfs_data>-cust_accnt IS NOT INITIAL.
wa_acc_rec-itemno_acc = lv_itemno + 1.
wa_acc_rec-customer = |{ <wfs_data>-cust_accnt ALPHA = IN }|.
wa_acc_rec-comp_code = co_cc.
wa_acc_rec-alloc_nmbr = <wfs_data>-assignment.
wa_acc_rec-item_text = <wfs_data>-short_txt.
wa_acc_rec-businessplace = <wfs_data>-bus_place.
wa_acc_rec-sectioncode = co_cc.
wa_acc_rec-tax_code = <wfs_data>-tax_code.
wa_acc_rec-profit_ctr = |{ <wfs_data>-prt_centr ALPHA = IN }|.
APPEND: wa_acc_rec TO it_acc_rec.
CLEAR:wa_acc_rec.
wa_curr-itemno_acc = lv_itemno + 1.
wa_curr-curr_type = '00'.
wa_curr-currency = <gs_data>-currency_key.
wa_curr-amt_doccur = lv_cust_amt . " * -1.
APPEND: wa_curr TO it_curr.
CLEAR wa_curr.
ENDIF.
**** Extension For HSN Code Field
ls_extension2-structure = 'HSN_SAC'.
ls_extension2-valuepart1 = lv_itemno.
ls_extension2-valuepart2 = <gs_data>-hsn_code.
APPEND ls_extension2 TO lt_extension2.
CLEAR:ls_extension2.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = wa_docheader
TABLES
accountgl = it_accntgl
accountreceivable = it_acc_rec
accounttax = it_tax
currencyamount = it_curr
return = it_return
extension2 = lt_extension2
criteria = lt_criteria
accountwt = it_accntwt.
LOOP AT it_return INTO wa_return WHERE type = 'E'.
ADD 1 TO count.
wa_msg-sno = count.
wa_msg-msg = wa_return-message.
wa_msg-type = icon_led_red.
APPEND: wa_msg TO it_msg.
CLEAR: wa_msg.
ENDLOOP.
READ TABLE it_return TRANSPORTING NO FIELDS WITH KEY type = 'S'.
IF sy-subrc = 0 AND p_check = abap_false.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = wa_docheader
IMPORTING
obj_key = lv_obj_key
TABLES
accountgl = it_accntgl
accountreceivable = it_acc_rec
accounttax = it_tax
currencyamount = it_curr
return = it_return
extension2 = lt_extension2
criteria = lt_criteria
accountwt = it_accntwt.
READ TABLE it_return INTO wa_return WITH KEY type = 'S'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ADD 1 TO count.
wa_msg-sno = count.
wa_msg-doc_no = lv_obj_key(10).
wa_msg-type = icon_led_green.
wa_msg-msg = |Document posted successfully : { lv_obj_key(10) }-{ lv_obj_key+10(4) }-{ lv_obj_key+14(4) }|. "wa_return-message. "
APPEND wa_msg TO it_msg.
CLEAR: wa_msg.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT it_return INTO wa_return WHERE type = 'E'.
ADD 1 TO count.
wa_msg-sno = count.
wa_msg-msg = wa_return-message.
wa_msg-type = icon_led_red.
APPEND: wa_msg TO it_msg.
CLEAR: wa_msg.
ENDLOOP.
ENDIF.
REFRESH:it_accntgl,
it_acc_rec,
it_accntwt,
it_curr,
it_accntwt,
it_return,
lt_extension2,
lt_criteria.
CLEAR:count,
lv_obj_key,
lv_itemno,
wa_docheader,
lv_cust_amt,
lv_net_amt,
lv_taxded,
lv_taxtot.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM display_log .
TYPE-POOLS: slis.
DATA:
wa_fieldcat TYPE slis_fieldcat_alv,
wa_layout TYPE slis_layout_alv,
it_fieldcat TYPE slis_t_fieldcat_alv,
lv_program TYPE sy-repid.
IF it_msg IS NOT INITIAL.
APPEND VALUE #( fieldname = 'SNO'
col_pos = 1
seltext_m = 'Sno.' ) TO it_fieldcat.
APPEND VALUE #( fieldname = 'TYPE'
col_pos = 2
seltext_m = 'Status' ) TO it_fieldcat.
APPEND VALUE #( fieldname = 'DOC_NO'
col_pos = 3
seltext_m = 'Document No' ) TO it_fieldcat.
APPEND VALUE #( fieldname = 'MSG'
col_pos = 5
seltext_m = 'Message' ) TO it_fieldcat.
CLEAR wa_layout.
wa_layout-colwidth_optimize = 'X'.
wa_layout-zebra = 'X'.
lv_program = sy-repid.
* display the final display
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = lv_program
* i_callback_user_command = 'USER_COMMAND'
is_layout = wa_layout
it_fieldcat = it_fieldcat
TABLES
t_outtab = it_msg
EXCEPTIONS
program_error = 1
OTHERS = 2.
ELSE.
MESSAGE 'No errors found' TYPE 'I'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM generate_template .
* start Excel
CREATE OBJECT h_excel 'EXCEL.APPLICATION'.
SET PROPERTY OF h_excel 'Visible' = 1.
* get list of workbooks, initially empty
CALL METHOD OF
h_excel
'Workbooks' = h_mapl.
*** Error handle File
PERFORM err_hdl.
* add a new workbook
CALL METHOD OF
h_mapl
'Add' = h_map.
*** Error handle File
PERFORM err_hdl.
PERFORM fill_cell USING: 1 1 0 'Sno',
1 2 0 'Doc Date',
1 3 0 'Posting Date',
1 4 0 'Currency',
1 5 0 'Header Text',
1 6 0 'Customer Account',
1 7 0 'Amount',
1 8 0 'Tax Code',
1 9 0 'Business Place',
1 10 0 'Assignment',
1 11 0 'Short Text',
1 12 0 'GL Account',
1 13 0 'Plant',
1 14 0 'Profit Centre',
1 15 0 'HSN Code'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form fill_cell
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM fill_cell USING i j bold val.
CALL METHOD OF
h_excel
'Cells' = h_zl
EXPORTING
#1 = i
#2 = j.
PERFORM err_hdl.
SET PROPERTY OF h_zl 'Value' = val .
PERFORM err_hdl.
GET PROPERTY OF h_zl 'Font' = h_f.
PERFORM err_hdl.
SET PROPERTY OF h_f 'Bold' = bold .
PERFORM err_hdl.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form err_hdl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM err_hdl .
IF sy-subrc <> 0.
CALL METHOD OF
h_excel
'QUIT'.
FREE OBJECT h_excel.
h_excel-handle = -1.
MESSAGE: 'Failed to generate template.' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form convert_date
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> WA_DOCHEADER_DOC_DATE
*&---------------------------------------------------------------------*
FORM convert_date USING p_gs_date.
CALL FUNCTION 'CONVERT_DATE_TO_INTERN_FORMAT'
EXPORTING
datum = p_gs_date
dtype = 'DATS'
IMPORTING
idate = p_gs_date.
ENDFORM.
*** BADI Implementation NAME: BADI_ACC_DOCUMENT
***** Excel Template
Comments
Post a Comment