{"id":22,"date":"2023-04-27T13:38:18","date_gmt":"2023-04-27T13:38:18","guid":{"rendered":"https:\/\/sapabap.dwimansolution.com\/?p=22"},"modified":"2023-04-28T04:38:00","modified_gmt":"2023-04-28T04:38:00","slug":"upload-file","status":"publish","type":"post","link":"https:\/\/sapabap.dwimansolution.com\/index.php\/2023\/04\/27\/upload-file\/","title":{"rendered":"Upload Excel File to Internal Table ABAP"},"content":{"rendered":"\n<p>Potongan program berikut ini berguna untuk melakukan upload file dalam format excel untuk disimpan dalam internal table<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TYPES: BEGIN OF gty_data,\n         icon TYPE icon_d.\nINCLUDE STRUCTURE OF zstructure_excel.\nTYPES: END OF gty_data,\n       gtt_data TYPE TABLE OF gty_data.<\/code><\/pre>\n\n\n\n<p>Penjelasan: deklarasi type data gty_data disarankan include structure excel untuk mempermudah pemindahan data dalam proses yang akan dipaparkan di bawah.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_ac_xl_to_sap  USING    p_file TYPE string\n                     CHANGING pct_data TYPE gtt_data.\n  DATA:\n    lv_filelength    TYPE i,\n    lv_headerxstring TYPE xstring,\n    lt_records       TYPE solix_tab.\n\n  PERFORM f_xlsx2itab USING p_file CHANGING lv_filelength lv_headerxstring lt_records.\n  PERFORM f_itab2xstring USING lv_filelength lt_records CHANGING lv_headerxstring .\n\n  PERFORM f_xstring2data USING lv_headerxstring CHANGING pct_data.\n\n  PERFORM f_validation_data CHANGING pct_data.\n\nENDFORM.<\/code><\/pre>\n\n\n\n<p>penjelasan:<\/p>\n\n\n\n<p>p_file = filename -&gt; silakan merujuk ke post berikut untuk mendapatkan cara membaca filename <a href=\"https:\/\/sapabap.dwimansolution.com\/index.php\/2023\/04\/27\/f4-search-help-file\/\" data-type=\"URL\" data-id=\"https:\/\/sapabap.dwimansolution.com\/index.php\/2023\/04\/27\/f4-search-help-file\/\">KLIK DI SINI<\/a> <\/p>\n\n\n\n<p>gtt_data = tipe data internal table hasil<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_xlsx2itab  USING    p_file TYPE string\n                  CHANGING pc_filelength TYPE i\n                           pc_headerxstring TYPE xstring\n                           pct_records TYPE solix_tab.\n  CALL FUNCTION 'GUI_UPLOAD'\n    EXPORTING\n      filename                = p_file\n      filetype                = 'BIN'\n    IMPORTING\n      filelength              = pc_filelength\n      header                  = pc_headerxstring\n    TABLES\n      data_tab                = pct_records\n    EXCEPTIONS\n      file_open_error         = 1\n      file_read_error         = 2\n      no_batch                = 3\n      gui_refuse_filetransfer = 4\n      invalid_type            = 5\n      no_authority            = 6\n      unknown_error           = 7\n      bad_data_format         = 8\n      header_not_allowed      = 9\n      separator_not_allowed   = 10\n      header_too_long         = 11\n      unknown_dp_error        = 12\n      access_denied           = 13\n      dp_out_of_memory        = 14\n      disk_full               = 15\n      dp_timeout              = 16\n      OTHERS                  = 17.\n  IF sy-subrc &lt;&gt; 0.\n    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'\n          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.\n    LEAVE LIST-PROCESSING.\n  ENDIF.\nENDFORM.<\/code><\/pre>\n\n\n\n<p>Penjelasan:<\/p>\n\n\n\n<p>BIN = file bertipe binary<\/p>\n\n\n\n<p>pada bagian ini hasil yang akan digunakan pada proses selanjutnya adalah <strong>pc_filelength<\/strong> dan internal table <strong>pct_records<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_itab2xstring  USING    p_filelength TYPE i\n                              pt_records TYPE solix_tab\n                     CHANGING pc_headerxstring TYPE xstring.\n\n  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'\n    EXPORTING\n      input_length = p_filelength\n    IMPORTING\n      buffer       = pc_headerxstring\n    TABLES\n      binary_tab   = pt_records\n    EXCEPTIONS\n      failed       = 1\n      OTHERS       = 2.\n  IF sy-subrc &lt;&gt; 0.\n    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'\n          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.\n    LEAVE LIST-PROCESSING.\n  ENDIF.\nENDFORM.<\/code><\/pre>\n\n\n\n<p>Penjelasan: SCMS_BINARY_TO_XSTRING berguna untuk meng-convert data binary yang berada dalam internal table pt_records menjadi format xstring<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_xstring2data USING    p_headerxstring TYPE xstring\n                    CHANGING pct_data TYPE gtt_data.\n  DATA:\n    lv_filename_str TYPE string,\n    lo_excel_ref    TYPE REF TO cl_fdt_xl_spreadsheet,\n    lt_worksheets   TYPE STANDARD TABLE OF string,\n    lv_err_msg      TYPE string,\n    lv_idx          TYPE sy-index,\n    lv_waers        TYPE waers,\n    lo_exc          TYPE REF TO cx_fdt_excel_core,\n    lo_data_raw     TYPE REF TO data,\n    ls_data         TYPE gty_data,\n    ls_xlsx         TYPE zstructure_excel.\n\n  FIELD-SYMBOLS:\n    &lt;lft_data_raw&gt; TYPE STANDARD TABLE.\n\n  TRY .\n      CREATE OBJECT lo_excel_ref\n        EXPORTING\n          document_name = lv_filename_str\n          xdocument     = p_headerxstring.\n\n      IF lo_excel_ref IS NOT INITIAL.\n        lo_excel_ref-&gt;if_fdt_doc_spreadsheet~get_worksheet_names(\n          IMPORTING\n            worksheet_names = lt_worksheets\n        ).\n      ENDIF.\n\n      IF lt_worksheets IS NOT INITIAL.\n\n        \" reading all worksheets\n        LOOP AT lt_worksheets INTO DATA(lv_worksheet).\n          lv_idx = 5. \" initial row\n          lo_data_raw = lo_excel_ref-&gt;if_fdt_doc_spreadsheet~get_itab_from_worksheet( lv_worksheet ).\n          ASSIGN lo_data_raw-&gt;* TO &lt;lft_data_raw&gt;.\n          IF sy-subrc EQ 0.\n            TRANSLATE lv_worksheet TO UPPER CASE.\n\n            LOOP AT &lt;lft_data_raw&gt; ASSIGNING FIELD-SYMBOL(&lt;lfs_data_raw&gt;) FROM lv_idx.\n              APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(&lt;lfs_data&gt;).\n              DO.\n                ASSIGN COMPONENT sy-index OF STRUCTURE &lt;lfs_data_raw&gt; TO FIELD-SYMBOL(&lt;lfs_raw&gt;).\n                IF sy-subrc NE 0.\n                  EXIT.\n                ELSE.\n                  ASSIGN COMPONENT sy-index OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(&lt;lfs_dest&gt;).\n\n                  \" converting value\n                  CASE sy-index.\n                    WHEN 4. \" insert leading zero\n                      &lt;lfs_dest&gt; = |{ &lt;lfs_raw&gt; ALPHA = IN }|.\n                    WHEN 11 OR 12. \" date\n                      PERFORM f_convert_date USING &lt;lfs_raw&gt; CHANGING &lt;lfs_dest&gt;.\n                    WHEN 21. \" UoM\n                      PERFORM f_convert_uom_in USING &lt;lfs_raw&gt; CHANGING &lt;lfs_dest&gt;.\n                    WHEN 31 OR 32. \" Currency\n                      ASSIGN COMPONENT 7 OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(&lt;lfs_waers&gt;). \" column 7 of excel is currency key\n                      IF &lt;lfs_waers&gt; IS INITIAL.\n                        &lt;lfs_waers&gt; = lv_waers.\n                      ELSE.\n                        lv_waers = &lt;lfs_waers&gt;.\n                      ENDIF.\n                      PERFORM f_convert_curr_in USING &lt;lfs_raw&gt; &lt;lfs_waers&gt; CHANGING &lt;lfs_dest&gt;.\n                    WHEN OTHERS.\n                      &lt;lfs_dest&gt; = &lt;lfs_raw&gt;.\n                  ENDCASE.\n                ENDIF.\n              ENDDO.\n              MOVE-CORRESPONDING ls_xlsx TO &lt;lfs_data&gt;.\n            ENDLOOP.\n          ENDIF.\n        ENDLOOP.\n      ENDIF.\n\n    CATCH cx_fdt_excel_core INTO lo_exc.\n      lv_err_msg = lo_exc-&gt;get_text( ).\n      MESSAGE lv_err_msg TYPE 'S' DISPLAY LIKE 'E'.\n      LEAVE LIST-PROCESSING.\n  ENDTRY.\n\nENDFORM.<\/code><\/pre>\n\n\n\n<p>Penjelasan: subroutine ini akan membaca satu per satu sheet dari excel yang diupload untuk disimpan ke dalam internal table <strong>pct_data<\/strong>.<\/p>\n\n\n\n<p>NOTES: <em>susunan antara structure workarea excel dan kolom excel file yang di-upload harus sama<\/em><\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_validation_data  CHANGING pct_data TYPE gtt_data.\n  LOOP AT pct_data ASSIGNING FIELD-SYMBOL(&lt;lfs_data&gt;).\n        IF &lt;lfs_data&gt;-status = 'ERROR'.\n          &lt;lfs_data&gt;-remarks = 'ERROR DATA'.\n          ls_grp_h-icon = icon_red_light.\n          CONTINUE.\n        ENDIF.\n  ENDLOOP.\nENDFORM.<\/code><\/pre>\n\n\n\n<p>Penjelasan: subroutine ini berfungsi untuk memvalidasi data sebelum diolah lebih lanjut<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_convert_date  USING p_date_string TYPE string CHANGING pc_date TYPE datum .\n\n  DATA: lv_convert_date(10) TYPE c.\n\n  CHECK p_date_string IS NOT INITIAL.\n\n  lv_convert_date = p_date_string .\n\n  \"date format YYYY\/MM\/DD\n  FIND REGEX '^\\d{4}&#91;\/|-]\\d{1,2}&#91;\/|-]\\d{1,2}$' IN lv_convert_date ##REGEX_POSIX.\n  IF sy-subrc = 0.\n    CALL FUNCTION '\/SAPDMC\/LSM_DATE_CONVERT'\n      EXPORTING\n        date_in             = lv_convert_date\n        date_format_in      = 'DYMD'\n        to_output_format    = ' '\n        to_internal_format  = 'X'\n      IMPORTING\n        date_out            = lv_convert_date\n      EXCEPTIONS\n        illegal_date        = 1\n        illegal_date_format = 2\n        no_user_date_format = 3\n        OTHERS              = 4.\n  ELSE.\n\n    \" date format DD\/MM\/YYYY or DD-MM-YYYY or DD.MM.YYYY\n\n    FIND REGEX '^\\d{1,2}&#91;\/|-|.]\\d{1,2}&#91;\/|-|.]\\d{4}$' IN lv_convert_date ##REGEX_POSIX.\n    IF sy-subrc = 0.\n      CALL FUNCTION '\/SAPDMC\/LSM_DATE_CONVERT'\n        EXPORTING\n          date_in             = lv_convert_date\n          date_format_in      = 'DDMY'\n          to_output_format    = ' '\n          to_internal_format  = 'X'\n        IMPORTING\n          date_out            = lv_convert_date\n        EXCEPTIONS\n          illegal_date        = 1\n          illegal_date_format = 2\n          no_user_date_format = 3\n          OTHERS              = 4.\n\n    ENDIF.\n  ENDIF.\n\n  IF sy-subrc = 0.\n    pc_date = lv_convert_date .\n  ELSE.\n    CLEAR pc_date.\n  ENDIF.\n\nENDFORM.<\/code><\/pre>\n\n\n\n<p>Penjelasan: subroutine ini untuk meng-convert date berformat DD.MM.YYYY menjadi YYYYMMDD (format datum SAP)<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_convert_uom_in  USING    p_in\n                       CHANGING pc_out.\n\n  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'\n    EXPORTING\n      input          = p_in\n    IMPORTING\n      output         = pc_out\n    EXCEPTIONS\n      unit_not_found = 1\n      OTHERS         = 2.\n  IF sy-subrc &lt;&gt; 0.\n* Implement suitable error handling here\n  ENDIF.\n\nENDFORM.<\/code><\/pre>\n\n\n\n<p>Penjelasan: subroutine ini berfungsi untuk meng-convert nilai UoM external menjadi nilai UoM internal<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FORM f_convert_curr_in  USING    p_in\n                                 p_waers\n                        CHANGING pc_out.\n  IF p_waers EQ 'IDR'.\n    pc_out = p_in \/ 100.\n  ELSE.\n    pc_out = p_in.\n  ENDIF.\nENDFORM.<\/code><\/pre>\n\n\n\n<p>Penjelasan: subroutine ini berfungsi untuk meng-convert nilai amount currency external menjadi nilai amount internal<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Potongan program berikut ini berguna untuk melakukan upload file dalam format excel untuk disimpan dalam internal table Penjelasan: deklarasi type data gty_data disarankan include structure excel untuk mempermudah pemindahan data dalam proses yang akan dipaparkan di bawah. penjelasan: p_file = filename -&gt; silakan merujuk ke post berikut untuk mendapatkan cara membaca filename KLIK DI SINI&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/22"}],"collection":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/comments?post=22"}],"version-history":[{"count":3,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/22\/revisions"}],"predecessor-version":[{"id":46,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/22\/revisions\/46"}],"wp:attachment":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/media?parent=22"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/categories?post=22"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/tags?post=22"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}