报表示例——用Jasper report实现MongoDB join

多样性数据源是报表开发的常见问题,但用JasperReport等报表工具本身难以处理,比如展现两个MongoDB collection连接的结果。虽然JasperReport有virtual data source或table join,但这些功能只在商业版或高端版本出现,在免费版中实现的难度很大。而且这些功能只支持两个数据源的连接,要实现多连接则麻烦得多。另外,这些功能只是图形化界面,无法对连接后的数据进行类似SQL的结构化计算。

集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协助报表工具方便地实现此类需求。下面通过一个例子来说明MongoDB join的实现过程。

Sales和emp是MongoDB中的两个collection,sales中的字段SellerId逻辑上相当于外键,指向emp的EId字段,现在需要按时间段查询出sales中的订单,并和emp进行左连接,最后在报表中展现。部分源数据如下:

Collection sales

Collectionemp

集算器脚本:

A1=MongoDB("mongo://localhost:27017/test?user=root&password=sa")

上述代码用来创建MongoDB的数据库连接,可用user和password来指定用户名和密码。

集算器也支持用JDBC方式连接MongoDB,用法和普通数据库一样,但由于第三方JDBC不仅收费,而且功能上不如官方库函数,比如无法获取多层数据,因此集算器直接封装原生方法,MongoDB的功能和语法都被保留,比如可以在此基础上使用find函数,

A2=A1.find("sales","{‘$and‘:[{‘OrderDate‘:{‘$gte‘:‘"+string(begin)+"‘}},{‘OrderDate‘:{‘$lte‘:‘"+string(end)+"‘}}]}","{_id:0}").fetch()

上述代码从MongoDB的salescollection中查询出某时间段的记录。函数find的第一个参数是collection名,第二个参数是查询条件,遵循MongoDB规范,第三个参数限定返回的字段。注意查询条件中的begin和end是来自报表的外部参数,分别表示OrderDate的起始时间和终止时间。

函数find返回的是游标,并不会把数据直接读入内存,因此支持大数据量。可以用skip、sort、conj等函数继续操作游标,直到遇到函数fetch、groups,或语句for时才会真正取数。本例直接用函数fetch()将数据读入内存,假如时间段是2009-01-01到2009-12-31,则A2的计算结果如下:

A3=A1.find("emp",,"{_id:0}").fetch()

上述代码从emp collection取数,无条件,除了_id之外取出所有字段,结果如下:

A4=A1.close()

上述代码用来关闭A1中的数据库连接。

[email protected](A2:sales,SellerId;A3:emp,EId)

上述代码将A2和A3进行左连接,连接字段是A2的SellerId和A3 的Eld,直观起见,连接后的两部分数据分别命名为sales和emp。函数join执行连接计算,选项@1表示左连接,计算结果如下图左侧:

可以看到,由于是左连接,因此sales中部分SellerId无法在emp中找到对应的记录。如果想进行全连接,可以使用选项@f,无选项则表示内连接。

A6=A5.new(sales.OrderID:OrderID,sales.Client:Client,sales.Amount:Amount,sales.OrderDate:OrderDate,emp.Name:Name,emp.Dept:Dept,emp.Gender:Gender)

A5执行连接操作,A6则从连接的结果中取出需要的字段,并用函数new组成二维表。比如sales.OrderID:OrderID表示从A5取出sales.OrderID字段,重命名为OrderID(报表工具无法识别sales.OrderID这样的字段名)。计算结果如下:

到此为止,报表需要的数据就全部计算出来了。最后只需用result A6将A6中的二维表返回报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。

接下来以JasperReport为例设计报表,表样如下:

需要定义两个报表参数Pbegin、Pend,分别对应集算器中的两个参数。预览后可以看到报表结果:

报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为mongodbJoin.dfx,则在JasperReport的SQL设计器中可以用mongodbJoin $P{pbegin},$P{pend}来调用。

时间: 2024-10-10 10:25:27

报表示例——用Jasper report实现MongoDB join的相关文章

用Jasper Report制作Mongodb join Mysql的报表例子

多样性和多数据源问题使用JasperReport等报表工具本身不易处理,比如展现MongoDB和mysql的混合运算.虽然JasperReport/Birt有virtual data source或table join等功能,但只在商业版或高端版本出现,在免费版中实现难度很大,而且功能也有较大局限,无法对连接后的数据进行类似SQL的结构化计算. 集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协助报表工具方便地实现此类需求.下面通过一个例子来说明MongoDB join mysql的

Jasper Report (2)--- 用JDBC做为数据源

用JDBC做为jasper report的数据源来连接数据库读取数据 1. 在Eclipse中新建Java项目(过程略),我的Java项目的结构如下所示: 注:这里的有关spring的jar包并不是改项目运行必须的,是我在做用JavaBean做为数据源的时候用到的包,请忽略. 2.连接数据库代码(我连接的是Mysql数据库) 1 package com.report.sample; 2 3 import java.sql.Connection; 4 import java.sql.DriverM

Jasper Report (1)--- Eclipse集成Ireport插件

环境的搭建(Eclipse中集成Ireport插件) 1. 首先在eclipse的工具栏点击 Help --> Eclipse MarketPlace --> Find 输入“ireport”点击搜索会出现如图所示的界面,按照图示进行安装插件(目前最新的是6.10) 2.安装成功后会提醒重新启动eclipse软件,重新启动后如图所示,验证插件是否安装成功 至此,eclipse集成ipreport插件已经成功,可以进行jasper report的设计了!

初试Jasper Report

第一步,打开Jaspersoft Studio,界面应该长这样(跟eclispse长的一样) 默认的项目名称是MyReports,当然也可以自己创建,此时我们需要这么干 点击File → New → Other,然后你会看到向导,此时勾选show all wizards(不勾选先看看长什么样子),然后点开java 或者jaspersoft studio两个文件夹,一般选的就是java project 或者jasperReports project,当然了,也可以将你自己的文件import到jas

用Jasper report来实现交叉报表的增长率计算

来源:     http://community.jaspersoft.com/questions/847490/how-get-annual-growth-rate-crosstab 交叉表的每一列都是动态生成的,进行列间计算时需要动态引用,用Jasper脚本实现此类需求有一定难度,用集算器在数据准备阶段实现则相对简单,下面用例子来说明. 数据库表store存储着多种产品在2014.2015年的销售量,需要用交叉表呈现每种产品每年的销售量,并计算出各产品的年增长率.部分源数据如下: 集算器代码

Jasper Report (3)--- 用JavaBean Collection做为数据源

1. 新建Java项目结构如下图所示(该项目中有子报表的知识这里不记录这点知识点): 2. 项目中代码片段 1.实现JRRewindableDataSource接口里面的方法 1 package com.iaspec.ireport.common; 2 3 import java.util.List; 4 5 import net.sf.jasperreports.engine.JRException; 6 import net.sf.jasperreports.engine.JRField;

用Jasper report计算opening balance

来源: http://community.jaspersoft.com/questions/850400/how-create-report-opening-balance-using-jasper-reports . 根据存取金额计算初期余额时需要进行跨行计算,用Jasper表达式可以实现,但步骤复杂有一定难度,用集算器协助Jasper则可以轻松实现,下面用简化的例子来说明. data.csv存储着某账户各期资金存取情况,需要根据该文件计算出初期余额,部分源数据如下: 集算器代码: A1:以逗

[deviceone开发]-echart的简单报表示例

一.简介 echart是一个常用的基于h5的报表库.这个例子简单展示了实现折线图,柱状图,圆环图和圆饼图的使用. 并实现和do的非html部分的数据交互. 二.效果图 三.相关下载 https://github.com/do-project/code4do/tree/master/call_echart 四.更多案例 http://source.deviceone.net/

K3/Cloud点按钮打开单据,列表,动态表单,简单账表和直接Sql报表示例

BOS IDE中配置了个界面,拖了动态表单界面,加了5个测试按钮. 点击"打开单据"维护界面, 会跳转到一个新的主界面页签,[物料]新增 点击"打开列表",会弹出[物料]列表界面 点击"打开动态表单",会弹出动态表单, 这个打开动态表单界面是空的,一般动态表单都是要压入自定义参数值进去,或者从父界面获取需要的值. 点击"打开简单帐表",会弹出简单帐表, 点击"打开直接SQL帐表",会弹出直接SQL帐表, 可