Fork me on GitHub

一步步实现ABAP后台导入EXCEL到数据库【1】

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

本文链接:http://www.cnblogs.com/hhelibeb/p/5912330.html

原创内容,转载请注明

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】

  

  

 
posted @ 2016-10-02 15:04  氢氦  阅读(8984)  评论(0编辑  收藏  举报