[问题解决]大数据量上载excel文件数据到SAP系统[ALSM_EXCEL_TO_INTERNAL_TABLE]详解编程语言

1, 问题描述

用excel上载大数据量的BOM数据到SAP系统中,一次上载的数量级别在10万条左右,这时用ALSM_EXCEL_TO_INTERNAL_TABLE上载时会dump,查看了代码发现ALSM_EXCEL_TO_INTERNAL_TABLE中是将数据先保存到剪贴板(Clippboard )上,然后在保存到内表中,很不幸剪贴板大小有限制,超过就会dump。

2017-02-15_15-44-00

2, 问题解决

解决方法比较简单,就是在循环中调用ALSM_EXCEL_TO_INTERNAL_TABLE,将一次上载的内容分成多次,以便减少保存到剪贴板中的内容。

代码如下:

下面代码中,每次上载40000条数据,循环10次,最多可以上载40万,当然循环次数还可以按需求扩大。

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.

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/19211.html

(0)
上一篇 2021年7月19日 21:56
下一篇 2021年7月19日 21:56

相关推荐

发表回复

登录后才能评论