报表示例——用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中的数据库连接。
A5=join@1(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}来调用。
报表示例——用Jasper report实现MongoDB join相关推荐
- 使用游标显示销售报表_协助报表开发之 MongoDB join mysql
集算器 SPL 语言支持处理多样性数据源,通过 SPL 对 MongoDB 集合与 MySql 表进行 join 关联,不仅简化了对 MongoDB 数据的操作,而且有利于与其它报表工具的方便集成.若 ...
- PDF报表打印 -- Jasper Report
一. PDF报表打印概述 1 概述 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之外,PDF报 ...
- Jasper Report 6.8 根据后台数据生成动态报表(JRXML文件实现)(三)JRXML文件生成过程(支持json,bean,map list数据源)
1.生成头信息及页面 protected Element createPageXmlFileRoot( ) {DftRptMaster dftRptMaster = rptInfo.getDftRpt ...
- jasper report 报表自动生成序号
利用Jasper report 提供的 COLUMN_COUNT函数来生成表格的序号列,在表格分页的时候,序号不能连续,新的一页总是从1开始. 于是,换了一个函数,用REPORT_COUNT,管用,分 ...
- 玩转 Jasper Report(1) Jaspersoft Studio 安装使用教程
文章目录 1 摘要 2 Jaspersoft Studio 下载安装 3 导出PDF的完整示例 4 当前示例的 jasper 源码 5 推荐参考资料 1 摘要 Jasper Report 作为一个老牌 ...
- 玩转 Jasper Report(3)Spring Boot 2.4 集成 Jasper Report 导出 PDF
文章目录 1 摘要 2 核心 Maven 依赖 3 核心代码 3.1 PDF 导出工具类 3.2 Jasper 导出模板 jrxml 文件 3.3 自定义字体配置 3.4 二维码设置 3.5 PDF导 ...
- Jasper Report详细使用教程(保姆级教程),整合Springboot使用
Jasper Report详细使用教程 1.下载Jaspersoft Studio 2.编写jrxml文件 3.编译模板文件 4.输出PDF报表(SpringBoot整合) 5.解决中文乱码(不显示的 ...
- jasper report分组显示
需求:java,使用jasper report生成PDF,并且将签署人相同的数据分组显示到一张PDF上,如下图: 问题:jasper report没有正确分组,radiologist为lly424的数 ...
- Linux服务器docker环境下Jasper Report报错
Linux服务器docker环境下Jasper Report报错 Jasperreports模板制作方法在网上都有很多教程,可以自行探索一下 我用的模板参考:https://blog.csdn.net ...
最新文章
- MDT 2010之部署Windows XP-5
- Trailblazer —— Rails 的扩展概念驱动开发框架
- 帝国cms栏目忘记设置为终极栏目怎么办?
- Geomagic Freeform Plus 2019中文版
- Android按钮持续按下执行,Android 按钮长按下去重复执行某个动作,放开后停止执行动作...
- 根据RTL图编写Verilog程序
- xd可以用ui动效效果吗_通过动画使UI设计栩栩如生:Adobe XD和After Effects
- CUDA:一维、二维的grid、block的核函数线程分配
- bugku_web_INSERT INTO 注入
- vue表格刷新数据_Vue.js的列表数据的同步更新方法
- office2013 应用程序无法正常启动(0xc000007b)
- HTML data-* 自定义属性
- linux安装jdk(二)
- 基于tensorflow的RNN中文自动写诗程序
- Stata: 实时估计个股贝塔(beta)系数
- Java代码使用最小二乘法实现线性回归预测
- 织梦编辑器加HTML视频显示很小,织梦教程:去掉编辑器自动加div的方法即大小字情况...
- 指尖江湖李忘生鸿蒙初开,剑网3指尖江湖李忘生全面评价
- 概率统计Python计算:离散型随机变量分布(bernoulli geom)
- My SQL 创建数据库
热门文章
- MacbookPro 2015/2017 安装Windows10后5G信号不稳定的解决方法
- Frida 安卓逆向破解辅助Hook
- Kafka系列10:面试题是否有必要深入了解其背后的原理?我觉得应该刨根究底(下)...
- 钠斯语音聊天系统-多人语聊房一键上麦,技能、婚姻、家族多种互动方式
- HDU 4343 Interval query 倍增思想, DP
- linux u盘新建文件夹加密,linux磁盘的加密保护以及u盘加密的方法
- 终极解决navicat远程mysql8报错 1251 Client does not support authentication protocol requested by server
- R实战 | 文章第一表:三线表的绘制
- ELMo模型最简单使用方式(pytorch版)
- (米联客MSXBO)开发板 osrc-lab LINUX下RTC时钟模块使用