AMDP + XLSX Workbench 报表开发模式

本文介绍了我和同事通过使用AMDP + XLSX Workbench缩短报表开发周期、分离数据查询处理逻辑和前端展示工作的经验。欢迎讨论。

前言

最近接到了一套人力资源报表的开发需求,需要以EXCEL表格的方式输出,且包含大量sheet页,每个sheet相当于一个独立的报表。

这种情况下,如果让同一个人开发所有内容,将会花费较长的开发周期,因此,要将程序分解成若干个部分,最好每个报表(sheet)都是一个独立的子模块,让不同的人同时开发。

对于这类报表,我们之前的做法是,使用OLE输出EXCEL文件,在report程序中,使用逻辑数据库获取数据,引入常用的OLE方法,为每个sheet创建一个include文件,实现不同sheet的代码分离。

代码类似这样:

REPORT zhr_report .

************************************************************************
* INCLUDES
************************************************************************
INCLUDE zhr_report_top.   "//数据定义

INCLUDE zhr_report_s01.   "//选择屏幕```````````

INCLUDE z_ole_excel_hr.   "//通用EXCEL操作子程序

INCLUDE zhr_report_m01.   "//事件

INCLUDE zhr_report_f01.   "//通用模块

INCLUDE zhr_report_ex01.  "//Sheet1

INCLUDE zhr_report ex02.  "//Sheet2

INCLUDE zhr_report_ex03.  "//Sheet3

INCLUDE zhr_report_ex04.  "//Sheet4
INCLUDE zhr_report_ex05.  "//Sheet5

示意图:

通过将通用的OLE方法封装到一个包含文件中,并使sheet页的处理放到不同的包含文件,可以使对它们的同时编辑成为可能。但是,这种做法也是有问题的:

  • 包含文件不是单独的程序,这意味着只要有一个include文件中有语法错误,语法检查时就会给出提示,从而无法激活整个程序。
  • 命名空间相同,这意味着定义子程序或FORM名时,很容易发生冲突
  • 只能通过增加包含文件实现程序的横向扩展,较难实现程序的纵向扩展。通用部分一旦确定,再想修改会比较困难。
  • OLE的性能较差。

为了解决这些问题,我们引入了AMDP + XLSX Workbench的报表开发模式。

改进后的模式示意图:

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

名词解释

AMDP

全称ABAP-Managed Database Procedure,一种ABAP on HANA的实现方式,提供了在ABAP中运行SQL Script的可能,并且与ABAP中的类和数据类型有良好的集成。之前的有关AMDP的文章:

ABAP中的AMDP(ABAP-Managed Database Procedures )

XLSX Workbench

一种可视化表单生成工具,相比复杂的OLE,可以用少量代码+一些拖拽和配置来生成EXCEL报表,性能更好。按XLSX Workbench的文档介绍,它有九大特性:

  • 无需ABAP编程技能
  • 可视化设计方式
  • 高性能
  • 支持后台处理
  • 强大的表单格式特性支持
  • 支持公式
  • 支持图片
  • 支持图表
  • 支持树

官方文档:https://sites.google.com/site/sapxlwb/home

代码例子

注意,本部分内容会假设读者已经有使用AMDP的XLSX Workbench的初步经验(至少是能输出Hello World的水平)。如果不是这样的话,可能会对其中的某些内容感到困惑。

1,首先,创建一个接口ZIF_XLSX_REPORT。

INTERFACE zif_xlsx_report

  PUBLIC .

  METHODS get_dataCHANGING
      !data            TYPE sflight_t
    RAISING
      cx_amdp_error .

ENDINTERFACE.

接口包含一个get_data方法,方法有一个参数data,它数据类型,即为将要输出给XLSX Workbench表单的的数据类型。

2,为接口创建实现类。

为接口创建一个实现类,在方法ZIF_XLSX_REPORT~GET_DATA中调用AMDP类方法,进行数据处理后,将得到的数据填充进chaging参数data中。

CLASS zcl_xlsx_report1 DEFINITION

  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    INTERFACES zif_xlsx_report .
  PROTECTED SECTION.
  PRIVATE SECTION.

ENDCLASS.

CLASS ZCL_XLSX_REPORT1 IMPLEMENTATION.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_XLSX_REPORT1->ZIF_XLSX_REPORT~GET_DATA
* +-------------------------------------------------------------------------------------------------+
* | [<-->] DATA                           TYPE        SFLIGHT_T
* | [!CX!] CX_AMDP_ERROR
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD zif_xlsx_report~get_data.

    "调用AMDP类的方法

    "数据处理

  ENDMETHOD.
ENDCLASS.

3,在report程序中调用各个实现类。

这是关键的一步:在report程序中动态地获取全部实现类,并依次实例化、调用其接口方法。

  CONSTANTS: c_interface TYPE seoclsname VALUE ‘ZIF_XLSX_REPORT‘.
  TRY.

      DATA(gt_classes) = cl_sic_configuration=>get_classes_for_interface( c_interface ).

    CATCH cx_class_not_existent .

  ENDTRY.

  LOOP AT gt_classes INTO DATA(gs_class).

    TRY .

        CREATE OBJECT go_ref TYPE (gs_class-clsname).

      CATCH cx_sy_create_object_error.

    ENDTRY.

    IF go_ref IS BOUND.

          go_ref->get_data( CHANGING data = g_data_structure ).

    ENDIF.

  ENDLOOP.
  • 由于XLSX Workbench中的一个表单在同一时间只能由一个人编辑,对于多sheet页的表格,无法让两个人并行开发表单。但是,因为表单独立于ABAP 程序,二者只需要通过约定好的内表结构(在示例中是SFLIGHT_T)通信。因此,可以在约定好通信结构的前提下,由一个人进行XLSX Workbench中表单的组件编辑、上下文绑定等工作,另一个(或多个)人进行数据逻辑处理工作。如果在引入了HANA开发人员,还可以把主要逻辑下推至HANA,从而使多人同时在不同层级上开发同一个套表,以提高总体开发速度。
  • 将每个sheet页写成一个类,所有类继承同一个接口,在report程序中动态地调用,可以将报表主程序的代码稳定下来,实现程序的解耦。不同的类之间也是个例的,可以方便地进行单独的单元测试,而不会在语法检查时受到其他人的开发内容的干扰。
  • 相比于本文开头提到的INCLUDE的方式,使用面向对象的新开发模式不仅提供了更好的横向扩展能力(只要增加新的实现类和结构字段即可实现数据处理逻辑和报表内容的扩展),而且也提供了更好的纵向扩展能力,可以通过面向对象的强大特性——继承——来实现对报表中相似部分进行抽象整合。

注意事项

总结了几点我们在实际开发中的经验,以供参考。

AMDP与SELECT-OPTIONS

细心的读者可能已经注意到上文的示例代码中并未处理选择屏幕这一关键问题。在Open SQL中我们可以很方便地直接使用range table。而在AMDP中使用它话需要一点点额外的代码:

可以通过CL_SHDB_SELTAB=>COMBINE_SELTABS( )来将选择屏幕的输入条件转换为AMDP中的SQL Script中的WHERE条件字符串,并使用APPLY_FILTER函数应用这一条件,具体的例子:

(引用自 Handling of SELECT-OPTIONS parameters within AMDP

异常处理

在本文介绍的开发模式下,HANA视图、XLSX Workbench表单和ABAP类是可以并行开发的,这意味着开发阶段的HANA视图可能处于不稳定的状态。ABAP开发者应注意在AMDP方法中显式地声明异常、并在调用它是进行处理。不然会很容易遇到程序dump的情况:)

具体的异常可见:AMDP异常

自建结构/表命名

无论是AMDP方法还是XLSX Workbench表单,在实践中都需要自建结构/表来接收数据。在开发内容分离的情况下,作为通信定义的结构/表类型的命名尤其重要。应当有一套合理的规则来为它们以及其中的字段命名。特别是XLSX Workbench表单的参数结构,在表单复杂的情况下,参数结构同样会是复杂的深度结构。如果命名不当的话,将会给开发和沟通带来相当的负担。

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

转载请注明

原文地址:https://www.cnblogs.com/hhelibeb/p/8422711.html

时间: 2024-08-10 02:06:35

AMDP + XLSX Workbench 报表开发模式的相关文章

oracle报表开发方案

PL/SQL也是一门语言,后台开发经常会用到. 目前做要到一个功能,关于"报表任务调度",说明白了就是做几张报表,每天统计一次新数据,用于在PC页面上显示,我苦思冥想了几天,总结出三种方案. 开发环境:SSM+oracle(spring,spring MVC,mybatis + oracle). 1.在pl/sql上,每张报表开发一个对应的储存过程,每个存储过程新建一个DBMS_JOB,按相关需求定时执行. 2.在pl/sql上,每张报表开发一个对应的储存过程,新建一张"报表

论制造业的报表开发项目需求

1.信息孤岛 中国制造企业随着ERP.PDM等信息化系统的初步部署完成,管理方式也由无明确过程型的粗放式管理过渡到流程越发清晰的精细化管理.同时,企业在实现对业务数据进行有效管理过程中,积累了大量的生产.行政管理信息,产生了利用现代信息技术收集.管理和展示分析结构化和非结构化的数据和信息的诉求,如何利用这些跨系统数据创造更大的价值? 利用报表开发工具(以下都以FineReport为例进行说明),可以设立一个灵活的数据支撑中心,能够做到随需应变,对单位现有的系统分析进行改进和增强. 首先,变化频繁

报表开发小技巧:报表的设计与配色技巧

1.示例工具 报表开发工具FineReport 2. 取色 2.1 设计器里取色 点击背景右侧的小三角,点击更多颜色,点击自定义选项卡,这里的HSL或者RGB值,就是我们需要得到的精确的颜色,如下图所示. RGB 是对机器很友好的色彩模式,但并不够人性化,因为我们对色彩的认识往往是"什么颜色?鲜艳不鲜艳?亮还是暗?"HSL 模式和 HSV(HSB) 都是基于 RGB 的,是作为一个更方便友好的方法创建出来的. HSL即色相.饱和度.亮度(Hue, Saturation, Lightne

基于成熟网管平台的网管软件开发模式

随着计算机网络的迅速发展,特别是国际互联网的不断地推广,计算机网络的使用越来越广泛,人们的生产生活学习对计算机网络的依赖也越来越大.同时,随着计算机网络的网络规模的不断扩大和连入网络的设备越来越多样,网络的复杂性也越来越高,网络的异构性也越拉越高.于是,网络管理就成为了一个重要的研究课题. 网络管理是对硬件.软件.人力的综合使用和协调,对网络资源进行监视.测试.配置.分析.评价和控制,从而以合理的价格满足网络的需求,如实时运行性能.服务质量等.从定义中可以看出,网络管理包含了两个重要的任务,一是

微信个性化菜单开发模式

最近一个礼拜搞了一个微信自定义菜单的开发,总的来说蛮郁闷的. 先给几个接口做下分析: 1:查询接口:查询接口分为两个,一个是开发模式下的普通查询接口,他只会查询出你通过添加接口创建出来的菜单和个性化的菜单(让公众号的不同用户群体看到不一样的自定义菜单),而不能获取到你通过微信管理平台添加的菜单.还有一个是可以查询全部菜单的接口,这个接口有点蛋疼,如果你先在平台上添加一个菜单,然后后台调用这个接口就可以获取到这个菜单,但调用这个接口的返回的json跟添加时的格式是不一样的(就是说你把它发回给你的j

报表开发技巧之根据点击次数奇偶性排序之数值型

进行排序的时,很多时候我们可能想实现根据点击的次数进行升降序排序,也就是说点击第一次点击标题升序排序,再次点击就降序,以此类推,而不是通过选择升序进行升序排列,选择降序进行降序排列. 示例工具:报表开发工具FineReport 解决思路 由扩展后排序可知,可以根据参数值的不同来决定升序还是降序,这里也可以此思路进行实现,定义一个参数,如果参数值为1的时候,就升序,参数值为0的时候,按照数据列的负数进行升序排序,即数据列降序. 注:该方法只适用于排序数据列数据类型为数字型的字段,如果数据类型为字符

微信公众平台搭建与开发(二)开发模式的搭建和关键词回复

在第一部分介绍了编辑模式,但是编辑模式有较大局限性,下面主要开始介绍开发模式,这一部门先简单介绍下开发模式的环境搭建和关键词回复. 开发模式首先要有一个虚拟主机,本人使用的是新浪开发者平台的虚拟主机,使用云豆计算流量,若成为新浪开发者用户基本上就可以免费使用了,本人注册用户所赠送的云豆不知道能用多久.当然国内比较大还有就是百度开发者平台,注册后发现部署还没有新浪的方便,并且在BAE3.0以后好像也是要收费的.有兴趣的朋友可以研究下google的开发者平台,不知道是否要收费. 在注册新浪开发者平台

Django开发模式会加载两次settings文件导致RotatingFileHandlerError

当使用RotatingFileHandler作为django的日志处理器的时候,会报: Traceback (most recent call last): File "C:\Python27\lib\logging\handlers.py", line 78, in emit self.doRollover() File "C:\Python27\lib\logging\handlers.py", line 141, in doRollover os.rename

关于Unity的开发模式

Unity是组件化的开发模式,总结起来就是节点+组件 1.每个空节点创建后,刚开始只有一个Transform组件,就像一个人出生的时候,只穿着一条裤衩一样 2.如果想让这个节点可以做更多的事情,有更多的功能,就可以给它加各种各样的组件,脚本也是一个组件,一个节点身上可以挂载各种各样的组件 3.挂好组件的节点,在层级视图中根据父子关系进行摆放,就像管理Windows的文件一样,管理那些节点 4.运行Unity,各个节点在各自组件的驱动下开始运动和逻辑变换,形成游戏