Create dynamic internal table based on CSV file in AL11
REPORT zcust_forecast.
TYPE-POOLS: abap.
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-h01.
PARAMETERS p_pathin TYPE string LOWER CASE
DEFAULT 'input.csv'.
PARAMETERS p_hdr AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b01.
SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-h02.
PARAMETERS: p_excel RADIOBUTTON GROUP rad1 DEFAULT 'X'
USER-COMMAND rad,
p_direct RADIOBUTTON GROUP rad1,
p_log RADIOBUTTON GROUP rad1.
PARAMETERS p_file TYPE localfile LOWER CASE
DEFAULT 'C:\Documents\desktop.csv'
MODIF ID exc.
PARAMETERS p_pathou TYPE string LOWER CASE
DEFAULT 'transform.csv'
MODIF ID dir.
PARAMETERS: p_email TYPE adr6-smtp_addr DEFAULT 'email.com' LOWER CASE MODIF ID mal,
p_subj TYPE so_obj_des DEFAULT 'Errors in the forecast file - Review manually.' MODIF ID mal.
SELECTION-SCREEN END OF BLOCK b02.
AT SELECTION-SCREEN OUTPUT.
* Show only relevant fields based on the radio button option
IF p_excel = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'DIR'.
screen-active = 0.
screen-invisible = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ELSEIF p_direct = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'EXC'.
screen-active = 0.
screen-invisible = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ELSEIF p_log = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'DIR' OR screen-group1 = 'MAL'.
screen-active = 0.
screen-invisible = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
AT SELECTION-SCREEN.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
DATA: l_rc TYPE sy-subrc,
l_window_title TYPE string,
lt_file_table TYPE STANDARD TABLE OF file_table.
l_window_title = 'Source file name'(001).
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = l_window_title
default_extension = 'XLS'
* DEFAULT_FILENAME =
* FILE_FILTER =
* WITH_ENCODING =
initial_directory = 'u:'
* MULTISELECTION =
CHANGING
file_table = lt_file_table
rc = l_rc
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc EQ 0.
DATA(lwa_file_table) = VALUE #( lt_file_table[ 1 ] ).
IF lwa_file_table IS NOT INITIAL.
p_file = lwa_file_table-filename.
ENDIF.
ELSE.
MESSAGE i999(zdialog) WITH 'Error uploading source file'(002).
ENDIF.
START-OF-SELECTION.
PERFORM read_data_from_inputfile USING p_pathin.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form READ_DATA_FROM_INPUTFILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_PATHIN text
*----------------------------------------------------------------------*
FORM read_data_from_inputfile USING lv_pathin.
DATA: lv_string TYPE string,
lt_header TYPE TABLE OF string,
lt_fields TYPE TABLE OF string,
lv_file TYPE string.
DATA: lo_struct TYPE REF TO cl_abap_structdescr,
lo_table TYPE REF TO cl_abap_tabledescr,
lt_comp TYPE abap_component_tab,
ls_comp TYPE abap_componentdescr,
lo_data TYPE REF TO data,
lo_line TYPE REF TO data.
FIELD-SYMBOLS: <it_data> TYPE STANDARD TABLE,
<wa_data> TYPE any.
lv_file = lv_pathin.
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc = 0.
READ DATASET lv_file INTO lv_string.
SPLIT lv_string AT ',' INTO TABLE lt_header.
LOOP AT lt_header INTO DATA(lv_colname).
CLEAR ls_comp.
PERFORM sanitize_fieldname CHANGING lv_colname.
ls_comp-name = lv_colname.
ls_comp-type = cl_abap_elemdescr=>get_string( ).
APPEND ls_comp TO lt_comp.
ENDLOOP.
lo_struct = cl_abap_structdescr=>create( lt_comp ).
lo_table = cl_abap_tabledescr=>create( lo_struct ).
CREATE DATA lo_data TYPE HANDLE lo_table.
ASSIGN lo_data->* TO <it_data>.
CREATE DATA lo_line TYPE HANDLE lo_struct.
ASSIGN lo_line->* TO <wa_data>.
DO.
READ DATASET lv_file INTO lv_string.
IF sy-subrc <> 0.
EXIT.
ENDIF.
CLEAR lt_fields.
CONDENSE lv_string NO-GAPS.
SPLIT lv_string AT ',' INTO TABLE lt_fields.
DO lines( lt_fields ) TIMES.
DATA(lv_idx) = sy-index.
FIELD-SYMBOLS: <fs_comp> TYPE any.
ASSIGN COMPONENT lv_idx OF STRUCTURE <wa_data> TO <fs_comp>.
IF sy-subrc = 0.
READ TABLE lt_fields INDEX lv_idx INTO DATA(lv_value).
<fs_comp> = lv_value.
ENDIF.
ENDDO.
APPEND <wa_data> TO <it_data>.
CLEAR <wa_data>.
ENDDO.
CLOSE DATASET lv_file.
ENDIF.
DATA lo_salv TYPE REF TO cl_salv_table.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_salv
CHANGING
t_table = <it_data> ).
lo_salv->display( ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SANITIZE_FIELDNAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_LV_COLNAME text
*----------------------------------------------------------------------*
FORM sanitize_fieldname CHANGING p_lv_colname.
DATA: cv_name TYPE string,
lv_valid TYPE string,
lv_char TYPE c LENGTH 1,
lv_idx TYPE i.
cv_name = p_lv_colname.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN cv_name WITH ''.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN cv_name WITH ''.
CONDENSE cv_name.
cv_name = to_upper( cv_name ).
lv_valid = ''.
DO strlen( cv_name ) TIMES.
lv_idx = sy-index - 1.
lv_char = cv_name+lv_idx(1).
IF lv_char CA 'ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_'.
CONCATENATE lv_valid lv_char INTO lv_valid.
ENDIF.
ENDDO.
cv_name = lv_valid.
CONDENSE cv_name NO-GAPS.
" max 30 char
IF strlen( cv_name ) > 30.
cv_name = cv_name(30).
ENDIF.
p_lv_colname = cv_name.
ENDFORM.
Comments
Post a Comment