`
datamachine
  • 浏览: 156810 次
社区版块
存档分类
最新评论

报表工具的动态数据源实现

    博客分类:
  • DB
阅读更多

  有时候我们需要用参数动态指定数据源,或将多数据源连接为单数据源,或向子报表、table控件动态传入数据源名。对于此类需求,报表工具经常要借助高级语言实现或牺牲安全性以降低复杂度,尤其是BIRT、Jasper等单源报表。

  使用免费的集算器可以弥补这一不足。集算器封装了丰富的结构化计算函数,支持动态解析表达式,支持多数据源混合计算,书写简单脚本就能实现动态数据源。集算器还提供了简单易用的JDBC接口,报表工具可将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果。

  集算器与报表工具的集成结构如下:


 

  下面举例说明集算器根据参数动态切换数据源的基本过程:

  数据源myDB1和oraDB分别指向不同的数据库,两库中有相同结构的表sOrder,报表需要根据参数动态连接数据源,查询并展现sOrder中金额大于1000的订单。

  myDB1中sOrder部分数据如下:


 

  oraDB中sOrder部分数据如下:


 

  集算器代码:=${pSource}.query(“select * from sOrder where Amount>?”,pAmount)

  pSource、pAmount都是报表参数,其中pSource代表数据源名,${…}表示将字符串或字符串变量解析为表达式,pAmount代表订单金额。

  当pSource=”myDB1”时,A1的计算结果如下:


 

  当pSource=”oraDB”时,A1的计算结果如下


 

  报表工具可用JDBC的方式调用集算器脚本,就像调用普通数据库中的存储过程,形如:call 脚本文件名(参数1…参数N)。集算器的返回结果会以普通数据集的形式参与报表计算。具体用法可参考集算器集成与应用之JasperReport集成 和集算器集成与应用之BIRT集成 。
  作为专业的报表数据源工具,集算器还可以实现更多的计算,下面分别举例。

多源数据join后计算

  Sales是mysql数据库中的表,存储着多名销售员每天的多个订单,其中字段SellerId是销售员编号。emp是mssql数据库中的表,存储着销售员信息,其中字段EId是销售员编号。现在需要在报表中展现:订单编号、日期、金额、销售员名字、部门名称,条件是:订单日期在最近N天(比如30天)或者订单属于某几个受关注的部门(比如Markeding和Finance)。部分源数据如下:

  库表sales


 

  库表emp


 

  集算器代码:


 

  A1,A2:查询数据库,myDB1和myDB2分别直向mysql和mssql。

  A3:将A1中的SellerId字段替换成A2中对应的记录,关联字段为EId。A3的计算结果如下(蓝色字体表示该数据项包含下级成员):


 

  当A2中找不到对应的记录时,函数switch默认保留A1中记录,对应的SellerId显示为空,效果类似于左连接。如果想进行内连接,应当使用选项@i,形如:A1.switch@i(SellerId,A2:EId) 。

  A4:对关联结果进行过滤,第1个条件是:订单日期在最近N天(对应参数days),表达式为OrderDate>=after(date(now()),days*-1)。第2个条件是:订单属于某几个受关注的部门(对应参数depts),表达式是depts.array().pos(SellerId.Dept)。运算符||表示逻辑关系“或”。

  函数after可以算出相对时间,函数array可以按分隔符将字符串拆分为集合。函数pos可以找出成员在集合中的位置。SellerId.Dept表示SellerId字段对应的记录的Dept字段。

  Days和depts都是来自于报表的参数,如果分别输入30、”Marketing,Finance”,则A4的结果如下:


 

  A5:从A4中取得报表需要的字段,最终计算结果如下:


 

结果集union

  结果集ds1和ds2结构相同,分别来自mySQL和文本文件,需要将ds1和ds2纵向拼接起来再呈现为交叉表。源数据如下:


 

  集算器代码:


 

  A3:纵向拼接两个数据集。报表工具只需呈现基于单数据集的简单交叉表。

主子报表多数据源
  对于单数据源报表,如果同一张报表中的主表和子表使用不同的数据源,就需要显式传递数据库URL,或用JAVA类合并不同的数据源,前者安全性较低,后者代码复杂。使用集算器可以方便地解决此类问题,下面用例子来说明。

  设计一张主子报表,按薪酬范围显示每位员工的订单信息,主报表数据来自表emp(MySQL数据库),子报表数据来自表sales(MSSQL数据库)。部分源数据如下:

  集算器代码:

  empEsProc.dfx(该脚本文件用于主报表)


 

  A1:按薪酬范围查询MYSQL数据库的表emp。

  salesEsProc.dfx(该脚本文件用于子报表)


 

  A1:按员工ID从MSSQL的sales表查找相应的订单。如果eid=1,则A1的计算结果如下:


 

  可以看到,不同的数据源可被集算器合并为单一数据源,主子报表只需调用不同的集算器文件即可实现本需求。

  有些报表系统会存在多种数据源,各报表使用的数据源不同且经常发生变更,管理起来难度较大,使用集算器单一数据源可以降低管理难度。
类似地,单一数据源还可以解决子报表多数据源的问题,即:报表中存在多个子报表(或table控件),每个子报表使用不同的数据源。

主子表动态关联

  主表相关的子表分布在多个数据库中,要求报表呈现这些数据源动态关联的结果。此类需求可以用集算器简单实现,例如:

主表org在数据源Master中,org里每条记录对应的子表在不同的数据源中,比如org.org_id=”ORG_S”时,这条记录对应的子表是数据源S_odaURL的User表,org.org_id=”ORG_T”时,这条记录对应的子表是数据源T_odaURL中的User表。子表不止两个,名字都是User,需要和主表动态关联再呈现在报表中。逻辑上的关系如下:


 

  集算器代码如下:


 

  A1:执行SQL,从数据源Master的org表取数据。arg1是来自报表的参数,arg1=”ORG”时A1的计算结果如下:


 

  A2:依次循环A1中的记录,每次动态关联一个子表,并将关联结果合并在B2中。集算器用自然缩进来表示循环语句的作用范围,即B2-B7,循环体中可用A2来引用循环变量,可用#A2来引用循环计数。

  B2:根据当前记录的org_id字段计算出对应子表的数据源名。第一次循环时,B2的计算结果为” S_odaURL”。

  B3:根据名字显式连接到数据源。

  B4:按条件查询user表中的数据。

  B5:在子表B4中新增三列,数据来自主表。比如第一次循环时,B5计算结果如下:


 

  B6:将B5的计算结果合并到B1,运算符”|”等价于函数union。循环结束后B1会存储报表需要的完整数据,如下:


 

  B7:显式关闭数据源连接。

  A8:将B1显式返回给报表工具(默认会返回最后一个单元格)

根据参数显示时间精度不同的数据

  报表需要用折线图展现近期的销售额变化。unitType是报表参数,代表时间精度,当unitType等于”hour”时,需要展现近1小时内每五分钟的销售额,当unitType=”day”时,需要展现近1天内每小时的销售额,当unitType=”week”时,需要展现近1周内每天的销售额。数据来源于orders表,字段Amount是订单金额,t是订单发生时间。

  集算器代码:


 

  A1:空结果集,用来存储B2-B4产生的时间序列。

  A2-B2:根据报表参数unitType生成不同的时间序列,B2可生成近1小时内的12个时间点,每个时间点间隔5分钟,B3生成近1天内的时间点,B4生成近1周的时间点。

  A5:循环A1,每次统计一个时间段内的销售额,”~”表示A1的当前成员,”~[-1] “表示上一个成员。当unitType=”day”,会生成12条记录的单字段结果集。

  A6:将A5通过JDBC传给报表。之后就可以按普通统计图的方法去呈现。

  • 大小: 46 KB
  • 大小: 28.4 KB
  • 大小: 32 KB
  • 大小: 33.7 KB
  • 大小: 40.2 KB
  • 大小: 26.2 KB
  • 大小: 39 KB
  • 大小: 39.3 KB
  • 大小: 54.6 KB
  • 大小: 38.5 KB
  • 大小: 38.7 KB
  • 大小: 57 KB
  • 大小: 12.1 KB
  • 大小: 11.5 KB
  • 大小: 8.6 KB
  • 大小: 57.3 KB
  • 大小: 60.7 KB
  • 大小: 45.7 KB
  • 大小: 11.3 KB
  • 大小: 27.4 KB
  • 大小: 45.1 KB
  • 大小: 43.1 KB
0
0
分享到:
评论

相关推荐

    华报智能报表工具

    填报方式 无需预先定义数据集,通过直接对虚拟数据集操作(简单的增删和赋值操作)或从XML数据源中加载数据即可实现内容的填报。 可以在录入模式由用户通过用户界面UI输入数据至虚拟数据集中,从而实现数据的采集。...

    锐浪报表Grid++Report5.3

    5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都可以作为报表数据源。 6、提供图表功能,包括:饼图、叠加饼图、柱状图、气泡图、折线图、曲线图、散列点图等...

    快速数据报表控件(ODBC数据源)

    快速数据报表控件(ODBC数据源)1.1 ****************** VB版的简易Datawindow ******************* 可视化数据操作,在编程环境中即可显示数据。 无须手工输入SQL语句 无须使用...

    Grid++Report5.5报表工具

    5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都可以作为报表数据源。 6、提供图表功能,包括:饼图、叠加饼图、柱状图、气泡图、折线图、曲线图、散列点图等...

    Grid++Report5报表工具 版本5.5.0.8

    5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都可以作为报表数据源。 6、提供图表功能,包括:饼图、叠加饼图、柱状图、气泡图、折线图、曲线图、散列点图等...

    spring MVC Web应用中集成Jasper报表工具

    spring MVC Web应用中集成Jasper报表工具。教程涵盖的技术点有:报表自定义数据源的使用;报表渲染、呈现的配置与实现;iReport报表设计器的使用(报表模板设计)等。

    报表设计器源代码

    此报表设计器是一个简单快速的报表开发工具,轻松实现报表显示、过滤、打印、导出等一体化集成功能。提供VB.net、C#丰富使用例子,报表如何调用一目了然。 一、工具特点: 1、可根据SQL语句自动生成报表格式,打印...

    Grid++Report5.6报表开发工具

    5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都可以作为报表数据源。 6、提供图表功能,包括:饼图、叠加饼图、柱状图、气泡图、折线图、曲线图、散列点图等...

    spring MVC Web应用中集成Jasper报表工具。

    在本教程中,我们将学习如何在一个简单的spring MVC Web应用中集成Jasper报表工具。教程涵盖的技术点有:报表自定义数据源的使用;报表渲染、呈现的配置与实现;iReport报表设计器的使用(报表模板设计)等。

    Excel透视表报表生成组件源码(cs 2005,2008)

    在Excel中,我们可以从两类不同的数据源中提取基本数据,利用数据透视表向导工具来制作数据统计报表。这两种数据源即以Excel 文件自身表单(Sheet)中的表作为数据源,或以诸如Access、SQL Server等这样的数据库作为...

    ChinaExcel报表控件-报表软件

    目前国内功能最强的报表中间件产品,支持普通报表、分组报表、交叉报表、分组交叉报表、主从报表等各类统计报表的制作,支持用户自己定义报表,支持报表二次加工、过滤、支持多数据源、支持WEB、C/S等各种应用环境。...

    一个netcore实现的、以复杂统计报表为核心目标的制作、运行工具。支持数据看板、大屏制作

    CellReport 是一个netcore实现的、以复杂统计报表为核心目标的制作、运行工具。...你可以使用数据库、excel文件、api服务、已有报表等为数据源,通过内置的集合函数组织数据,以类excel界面设计最终呈现结果.zip

    基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目

    内置的基础功能包括数据源,数据集,报表管理。 多数据源支持,内置mysql、elasticsearch、kudu驱动,支持自定义数据集省去数据接口开发,支持17种大屏组件,不会开发,照着设计稿也可以制作大屏。 三步轻松完成大屏...

    GrafanaJsonDatasource:最灵活的Grafana数据源,可通过HTTP JSON API获取数据

    要使用此数据源,后端需要实现4个端点: GET /具有200状态代码响应。 用于数据源配置页面上的“测试连接”。 POST /search在调用时返回可用指标。 POST /query根据输入返回指标。 POST /annotations返回注释。 ...

    XML - 报表数据的新大陆.rar

    因此我认为报表工具不应当处理巨大的XML文档,在此前提下,为了实现方便,采用DOM方式来处理XML文档。 在.NET中使用XmlDocument加载一个XML文档后,会形成一个以XmlDocument为根节点的XML对象树状结构,面对这个XML...

    用集算器实现跨数据库关联报表

     现在大多数主流报表工具都支持多数据源关联,这在某些方面确实为报表用户带来了便利。然而我们也经常会遇到通过报表自身的多源关联功能很难实现一些跨库关联的报表(由于数据结构和业务本身决定)。这当然容易...

    报表软件--Style Report报表数据填报

     可以和各种数据源相关联,实现异构数据源之间的表关联,真正实现多源填报  处理数据灵活,通过javascript改动数据结构随时适应业务需求。  支持离线填写,可以导出excel文档,符合目前很多企业的填报流程,...

    Grid++Report6 报表开发者安装包

    5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都可以作为报表数据源。 6、提供图表功能,包括:饼图、叠加饼图、柱状图、气泡图、折线图、曲线图、散列点图等...

    JasperReport+iReport 报表工具详细开发手册

    JasperReport+iReport 报表工具详细开发手册 1. 简介 ................................................................................................................................................3 2. ...

    Excel 2007数据透视表完全剖析 4/7

    本书首先介绍了数据透视表的基础,然后逐步介绍创建数据透视表、自定义透视表、查看视图数据、在透视表内进行计算、使用数据透视图等可视化工具、分析数据源、共享数据表、使用和分析OLAP数据、在透视表中使用宏和...

Global site tag (gtag.js) - Google Analytics