用excel上载大数据量的BOM数据到SAP系统中,一次上载的数量级别在10万条左右,这时用ALSM_EXCEL_TO_INTERNAL_TABLE上载时会dump,查看了代码发现ALSM_EXCEL_TO_INTERNAL_TABLE中是将数据先保存到剪贴板(
Clippboard )上,然后在保存到内表中,很不幸剪贴板大小有限制,超过就会dump。
REPORT ztest_upload_excel.
DATA:g_begin_row TYPE i,
g_end_row TYPE i.
DATA:git_temp TYPE TABLE OF alsmex_tabline,
gwa_temp TYPE alsmex_tabline.
TYPES:BEGIN OF ty_upload,
werks TYPE ymoe_compalloc-werks, "Plant
root TYPE ymoe_compalloc-root, "Root material
maktxr TYPE makt-maktx, "Description ( R )
parent TYPE ymoe_compalloc-parent, "Parent
maktxp TYPE makt-maktx, "Description ( P )
beskz TYPE marc-beskz, "Procurement Type
sobsl TYPE marc-sobsl, "Special Procurement Type
component TYPE ymoe_compalloc-component, "Component
maktxc TYPE makt-maktx, "Description ( C )
prodline TYPE ymoe_compalloc-prodline, "Production Line
workstation TYPE ymoe_compalloc-workstation, "Work Station
END OF ty_upload.
DATA:git_upload TYPE STANDARD TABLE OF ty_upload,
gwa_upload LIKE LINE OF git_upload.
PARAMETERS:p_file TYPE rlgrap-filename
DEFAULT 'C:\temp\upload.xlsx' OBLIGATORY. "File Name
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_get_filename.
*----------------------------------------------------------------------*
* Start-of-Selection
*----------------------------------------------------------------------*
START-OF-SELECTION.
g_begin_row = 2.
g_end_row = g_begin_row + 40000.
DO 10 TIMES.
REFRESH:git_temp.
* Get EXCEL-Sheet in internal table
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = '1'
i_begin_row = g_begin_row
i_end_col = '11'
i_end_row = g_end_row
TABLES
intern = git_temp
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF git_temp[] IS INITIAL.
EXIT.
ELSE.
LOOP AT git_temp INTO gwa_temp.
AT NEW row.
CLEAR gwa_upload.
ENDAT.
CASE gwa_temp-col.
WHEN '1'.
gwa_upload-werks = gwa_temp-value.
WHEN '2'.
gwa_upload-root = gwa_temp-value.
WHEN '3'.
gwa_upload-maktxr = gwa_temp-value.
WHEN '4'.
gwa_upload-parent = gwa_temp-value.
WHEN '5'.
gwa_upload-maktxp = gwa_temp-value.
WHEN '6'.
gwa_upload-beskz = gwa_temp-value.
WHEN '7'.
gwa_upload-sobsl = gwa_temp-value.
WHEN '8'.
gwa_upload-component = gwa_temp-value.
WHEN '9'.
gwa_upload-maktxc = gwa_temp-value.
WHEN '10'.
gwa_upload-prodline = gwa_temp-value.
WHEN '11'.
gwa_upload-workstation = gwa_temp-value.
ENDCASE.
AT END OF row.
APPEND gwa_upload TO git_upload.
ENDAT.
ENDLOOP.
g_begin_row = g_end_row + 1.
g_end_row = g_begin_row + 40000.
ENDIF.
ENDDO.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FILENAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_filename .
DATA:l_filter TYPE string,
lit_file TYPE STANDARD TABLE OF file_table,
lwa_file LIKE LINE OF lit_file,
l_rc TYPE i.
CLEAR:p_file.
l_filter = 'Microsoft Excel Files (*.XLS;*.XLSX;*.XLSM)|*.XLS;*.XLSX;*.XLSM|'.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
* window_title =
default_extension = '.xlsx'
* default_filename =
file_filter = l_filter
* with_encoding =
* initial_directory =
* multiselection =
CHANGING
file_table = lit_file
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 = 0.
READ TABLE lit_file INTO lwa_file INDEX 1.
IF sy-subrc = 0.
p_file = lwa_file-filename.
ENDIF.
ENDIF.
ENDFORM.