Mass upload program to update VAT Invoice No. in FI document

Main program:

REPORT /rb9f/ftx_upd_tax_inv_no.

INCLUDE /rb9f/ftx_upd_tax_inv_no_top.

INCLUDE /rb9f/ftx_upd_tax_inv_no_f01.

INITIALIZATION.
PERFORM check_tcode.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fpath.
PERFORM f4_fpath.

AT SELECTION-SCREEN ON p_fpath .
PERFORM check_file_extension.

START-OF-SELECTION.
PERFORM file_upload.
PERFORM authorization.
PERFORM validation.
IF p_test IS INITIAL.
PERFORM process.
ENDIF.

END-OF-SELECTION.
PERFORM show_result.

*&———————————————————————*
*&  Include           /RB9F/FTX_UPD_TAX_INV_NO_TOP
*&———————————————————————*
TABLESt001bkpf.
TYPES:
BEGIN OF gty_upload,
bukrs    TYPE bkpfbukrs,
vbeln    TYPE vbrkvbeln,
gjahr    TYPE bkpfgjahr,
xref1_hd(1000TYPE C,“bkpf-xref1_hd,
awkey    TYPE bkpfawkey,
END OF gty_upload.
TYPES BEGIN OF gty_alv,
status   TYPE iconid,
bukrs    TYPE bkpfbukrs,
vbeln    TYPE vbrkvbeln,
gjahr    TYPE bkpfgjahr,
xref1_hd(1000TYPE C,“bkpf-xref1_hd,
message  TYPE char255,
awkey    TYPE bkpfawkey,
belnr    TYPE bkpfbelnr,
END OF gty_alv.
*Data Declaration
DATA gt_disp TYPE STANDARD TABLE OF gty_upload .
DATA :gs_disp       TYPE gty_upload,
gt_alv        TYPE STANDARD TABLE OF gty_alv,
gs_alv        TYPE gty_alv,
go_salv_table TYPE REF TO cl_salv_table,
go_columns    TYPE REF TO cl_salv_columns_table,
go_column     TYPE REF TO cl_salv_column.

DATA gt_itab TYPE STANDARD TABLE OF alsmex_tabline WITH DEFAULT KEY.

CONSTANTSgc_red_light TYPE iconid VALUE icon_red_light.
CONSTANTSgc_green_light TYPE iconid VALUE icon_green_light.

SELECT-OPTIONSs_bukrs FOR t001bukrs OBLIGATORY.
PARAMETERSp_fpath TYPE string OBLIGATORY.
PARAMETERSp_test TYPE flag AS CHECKBOX.

*&———————————————————————*
*&  Include           /RB9F/FTX_UPD_TAX_INV_NO_F01
*&———————————————————————*
*&———————————————————————*
*&      Form  F4_FILE
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM f4_fpath .
DATAlv_filename TYPE stringlv_path TYPE stringlv_fullpath TYPE string.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
prompt_on_overwrite       ‘ ‘
CHANGING
filename                  lv_filename
path                      lv_path
fullpath                  lv_fullpath
EXCEPTIONS
cntl_error                1
error_no_gui              2
not_supported_by_gui      3
invalid_default_file_name 4
OTHERS                    5.
IF sysubrc <> 0.
ELSE.
WAIT UP TO SECONDS.
ENDIF.
p_fpath lv_fullpath.
ENDFORM.
*&———————————————————————*
*&      Form  CHECK_FILE_EXTENSION
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM check_file_extension .
IF p_fpath IS NOT INITIAL.
SPLIT  p_fpath AT ‘.’ INTO TABLE DATA(lt_file).
IF sysubrc IS INITIAL AND lt_file IS NOT INITIAL.
DATA(lv_lineslineslt_file ).
READ TABLE lt_file INTO DATA(lv_ext)  INDEX lv_lines.
ENDIF.
IF lv_ext IS NOT INITIAL.
IF   to_lowerlv_ext NE ‘xlsx’ .
MESSAGE  text001 TYPE ‘E’ DISPLAY LIKE ‘S’.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&———————————————————————*
*&      Form  FILE_UPLOAD
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM file_upload .
DATA ls_data          TYPE REF TO data,
lv_lines         TYPE i,
lt_records       TYPE solix_tab,
lv_headerxstring TYPE xstring,
lv_filelength    TYPE i,
lv_filetype      TYPE char10,
lt_file          TYPE TABLE OF string.
FIELD-SYMBOLS <gt_data>       TYPE STANDARD TABLE .

IF  p_fpath IS NOT INITIAL.
SPLIT  p_fpath AT ‘.’ INTO TABLE lt_file.
IF sysubrc IS INITIAL AND lt_file IS NOT INITIAL.
LOOP AT lt_file INTO DATA(ls_file).
lv_lines lv_lines + 1.
ENDLOOP.
READ TABLE lt_file INTO DATA(lv_ext)  INDEX lv_lines.
ENDIF.

ENDIF.
IF lv_ext IS NOT INITIAL.
IF   to_lowerlv_ext EQ ‘xlsx’ OR to_lowerlv_ext EQ ‘xls’.
lv_filetype ‘BIN’.
ENDIF.
ENDIF.
IF lv_filetype EQ ‘BIN’.
CALL FUNCTION ‘GUI_UPLOAD’ ##FM_SUBRC_OK
EXPORTING
filename                p_fpath
filetype                lv_filetype
IMPORTING
filelength              lv_filelength
header                  lv_headerxstring
TABLES
data_tab                lt_records
EXCEPTIONS
file_open_error         1
file_read_error         2
no_batch                3
gui_refuse_filetransfer 4
invalid_type            5
no_authority            6
unknown_error           7
bad_data_format         8
header_not_allowed      9
separator_not_allowed   10
header_too_long         11
unknown_dp_error        12
access_denied           13
dp_out_of_memory        14
disk_full               15
dp_timeout              16
OTHERS                  17.
CALL FUNCTION ‘SCMS_BINARY_TO_XSTRING’
EXPORTING
input_length lv_filelength
IMPORTING
buffer       lv_headerxstring
TABLES
binary_tab   lt_records
EXCEPTIONS
failed       1
OTHERS       2.
IF sysubrc <> 0.
“Implement suitable error handling here
ENDIF.

DATA lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .
TRY .
lo_excel_ref NEW cl_fdt_xl_spreadsheet(
document_name =  p_fpath
xdocument     lv_headerxstring
mime_type      =  ‘.XLSX’ .
CATCH cx_fdt_excel_core.
“Implement suitable error handling here
ENDTRY .
“Get List of Worksheets
lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
IMPORTING
worksheet_names DATA(lt_worksheets).
IF NOT lt_worksheets IS INITIAL.

READ TABLE lt_worksheets INTO DATA(lv_woksheetnameINDEX 1.
DATA(lo_data_reflo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
lv_woksheetname ).
“now you have excel work sheet data in dyanmic internal table
ASSIGN lo_data_ref->TO <gt_data>.
ENDIF.
ENDIF.
LOOP AT <gt_data> ASSIGNING FIELDSYMBOL(<gs_data>).
IF sytabix ‘1’.
ELSE.
DO TIMES.
ASSIGN COMPONENT syindex OF STRUCTURE <gs_data>  TO FIELDSYMBOL(<fs>).
ASSIGN COMPONENT syindex OF STRUCTURE gs_disp TO FIELDSYMBOL(<fs1>).
*        TRANSLATE <fs> USING ‘. ‘.
*        TRANSLATE <fs> USING ‘, ‘.
*        CONDENSE <fs> NO-GAPS.
*        MOVE <fs> TO <fs1>.
<fs1> <fs>.
ENDDO.
gs_dispawkey gs_dispvbeln.
APPEND gs_disp TO gt_disp.
ENDIF.
ENDLOOP.
ENDFORM.
*&———————————————————————*
*&      Form  SHOW_RESULT
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM show_result .
DATAlo_selections TYPE REF TO cl_salv_selections.
DATA lo_filters TYPE REF TO cl_salv_filters.      ” filter reference
DATA lo_filter TYPE salv_t_filter_ref.        ” Filter table
DATA ls_filter TYPE salv_s_filter_ref.
DATA lo_ref_func TYPE REF TO cl_salv_functions.   “filter row

DATA lr_func TYPE REF TO   cl_salv_functions_list.
*  IF gt_alv IS NOT INITIAL.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table go_salv_table
CHANGING
t_table      gt_alv ).
CATCH cx_salv_msg.

ENDTRY.
*Functions
lo_ref_func go_salv_table->get_functions).
lr_func go_salv_table->get_functions).
*          lr_func->set_group_sort( abap_true ).
lr_func->set_allabap_true ).
*Filters
” get filters
lo_filters go_salv_table->get_filters).
*   set the columns technical

go_columns go_salv_table->get_columns).
PERFORM change_columns_attributes.
go_columns->set_optimizeabap_true ).
*   selections
lo_selections go_salv_table->get_selections).

*   set selection mode
lo_selections->set_selection_modeif_salv_c_selection_mode=>row_column ).
**   Set zebra layout
*    set_layout( ).

*   Display the table
go_salv_table->display).

*  ENDIF.
ENDFORM.
*&———————————————————————*
*&      Form  CHANGE_COLUMNS_ATTRIBUTES
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM change_columns_attributes .
” cambia el nombre a una columna…
DATA not_found TYPE REF TO cx_salv_not_found.
TRY.
go_column go_columns->get_columncolumnname ‘STATUS’ ).
go_column->set_short_text‘Status’ ).
go_column->set_medium_text‘Status’ ).
go_column->set_long_text‘Status’ ).

go_column go_columns->get_columncolumnname ‘MESSAGE’ ).
go_column->set_short_text‘Message’ ).
go_column->set_medium_text‘Message’ ).
go_column->set_long_text‘Message’ ).

go_column go_columns->get_columncolumnname ‘AWKEY’ ).
go_column->set_technical‘X’ ).

go_column go_columns->get_columncolumnname ‘BELNR’ ).
go_column->set_technical‘X’ ).
CATCH cx_salv_not_found INTO not_found.
” error handling
ENDTRY.
ENDFORM.
*&———————————————————————*
*&      Form  PROCESS
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM process .
DATAlv_bukrs  TYPE bukrs,
lv_belnr  TYPE belnr_d,
lv_gjahr  TYPE gjahr,
lt_accchg TYPE STANDARD TABLE OF accchg,
ls_accchg TYPE accchg.
DATA lv_xref1_hd TYPE bkpfxref1_hd.
READ TABLE gt_alv INTO DATA(ls_alv_checkWITH KEY status gc_red_light.
IF sysubrc 0.
RETURN.
ENDIF.
LOOP AT gt_alv ASSIGNING FIELDSYMBOL(<lfs_alv>).
CLEAR lt_accchg.
lv_bukrs <lfs_alv>bukrs.
lv_gjahr <lfs_alv>gjahr.
lv_belnr <lfs_alv>belnr.
lv_xref1_hd <lfs_alv>xref1_hd.
APPEND VALUE #fdname ‘XREF1_HD’ newval lv_xref1_hd TO lt_accchg.
CALL FUNCTION ‘FI_DOCUMENT_CHANGE’
EXPORTING
i_bukrs              lv_bukrs
i_belnr              lv_belnr
i_gjahr              lv_gjahr
TABLES
t_accchg             lt_accchg
EXCEPTIONS
no_reference         1
no_document          2
many_documents       3
wrong_input          4
overwrite_creditcard 5
OTHERS               6.
IF sysubrc 0.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait ‘X’.
<lfs_alv>status gc_green_light.
<lfs_alv>message text002.
ELSE.
CALL FUNCTION ‘FORMAT_MESSAGE’
EXPORTING
id        symsgid
no        symsgno
v1        symsgv1
v2        symsgv2
v3        symsgv3
v4        symsgv4
IMPORTING
msg       <lfs_alv>message
EXCEPTIONS
not_found 1
OTHERS    2.
IF sysubrc 0.

ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*&———————————————————————*
*&      Form  VALIDATION
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM validation .
PERFORM company_code_validation.
IF gt_disp IS NOT INITIAL.
SELECT
bukrs,
belnr,
gjahr,
awkey
FROM bkpf
FOR ALL ENTRIES IN @gt_disp
WHERE bkpf~awkey @gt_dispawkey
INTO TABLE @DATA(lt_bkpf).
IF sysubrc 0.
SORT lt_bkpf BY bukrs gjahr awkey.
ENDIF.
ENDIF.
LOOP AT gt_disp INTO gs_disp.
CLEAR gs_alv.
MOVE-CORRESPONDING gs_disp TO gs_alv.
gs_alvstatus gc_green_light.
READ TABLE lt_bkpf INTO DATA(ls_bkpf)
WITH KEY bukrs gs_dispbukrs gjahr gs_dispgjahr awkey gs_dispawkey BINARY SEARCH.
IF sysubrc <> 0.
gs_alvstatus gc_red_light.
gs_alvmessage text001.
ELSE.
gs_alvbelnr ls_bkpfbelnr.
ENDIF.

IF gs_alvstatus gc_green_light.
IF strlengs_alvxref1_hd 20.
gs_alvstatus gc_red_light.
gs_alvmessage text005.
ENDIF.
ENDIF.

APPEND gs_alv TO gt_alv.
ENDLOOP.
ENDFORM.
*&———————————————————————*
*&      Form  COMPANY_CODE_VALIDATION
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM company_code_validation .
DATA lv_f_invalid TYPE boolean.
DATA(lt_company_codegt_disp.
SORT lt_company_code BY bukrs.
DELETE ADJACENT DUPLICATES FROM lt_company_code COMPARING bukrs.
lv_f_invalid abap_false.
LOOP AT lt_company_code INTO DATA(ls_company_code).
IF ls_company_codebukrs NOT IN s_bukrs.
lv_f_invalid abap_true.
EXIT.
ENDIF.
ENDLOOP.
IF lv_f_invalid abap_true.
MESSAGE text003 TYPE ‘S’ DISPLAY LIKE ‘E’.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&———————————————————————*
*&      Form  AUTHORIZATION
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM authorization .
SELECT
bukrs
FROM t001
WHERE bukrs IN @s_bukrs
INTO TABLE @DATA(lt_company_code).
IF sysubrc 0.
LOOP AT lt_company_code INTO DATA(ls_company_code).
AUTHORITY-CHECK OBJECT ‘F_BKPF_BUK’
ID ‘BUKRS’ FIELD ls_company_codebukrs
ID ‘ACTVT’ FIELD ’03’.
IF sysubrc <> 0.
MESSAGE text004 && |  | && ls_company_codebukrs TYPE ‘S’ DISPLAY LIKE ‘E’.
LEAVE LIST-PROCESSING.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*&———————————————————————*
*&      Form  CHECK_TCODE
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM check_tcode .
CONSTANTSlc_tcode TYPE char20 VALUE ‘/RB9F/FTX_UPD_TINV’.
CALL FUNCTION ‘AUTHORITY_CHECK_TCODE’
EXPORTING
tcode  lc_tcode
EXCEPTIONS
ok     0
not_ok 2
OTHERS 3.
IF sysubrc <> AND NOT sytcode ‘SA38’ OR sytcode ‘SE38’ OR sybatch ‘X’ ).
MESSAGE e172(00WITH lc_tcode.
ENDIF.
ENDFORM.