Skip to content
Skip to content
Menu
SAP ABAP DWIMAN
  • About
SAP ABAP DWIMAN

Upload Excel File to Internal Table ABAP

By juananda.satria on April 27, 2023April 28, 2023

Potongan program berikut ini berguna untuk melakukan upload file dalam format excel untuk disimpan dalam internal table

TYPES: BEGIN OF gty_data,
         icon TYPE icon_d.
INCLUDE STRUCTURE OF zstructure_excel.
TYPES: END OF gty_data,
       gtt_data TYPE TABLE OF gty_data.

Penjelasan: deklarasi type data gty_data disarankan include structure excel untuk mempermudah pemindahan data dalam proses yang akan dipaparkan di bawah.

FORM f_ac_xl_to_sap  USING    p_file TYPE string
                     CHANGING pct_data TYPE gtt_data.
  DATA:
    lv_filelength    TYPE i,
    lv_headerxstring TYPE xstring,
    lt_records       TYPE solix_tab.

  PERFORM f_xlsx2itab USING p_file CHANGING lv_filelength lv_headerxstring lt_records.
  PERFORM f_itab2xstring USING lv_filelength lt_records CHANGING lv_headerxstring .

  PERFORM f_xstring2data USING lv_headerxstring CHANGING pct_data.

  PERFORM f_validation_data CHANGING pct_data.

ENDFORM.

penjelasan:

p_file = filename -> silakan merujuk ke post berikut untuk mendapatkan cara membaca filename KLIK DI SINI

gtt_data = tipe data internal table hasil

FORM f_xlsx2itab  USING    p_file TYPE string
                  CHANGING pc_filelength TYPE i
                           pc_headerxstring TYPE xstring
                           pct_records TYPE solix_tab.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_file
      filetype                = 'BIN'
    IMPORTING
      filelength              = pc_filelength
      header                  = pc_headerxstring
    TABLES
      data_tab                = pct_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.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    LEAVE LIST-PROCESSING.
  ENDIF.
ENDFORM.

Penjelasan:

BIN = file bertipe binary

pada bagian ini hasil yang akan digunakan pada proses selanjutnya adalah pc_filelength dan internal table pct_records

FORM f_itab2xstring  USING    p_filelength TYPE i
                              pt_records TYPE solix_tab
                     CHANGING pc_headerxstring TYPE xstring.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = p_filelength
    IMPORTING
      buffer       = pc_headerxstring
    TABLES
      binary_tab   = pt_records
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    LEAVE LIST-PROCESSING.
  ENDIF.
ENDFORM.

Penjelasan: SCMS_BINARY_TO_XSTRING berguna untuk meng-convert data binary yang berada dalam internal table pt_records menjadi format xstring

FORM f_xstring2data USING    p_headerxstring TYPE xstring
                    CHANGING pct_data TYPE gtt_data.
  DATA:
    lv_filename_str TYPE string,
    lo_excel_ref    TYPE REF TO cl_fdt_xl_spreadsheet,
    lt_worksheets   TYPE STANDARD TABLE OF string,
    lv_err_msg      TYPE string,
    lv_idx          TYPE sy-index,
    lv_waers        TYPE waers,
    lo_exc          TYPE REF TO cx_fdt_excel_core,
    lo_data_raw     TYPE REF TO data,
    ls_data         TYPE gty_data,
    ls_xlsx         TYPE zstructure_excel.

  FIELD-SYMBOLS:
    <lft_data_raw> TYPE STANDARD TABLE.

  TRY .
      CREATE OBJECT lo_excel_ref
        EXPORTING
          document_name = lv_filename_str
          xdocument     = p_headerxstring.

      IF lo_excel_ref IS NOT INITIAL.
        lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
          IMPORTING
            worksheet_names = lt_worksheets
        ).
      ENDIF.

      IF lt_worksheets IS NOT INITIAL.

        " reading all worksheets
        LOOP AT lt_worksheets INTO DATA(lv_worksheet).
          lv_idx = 5. " initial row
          lo_data_raw = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet( lv_worksheet ).
          ASSIGN lo_data_raw->* TO <lft_data_raw>.
          IF sy-subrc EQ 0.
            TRANSLATE lv_worksheet TO UPPER CASE.

            LOOP AT <lft_data_raw> ASSIGNING FIELD-SYMBOL(<lfs_data_raw>) FROM lv_idx.
              APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
              DO.
                ASSIGN COMPONENT sy-index OF STRUCTURE <lfs_data_raw> TO FIELD-SYMBOL(<lfs_raw>).
                IF sy-subrc NE 0.
                  EXIT.
                ELSE.
                  ASSIGN COMPONENT sy-index OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(<lfs_dest>).

                  " converting value
                  CASE sy-index.
                    WHEN 4. " insert leading zero
                      <lfs_dest> = |{ <lfs_raw> ALPHA = IN }|.
                    WHEN 11 OR 12. " date
                      PERFORM f_convert_date USING <lfs_raw> CHANGING <lfs_dest>.
                    WHEN 21. " UoM
                      PERFORM f_convert_uom_in USING <lfs_raw> CHANGING <lfs_dest>.
                    WHEN 31 OR 32. " Currency
                      ASSIGN COMPONENT 7 OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(<lfs_waers>). " column 7 of excel is currency key
                      IF <lfs_waers> IS INITIAL.
                        <lfs_waers> = lv_waers.
                      ELSE.
                        lv_waers = <lfs_waers>.
                      ENDIF.
                      PERFORM f_convert_curr_in USING <lfs_raw> <lfs_waers> CHANGING <lfs_dest>.
                    WHEN OTHERS.
                      <lfs_dest> = <lfs_raw>.
                  ENDCASE.
                ENDIF.
              ENDDO.
              MOVE-CORRESPONDING ls_xlsx TO <lfs_data>.
            ENDLOOP.
          ENDIF.
        ENDLOOP.
      ENDIF.

    CATCH cx_fdt_excel_core INTO lo_exc.
      lv_err_msg = lo_exc->get_text( ).
      MESSAGE lv_err_msg TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
  ENDTRY.

ENDFORM.

Penjelasan: subroutine ini akan membaca satu per satu sheet dari excel yang diupload untuk disimpan ke dalam internal table pct_data.

NOTES: susunan antara structure workarea excel dan kolom excel file yang di-upload harus sama

FORM f_validation_data  CHANGING pct_data TYPE gtt_data.
  LOOP AT pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
        IF <lfs_data>-status = 'ERROR'.
          <lfs_data>-remarks = 'ERROR DATA'.
          ls_grp_h-icon = icon_red_light.
          CONTINUE.
        ENDIF.
  ENDLOOP.
ENDFORM.

Penjelasan: subroutine ini berfungsi untuk memvalidasi data sebelum diolah lebih lanjut

FORM f_convert_date  USING p_date_string TYPE string CHANGING pc_date TYPE datum .

  DATA: lv_convert_date(10) TYPE c.

  CHECK p_date_string IS NOT INITIAL.

  lv_convert_date = p_date_string .

  "date format YYYY/MM/DD
  FIND REGEX '^\d{4}[/|-]\d{1,2}[/|-]\d{1,2}$' IN lv_convert_date ##REGEX_POSIX.
  IF sy-subrc = 0.
    CALL FUNCTION '/SAPDMC/LSM_DATE_CONVERT'
      EXPORTING
        date_in             = lv_convert_date
        date_format_in      = 'DYMD'
        to_output_format    = ' '
        to_internal_format  = 'X'
      IMPORTING
        date_out            = lv_convert_date
      EXCEPTIONS
        illegal_date        = 1
        illegal_date_format = 2
        no_user_date_format = 3
        OTHERS              = 4.
  ELSE.

    " date format DD/MM/YYYY or DD-MM-YYYY or DD.MM.YYYY

    FIND REGEX '^\d{1,2}[/|-|.]\d{1,2}[/|-|.]\d{4}$' IN lv_convert_date ##REGEX_POSIX.
    IF sy-subrc = 0.
      CALL FUNCTION '/SAPDMC/LSM_DATE_CONVERT'
        EXPORTING
          date_in             = lv_convert_date
          date_format_in      = 'DDMY'
          to_output_format    = ' '
          to_internal_format  = 'X'
        IMPORTING
          date_out            = lv_convert_date
        EXCEPTIONS
          illegal_date        = 1
          illegal_date_format = 2
          no_user_date_format = 3
          OTHERS              = 4.

    ENDIF.
  ENDIF.

  IF sy-subrc = 0.
    pc_date = lv_convert_date .
  ELSE.
    CLEAR pc_date.
  ENDIF.

ENDFORM.

Penjelasan: subroutine ini untuk meng-convert date berformat DD.MM.YYYY menjadi YYYYMMDD (format datum SAP)

FORM f_convert_uom_in  USING    p_in
                       CHANGING pc_out.

  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
    EXPORTING
      input          = p_in
    IMPORTING
      output         = pc_out
    EXCEPTIONS
      unit_not_found = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

Penjelasan: subroutine ini berfungsi untuk meng-convert nilai UoM external menjadi nilai UoM internal

FORM f_convert_curr_in  USING    p_in
                                 p_waers
                        CHANGING pc_out.
  IF p_waers EQ 'IDR'.
    pc_out = p_in / 100.
  ELSE.
    pc_out = p_in.
  ENDIF.
ENDFORM.

Penjelasan: subroutine ini berfungsi untuk meng-convert nilai amount currency external menjadi nilai amount internal

Post navigation

F4 Search Help File
ALV using lcl_alv_grid

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • SAP ABAP – Generate Fiori URL
  • SAP ABAP – Workflow Agents CDS
  • SAP ABAP – Workflow Level with Table Function
  • SAP ABAP – Download ALV to Excel with Total and Subtotal
  • SAP ABAP – BDC Template

Recent Comments

  1. SAP ABAP – Simple Interface FTP Inbound (SAP Consume File From FTP) – SAP ABAP DWIMAN on SAP ABAP – String Encode & Decode BASE64
  2. Upload file – SAP ABAP DWIMAN on F4 Search Help File

Archives

  • May 2025
  • August 2024
  • June 2024
  • May 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • May 2023
  • April 2023

Categories

  • Uncategorized
©2026 SAP ABAP DWIMAN | WordPress Theme by SuperbThemes.com