在SAP的应用当中,导入、导出EXCEL文件的情况是一个常见的需求,有时候用户可能有大量的数据需要定期导入到SAP的数据库中。这种情况下,使用导入程序在前台导入可能要花费不少的时间,如果能安排导入程序为后台作业,既可以节约用户的时间,也可以有效利用闲时的服务器资源。下面来介绍一下相关的知识和具体实践办法。
本文链接:http://www.cnblogs.com/hhelibeb/p/5912330.html
原创内容,转载请注明
1,定义结构
首先,准备一个EXCEL文件。假设一个相对简单的情景,比如,要上传的数据库表有三个字段。那么我们也建立一个三列内容的EXCEL文件,test.xlsx:
由此,可以在代码中定义相应的内表itab:
DATA: BEGIN OF wa, col1(30) TYPE c, col2(30) TYPE c, col3(30) TYPE c, END OF wa. DATA itab LIKE STANDARD TABLE OF wa.
2,上传并读取文件
我们需要有一个选择屏幕,用于指定文件的路径:
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001. PARAMETERS: p_source TYPE rlgrap-filename DEFAULT ‘C:\Users\liyue\Desktop\test.xlsx‘ MODIF ID ty1. SELECTION-SCREEN END OF BLOCK block
添加文件选择帮助:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_source. PERFORM get_filename. FORM get_filename. TRY. CALL FUNCTION ‘WS_FILENAME_GET‘ EXPORTING mask = ‘*.XLSX.‘ mode = ‘O‘ IMPORTING filename = p_source EXCEPTIONS inv_winsys = 01 no_batch = 02 selection_cancel = 03 selection_error = 04. ENDTRY. IF p_source EQ ‘‘. MESSAGE s000(zfi01) WITH ‘未选择文件!‘ DISPLAY LIKE ‘E‘. ENDIF. ENDFORM.
运行程序后,使用ALSM_EXCEL_TO_INTERNAL_TABLE函数读取文件:
START-OF-SELECTION. PERFORM read_data. PERFORM output_data. *&---------------------------------------------------------------------* *& Form FRM_READ_DATA *&---------------------------------------------------------------------* * 读取上传的EXCEL文件 *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM read_data . TRY. CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE‘ EXPORTING filename = p_source i_begin_col = 1 i_begin_row = 1 i_end_col = 255 i_end_row = 3 TABLES intern = gt_excel[] EXCEPTIONS inconsistent_parameters = 1 s_file_ole = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE s000(zfi01) WITH ‘文件打开失败!‘ DISPLAY LIKE ‘E‘. LEAVE LIST-PROCESSING. ENDIF. * CATCH icx_obl_parameter_error INTO . ENDTRY. FIELD-SYMBOLS <fs_value>. FIELD-SYMBOLS <fs_excel> LIKE gt_excel. SORT gt_excel BY row col. LOOP AT gt_excel ASSIGNING <fs_excel>. ASSIGN COMPONENT <fs_excel>-col OF STRUCTURE wa TO <fs_value>. <fs_value> = <fs_excel>-value. AT END OF row. APPEND wa TO itab. CLEAR wa. ENDAT. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form OUTPUT_DATA *&---------------------------------------------------------------------* * 将数据写入到Applacation Server *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM output_data . DATA s_file TYPE rlgrap-filename. PERFORM generate_filename_in_server USING s_file. OPEN DATASET s_file FOR INPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc = 0 . LOOP AT itab INTO wa. write: \ wa. ENDLOOP. ENDFORM.
这里没有使用INSERT语句插入数据库,因为我们还没有建立相应的数据库表:) 因此,先使用write验证数据读取的情况。
接下来是安排程序作为后台作业运行。在选择屏幕点击F9,安排程序立刻作为后台作业执行,(如果运行成功的话,在假脱机日志中可以查看到write输出的文件内容):
保存之后查看运行结果,打开工具栏——系统——自有作业
嗯....什么,已取消?看来作业失败了,得分析下原因才行。双击任务名,点击“任务日志”按钮查看:
原来,在后台作业中,ALSM_EXCEL_TO_INTERNAL_TABLE函数并没有正确读取到文件的内容。
在SCN上查询这个问题,可以发现,有很多人踩过这个坑。也有人给出了解释:之所以无法读取相应的文件内容,是因为后台作业实际上运行在ABAP应用服务器层面(Application Servers),而不是表现层(Presentation),当然也就不可能按照给定的路径读取文件了。
tips: SAP系统架构
1.最底层是数据库层。SAP自己并不提供底层数据库,而使用其他厂商的数据库管理系统(支持所有的主流数据库)。当然,现在已经有了HANA。只有SAP自身管理和运行所需的程序和元数据没有保存在数据库里,而应用系统运行的几乎所有数据都存储在数据库中。 2.ABAP程序运行在应用服务层。ABAP程序包括SAP提供的标准程序和我们自己开发的程序。ABAP程序从数据库读数据,处理数据,有可能还要储存数据。 3.第三层是表示层。这一层就是用户界面,用户可以通过它访问程序,输入数据,接收工作进程处理的结果。SAP把表示层也称为服务器,因为它的工作模式跟web浏览器类似,负责把应用服务器传来的界面布局数据转换成用户可浏览的界面,这种处理也可以成为一种‘服务’。 在SAP系统中,软件的技术分布完全独立与它所安装硬件的物理位置。 对于用户来说,SAP系统的应用层和数据库就是一个Black Box。从技术角度讲,有三种类型的屏幕:标准屏幕、选择屏幕和清单,没中屏幕为用户提供不同的服务。程序员应该根据任务的需要,为用户提供合适的屏幕。 |
看来,我们有必要找到一种折衷的方式来实现后台导入数据到数据库。接下来的内容请看一步步实现ABAP后台导入EXCEL到数据库【2】。