SAP ABAP EXCEL 下载模板并导入(数据批导)

25 篇文章 7 订阅
1 篇文章 0 订阅

SAP ABAP EXCEL 下载模板并导入(数据批导)

前言

在业务中我们经常会使用 EXCEL 导入手工数据到 SAP
为简化各业务操作做数据准备

例如:主数据的创建、采购申请、采购订单的创建、销售订单的创建、会计凭证的创建等等

流程大致如下:

  1. 上传 EXCEL 模板到 SAP
  2. 用户下载 EXCEL 模板
  3. 用户填充好数据后导入 SAP

上传 EXCEL 模板

下载 EXCEL 模板的前提是已经将模板存入了系统中
一般我们通过事务码SMW0将模板上传到系统

执行事务码 SMW0 后选中 “WebRFC应用程序的二进制数据” 点击执行后填写所要上传的包
执行后点击 “新建” => 输入对象名称和描述后 => 上传模板文件

下载 EXCEL 模板

定义屏幕

SELECTION-SCREEN FUNCTION KEY 1. 

这是在屏幕的执行按钮后的位置添加一个功能按钮

同理也可以是 FUNCTION KEY 2, 3 …

初始化设置

TABLES: sscrfields.

INITIALIZATION.
 `  sscrfields-functxt_01 = '模板下载'.

INITIALIZATION事件中给sscrfields-functxt_01赋值就是给上述添加的功能按钮设置按钮文本
这样用户能更好地使用我们的功能

点击按钮后触发下载功能

当用户点击屏幕功能按钮 “模板下载” 的时候 我们需要用户选择文件的保存路径并执行从模板库下载模板的功能
也就是在 sscrfields-ucomm EQ 'FC01' 时弹出文件保存框,提示用户选择保存路径
后执行下载功能

我们调用FM 'GUI_FILE_SAVE_DIALOG'获取用户填入的文件保存路径以及用户选择的“保存”或“取消”功能
当用户选择“保存”时 执行下载功能

AT SELECTION-SCREEN.
  DATA: gv_name        TYPE string,
        gv_file        TYPE string,
        gv_user_action TYPE i.
  IF sscrfields-ucomm EQ 'FC01'.
    gv_name = '下载模板'.
    CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
      EXPORTING
        default_file_name = gv_name
      IMPORTING
        fullpath          = gv_file
        user_action       = gv_user_action.

    IF gv_user_action EQ 0.
      PERFORM frm_download_excel USING 'ZTEMPLATE' gv_file.
      MESSAGE '模板下载成功!' TYPE 'S'.
    ENDIF.
  ENDIF.

下载EXCEL文件功能

下载功能主要调用 FM 'DOWNLOAD_WEB_OBJECT'
传入上述定义的模板名称以及文件保存的路径
返回下载的状态

FORM frm_download_excel USING excel_name excel_name1.
  DATA:
    ls_objdata     LIKE wwwdatatab,
    ls_mime        LIKE w3mime,
    ls_destination LIKE rlgrap-filename,
    lv_objnam      TYPE string,
    lv_subrc       LIKE sy-subrc,
    lv_errtxt      TYPE string,
    lv_objid       TYPE wwwdatatab-objid,
    lv_dest        LIKE sapb-sappfad,
    lv_fullpath    LIKE rlgrap-filename.

  MOVE excel_name TO lv_objid.
  CONCATENATE lv_objid '.XLSX' INTO lv_objnam.
  CONDENSE lv_objnam NO-GAPS.
  
  SELECT SINGLE
    relid,
    objid
  FROM
    wwwdata
  WHERE srtf2 EQ 0
    AND relid EQ 'MI'
    AND objid EQ @lv_objid
  INTO CORRESPONDING FIELDS OF @ls_objdata.
  
  IF sy-subrc NE 0 OR ls_objdata-objid EQ space.
    CONCATENATE '模板文件:' lv_objnam '不存在,请用TCODE:SMW0进行加载' INTO lv_errtxt.
    MESSAGE lv_errtxt TYPE 'E'.
    RETURN.
  ENDIF.

  CONCATENATE excel_name1 '.xlsx' INTO lv_fullpath.
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_objdata
      destination = lv_fullpath
    IMPORTING
      rc          = lv_subrc.

  IF lv_subrc NE 0.
    CONCATENATE '模板文件:' lv_objnam '下载失败' INTO lv_errtxt.
    MESSAGE lv_errtxt TYPE 'E'.
  ELSE.
    MESSAGE '模板下载成功' TYPE 'S'.
  ENDIF.
ENDFORM.

导入EXCEL文件

导入EXCEL文件需获取文件路径
手动输入文件路径肯定不现实,所以我们需要用到搜索帮助

选择屏幕 输入框

用于获取导入的 EXCEL 文件路径

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
  PARAMETERS p_file TYPE rlgrap-filename MEMORY ID fil MODIF ID ty1.
SELECTION-SCREEN END OF BLOCK blk1.

为输入框添加 F4 搜索帮助

为上述选择屏幕添加搜索搜索帮助
该搜索帮助将通过文件选择框的形式获的文件路径
该文件即为待导入的文件

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mode             = 'O'
      title            = '导入模板'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

定义全局变量

定义类型ty_cols_rows和工作区gs_cols_rows的目的是
提升程序的可维护性
便于维护修改读取 EXCEL 的行列数
如果导入模板经常变动,则这段代码将能有效地提升程序整体的可读可用性

TYPES: BEGIN OF ty_cols_rows,
         begin_col TYPE i,
         begin_row TYPE i,
         end_col   TYPE i,
         end_row   TYPE i,
       END OF ty_cols_rows.
DATA: gs_cols_rows TYPE ty_cols_rows.

定义导入的子例程

定义变量 lv_index 的目的是为了使代码更简洁
使用field-symbols指针给工作区赋值
同时可以使用变量lv_index判断并对某些特殊数据进行处理

例如日期填入时可能包含小数点或其他的什么符号,这在SAP里是不被允许的
还有比如说给物料增加前导零等处理

调用FM 'ALSM_EXCEL_TO_INTERNAL_TABLE'读取选择屏幕输入路径的 EXCEL 文件
并传入参数读取的开始行、开始列、结束行、结束列
返回一个字段名分别为ROW 行, COL 列, VALUE 单元格值的内表
我们可以通过 FIELD-SYMBOLS 变量依据 COLVALUE值存入工作区
并使用语句AT END OF row来获取一行数据

FORM frm_upload_data USING lv_file LIKE rlgrap-filename
                     `                      ls_cols_rows LIKE gs_cols_rows.

  DATA: excel    TYPE ole2_object,
        lv_index TYPE i.

  DATA: lt_excel LIKE TABLE OF alsmex_tabline,
        ls_excel LIKE alsmex_tabline.

  FIELD-SYMBOLS: <fs>.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = lv_file
      i_begin_col             = ls_cols_rows-begin_col
      i_begin_row             = ls_cols_rows-begin_row
      i_end_col               = ls_cols_rows-end_col
      i_end_row               = ls_cols_rows-end_row
    TABLES
      intern                  = lt_excel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  SET PROPERTY OF excel 'DisplayAlerts' = 0.

  SORT lt_excel BY row col.
  LOOP AT lt_excel INTO ls_excel.
    lv_index = ls_excel-col.

    IF lv_index EQ 5 OR lv_index EQ 6.
      WHILE ls_excel-value CA '.'.
        REPLACE '.' WITH '' INTO ls_excel-value.
        CONDENSE ls_excel-value NO-GAPS.
      ENDWHILE.
    ENDIF.

    ASSIGN COMPONENT lv_index OF STRUCTURE gs_data TO <fs>.
    <fs> = ls_excel-value.

    IF lv_index EQ 1.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          input  = <fs>
        IMPORTING
          output = <fs>.
    ENDIF.

    AT END OF row.
      APPEND gs_data TO gt_data.
      CLEAR gs_data.
    ENDAT.
  ENDLOOP.
ENDFORM.

执行导入子例程

START-OF-SELECTION. 

gs_cols_rows-begin_col = 1.
gs_cols_rows-begin_row = 2.
gs_cols_rows-end_col = 12.
gs_cols_rows-end_row = 9999.

PERFORM frm_upload_data USING p_file gs_cols_rows.

总结

至此,EXCEL 文件内容已经导入到内表中
后续我们可以将数据通过ALV展示
并接收用户命令完成主数据创建、订单(凭证)创建等功能

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值