多样性数据源是报表开发的常见问题,但用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. apache 开启 gzip 压缩服务
  2. 产品网络推广方案浅谈网站的相关性对优化的影响!
  3. 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数
  4. IDEA配置Tomcat出现404,The requested resource is not available终极超详细解决方案
  5. springboot日志笔记
  6. 删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
  7. u-boot启动参数命令格式
  8. linux下php、apache、mysql、curl环境搭建
  9. 拿下阿里投资 回血的网易云音乐能成功突围吗?
  10. javascript Event对象
  11. 前端之JavaScript进阶
  12. 目标检测方法总结(R-CNN系列)
  13. sql获取服务器系统时间,SQL Server取系统当前时间
  14. html鼠标移动图片自动放大,当鼠标移动到图片上时跟随鼠标显示放大的图片效果...
  15. Mongoose操作mongoDB的详细步骤
  16. 计算机网络常见面试题(计算机考研必备)
  17. 公司工作流程开发培训
  18. 将原神角色导入unity 完整版
  19. 启用DoH(DNS-over HTTPS)在Windows、Android、IOS平台
  20. 常用邮箱POP,SMTP服务器列表

热门文章

  1. c常用头文件——sys/socket.h
  2. 百度云服务器BCC安装ubuntu16.04 +python3.6配置uWSGI和Nginx 部署Django项目
  3. 一年Android工作经验,一举拿下百度、网易,flutterprovider局部刷新
  4. 车间排产软件提高生产进度的稳定性
  5. eclipse视图介绍
  6. 重心模型选址代码_[500行代码学懂OpenGL]之四z-buffer
  7. 实验六 2D图形变换
  8. leetcode:Number of Islands
  9. 2019: 我们的征途是星辰大海! | 掘金年度征文
  10. Google Book Search APIs——谷歌图书搜索API