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.