上载EXCEL文件到SAP系统内表FUNCTION

本文档介绍了如何通过SAP自定义FUNCTION模块,将选择的Excel文件上传并导入到SAP系统内的内表。首先在选择屏幕中调用FILESYSTEM_SHOW进行文件选择,然后通过ALSM_EXCEL_TO_INTERNAL_TABLE函数将Excel数据转换到内表,最后进行数据处理和内表更新。

思路:在选择屏幕中点开选择电脑中需要上传的EXCEL文件( PERFORM FILESYSTEM_SHOW CHANGING G_SUBRC P_FILE.),文件上传后用相应FUNCTIONG传到内表中。(ZHRIT101)

 

 

FORM filesystem_show  CHANGING pl_subrc    TYPE i
                                                        pl_file     TYPE rlgrap-filename.


  DATA: l_file_tab TYPE filetable,
         l_file     TYPE file_table,
         l_title    TYPE string.

  l_title = text-001.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = l_title
    CHANGING
      file_table              = l_file_tab
      rc                      = pl_subrc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      OTHERS                  = 4.

  CHECK sy-subrc = 0.
  LOOP AT l_file_tab INTO l_file.
    str_file = l_file.
    MOVE str_file TO pl_file.
    EXIT.
  ENDLOOP.

ENDFORM.                    " FILESYSTEM_SHOW,从电脑中选择excel文件

 

 

FORM upload_excel_file .

  DATA: lt_intern LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.

  DATA: l_tabix LIKE sy-tabix.
  DATA: l_begcol TYPE i,
        l_begrow TYPE i,
        l_endcol TYPE i,
        l_endrow TYPE i,
        l_string TYPE string.

** 設定上傳的Excel file所要讀取的範圍
  MOVE : '1'     TO l_begcol,
         '1'     TO l_begrow,
         '5'   TO l_endcol,                                        "excel文件中实际用到多少列就填多少
         '65535' TO l_endrow.                                     "65536应该是最大行数吧,呵呵!

  FIELD-SYMBOLS : <field> TYPE ANY.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = l_begcol
      i_begin_row             = l_begrow
      i_end_col               = l_endcol
      i_end_row               = l_endrow
    TABLES
      intern                  = lt_intern
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

 

     IF SY-SUBRC <> 0.
         MESSAGE '读取EXCEL出现错误' TYPE 'E'.
    ELSE.

** 当第一笔为HEADER时,删除
    DELETE IT_INTERN WHERE ROW = 1.


** 检查上传档案是否有资料
    IF IT_INTERN IS INITIAL.
      MESSAGE '请检查你EXCEL是否有数据' TYPE 'I'.
      EXIT.
    ENDIF.

  SORT IT_INTERN BY ROW COL.
    LOOP AT IT_INTERN.
      AT NEW  ROW.
        g_col = 1.
      ENDAT.
      IF g_col = 1.
              codeIF SY-SUBRC <> 0.
         MESSAGE '读取EXCEL出现错误' TYPE 'E'.
    ELSE.

** 当第一笔为HEADER时,删除
    DELETE IT_INTERN WHERE ROW = 1.


** 检查上传档案是否有资料
    IF IT_INTERN IS INITIAL.
      MESSAGE '请检查你EXCEL是否有数据' TYPE 'I'.
      EXIT.
    ENDIF.

  SORT IT_INTERN BY ROW COL.
    LOOP AT IT_INTERN.

********************本来是想 CASE IT_INTERN-COL,可不行哦,不知道为什么,就设了个g_COL的变量*******

      g_col = IT_INTERN-COL.         

        CASE g_col.
          WHEN 1.
            PERFORM transfer_pernr_to_sap USING IT_INTERN-VALUE CHANGING IT_BJTAB-PERNR.
          WHEN 2.
            PERFORM transfer_date_to_sap USING IT_INTERN-VALUE CHANGING IT_BJTAB-BEGDA.
          WHEN 3.
            IT_BJTAB-INFOTYPE = IT_INTERN-VALUE.
          WHEN 4.
            IT_BJTAB-SUBTY = IT_INTERN-VALUE.
          WHEN 5.
            IT_BJTAB-PBYER = IT_INTERN-VALUE.
         ENDCASE.
         CLEAR IT_INTERN.

**************************一行内表全都填到工作区后,要附加到内表中*********************8888
       AT END OF ROW.
         APPEND IT_BJTAB.
         CLEAR IT_BJTAB.
       ENDAT.

    ENDLOOP.

ENDFORM. 

 

 

<think>好的,我现在需要帮助用户解决SAP中上传Excel时读取文件失败的问题。首先,我得回忆一下用户提到的错误可能涉及哪些方面。用户提到了引用中的几个问题,比如使用ALSM_EXCEL_TO_INTERNAL_TABLE时文件名转换的问题,还有ABAP WPS导入Excel报错E:000的情况,以及信息类型不一致导致的DUMP。我需要综合这些信息来分析可能的解决方案。 首先,用户上传Excel失败可能有很多因。根据引用[1][2],ALSM_EXCEL_TO_INTERNAL_TABLE是常用的批量导入Excel的方法,但处理大数据量时需要注意性能。如果用户上传的文件过大,可能会导致超时或内存不足。此外,引用[3]提到文件名中的空格被转换,可能导致URI不正确,进而读取失败。所以需要检查文件名是否符合规范,是否有特殊字符或空格。 然后,引用[4]中的错误E:000可能与Excel应用程序对象创建失败有关,比如Office组件未正确安装或权限问题。同时,引用[5]的信息类型不一致问题提示,数据本身的问题也可能导致上传失败,比如Excel中的数据类型与SAP结构不匹配。 接下来,我需要将这些可能的因整理成结构化的解决方案。首先检查文件格式名称,确保没有特殊字符且符合SAP要求。然后检查文件大小,如果太大可能需要拆分。接着检查ABAP代码中的逻辑,比如是否正确处理了Excel对象,是否处理了可能出现的异常。同时,权限问题也不可忽视,用户是否有足够的权限访问服务器目录。最后,数据校验日志分析也是关键步骤,查看系统日志或ST22的DUMP信息,找出具体错误点。 此外,用户可能需要生成相关问题,我需要考虑用户可能进一步会问的问题,比如如何处理特定错误代码,或者优化上传性能的方法,以及替代方案如DOI的使用。这些都需要在相关问题部分列出,帮助用户进一步探索解决方案。 总结起来,我需要分步骤列出可能的对应的解决方案,确保用户能逐步排查问题,同时提供相关的扩展问题,帮助用户深入理解问题根源。</think>### SAP上传Excel文件失败解决方案 #### 一、常见错误因分析 1. **文件格式问题** - 文件名包含特殊字符(如空格、斜杠等),SAP在解析URI时可能自动转换字符导致路径错误[^3]。例如:文件名`DOI_TEST.xlsx`被转换为`DOI_5FTEST.xlsx`。 - 文件扩展名非`.xls`或`.xlsx`,或文件内容格式损坏。 2. **文件大小限制** - 使用`ALSM_EXCEL_TO_INTERNAL_TABLE`时,若Excel数据量过大(如超过10万),可能导致内存溢出或超时[^1][^2]。 3. **ABAP代码逻辑问题** - Excel对象创建失败(如`CREATEOBJECT`错误),可能因Office组件未安装或权限不足[^4]。 - 未正确处理Excel工作名或数据范围,例如未指定`SHEET_NAME`或`START_COL`参数。 4. **数据一致性校验失败** - Excel字段类型与目标SAP结构不匹配(如数值字段包含文本)。 - 信息类型冲突(如HCM模块中0000与0001信息类型数据不一致引发DUMP)[^5]。 --- #### 二、分步骤解决方案 1. **检查文件格式与名称** - 确保文件名不含空格或特殊字符(如`_`替代空格)。 - 验证文件是否可正常通过Excel本地打开,避免文件损坏。 2. **拆分大文件** - 若数据量过大,将Excel拆分为多个小文件分批上传。 - 调整ABAP代码,增加内存清理逻辑(如`REFRESH`内,释放对象)。 3. **完善ABAP代码逻辑** - **对象创建检查**: ```abap IF sy-subrc NE 0. CREATE OBJECT excel_application 'Excel.Application'. " 检查Office组件安装 ENDIF. ``` - **显式指定参数**: ```abap CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = lv_filename i_begin_col = 1 i_begin_row = 2 i_end_col = 10 i_end_row = 10000 sheet_name = 'Sheet1'. ``` 4. **增强数据校验** - 在数据转换前增加类型检查,例如: ```abap LOOP AT lt_excel_data ASSIGNING FIELD-SYMBOL(<fs_row>). IF <fs_row>-value CN '0123456789'. " 检查数值字段 RAISE EXCEPTION TYPE cx_sy_conversion_error. ENDIF. ENDLOOP. ``` 5. **检查权限与日志** - 确认用户对服务器目录有写入权限(如`TMP`或`DATA`目录)。 - 通过事务码`ST22`查看ABAP DUMP详情,定位具体错误。 --- #### 三、替代方案 若`ALSM_EXCEL_TO_INTERNAL_TABLE`仍失败,可尝试: 1. **使用DOI技术** - 通过`CL_DOCUMENT_OBJECT_XLS`类操作Excel,更稳定但复杂度较高。 2. **转换为CSV上传** - 通过`GUI_UPLOAD`函数上传CSV文件,避免Excel解析问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值