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

在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】。

  

  

时间: 2024-10-11 05:41:30

一步步实现ABAP后台导入EXCEL到数据库【1】的相关文章

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

前文:http://www.cnblogs.com/hhelibeb/p/5912330.html 既然后台作业只能在应用服务器运行,那么,我们可以先将要上传的数据保存在应用服务器中,之后再以后台作业的形式导入数据库.这里需要使用的关键字是OPEN DATASET. 1. OPEN DATASET Syntax OPEN DATASET dset   FOR { INPUT | OUTPUT | APPENDING | UPDATE }   IN { { BINARY MODE }      |

.Net core 使用NPOI 直接导入Excel到数据库(即不先将Excel保存到服务器再读取文件到数据库)

原文:.Net core 使用NPOI 直接导入Excel到数据库(即不先将Excel保存到服务器再读取文件到数据库) 1 /// <summary> 2 /// 导入信息 3 /// </summary> 4 /// <param name="file"></param> 5 /// <returns></returns> 6 /// /Public/PublicPool/ImportCustomer 7 pub

ASP.NET MVC导入excel到数据库

MVC导入excel和webform其实没多大区别,以下为代码: 视图StationImport.cshtml的代码: @{ ViewBag.Title = "StationImport"; Layout = "~/Areas/Admin/Views/Shared/_index.cshtml"; } @using (Html.BeginForm("StationImport", "Station", FormMethod.Po

导入Excel至数据库——程序实现

说明 承接上一篇博客,本篇博文将提供一种实现Excel数据导入数据库表的具体C#实现,其实,如果只针对单纯的一个业务开发,不用想太多内容的,只要将Excel数据转换为DataTable后具体操作,也就完成了,但如果要想写出能够应对多个需求业务的程序的时候就不得不想一些能够复用的方法了.废话少说,还是具体看一下具体的实现过程: 再次列一下我们的功能需求点: 换列名--中文-属性名称(字段名称) 必要性--必要列.行数据 去重复--Excel数据的重复.Excel与DataTable数据的重复 默认

【Java】【46】导入Excel到数据库

前言: 业务场景:用户提供Excel表,在页面上点击“导入按钮”,系统读取Excel中的数据,存到对应的数据库 注: 1,目前仅提供导入简单的Excel表,没有合并单元格,只能读取单页sheet 2,方法里用到了具体业务场景的实体类,所以适用性不是很强,其他场景要用的话,还需要修改代码.但是也具有一定的参考性,所以先记录下来.我的后续思路是:在 工具类(ReadExcelUtil) 里根据导入的Excel表头确定要处理的字段名,然后拼成json格式的数据,传到Service层,再做处理.之后再做

xadmin后台 导入 excel 功能拓展

新建 excel 文件 在 xadmin 的 plugins 下添加一个 excel.py # _*_ coding:utf-8 _*_ __author__ = "yangtuo" __date__ = "2019/4/3 21:12" import xadmin from xadmin.views import BaseAdminPlugin, ListAdminView from django.template import loader # excel 导入

OpenXML_导入Excel到数据库(转)

(1).实现功能:通过前台选择.xlsx文件的Excel,将其文件转化为DataTable和List集合 (2).开发环境:Window7旗舰版+vs2013+Mvc4.0 (2).在使用中需要用到的包和dll 1.用NuGet引入OpenXML包[全名叫DocumentFormat.OpenXml]=>注意:现在导入的Excel只支持.xlsx结尾的Excel,若导入.xls结尾的则会出现[文件包含损坏的数据]的错误! 2.WindowsBase.dll (3).MVC中通过file选择文件并

导入EXCEL到数据库中

procedure Import(SourceDS, DestDS: Tadoquery); var sFileName, sTableName: string; sl: TStringList; i: integer; conn: TADOConnection; dialog: TOpenDialog; begin dialog := TOpenDialog.Create(Application); if not dialog.Execute then Exit; try sFileName

导入Excel到数据库

DataTable dt = new DataTable();//全局 //第一步:首先上传到服务器        string strFileNewName =DateTime.Now.ToString("yyyyMMddhhmmss") + ".xlsx";        FileUpload1.SaveAs(Server.MapPath("../Excel/Upload/" + strFileNewName)); //第二步:将Excel的