FB60 Vendor Invoice Post using BAPI
*&---------------------------------------------------------------------*
*& Report ZFI_FB60_VENDOR_UPLOAD_TOOL*&---------------------------------------------------------------------*
*&Created By : King Of ABAP'r
*&Created On : 2025
*&Description : Vendor Invoice Upload FB60
*&Functional Consultant : Consultant
*&Program : ZFI_FB60_VENDOR_UPLOAD_TOOL
*&---------------------------------------------------------------------*
REPORT zfi_fb60_vendor_upload_tool.
INCLUDE zfi_fb60_vendor_upl_top.
INCLUDE zfi_fb60_vendor_upl_sel.
INCLUDE zfi_fb60_vendor_upl_f01.
START-OF-SELECTION.
*** Get File Data
PERFORM get_file_data.
*** Call Bapi
PERFORM create_bapi.
*** Display Error/Success LOG
PERFORM display_log.
*&---------------------------------------------------------------------*
*& Include ZFI_FB60_VENDOR_UPL_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
TYPES:BEGIN OF ty_final,
sno TYPE i,
doc_date TYPE bldat, " Document Date
post_date TYPE budat, " Posting Date
company_code TYPE bukrs,
currency TYPE waers,
xblnr TYPE xblnr,
vend_no TYPE lifnr,
gl_amt TYPE bapidoccur,
culate_tax TYPE c,
business_place TYPE acpi_branch,
section_code TYPE acpi_secco1,
taxcode TYPE bseg-mwskz, " Tax Code bseg-mwskz,
pmnttrms TYPE char4,
assinment TYPE dzuonr,
item_text TYPE sgtxt,
gl_acc TYPE hkont,
aufnr TYPE aufnr,
hsn_sac TYPE char30, "j_1ig_hsn_sac,
END OF ty_final.
DATA:gt_data TYPE TABLE OF ty_final,
gt_data1 TYPE TABLE OF ty_final,
ls_data TYPE ty_final.
TYPES : BEGIN OF ty_msg,
sno TYPE i,
type TYPE char10, "bapi_mtype,
doc_no TYPE belnr_d,
gjahr TYPE gjahr,
msg TYPE bapi_msg,
* number TYPE symsgno,
END OF ty_msg.
DATA:
gt_msg TYPE TABLE OF ty_msg,
gs_msg TYPE ty_msg.
DATA:
lv_mseg TYPE string.
DATA:
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.
*& Include ZFI_FB60_VENDOR_UPL_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
TYPES:BEGIN OF ty_final,
sno TYPE i,
doc_date TYPE bldat, " Document Date
post_date TYPE budat, " Posting Date
company_code TYPE bukrs,
currency TYPE waers,
xblnr TYPE xblnr,
vend_no TYPE lifnr,
gl_amt TYPE bapidoccur,
culate_tax TYPE c,
business_place TYPE acpi_branch,
section_code TYPE acpi_secco1,
taxcode TYPE bseg-mwskz, " Tax Code bseg-mwskz,
pmnttrms TYPE char4,
assinment TYPE dzuonr,
item_text TYPE sgtxt,
gl_acc TYPE hkont,
aufnr TYPE aufnr,
hsn_sac TYPE char30, "j_1ig_hsn_sac,
END OF ty_final.
DATA:gt_data TYPE TABLE OF ty_final,
gt_data1 TYPE TABLE OF ty_final,
ls_data TYPE ty_final.
TYPES : BEGIN OF ty_msg,
sno TYPE i,
type TYPE char10, "bapi_mtype,
doc_no TYPE belnr_d,
gjahr TYPE gjahr,
msg TYPE bapi_msg,
* number TYPE symsgno,
END OF ty_msg.
DATA:
gt_msg TYPE TABLE OF ty_msg,
gs_msg TYPE ty_msg.
DATA:
lv_mseg TYPE string.
DATA:
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.
*&---------------------------------------------------------------------*
*& Include ZFI_FB60_VENDOR_UPL_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_file TYPE rlgrap-filename."BLIGATORY.
PARAMETERS: 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_FB60_VENDOR_UPL_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_file TYPE rlgrap-filename."BLIGATORY.
PARAMETERS: 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_FB60_VENDOR_UPL_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
FORM file_upload .
**** file upload data
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
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_file_data .
DATA:t_raw TYPE truxs_t_text_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 = gt_data.
IF gt_data IS INITIAL.
MESSAGE 'No data uploaded' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_bapi
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM create_bapi .
DATA: ls_header TYPE bapiache09,
lt_gl_acc TYPE TABLE OF bapiacgl09,
lt_acc_pay TYPE TABLE OF bapiacap09,
ls_acc_pay TYPE bapiacap09,
lt_curr TYPE TABLE OF bapiaccr09,
lt_tax TYPE TABLE OF bapiactx09,
lt_accountwt TYPE TABLE OF bapiacwt09,
lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2.
*** extension fill for posting key
DATA : lt_extension2 TYPE TABLE OF bapiparex,
ls_extension2 TYPE bapiparex.
*** variable declarations
DATA: lv_item_no TYPE posnr_acc.
DATA: lv_obj_typ LIKE bapiache09-obj_type,
lv_obj_key LIKE bapiache09-obj_key,
lv_obj_sys LIKE bapiache09-obj_sys.
*** calculation tax code decalrations
DATA : lv_taxtot TYPE bset-fwste,
lv_taxded TYPE bset-fwste.
DATA : lt_mwdat TYPE TABLE OF rtax1u15.
DATA : lv_fiscal_year TYPE gjahr.
DATA : lv_amt TYPE wrbtr.
REFRESH: gt_data1.
gt_data1[] = gt_data[].
SORT gt_data BY sno.
DELETE ADJACENT DUPLICATES FROM gt_data COMPARING sno.
LOOP AT gt_data INTO DATA(gs_Data).
*** header DATA declarations
DATA(lv_count) = gs_data-sno.
ls_header-username = sy-uname.
ls_header-header_txt = gs_data-item_text.
ls_header-comp_code = gs_data-company_code.
ls_header-doc_date = gs_data-doc_date.
PERFORM convert_date USING ls_header-doc_date.
ls_header-pstng_date = gs_Data-post_date.
PERFORM convert_date USING ls_header-pstng_date.
ls_header-doc_type = 'KR'.
ls_header-ref_doc_no = gs_data-xblnr.
"Get Fiscal Year
CALL FUNCTION 'GET_CURRENT_YEAR'
EXPORTING
bukrs = gs_data-company_code
date = gs_data-post_date
IMPORTING
curry = lv_fiscal_year.
TRANSLATE ls_header-ref_doc_no TO UPPER CASE.
SELECT SINGLE * FROM bkpf INTO @DATA(ls_bkpf)
WHERE xblnr EQ @ls_header-ref_doc_no
AND bukrs EQ @gs_Data-company_code.
IF sy-subrc EQ 0.
gs_msg-sno = gs_data-sno.
gs_msg-type = icon_led_red.
gs_msg-msg = |Duplicate record found for Reference#{ ls_bkpf-bukrs }/{ ls_bkpf-belnr }/{ ls_bkpf-gjahr }|.
gs_msg-gjahr = lv_fiscal_year.
APPEND: gs_msg TO gt_msg.
CLEAR: gs_msg.
CONTINUE.
ENDIF.
"items declarations
LOOP AT gt_data1 ASSIGNING FIELD-SYMBOL(<gs_data>) WHERE sno = gs_data-sno.
" Fill GL Account Details
IF <gs_data>-gl_acc IS NOT INITIAL.
APPEND INITIAL LINE TO lt_gl_acc ASSIGNING FIELD-SYMBOL(<ls_gl_acc>).
<ls_gl_acc>-itemno_acc = lv_item_no = lv_item_no + 1.
<ls_gl_acc>-gl_account = |{ <gs_data>-gl_acc ALPHA = IN }|.
<ls_gl_acc>-item_text = <gs_data>-item_text.
<ls_gl_acc>-comp_code = <gs_data>-company_code.
<ls_gl_acc>-tax_code = <gs_data>-taxcode.
<ls_gl_acc>-businessplace = <gs_data>-business_place.
<ls_gl_acc>-itemno_tax = 1.
<ls_gl_acc>-alloc_nmbr = <gs_data>-assinment.
<ls_gl_acc>-orderid = <gs_data>-aufnr.
APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<ls_curr>).
<ls_curr>-itemno_acc = lv_item_no.
<ls_curr>-currency = <gs_data>-currency.
<ls_curr>-amt_doccur = <gs_data>-gl_amt.
<ls_curr>-curr_type = '00'.
ENDIF.
"Fill Vendor Details into Account payable
IF <gs_data>-vend_no IS NOT INITIAL.
ls_acc_pay-itemno_acc = lv_item_no = lv_item_no + 1.
ls_acc_pay-vendor_no = |{ <gs_data>-vend_no ALPHA = IN }|.
ls_acc_pay-alloc_nmbr = <gs_data>-assinment.
ls_acc_pay-item_text = <gs_data>-item_text.
ls_acc_pay-pmnttrms = <gs_data>-pmnttrms.
ls_acc_pay-businessplace = <gs_data>-business_place.
ls_acc_pay-sectioncode = <gs_data>-section_code.
ls_acc_pay-tax_code = <gs_data>-taxcode.
APPEND: ls_acc_pay TO lt_acc_pay.
ENDIF.
CLEAR: lv_taxtot,lv_taxded.
REFRESH:lt_mwdat.
IF <gs_data>-taxcode IS NOT INITIAL.
lv_amt = <gs_data>-gl_amt.
CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
EXPORTING
i_bukrs = <gs_data>-company_code "'1983'
i_mwskz = <gs_data>-taxcode
i_waers = <gs_data>-currency "'INR'
i_wrbtr = lv_amt
IMPORTING
e_fwste = lv_taxtot
e_fwast = lv_taxded
TABLES
t_mwdat = lt_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.
"Fill Vendor Line Amount
APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<gs_curr>).
<gs_curr>-itemno_acc = lv_item_no.
<gs_curr>-curr_type = '00'.
<gs_curr>-currency = <gs_data>-currency.
<gs_curr>-amt_doccur = <gs_data>-gl_amt + lv_taxtot .
<gs_curr>-amt_doccur = <gs_curr>-amt_doccur * -1.
CLEAR lv_amt.
LOOP AT lt_mwdat ASSIGNING FIELD-SYMBOL(<ls_mwdat>).
CHECK <ls_mwdat>-wmwst NE 0.
lv_item_no = lv_item_no + 1.
APPEND INITIAL LINE TO lt_tax ASSIGNING FIELD-SYMBOL(<ls_acctax>).
IF <ls_acctax> IS ASSIGNED.
<ls_acctax>-itemno_acc = lv_item_no.
<ls_acctax>-gl_account = <ls_mwdat>-hkont.
<ls_acctax>-tax_code = <gs_data>-taxcode.
<ls_acctax>-tax_rate = <ls_mwdat>-msatz.
<ls_acctax>-cond_key = <ls_mwdat>-kschl.
<ls_acctax>-acct_key = <ls_mwdat>-ktosl.
<ls_acctax>-direct_tax = abap_true.
<ls_acctax>-itemno_tax = lv_item_no.
APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<ls_curr_amt>).
IF <ls_curr_amt> IS ASSIGNED.
<ls_curr_amt>-itemno_acc = lv_item_no . "+ 1.
<ls_curr_amt>-curr_type = '00'.
<ls_curr_amt>-currency = <gs_data>-currency.
<ls_curr_amt>-amt_doccur = <ls_mwdat>-wmwst.
<ls_curr_amt>-amt_base = <ls_mwdat>-wmwst.
ENDIF.
ENDIF.
ENDLOOP.
* ENDIF.
ENDIF.
***** Extension For HSN Code Field
* ls_extension2-structure = 'HSN_SAC'.
* ls_extension2-valuepart1 = lv_item_no.
* ls_extension2-valuepart2 = <gs_data>-hsn_sac.
* APPEND ls_extension2 TO lt_extension2.
* CLEAR:ls_extension2.
ENDLOOP.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = ls_header
TABLES
accountgl = lt_gl_acc
accountpayable = lt_acc_pay
accounttax = lt_tax
currencyamount = lt_curr
extension2 = lt_extension2
* criteria = lt_criteria
return = lt_return.
* accountwt = lt_accountwt.
LOOP AT lt_return INTO ls_return WHERE type = 'E'.
gs_msg-sno = lv_count.
gs_msg-msg = ls_return-message.
gs_msg-type = 'E'.
APPEND: gs_msg TO gt_msg.
CLEAR: gs_msg.
ENDLOOP.
READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
IF sy-subrc NE 0 AND p_check = abap_false.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_header
IMPORTING
obj_type = lv_obj_typ
obj_key = lv_obj_key
obj_sys = lv_obj_sys
TABLES
accountgl = lt_gl_acc
accountpayable = lt_acc_pay
accounttax = lt_tax
currencyamount = lt_curr
extension2 = lt_extension2
* criteria = lt_criteria
return = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
gs_msg-sno = lv_count.
gs_msg-doc_no = lv_obj_key(10).
gs_msg-gjahr = lv_obj_key+14(4).
gs_msg-type = icon_green_light.
gs_msg-msg = |Document posted successfully:{ lv_obj_key }|.
APPEND gs_msg TO gt_msg.
CLEAR: gs_msg.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT lt_return INTO ls_return WHERE type = 'E'.
gs_msg-sno = lv_count.
gs_msg-msg = ls_return-message.
gs_msg-type = icon_red_light.
APPEND: gs_msg TO gt_msg.
CLEAR: gs_msg.
ENDLOOP.
ENDIF.
ENDIF.
CLEAR: ls_header,
lt_curr,
lt_tax,
lt_extension2,
lt_gl_acc,
lt_acc_pay,
lt_return,
lt_accountwt,
* lt_criteria,
lv_item_no.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form convert_date
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_HEADER_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.
*&---------------------------------------------------------------------*
*& Form DISPLAY_LOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> DISPLAY_LOG
*&---------------------------------------------------------------------*
FORM display_log .
TYPE-POOLS: slis.
DATA: ls_fieldcat TYPE slis_fieldcat_alv,
ls_layout TYPE slis_layout_alv.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: lv_program TYPE sy-repid.
IF gt_msg IS NOT INITIAL.
APPEND VALUE #( fieldname = 'SNO'
col_pos = 1
ref_tabname = 'GT_ALV'
seltext_m = 'Sno' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'TYPE'
col_pos = 2
ref_tabname = 'GT_ALV'
seltext_m = 'Status' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'DOC_NO'
col_pos = 3
ref_tabname = 'GT_ALV'
hotspot = 'X'
seltext_m = 'Document No' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'GJAHR'
col_pos = 4
ref_tabname = 'GT_ALV'
seltext_m = 'Year' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'MSG'
col_pos = 5
ref_tabname = 'GT_ALV'
seltext_m = 'Message' ) TO lt_fieldcat.
CLEAR ls_layout.
ls_layout-colwidth_optimize = 'X'.
ls_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 = ls_layout
it_fieldcat = lt_fieldcat
TABLES
t_outtab = gt_msg
EXCEPTIONS
program_error = 1
OTHERS = 2.
ELSE.
MESSAGE 'No errors found' TYPE 'I'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'.
IF rs_selfield-fieldname = 'DOC_NO'.
READ TABLE gt_msg INTO DATA(gs_final) INDEX rs_selfield-tabindex.
IF sy-lsind = 0.
SET PARAMETER ID 'BLN' FIELD gs_final-doc_no.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
ENDCASE.
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 'Company Code',
1 5 0 'Currency',
1 6 0 'Reference',
1 7 0 'Vendor',
1 8 0 'Amount',
1 9 0 'Calculate Tax',
1 10 0 'Business Place',
1 11 0 'Section Code',
1 12 0 'Tax Code',
1 13 0 'Payment Terms',
1 14 0 'Assignment',
1 15 0 'Line Item Text',
1 16 0 'GL Account',
1 17 0 'Order No',
1 18 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.
*& Include ZFI_FB60_VENDOR_UPL_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
FORM file_upload .
**** file upload data
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
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_file_data .
DATA:t_raw TYPE truxs_t_text_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 = gt_data.
IF gt_data IS INITIAL.
MESSAGE 'No data uploaded' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_bapi
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM create_bapi .
DATA: ls_header TYPE bapiache09,
lt_gl_acc TYPE TABLE OF bapiacgl09,
lt_acc_pay TYPE TABLE OF bapiacap09,
ls_acc_pay TYPE bapiacap09,
lt_curr TYPE TABLE OF bapiaccr09,
lt_tax TYPE TABLE OF bapiactx09,
lt_accountwt TYPE TABLE OF bapiacwt09,
lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2.
*** extension fill for posting key
DATA : lt_extension2 TYPE TABLE OF bapiparex,
ls_extension2 TYPE bapiparex.
*** variable declarations
DATA: lv_item_no TYPE posnr_acc.
DATA: lv_obj_typ LIKE bapiache09-obj_type,
lv_obj_key LIKE bapiache09-obj_key,
lv_obj_sys LIKE bapiache09-obj_sys.
*** calculation tax code decalrations
DATA : lv_taxtot TYPE bset-fwste,
lv_taxded TYPE bset-fwste.
DATA : lt_mwdat TYPE TABLE OF rtax1u15.
DATA : lv_fiscal_year TYPE gjahr.
DATA : lv_amt TYPE wrbtr.
REFRESH: gt_data1.
gt_data1[] = gt_data[].
SORT gt_data BY sno.
DELETE ADJACENT DUPLICATES FROM gt_data COMPARING sno.
LOOP AT gt_data INTO DATA(gs_Data).
*** header DATA declarations
DATA(lv_count) = gs_data-sno.
ls_header-username = sy-uname.
ls_header-header_txt = gs_data-item_text.
ls_header-comp_code = gs_data-company_code.
ls_header-doc_date = gs_data-doc_date.
PERFORM convert_date USING ls_header-doc_date.
ls_header-pstng_date = gs_Data-post_date.
PERFORM convert_date USING ls_header-pstng_date.
ls_header-doc_type = 'KR'.
ls_header-ref_doc_no = gs_data-xblnr.
"Get Fiscal Year
CALL FUNCTION 'GET_CURRENT_YEAR'
EXPORTING
bukrs = gs_data-company_code
date = gs_data-post_date
IMPORTING
curry = lv_fiscal_year.
TRANSLATE ls_header-ref_doc_no TO UPPER CASE.
SELECT SINGLE * FROM bkpf INTO @DATA(ls_bkpf)
WHERE xblnr EQ @ls_header-ref_doc_no
AND bukrs EQ @gs_Data-company_code.
IF sy-subrc EQ 0.
gs_msg-sno = gs_data-sno.
gs_msg-type = icon_led_red.
gs_msg-msg = |Duplicate record found for Reference#{ ls_bkpf-bukrs }/{ ls_bkpf-belnr }/{ ls_bkpf-gjahr }|.
gs_msg-gjahr = lv_fiscal_year.
APPEND: gs_msg TO gt_msg.
CLEAR: gs_msg.
CONTINUE.
ENDIF.
"items declarations
LOOP AT gt_data1 ASSIGNING FIELD-SYMBOL(<gs_data>) WHERE sno = gs_data-sno.
" Fill GL Account Details
IF <gs_data>-gl_acc IS NOT INITIAL.
APPEND INITIAL LINE TO lt_gl_acc ASSIGNING FIELD-SYMBOL(<ls_gl_acc>).
<ls_gl_acc>-itemno_acc = lv_item_no = lv_item_no + 1.
<ls_gl_acc>-gl_account = |{ <gs_data>-gl_acc ALPHA = IN }|.
<ls_gl_acc>-item_text = <gs_data>-item_text.
<ls_gl_acc>-comp_code = <gs_data>-company_code.
<ls_gl_acc>-tax_code = <gs_data>-taxcode.
<ls_gl_acc>-businessplace = <gs_data>-business_place.
<ls_gl_acc>-itemno_tax = 1.
<ls_gl_acc>-alloc_nmbr = <gs_data>-assinment.
<ls_gl_acc>-orderid = <gs_data>-aufnr.
APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<ls_curr>).
<ls_curr>-itemno_acc = lv_item_no.
<ls_curr>-currency = <gs_data>-currency.
<ls_curr>-amt_doccur = <gs_data>-gl_amt.
<ls_curr>-curr_type = '00'.
ENDIF.
"Fill Vendor Details into Account payable
IF <gs_data>-vend_no IS NOT INITIAL.
ls_acc_pay-itemno_acc = lv_item_no = lv_item_no + 1.
ls_acc_pay-vendor_no = |{ <gs_data>-vend_no ALPHA = IN }|.
ls_acc_pay-alloc_nmbr = <gs_data>-assinment.
ls_acc_pay-item_text = <gs_data>-item_text.
ls_acc_pay-pmnttrms = <gs_data>-pmnttrms.
ls_acc_pay-businessplace = <gs_data>-business_place.
ls_acc_pay-sectioncode = <gs_data>-section_code.
ls_acc_pay-tax_code = <gs_data>-taxcode.
APPEND: ls_acc_pay TO lt_acc_pay.
ENDIF.
CLEAR: lv_taxtot,lv_taxded.
REFRESH:lt_mwdat.
IF <gs_data>-taxcode IS NOT INITIAL.
lv_amt = <gs_data>-gl_amt.
CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
EXPORTING
i_bukrs = <gs_data>-company_code "'1983'
i_mwskz = <gs_data>-taxcode
i_waers = <gs_data>-currency "'INR'
i_wrbtr = lv_amt
IMPORTING
e_fwste = lv_taxtot
e_fwast = lv_taxded
TABLES
t_mwdat = lt_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.
"Fill Vendor Line Amount
APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<gs_curr>).
<gs_curr>-itemno_acc = lv_item_no.
<gs_curr>-curr_type = '00'.
<gs_curr>-currency = <gs_data>-currency.
<gs_curr>-amt_doccur = <gs_data>-gl_amt + lv_taxtot .
<gs_curr>-amt_doccur = <gs_curr>-amt_doccur * -1.
CLEAR lv_amt.
LOOP AT lt_mwdat ASSIGNING FIELD-SYMBOL(<ls_mwdat>).
CHECK <ls_mwdat>-wmwst NE 0.
lv_item_no = lv_item_no + 1.
APPEND INITIAL LINE TO lt_tax ASSIGNING FIELD-SYMBOL(<ls_acctax>).
IF <ls_acctax> IS ASSIGNED.
<ls_acctax>-itemno_acc = lv_item_no.
<ls_acctax>-gl_account = <ls_mwdat>-hkont.
<ls_acctax>-tax_code = <gs_data>-taxcode.
<ls_acctax>-tax_rate = <ls_mwdat>-msatz.
<ls_acctax>-cond_key = <ls_mwdat>-kschl.
<ls_acctax>-acct_key = <ls_mwdat>-ktosl.
<ls_acctax>-direct_tax = abap_true.
<ls_acctax>-itemno_tax = lv_item_no.
APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<ls_curr_amt>).
IF <ls_curr_amt> IS ASSIGNED.
<ls_curr_amt>-itemno_acc = lv_item_no . "+ 1.
<ls_curr_amt>-curr_type = '00'.
<ls_curr_amt>-currency = <gs_data>-currency.
<ls_curr_amt>-amt_doccur = <ls_mwdat>-wmwst.
<ls_curr_amt>-amt_base = <ls_mwdat>-wmwst.
ENDIF.
ENDIF.
ENDLOOP.
* ENDIF.
ENDIF.
***** Extension For HSN Code Field
* ls_extension2-structure = 'HSN_SAC'.
* ls_extension2-valuepart1 = lv_item_no.
* ls_extension2-valuepart2 = <gs_data>-hsn_sac.
* APPEND ls_extension2 TO lt_extension2.
* CLEAR:ls_extension2.
ENDLOOP.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = ls_header
TABLES
accountgl = lt_gl_acc
accountpayable = lt_acc_pay
accounttax = lt_tax
currencyamount = lt_curr
extension2 = lt_extension2
* criteria = lt_criteria
return = lt_return.
* accountwt = lt_accountwt.
LOOP AT lt_return INTO ls_return WHERE type = 'E'.
gs_msg-sno = lv_count.
gs_msg-msg = ls_return-message.
gs_msg-type = 'E'.
APPEND: gs_msg TO gt_msg.
CLEAR: gs_msg.
ENDLOOP.
READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
IF sy-subrc NE 0 AND p_check = abap_false.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_header
IMPORTING
obj_type = lv_obj_typ
obj_key = lv_obj_key
obj_sys = lv_obj_sys
TABLES
accountgl = lt_gl_acc
accountpayable = lt_acc_pay
accounttax = lt_tax
currencyamount = lt_curr
extension2 = lt_extension2
* criteria = lt_criteria
return = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
gs_msg-sno = lv_count.
gs_msg-doc_no = lv_obj_key(10).
gs_msg-gjahr = lv_obj_key+14(4).
gs_msg-type = icon_green_light.
gs_msg-msg = |Document posted successfully:{ lv_obj_key }|.
APPEND gs_msg TO gt_msg.
CLEAR: gs_msg.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT lt_return INTO ls_return WHERE type = 'E'.
gs_msg-sno = lv_count.
gs_msg-msg = ls_return-message.
gs_msg-type = icon_red_light.
APPEND: gs_msg TO gt_msg.
CLEAR: gs_msg.
ENDLOOP.
ENDIF.
ENDIF.
CLEAR: ls_header,
lt_curr,
lt_tax,
lt_extension2,
lt_gl_acc,
lt_acc_pay,
lt_return,
lt_accountwt,
* lt_criteria,
lv_item_no.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form convert_date
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_HEADER_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.
*&---------------------------------------------------------------------*
*& Form DISPLAY_LOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> DISPLAY_LOG
*&---------------------------------------------------------------------*
FORM display_log .
TYPE-POOLS: slis.
DATA: ls_fieldcat TYPE slis_fieldcat_alv,
ls_layout TYPE slis_layout_alv.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: lv_program TYPE sy-repid.
IF gt_msg IS NOT INITIAL.
APPEND VALUE #( fieldname = 'SNO'
col_pos = 1
ref_tabname = 'GT_ALV'
seltext_m = 'Sno' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'TYPE'
col_pos = 2
ref_tabname = 'GT_ALV'
seltext_m = 'Status' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'DOC_NO'
col_pos = 3
ref_tabname = 'GT_ALV'
hotspot = 'X'
seltext_m = 'Document No' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'GJAHR'
col_pos = 4
ref_tabname = 'GT_ALV'
seltext_m = 'Year' ) TO lt_fieldcat.
APPEND VALUE #( fieldname = 'MSG'
col_pos = 5
ref_tabname = 'GT_ALV'
seltext_m = 'Message' ) TO lt_fieldcat.
CLEAR ls_layout.
ls_layout-colwidth_optimize = 'X'.
ls_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 = ls_layout
it_fieldcat = lt_fieldcat
TABLES
t_outtab = gt_msg
EXCEPTIONS
program_error = 1
OTHERS = 2.
ELSE.
MESSAGE 'No errors found' TYPE 'I'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'.
IF rs_selfield-fieldname = 'DOC_NO'.
READ TABLE gt_msg INTO DATA(gs_final) INDEX rs_selfield-tabindex.
IF sy-lsind = 0.
SET PARAMETER ID 'BLN' FIELD gs_final-doc_no.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
ENDCASE.
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 'Company Code',
1 5 0 'Currency',
1 6 0 'Reference',
1 7 0 'Vendor',
1 8 0 'Amount',
1 9 0 'Calculate Tax',
1 10 0 'Business Place',
1 11 0 'Section Code',
1 12 0 'Tax Code',
1 13 0 'Payment Terms',
1 14 0 'Assignment',
1 15 0 'Line Item Text',
1 16 0 'GL Account',
1 17 0 'Order No',
1 18 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.
Comments
Post a Comment