SAP ABAP EXCEL 下载模板并导入(数据批导)
文章目录
前言
在业务中我们经常会使用 EXCEL 导入手工数据到 SAP
为简化各业务操作做数据准备
例如:主数据的创建、采购申请、采购订单的创建、销售订单的创建、会计凭证的创建等等
流程大致如下:
- 上传 EXCEL 模板到 SAP
- 用户下载 EXCEL 模板
- 用户填充好数据后导入 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 变量依据 COL
将 VALUE
值存入工作区
并使用语句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展示
并接收用户命令完成主数据创建、订单(凭证)创建等功能