zoukankan      html  css  js  c++  java
  • [问题解决]大数据量上载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:	empupload.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.
  • 相关阅读:
    url_encode and url_decode in Shell
    学嵌入式技术,做高端电子工程师
    MCU助推居家移动医疗微型化
    深圳单片机培训,7月盛大开班,报名既送
    中国嵌入式工控机市场前景广阔
    嵌入式 现已发展为 IT行业的主流——高薪,且人才缺乏
    谷歌苹果已“技穷”?移动操作系统2013无创新
    C# 与 C++,语法差别有多小-其他2
    link
    C# 与 C++,语法差别有多小-第三章 C++数据类型 第一部分
  • 原文地址:https://www.cnblogs.com/datie/p/11435848.html
Copyright © 2011-2022 走看看