Upload Tool For Vendor Credit Invoice (FB65) BAPI
Input :
Code :
*&----------------------------------------------------------------------*
*& Report ZFI_VEN_INV_CREDIT_CREATE
*&----------------------------------------------------------------------*
*& Program : ZFI_VEN_INV_CREDIT_CREATE
*& Author : King Of ABAP
*& Created on : 01.01.2024
*& Requested By : FI Functional Consultant
*& Project : ?
*& Transport-No : ?
*& Description : Vendor Credit Memo/Invoice Creation For FB65
*& T-Code : ?
*&----------------------------------------------------------------------*
REPORT zfi_ven_inv_credit_create.
INCLUDE zfi_ven_inv_credit_create_top.
INCLUDE zfi_ven_inv_credit_create_sel.
INCLUDE zfi_ven_inv_credit_create_f01.
START-OF-SELECTION.
*** Get File Data
PERFORM get_file_data.
*** Call Bapi
PERFORM create_bapi.
*** Display Error/Success LOG
PERFORM display_log.
*& Report ZFI_VEN_INV_CREDIT_CREATE
*&----------------------------------------------------------------------*
*& Program : ZFI_VEN_INV_CREDIT_CREATE
*& Author : King Of ABAP
*& Created on : 01.01.2024
*& Requested By : FI Functional Consultant
*& Project : ?
*& Transport-No : ?
*& Description : Vendor Credit Memo/Invoice Creation For FB65
*& T-Code : ?
*&----------------------------------------------------------------------*
REPORT zfi_ven_inv_credit_create.
INCLUDE zfi_ven_inv_credit_create_top.
INCLUDE zfi_ven_inv_credit_create_sel.
INCLUDE zfi_ven_inv_credit_create_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_VEN_INV_CREDIT_CREATE_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
TYPES:BEGIN OF ty_final,
sno TYPE i,
transaction TYPE buscase,
vend_no TYPE lifnr, "newko,
inv_date TYPE bldat, " Document Date
post_date TYPE budat, " Posting Date
xblnr TYPE xblnr,
currency TYPE waers,
bupla TYPE bupla,
hdr_txt TYPE sgtxt,
gl_acc TYPE hkont,
gl_amt TYPE bapidoccur,
taxcode TYPE bseg-mwskz, " Tax Code bseg-mwskz,
assinment TYPE dzuonr,
item_text TYPE sgtxt,
cost_center TYPE kostl,
profit_ctr TYPE prctr,
wt_withcd TYPE wt_withcd,
plant TYPE werks_d,
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.
*& Include ZFI_VEN_INV_CREDIT_CREATE_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
TYPES:BEGIN OF ty_final,
sno TYPE i,
transaction TYPE buscase,
vend_no TYPE lifnr, "newko,
inv_date TYPE bldat, " Document Date
post_date TYPE budat, " Posting Date
xblnr TYPE xblnr,
currency TYPE waers,
bupla TYPE bupla,
hdr_txt TYPE sgtxt,
gl_acc TYPE hkont,
gl_amt TYPE bapidoccur,
taxcode TYPE bseg-mwskz, " Tax Code bseg-mwskz,
assinment TYPE dzuonr,
item_text TYPE sgtxt,
cost_center TYPE kostl,
profit_ctr TYPE prctr,
wt_withcd TYPE wt_withcd,
plant TYPE werks_d,
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.
*&---------------------------------------------------------------------*
*& Include ZFI_VEN_INV_CREDIT_CREATE_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_file TYPE rlgrap-filename OBLIGATORY.
PARAMETERS: p_check AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
SELECTION-SCREEN PUSHBUTTON 1(60) cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREEN END OF BLOCK b2.
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_VEN_INV_CREDIT_CREATE_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_file TYPE rlgrap-filename OBLIGATORY.
PARAMETERS: p_check AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
SELECTION-SCREEN PUSHBUTTON 1(60) cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREEN END OF BLOCK b2.
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_VEN_INV_CREDIT_CREATE_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
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:
lt_header TYPE TABLE OF bapiache09,
ls_header TYPE bapiache09,
lt_gl_acc TYPE TABLE OF bapiacgl09,
ls_gl_acc TYPE bapiacgl09,
lt_acc_pay TYPE TABLE OF bapiacap09,
ls_acc_pay TYPE bapiacap09,
lt_curr TYPE TABLE OF bapiaccr09,
ls_curr TYPE bapiaccr09,
lt_tax TYPE TABLE OF bapiactx09,
ls_tax TYPE bapiactx09,
lt_accountwt TYPE TABLE OF bapiacwt09,
ls_accountwt TYPE bapiacwt09,
lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2,
lt_criteria TYPE bapiackec9_tab.
DATA: lv_obj_typ LIKE bapiache09-obj_type,
lv_obj_key LIKE bapiache09-obj_key,
lv_obj_sys LIKE bapiache09-obj_sys.
*** variable declarations
DATA: lv_item_no TYPE posnr_acc.
*** calculation tax code decalrations
DATA : lv_taxtot TYPE bset-fwste,
lv_taxded TYPE bset-fwste.
DATA : lt_mwdat TYPE TABLE OF rtax1u15.
*** extension fill for posting key
DATA: lt_extension2 TYPE TABLE OF bapiparex,
ls_extension2 TYPE bapiparex.
DATA:lt_extension1 TYPE TABLE OF bapiacextc,
ls_extension1 TYPE bapiacextc.
DATA:lv_amt TYPE wrbtr.
DATA:lv_fiscal_year TYPE gjahr.
*** Constant Declaration
CONSTANTS: c_cc TYPE bukrs VALUE '****'.
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 ls_data.
*** header DATA declarations
DATA(lv_count) = ls_data-sno.
CLEAR:ls_header.
ls_header-username = sy-uname.
ls_header-header_txt = ls_data-hdr_txt.
ls_header-comp_code = c_cc.
ls_header-doc_date = ls_data-inv_date .
PERFORM convert_date USING ls_header-doc_date.
ls_header-pstng_date = ls_data-post_date.
PERFORM convert_date USING ls_header-pstng_date.
IF ls_data-transaction = 'G'. " Vendor Credit Memo
ls_header-doc_type = 'KG'.
ELSEIF ls_data-transaction = 'R'. " Vendor Invoice Normal Document
ls_header-doc_type = 'KR'.
ENDIF.
ls_header-ref_doc_no = ls_data-xblnr.
"Get Fiscal Year
CALL FUNCTION 'GET_CURRENT_YEAR'
EXPORTING
bukrs = c_cc
date = ls_data-post_date
IMPORTING
curry = lv_fiscal_year.
SELECT SINGLE * FROM bkpf INTO @DATA(ls_bkpf)
WHERE xblnr EQ @ls_header-ref_doc_no
AND bukrs EQ @c_cc.
IF sy-subrc EQ 0.
gs_msg-sno = ls_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 = ls_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 = c_cc.
<ls_gl_acc>-profit_ctr = |{ <gs_data>-profit_ctr ALPHA = IN }|.
<ls_gl_acc>-tax_code = <gs_data>-taxcode.
<ls_gl_acc>-businessplace = <gs_data>-bupla.
<ls_gl_acc>-itemno_tax = lv_item_no.
<ls_gl_acc>-alloc_nmbr = <gs_data>-assinment.
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.
IF ls_data-transaction = 'G'.
MULTIPLY <ls_curr>-amt_doccur BY -1.
ENDIF.
ENDIF.
SELECT SINGLE *
FROM ska1
INTO @DATA(ls_ska1)
WHERE saknr = @<ls_gl_acc>-gl_account
AND ktopl = @c_cc.
SELECT SINGLE *
FROM cskb
INTO @DATA(ls_cskb)
WHERE kstar = @<ls_gl_acc>-gl_account
AND kokrs = @c_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_item_no.
<ls_criteria>-fieldname = 'WERKS'.
* <ls_criteria>-character = |{ <gs_data>-profit_ctr ALPHA = IN }|.
<ls_criteria>-character = <gs_data>-profit_ctr.
ELSEIF ls_cskb-katyp = '01'.
<ls_gl_acc>-costcenter = |{ <gs_data>-cost_center ALPHA = IN }|.
ENDIF.
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-businessplace = <gs_data>-bupla.
ls_acc_pay-sectioncode = c_cc.
ls_acc_pay-tax_code = <gs_data>-taxcode.
ls_acc_pay-profit_ctr = |{ <gs_data>-profit_ctr ALPHA = IN }|.
APPEND: ls_acc_pay TO lt_acc_pay.
IF <gs_data>-wt_withcd IS NOT INITIAL.
"With Holding Tax Data
APPEND INITIAL LINE TO lt_accountwt ASSIGNING FIELD-SYMBOL(<ls_accountwt>).
<ls_accountwt>-itemno_acc = lv_item_no.
<ls_accountwt>-wt_type = <gs_data>-wt_withcd.
<ls_accountwt>-wt_code = <gs_data>-wt_withcd.
<ls_accountwt>-bas_amt_tc = <gs_data>-gl_amt.
ENDIF.
CLEAR: lv_taxtot,lv_taxded.
REFRESH:lt_mwdat.
IF <gs_data>-taxcode IS NOT INITIAL.
lv_amt = <gs_data>-gl_amt.
EXPORT lv_bupla FROM <gs_data>-bupla TO MEMORY ID 'BUPLA'.
CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
EXPORTING
i_bukrs = '1983'
i_mwskz = <gs_data>-taxcode
i_waers = '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.
ENDIF.
"Fill Vendor Line Amount
ls_curr-itemno_acc = lv_item_no.
ls_curr-currency = <gs_data>-currency.
ls_curr-amt_doccur = <gs_data>-gl_amt + lv_taxtot.
IF ls_data-transaction = 'R'.
MULTIPLY ls_curr-amt_doccur BY -1.
ENDIF.
APPEND: ls_curr TO lt_curr.
CLEAR ls_curr.
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.
<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.
IF ls_data-transaction = 'G'.
MULTIPLY <ls_curr_amt>-amt_doccur BY -1.
MULTIPLY <ls_curr_amt>-amt_base BY -1.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
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
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
criteria = lt_criteria
return = lt_return
accountwt = lt_accountwt.
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.
WAIT UP TO 2 SECONDS.
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 display_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
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 = 'Serial Number' ) 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'
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
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 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 generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 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 'TRANSACTION',
1 3 0 'VENDOR',
1 4 0 'INVOICE DATE',
1 5 0 'POSTING DATE',
1 6 0 'REF DOC NO',
1 7 0 'CURRENCY',
1 8 0 'BUSINESS PLACE',
1 9 0 'HEDER TEXT',
1 10 0 'GL ACCOUNT',
1 11 0 'GL AMOUNT',
1 12 0 'TAXCODE',
1 13 0 'ASSIGNMENT NUMBER',
1 14 0 'ITEM TEXT',
1 15 0 'COST CENTER',
1 16 0 'PROFIT CENTER',
1 17 0 'WITH HOLDING TAX',
1 18 0 'PLANT'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form err_hdl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 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 fill_cell
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_1
*& --> P_1
*& --> P_0
*& --> P_
*&---------------------------------------------------------------------*
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.
*& Include ZFI_VEN_INV_CREDIT_CREATE_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
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:
lt_header TYPE TABLE OF bapiache09,
ls_header TYPE bapiache09,
lt_gl_acc TYPE TABLE OF bapiacgl09,
ls_gl_acc TYPE bapiacgl09,
lt_acc_pay TYPE TABLE OF bapiacap09,
ls_acc_pay TYPE bapiacap09,
lt_curr TYPE TABLE OF bapiaccr09,
ls_curr TYPE bapiaccr09,
lt_tax TYPE TABLE OF bapiactx09,
ls_tax TYPE bapiactx09,
lt_accountwt TYPE TABLE OF bapiacwt09,
ls_accountwt TYPE bapiacwt09,
lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2,
lt_criteria TYPE bapiackec9_tab.
DATA: lv_obj_typ LIKE bapiache09-obj_type,
lv_obj_key LIKE bapiache09-obj_key,
lv_obj_sys LIKE bapiache09-obj_sys.
*** variable declarations
DATA: lv_item_no TYPE posnr_acc.
*** calculation tax code decalrations
DATA : lv_taxtot TYPE bset-fwste,
lv_taxded TYPE bset-fwste.
DATA : lt_mwdat TYPE TABLE OF rtax1u15.
*** extension fill for posting key
DATA: lt_extension2 TYPE TABLE OF bapiparex,
ls_extension2 TYPE bapiparex.
DATA:lt_extension1 TYPE TABLE OF bapiacextc,
ls_extension1 TYPE bapiacextc.
DATA:lv_amt TYPE wrbtr.
DATA:lv_fiscal_year TYPE gjahr.
*** Constant Declaration
CONSTANTS: c_cc TYPE bukrs VALUE '****'.
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 ls_data.
*** header DATA declarations
DATA(lv_count) = ls_data-sno.
CLEAR:ls_header.
ls_header-username = sy-uname.
ls_header-header_txt = ls_data-hdr_txt.
ls_header-comp_code = c_cc.
ls_header-doc_date = ls_data-inv_date .
PERFORM convert_date USING ls_header-doc_date.
ls_header-pstng_date = ls_data-post_date.
PERFORM convert_date USING ls_header-pstng_date.
IF ls_data-transaction = 'G'. " Vendor Credit Memo
ls_header-doc_type = 'KG'.
ELSEIF ls_data-transaction = 'R'. " Vendor Invoice Normal Document
ls_header-doc_type = 'KR'.
ENDIF.
ls_header-ref_doc_no = ls_data-xblnr.
"Get Fiscal Year
CALL FUNCTION 'GET_CURRENT_YEAR'
EXPORTING
bukrs = c_cc
date = ls_data-post_date
IMPORTING
curry = lv_fiscal_year.
SELECT SINGLE * FROM bkpf INTO @DATA(ls_bkpf)
WHERE xblnr EQ @ls_header-ref_doc_no
AND bukrs EQ @c_cc.
IF sy-subrc EQ 0.
gs_msg-sno = ls_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 = ls_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 = c_cc.
<ls_gl_acc>-profit_ctr = |{ <gs_data>-profit_ctr ALPHA = IN }|.
<ls_gl_acc>-tax_code = <gs_data>-taxcode.
<ls_gl_acc>-businessplace = <gs_data>-bupla.
<ls_gl_acc>-itemno_tax = lv_item_no.
<ls_gl_acc>-alloc_nmbr = <gs_data>-assinment.
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.
IF ls_data-transaction = 'G'.
MULTIPLY <ls_curr>-amt_doccur BY -1.
ENDIF.
ENDIF.
SELECT SINGLE *
FROM ska1
INTO @DATA(ls_ska1)
WHERE saknr = @<ls_gl_acc>-gl_account
AND ktopl = @c_cc.
SELECT SINGLE *
FROM cskb
INTO @DATA(ls_cskb)
WHERE kstar = @<ls_gl_acc>-gl_account
AND kokrs = @c_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_item_no.
<ls_criteria>-fieldname = 'WERKS'.
* <ls_criteria>-character = |{ <gs_data>-profit_ctr ALPHA = IN }|.
<ls_criteria>-character = <gs_data>-profit_ctr.
ELSEIF ls_cskb-katyp = '01'.
<ls_gl_acc>-costcenter = |{ <gs_data>-cost_center ALPHA = IN }|.
ENDIF.
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-businessplace = <gs_data>-bupla.
ls_acc_pay-sectioncode = c_cc.
ls_acc_pay-tax_code = <gs_data>-taxcode.
ls_acc_pay-profit_ctr = |{ <gs_data>-profit_ctr ALPHA = IN }|.
APPEND: ls_acc_pay TO lt_acc_pay.
IF <gs_data>-wt_withcd IS NOT INITIAL.
"With Holding Tax Data
APPEND INITIAL LINE TO lt_accountwt ASSIGNING FIELD-SYMBOL(<ls_accountwt>).
<ls_accountwt>-itemno_acc = lv_item_no.
<ls_accountwt>-wt_type = <gs_data>-wt_withcd.
<ls_accountwt>-wt_code = <gs_data>-wt_withcd.
<ls_accountwt>-bas_amt_tc = <gs_data>-gl_amt.
ENDIF.
CLEAR: lv_taxtot,lv_taxded.
REFRESH:lt_mwdat.
IF <gs_data>-taxcode IS NOT INITIAL.
lv_amt = <gs_data>-gl_amt.
EXPORT lv_bupla FROM <gs_data>-bupla TO MEMORY ID 'BUPLA'.
CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
EXPORTING
i_bukrs = '1983'
i_mwskz = <gs_data>-taxcode
i_waers = '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.
ENDIF.
"Fill Vendor Line Amount
ls_curr-itemno_acc = lv_item_no.
ls_curr-currency = <gs_data>-currency.
ls_curr-amt_doccur = <gs_data>-gl_amt + lv_taxtot.
IF ls_data-transaction = 'R'.
MULTIPLY ls_curr-amt_doccur BY -1.
ENDIF.
APPEND: ls_curr TO lt_curr.
CLEAR ls_curr.
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.
<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.
IF ls_data-transaction = 'G'.
MULTIPLY <ls_curr_amt>-amt_doccur BY -1.
MULTIPLY <ls_curr_amt>-amt_base BY -1.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
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
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
criteria = lt_criteria
return = lt_return
accountwt = lt_accountwt.
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.
WAIT UP TO 2 SECONDS.
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 display_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
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 = 'Serial Number' ) 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'
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
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 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 generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 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 'TRANSACTION',
1 3 0 'VENDOR',
1 4 0 'INVOICE DATE',
1 5 0 'POSTING DATE',
1 6 0 'REF DOC NO',
1 7 0 'CURRENCY',
1 8 0 'BUSINESS PLACE',
1 9 0 'HEDER TEXT',
1 10 0 'GL ACCOUNT',
1 11 0 'GL AMOUNT',
1 12 0 'TAXCODE',
1 13 0 'ASSIGNMENT NUMBER',
1 14 0 'ITEM TEXT',
1 15 0 'COST CENTER',
1 16 0 'PROFIT CENTER',
1 17 0 'WITH HOLDING TAX',
1 18 0 'PLANT'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form err_hdl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 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 fill_cell
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_1
*& --> P_1
*& --> P_0
*& --> P_
*&---------------------------------------------------------------------*
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.
Comments
Post a Comment