Monday, June 15, 2015

ABAP - Function to Upload Huge/Big Excel file Using alsm_excel_to_internal_table

ABAP - Function to Upload Huge/Big Excel file Using alsm_excel_to_internal_table
reference link : *
* source http://zevolving.com/2013/04/abap-upload-excel-file-using-alsm_excel_to_internal_table/
* http://scn.sap.com/thread/1436772
Step: 1 -  Declare Internal Table ( See zuplbpjs_top.  )
REPORT zuplbpjs MESSAGE-ID zhrmsg.
INCLUDE zuplbpjs_top.    "Data Declaration
INCLUDE zuplbpjs_sel.    "Selection Screen
INCLUDE zuplbpjs_xls.    "Upload Excel Functions
INCLUDE zuplbpjs_alv.    "Alv Functions
INCLUDE zuplbpjs_msg.    "Show Message Function
INCLUDE zuplbpjs_f01.    "Process Functions
INCLUDE zuplbpjs_main.   "Main Include


Step 2 : Create zuplbpjs_top and declare internal table below

TYPES:
BEGIN OF ty_data,
znomor TYPE char5,
znokk  TYPE char20,
zkitas TYPE char20,
zname  TYPE char20,
zp2ia  TYPE char1,
ztplhr TYPE char20,
ztglhr TYPE char10,
zsex   TYPE char1,
zstats TYPE char1,
zalm   TYPE char40,
zrt    TYPE char3,
zrw    TYPE char3,
znopos TYPE char5,
zcdkec TYPE char10,
znmkec TYPE char20,
zcddes TYPE char10,
znmdes TYPE char20,
zcdfas TYPE char15,
znmfas TYPE char80,
zcdden TYPE char10,
znmden TYPE char20,
ztelp  TYPE char20,
zemail TYPE char20,
zpernr TYPE char80,
zjabat TYPE char15,
zjobst TYPE char1,
zbecls TYPE char1,
ztmt   TYPE char10,
zgaji  TYPE char20,
znatio TYPE char1,
zpolis TYPE char20,
zoass  TYPE char20,
znpwp  TYPE char20,
zpassp TYPE char10,
zlevel TYPE char1,
zinfo  TYPE char20,
zbpjsi TYPE char20,
znote  TYPE string,
select TYPE c,
END   OF ty_data.
TYPES: tt_data TYPE STANDARD TABLE OF ty_data.
DATA: t_data  TYPE tt_data.
DATA: t_wa LIKE LINE OF t_data.
Step 3 : Create zuplbpjs_xls Inlcude and type code below
*----------------------------------------------------------------------*
*   INCLUDE ZUPLBPJS_EXCEL                                             *
*----------------------------------------------------------------------*
*
* source http://zevolving.
* com/2013/04/abap-upload-excel-file-using-alsm_excel_to_internal_table/
* http://scn.sap.com/thread/1436772
** How to use it
*PERFORM flcl_excel_uploader
*        TABLES t_data USING 1 'C:\ZMAP20150217ASLI.XLS'.
*---------------------------------------------------------------------*
*       FORM flcl_excel_uploader                                      *
*---------------------------------------------------------------------*
FORM flcl_excel_uploader
TABLES ct_data LIKE t_data[]
USING p_header_rows_count p_filename.
DATA: max_rows          TYPE i.
DATA: filename          TYPE localfile.
DATA: lv_tot_components TYPE i.
DATA: lv_empty TYPE flag,
lv_begin TYPE i,
lv_end   TYPE i.
FIELD-SYMBOLS: TYPE ANY.
max_rows = 9999.
filename = p_filename.
* count field count
DATA:  l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,
l_descr_ref      TYPE REF TO cl_abap_structdescr,
wa_table TYPE abap_compdescr.
DATA: fl_table LIKE wa_table OCCURS 0 WITH HEADER LINE.
l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( t_data ).
l_descr_ref ?= l_tabledescr_ref->get_table_line_type( ).
LOOP AT l_descr_ref->components INTO wa_table .
lv_tot_components = lv_tot_components + 1.
ENDLOOP.
* start Loop
lv_begin = p_header_rows_count + 1.
lv_end   = max_rows.
WHILE lv_empty IS INITIAL.
PERFORM do_upload
TABLES ct_data
USING p_filename 'ct_data[]'
CHANGING lv_begin lv_end lv_tot_components lv_empty.
lv_begin = lv_end + 1.
lv_end   = lv_begin + max_rows.
ENDWHILE.
ENDFORM.
*
FORM do_upload
TABLES ct_data LIKE t_data[]
USING filename itab_name
CHANGING iv_begin iv_end lv_tot_components rv_empty.
DATA: li_exceldata  TYPE STANDARD TABLE OF alsmex_tabline.
DATA: ls_exceldata  LIKE LINE OF li_exceldata.
DATA: lv_tot_rows   TYPE i.
DATA: lv_packet     TYPE i.
*  FIELD-SYMBOLS: TYPE ANY.
FIELD-SYMBOLS: TYPE ANY.
* Upload this packet
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename                = filename
i_begin_col             = 1
i_begin_row             = iv_begin
i_end_col               = lv_tot_components
i_end_row               = iv_end
TABLES
intern                  = li_exceldata
EXCEPTIONS
inconsistent_parameters = 1
upload_ole              = 2
OTHERS                  = 3.
* something wrong, exit
IF sy-subrc <> 0.
*    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
rv_empty = 'X'.
EXIT.
ENDIF.
* No rows uploaded, exit
IF li_exceldata IS INITIAL.
rv_empty = 'X'.
EXIT.
ENDIF.
* Move from Row, Col to Flat Structure
LOOP AT li_exceldata INTO ls_exceldata.
" Append new row
AT NEW row.
*      append initial line to ct_data assigning .
APPEND ct_data.
CLEAR ct_data.
*      ASSIGN (itab_name) TO .
ENDAT.
" component and its value
ASSIGN COMPONENT ls_exceldata-col OF STRUCTURE ct_data TO .
IF sy-subrc EQ 0.
= ls_exceldata-value.
ENDIF.
" add the row count
AT END OF row.
IF NOT ( ct_data IS INITIAL ).
lv_tot_rows = lv_tot_rows + 1.
ENDIF.
ENDAT.
ENDLOOP.
* packet has more rows than uploaded rows,
* no more packet left. Thus exit
lv_packet = iv_end - iv_begin.
IF lv_tot_rows LT lv_packet.
rv_empty = 'X'.
ENDIF.
ENDFORM.
Step 4 : Create zuplbpjs_main include with code below
*----------------------------------------------------------------------*
*   INCLUDE ZUPLBPJS_MAIN                                              *
*----------------------------------------------------------------------*
INITIALIZATION.
PERFORM set_period.
gd_repid = sy-repid.
START-OF-SELECTION.
LOOP AT filename_table INTO filename.
PERFORM flcl_excel_uploader
TABLES t_data USING hrow filename.
ENDLOOP.
END-OF-SELECTION.
PERFORM displa_alv.

No comments:

Post a Comment