多样性数据源是报表开发的常见问题,但用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相关推荐

  1. 使用游标显示销售报表_协助报表开发之 MongoDB join mysql

    集算器 SPL 语言支持处理多样性数据源,通过 SPL 对 MongoDB 集合与 MySql 表进行 join 关联,不仅简化了对 MongoDB 数据的操作,而且有利于与其它报表工具的方便集成.若 ...

  2. PDF报表打印 -- Jasper Report

    一. PDF报表打印概述 1 概述 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之外,PDF报 ...

  3. Jasper Report 6.8 根据后台数据生成动态报表(JRXML文件实现)(三)JRXML文件生成过程(支持json,bean,map list数据源)

    1.生成头信息及页面 protected Element createPageXmlFileRoot( ) {DftRptMaster dftRptMaster = rptInfo.getDftRpt ...

  4. jasper report 报表自动生成序号

    利用Jasper report 提供的 COLUMN_COUNT函数来生成表格的序号列,在表格分页的时候,序号不能连续,新的一页总是从1开始. 于是,换了一个函数,用REPORT_COUNT,管用,分 ...

  5. 玩转 Jasper Report(1) Jaspersoft Studio 安装使用教程

    文章目录 1 摘要 2 Jaspersoft Studio 下载安装 3 导出PDF的完整示例 4 当前示例的 jasper 源码 5 推荐参考资料 1 摘要 Jasper Report 作为一个老牌 ...

  6. 玩转 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导 ...

  7. Jasper Report详细使用教程(保姆级教程),整合Springboot使用

    Jasper Report详细使用教程 1.下载Jaspersoft Studio 2.编写jrxml文件 3.编译模板文件 4.输出PDF报表(SpringBoot整合) 5.解决中文乱码(不显示的 ...

  8. jasper report分组显示

    需求:java,使用jasper report生成PDF,并且将签署人相同的数据分组显示到一张PDF上,如下图: 问题:jasper report没有正确分组,radiologist为lly424的数 ...

  9. Linux服务器docker环境下Jasper Report报错

    Linux服务器docker环境下Jasper Report报错 Jasperreports模板制作方法在网上都有很多教程,可以自行探索一下 我用的模板参考:https://blog.csdn.net ...

最新文章

  1. MDT 2010之部署Windows XP-5
  2. Trailblazer —— Rails 的扩展概念驱动开发框架
  3. 帝国cms栏目忘记设置为终极栏目怎么办?
  4. Geomagic Freeform Plus 2019中文版
  5. Android按钮持续按下执行,Android 按钮长按下去重复执行某个动作,放开后停止执行动作...
  6. 根据RTL图编写Verilog程序
  7. xd可以用ui动效效果吗_通过动画使UI设计栩栩如生:Adobe XD和After Effects
  8. CUDA:一维、二维的grid、block的核函数线程分配
  9. bugku_web_INSERT INTO 注入
  10. vue表格刷新数据_Vue.js的列表数据的同步更新方法
  11. office2013 应用程序无法正常启动(0xc000007b)
  12. HTML data-* 自定义属性
  13. linux安装jdk(二)
  14. 基于tensorflow的RNN中文自动写诗程序
  15. Stata: 实时估计个股贝塔(beta)系数
  16. Java代码使用最小二乘法实现线性回归预测
  17. 织梦编辑器加HTML视频显示很小,织梦教程:去掉编辑器自动加div的方法即大小字情况...
  18. 指尖江湖李忘生鸿蒙初开,剑网3指尖江湖李忘生全面评价
  19. 概率统计Python计算:离散型随机变量分布(bernoulli geom)
  20. My SQL 创建数据库

热门文章

  1. MacbookPro 2015/2017 安装Windows10后5G信号不稳定的解决方法
  2. Frida 安卓逆向破解辅助Hook
  3. Kafka系列10:面试题是否有必要深入了解其背后的原理?我觉得应该刨根究底(下)...
  4. 钠斯语音聊天系统-多人语聊房一键上麦,技能、婚姻、家族多种互动方式
  5. HDU 4343 Interval query 倍增思想, DP
  6. linux u盘新建文件夹加密,linux磁盘的加密保护以及u盘加密的方法
  7. 终极解决navicat远程mysql8报错 1251 Client does not support authentication protocol requested by server
  8. R实战 | 文章第一表:三线表的绘制
  9. ELMo模型最简单使用方式(pytorch版)
  10. (米联客MSXBO)开发板 osrc-lab LINUX下RTC时钟模块使用