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

用Jasper report实现MongoDB join

阅读更多

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

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

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



 

  Collection emp



 

   集算器脚本:



 

    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的sales collection中查询出某时间段的记录。函数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}来调用。 

  • 大小: 27.5 KB
  • 大小: 34.6 KB
  • 大小: 68 KB
  • 大小: 36.4 KB
  • 大小: 30.8 KB
  • 大小: 68.3 KB
  • 大小: 64 KB
  • 大小: 39 KB
  • 大小: 44.9 KB
2
1
分享到:
评论

相关推荐

    Jasper report用户手册Jasper report用户手册

    《JasperReport用户手册》是针对Java开发人员和报表设计者的一份详尽指南,它提供了使用JasperReport库创建、设计和管理复杂报表的全面知识。JasperReport是一款开源的报表工具,允许开发者在各种应用程序中嵌入交互...

    Jasper Report

    Jasper Report

    Jasper Report用户手册.doc

    这份《Jasper Report用户手册》详尽地介绍了如何使用JasperReport进行报表的设计、编译、预览、填充、查看、打印以及导出等操作。 首先,手册简要介绍了JasperReport的基本概念,包括API概览。API中涉及的主要类和...

    Jasper_Report用户手册

    Jasper Report用户手册 version1.0 1 简介 2 API概览 Class net.sf.jasper.engine.design.JasperDesign Class net.sf.jasper.engine.JasperReport Class net.sf.jasper.engine.JasperCompileManager Class ...

    Jasper Report用户手册(1.0)中文版

    ### Jasper Report 用户手册知识点概述 #### 一、简介 Jasper Reports是一款开源的报表工具,由Jaspersoft公司开发并维护。它能够帮助开发者轻松地将数据转化为专业的报表格式,并支持多种输出方式,如PDF、HTML、...

    struts2 + jasper report

    总结来说,`struts2 + jasper report`的组合为Java Web应用提供了强大的报表生成能力,通过Struts2的控制层管理和JasperReport的报表引擎,可以方便地将后台数据转化为直观的报表展示给用户。在项目`...

    The First Jasper Report Ever

    标题和描述均提到了"The First Jasper Report Ever",这标志着Jasper Reports的首个报告实例,Jasper Reports是一种广泛使用的开源报告工具,它允许用户创建、填充和查看复杂的报表。此报告由byteodord在2001年至...

    jasper怎么构建报表的详细例子

    在本篇文章中,我们将深入探讨如何使用Jasper来构建各种类型的报表,包括普通报表、分组报表、自定义报表、图形报表以及图形表格混合的报表。 首先,我们从基础开始——普通报表。JasperReport的基础在于JRXML文件...

    jasper report 报表源码 里面有demo

    jasper report 报表源码 里面有demo 容我多说俩,jasperReports 是一个基于 Java 的开源报表工具,它可以在 Java 环境下像其它 IDE 报表工具一样来制作报表。JasperReports 支持 PDF、HTML、XLS、CSV 和 XML 文件输出...

    JasperReports介绍.doc Jasper report

    JasperReports是一款强大的开源报表生成工具,主要用Java编写,适用于各种Java应用,包括J2EE和Web应用。它允许用户创建丰富的报表内容,并可以导出为PDF、HTML、XLS、CSV和XML等多种格式。报表的设计是基于XML文件...

    还是jasper report jar包 补充三个

    标题中的“jasper report jar包 补充三个”指的是在之前的基础上增加了三个与JasperReports相关的JAR库,这是用于报表生成和设计的开源Java框架。JasperReports库依赖于多个第三方组件,以便支持丰富的报表功能,如...

    Jasper Report java包 帮助文档 API 实例

    - **JRXML文件**:JasperReport使用XML格式定义报表布局,JRXML文件是报表设计的基础,包含了报表的所有元素如文本框、表格、图像等。 - **模板设计**:通过iReport或Jaspersoft Studio等可视化工具,开发者可以...

    jasper报表(odoo)

    jasper报表(odoo)

    Jasper Report 报表的使用步骤及应用

    5. **参数设置(动态传参数)**:参数允许你在运行时传递值给报表,实现动态报表。在报表设计阶段,可以定义参数,并在运行时通过参数传递数据,例如日期范围或特定查询条件。 6. **设置Page Rooter**:Page Rooter...

    jasperIreport +Ireport实现金额大写

    Ireport实现金额大写 在irport里面写script脚本 完成转换

    jasper report用到的5个jar包

    在使用JasperReport时,为了使其正常工作,需要依赖一系列的Java Archive (JAR) 文件。在给定的压缩包文件中,包含了五个关键的JAR文件,它们是JasperReport运行的核心组件。下面将详细解释这些JAR文件的作用及其在...

    Jasper_+_ireport_集成报表到Web应用,操作说明

    在集成Jasper Report与iReport到Web应用之前,首要步骤是下载并安装所需的软件。iReport是Jasper Report的一个图形界面设计工具,主要用于设计报表布局。而Jasper Report则是一套用于在Java应用程序中生成报表的类库...

    JasPer软件_JPEG2000标准的实现

    ### JasPer软件:JPEG2000标准的实现 #### 一、引言 JPEG2000标准是由国际标准化组织(ISO)与国际电工委员会(IEC)联合推出的新一代静止图像压缩标准,旨在取代传统的JPEG标准,并提供更高效、更灵活的图像压缩...

    JasperReport动态表头及按组分页,去掉了subreport

    在JasperReport中,可以使用`<band>`元素来定义不同级别的表头,并通过`<group>`标签来设置分组,使表头随着数据分组的变化而变化。例如,当一个表格的数据按照地区、城市、产品类别进行分组时,表头会分别显示这些...

    利用Jasperreport+IReport进行报表开发

    1. 加载报表模板:使用 JasperReport 类的 compileReport 方法将 .jrxml 文件编译为 .jasper 文件。 2. 数据填充:通过 JasperFillManager 的 fillReport 方法,用实际数据填充报表模板。 3. 报表导出:使用 ...

Global site tag (gtag.js) - Google Analytics