在SAP的应用当中,导入、导出EXCEL文件的情况是一个常见的需求,有时候用户需要将大量数据定期导入到SAP的数据库中。这种情况下,使用导入程序在前台导入可能要花费不少的时间,如果能安排导入程序为后台作业,既可以节约用户的时间,也可以有效利用闲时的服务器资源,最重要的是可以避开程序超时。下面来介绍一下相关的知识和具体实践办法。

本文链接:IT虾米网

原创内容,转载请注明

1,定义结构

  首先,新建程序ztest_upload,并准备一个EXCEL文件。假设一个相对简单的情景,比如,要上传的数据库表有三个字段。那么我们也建立一个三列内容的EXCEL文件,test.xlsx:

  

  由此,可以在代码中定义相应的内表itab:

REPORT ztest_upload. 
 
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】

  

  

 

评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

ABAP关键字SUBMIT的简单例子和学习小记