Create dynamic internal table based on CSV file in AL11

 REPORT zcust_forecast.


TYPE-POOLSabap.

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.

PARAMETERSp_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.

PARAMETERSp_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.
  DATAl_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_tableVALUE #lt_file_table[ ).
    IF lwa_file_table IS NOT INITIAL.
      p_file lwa_file_table-filename.
    ENDIF.
  ELSE.
    MESSAGE i999(zdialogWITH '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.

  DATAlv_string TYPE string,
        lt_header TYPE TABLE OF string,
        lt_fields TYPE TABLE OF string,
        lv_file   TYPE string.

  DATAlo_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=>createlt_comp ).
    lo_table  cl_abap_tabledescr=>createlo_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 lineslt_fields TIMES.
        DATA(lv_idxsy-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.

  DATAcv_name TYPE string,
       lv_valid TYPE string,
       lv_char TYPE 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_uppercv_name ).
  lv_valid ''.

  DO strlencv_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 strlencv_name 30.
    cv_name cv_name(30).
  ENDIF.

  p_lv_colname cv_name.

ENDFORM.

Comments

Popular posts from this blog

Add additional fields in VA05 report

FAGLL03 / FBL1N / FBL3N / FBL5N not showing custom fields

Totals table for ACDOCA in S/4 HANA - ACDOCT