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
*&———————————————————————*
TABLES: t001, bkpf.
TYPES:
BEGIN OF gty_upload,
bukrs    TYPE bkpf–bukrs,
vbeln    TYPE vbrk–vbeln,
gjahr    TYPE bkpf–gjahr,
xref1_hd(1000) TYPE C,“bkpf-xref1_hd,
awkey    TYPE bkpf–awkey,
END OF gty_upload.
TYPES : BEGIN OF gty_alv,
status   TYPE icon–id,
bukrs    TYPE bkpf–bukrs,
vbeln    TYPE vbrk–vbeln,
gjahr    TYPE bkpf–gjahr,
xref1_hd(1000) TYPE C,“bkpf-xref1_hd,
message  TYPE char255,
awkey    TYPE bkpf–awkey,
belnr    TYPE bkpf–belnr,
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.

CONSTANTS: gc_red_light TYPE icon–id VALUE icon_red_light.
CONSTANTS: gc_green_light TYPE icon–id VALUE icon_green_light.

SELECT-OPTIONS: s_bukrs FOR t001–bukrs OBLIGATORY.
PARAMETERS: p_fpath TYPE string OBLIGATORY.
PARAMETERS: p_test TYPE flag AS CHECKBOX.

*&———————————————————————*
*&  Include           /RB9F/FTX_UPD_TAX_INV_NO_F01
*&———————————————————————*
*&———————————————————————*
*&      Form  F4_FILE
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM f4_fpath .
DATA: lv_filename TYPE string, lv_path TYPE string, lv_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 sy–subrc <> 0.
ELSE.
WAIT UP TO 5 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 sy–subrc IS INITIAL AND lt_file IS NOT INITIAL.
DATA(lv_lines) = lines( lt_file ).
READ TABLE lt_file INTO DATA(lv_ext)  INDEX lv_lines.
ENDIF.
IF lv_ext IS NOT INITIAL.
IF   to_lower( lv_ext ) NE ‘xlsx’ .
MESSAGE  text–001 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 sy–subrc 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_lower( lv_ext ) EQ ‘xlsx’ OR to_lower( lv_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 sy–subrc <> 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_woksheetname) INDEX 1.
DATA(lo_data_ref) = lo_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 FIELD–SYMBOL(<gs_data>).
IF sy–tabix = ‘1’.
ELSE.
DO 6 TIMES.
ASSIGN COMPONENT sy–index OF STRUCTURE <gs_data>  TO FIELD–SYMBOL(<fs>).
ASSIGN COMPONENT sy–index OF STRUCTURE gs_disp TO FIELD–SYMBOL(<fs1>).
*        TRANSLATE <fs> USING ‘. ‘.
*        TRANSLATE <fs> USING ‘, ‘.
*        CONDENSE <fs> NO-GAPS.
*        MOVE <fs> TO <fs1>.
<fs1> = <fs>.
ENDDO.
gs_disp–awkey = gs_disp–vbeln.
APPEND gs_disp TO gt_disp.
ENDIF.
ENDLOOP.
ENDFORM.
*&———————————————————————*
*&      Form  SHOW_RESULT
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM show_result .
DATA: lo_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_all( abap_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_optimize( abap_true ).
*   selections
lo_selections = go_salv_table->get_selections( ).

*   set selection mode
lo_selections->set_selection_mode( if_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_column( columnname = ‘STATUS’ ).
go_column->set_short_text( ‘Status’ ).
go_column->set_medium_text( ‘Status’ ).
go_column->set_long_text( ‘Status’ ).

go_column = go_columns->get_column( columnname = ‘MESSAGE’ ).
go_column->set_short_text( ‘Message’ ).
go_column->set_medium_text( ‘Message’ ).
go_column->set_long_text( ‘Message’ ).

go_column = go_columns->get_column( columnname = ‘AWKEY’ ).
go_column->set_technical( ‘X’ ).

go_column = go_columns->get_column( columnname = ‘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 .
DATA: lv_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 bkpf–xref1_hd.
READ TABLE gt_alv INTO DATA(ls_alv_check) WITH KEY status = gc_red_light.
IF sy–subrc = 0.
RETURN.
ENDIF.
LOOP AT gt_alv ASSIGNING FIELD–SYMBOL(<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 sy–subrc = 0.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait = ‘X’.
<lfs_alv>–status = gc_green_light.
<lfs_alv>–message = text–002.
ELSE.
CALL FUNCTION ‘FORMAT_MESSAGE’
EXPORTING
id        = sy–msgid
no        = sy–msgno
v1        = sy–msgv1
v2        = sy–msgv2
v3        = sy–msgv3
v4        = sy–msgv4
IMPORTING
msg       = <lfs_alv>–message
EXCEPTIONS
not_found = 1
OTHERS    = 2.
IF sy–subrc = 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_disp–awkey
INTO TABLE @DATA(lt_bkpf).
IF sy–subrc = 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_alv–status = gc_green_light.
READ TABLE lt_bkpf INTO DATA(ls_bkpf)
WITH KEY bukrs = gs_disp–bukrs gjahr = gs_disp–gjahr awkey = gs_disp–awkey BINARY SEARCH.
IF sy–subrc <> 0.
gs_alv–status = gc_red_light.
gs_alv–message = text–001.
ELSE.
gs_alv–belnr = ls_bkpf–belnr.
ENDIF.

IF gs_alv–status = gc_green_light.
IF strlen( gs_alv–xref1_hd ) > 20.
gs_alv–status = gc_red_light.
gs_alv–message = text–005.
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_code) = gt_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_code–bukrs NOT IN s_bukrs.
lv_f_invalid = abap_true.
EXIT.
ENDIF.
ENDLOOP.
IF lv_f_invalid = abap_true.
MESSAGE text–003 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 sy–subrc = 0.
LOOP AT lt_company_code INTO DATA(ls_company_code).
AUTHORITY-CHECK OBJECT ‘F_BKPF_BUK’
ID ‘BUKRS’ FIELD ls_company_code–bukrs
ID ‘ACTVT’ FIELD ’03’.
IF sy–subrc <> 0.
MESSAGE text–004 && |  | && ls_company_code–bukrs TYPE ‘S’ DISPLAY LIKE ‘E’.
LEAVE LIST-PROCESSING.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*&———————————————————————*
*&      Form  CHECK_TCODE
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM check_tcode .
CONSTANTS: lc_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 sy–subrc <> 0 AND NOT ( sy–tcode = ‘SA38’ OR sy–tcode = ‘SE38’ OR sy–batch = ‘X’ ).
MESSAGE e172(00) WITH lc_tcode.
ENDIF.
ENDFORM.