精华内容
下载资源
问答
  • Birt 报表参数的使用路 绪清 和 任 谦2007 年 9 月 27 日发布序言参数是 birt 提供的一种很重要的机制,在 birt 中,参数具有变量的作用,它为 birt 报表的生成提供了一种灵活强大的机制。本文基于 Birt 2.1.2 讲述 ...

    Birt 报表参数的使用

    路 绪清 和 任 谦

    2007 年 9 月 27 日发布

    序言

    参数是 birt 提供的一种很重要的机制,在 birt 中,参数具有变量的作用,它为 birt 报表的生成提供了一种灵活强大的机制。本文基于 Birt 2.1.2 讲述 Birt 报表中一些重要的用法以及 birt 源码级的参数使用机理,为报表开发者以及报表应用程序开发者提供一个参考。

    本文的示例是基于 Birt RCP designer 2.1.2 开发的,在阅读本文前,最好有 eclipse 相关经验,并且已经能够使用 Birt 插件制作一些简单报表,并了解 Birt 报表的一些基本概念,比如 Data Source(数据源),Data Set(数据集)等。基本报表制作过程可见 developerworks 相关文章"BIRT:基于 Eclipse 的报表"。

    本文示例使用 Birt 自带的 Sample 数据源,用到的数据基于图 1 所示的实体关系模型。从这个模型中可以看出,文中示例用到三张数据库表分别为 customers,orders 和 orderdetails。其中 customers 表的 customernumber 字段作为外键出现在 orders 表中,而 orders 表的 ordernumber 字段做为外键出现在 orderdetails 表中。

    图 1. 实体关系模型

    1 标量参数(Scalar parameter)

    在使用 BIRT 参数的时候,首先要了解 BIRT 分为报表参数和数据集参数。

    报表参数定义于整个报表内,而数据集参数定义于某个数据集(Data Set)中。

    数据集参数使用的时候通常需要链接到某个报表参数或者利用绑定表(binding tab)和一个嵌套表中的某个数据元素绑定。

    标量参数是Birt报表中最简单也是最基本的一类参数,标量参数可以分为静态和动态两种,其中静态参数从用户界面获得用户输入的数据值,而动态参数则可以关联至某一个数据集,因此可以获得一个数据的集合,供用户选择。

    下面分别介绍这两种参数。

    1.1 静态标量参数

    右键点击Outline面板中的Report parameter选项,在弹出的上下文菜单中点击“New parameter”,弹出图2所示编辑参数对话框,在name域输入参数的名字,本例中使用的参数名字为“customernum”,此时List of value项默认为static。

    点击OK后返回到开发主界面。

    图 2. 编辑参数

    接下来定义Data Set。Data Set定义的对话框如图3所示。

    在这个对话框中首先定义“Query”。

    我们可以看出Where条件中的customernumber字段通过”?”代表的参数传入参数值。

    图 3. 数据集中的“查询”定义

    点击”Parameter”,弹出在数据集中定义参数的对话框。

    数据集中的参数需要链接至某一个报表参数。

    在本例中将数据集参数链接至前面定义的报表参数customernum。

    点击OK,我们就完成了数据集中参数的定义。当报表运行时,Birt会使用由报表参数customernum传入的值填充where条件,生成结果数据集。

    如图4所示。

    图 4. 数据集中的“参数”定义

    1.2 动态标量参数

    动态参数可以提供一个数据值的列表供用户选择,这种功能能够极大增强报表设计用户界面的交互性。

    在本例中,我们首先定义一个数据集,这个数据集不使用参数,它从订单表中查询出所有的订单号,为报表参数提供一个数据值的列表。

    如图5所示。

    图 5. 数据集“ordernum”

    接下来,我们定义报表参数,这个参数链接至前面的ordernum,因此可以根据数据集中的参数ordernum动态的获得可选值。

    如图6所示。

    图 6. 报表参数“ordernumpara”

    如图中所示参数的display type选成Como Box,List of value选择为Dynamic,其链接至的Data Set选择为前面定义的ordernum数据集,同时选定Select value column为数据集ordernum中的某个字段,这里ordernum数据集只有一个字段,故选择为ordernumber。

    这样就将报表参数和数据集参数关联起来。但这不是我们的最终目的,我们的目的是以报表参数ordernumpara为中介,向另一个数据集提供参数。

    因此,我们定义图7所示的数据集。

    图 7. 数据集“ordersdetail”

    点击“Parameter”项,进入数据集参数定义界面,如图8所示。

    图 8. 将数据集内的参数连接至报表参数“ordernumpara”

    将本数据集的参数num链接至ordernumpara,就完成藉由一个报表参数为中介将一个数据集的字段值链接到另一个数据集的参数的功能。

    2 Cascading Parameter

    除了使用动态报表参数提供数据值的选择列表,报表开发过程中用户经常需要用到互相关联的参数。

    比如要选择某个客户的某个订单号标识的所有订单的内容,用户并不愿意列出所有可能的订单号,比较理想的情况是给出一个客户编号的选择列表,根据这个列表的内容再给出每个客户的所有订单号的列表,这样用户就可以选择相应的客户对应的某个订单号,从而查询出此客户的这个订单号标识的所有订单的详细内容。

    Cascading parameter 一方面增强了报表逻辑的功能;另一方面,通过将一部分应用逻辑转移到界面操作上,进一步降低了报表内部逻辑和SQL查询语句的复杂性。

    首先定义一个customer数据集,这个数据集 包含customernumber和customername两个字段。如图9所示。

    图 9. 数据集“customer”

    接着定义一个名字为orders的数据集,如图10所示。

    图 10. 数据集“orders”

    在“Orders”数据集中使用一个数据集参数,这个数据集参数将要引用接下来将要定义的层叠参数中customer参数。

    定义了以上数据集之后,我们就可以来定义层叠参数了。

    右键点击Outline面板中的Report parameter选项,在弹出的上下文菜单中点击“New Cascading Parameter”,弹出以下对话框,在Cascading Parameter name域输入参数的名字,本例中使用的参数名字为“custorder”,Data Set Model选择为Multi Data Set。

    在紧接着的Parameters表中定义一个名为customer的参数,并将其关联至customer这个数据集,其取值为customer数据集中的customernumber字段,这样customer这个层叠参数的取值就是一个customernumber的列表。

    Customer此时也成为一个动态参数。

    如图11所示。

    图 11. 层叠参数定义1

    完成customer的定义后,我们紧接着定义另一参数order,方法和定义customer相同,最后order参数和数据集orders关联,其取值为orders数据集中的ordernumber字段。

    由于数据集orders的局部参数需要和前面定义的customer参数关联后才能产生数据结果集合,因此,在下一步将数据集orders与参数customer完成关联后,order这个层叠参数也将成为一个动态参数,它也成为一个数据值的选择列表,这个列表的值是由某个customernumber决定的所有可能的订单号。

    如图12所示。

    图 12. 层叠参数定义2

    接下来将orders数据集中的参数param1关联至层叠参数customer,如图13所示。

    图 13. 关联数据集“orders”中的参数至层叠参数“Customer”

    最后,定义生成报表的数据集orderdetail,如图14所示。

    图 14. 数据集“orderdetail”

    然后将其局部参数param1关联至层叠参数order,如图15所示。

    这样我们就完成了具有Cascading parameter功能的数据集的定义。

    图 15. 关联数据集“Orderdetail”中的参数至层叠参数“Order”

    从主开发界面中将orderdetail数据集拖拽到主开发面板上就完成了这个简单的报表的制作。见图16

    图 16. 层叠定义完成后的主开发界面

    点击preview,会弹出如图17所示对话框。

    从这个对话框中我们可以看到层叠参数customer的数据是customers数据库表中的所有客户,选定一个客户后,层叠参数order的列表将只出现客户TechnicsStoreInc的所有订单,选择其中一个订单后,就会从orderdetail数据表中选出这个订单号标识的所有订单的详细内容。

    图 17. 层叠参数用户界面

    3 Parameter Group

    在某些情况下,在创建报表的时候需要提供大量的参数,为了在界面上更加有效地对这些参数进行组织,BIRT提供了parameter group的功能。

    用户可以使用parameter group将相关的parameter组织在一起。

    Parameter group的使用比较简单。

    首先需要创建一个parameter group。在outline视图中用鼠标右键点击report parameters标签并选择new parameter group。

    创建完parameter group后便可以为其创建parameter。

    为一个parameter group创建parameter有两种方式。一种方式是用鼠标右键点击parameter group标签并选择new parameter创建新的parameter;另一种方式是将已有的parameter添加入parameter group,只需要使用鼠标将所需要的parameter拖拽入parameter group中。

    如图18所示是parameter group的一个例子。

    图 18. Parameter Group示例

    4 使用parameter实现nested tables

    前面的例子展示了如何将BIRT中的report parameter与data set parameter进行binding。

    作为BIRT parameter的另一个例子,我们下面通过介绍data set parameter与data colummn的binding实现nested tables。

    本节将通过JDBC Dataset和Scripted Dataset分别介绍实现过程。

    Nested table主要用于存在外键关联的两个或几个表。

    比如customer与order是1:N的关系,order表中存在外键custmernumber。

    有些时候,我们要将customer与相应order的信息一起进行展现,这时就需要使用nested table。

    4.1 使用JDBC Data Sets

    首先,在Birt数据源的基础上创建两个数据集CustomerSet(OuterSet)和OrderSet(InnerSet)。

    CustomerSet用于获取所有Customer的信息,在layout视图下右键点击“Data Explorer”中的“Data Sets”图标并选择“New Data Set”,选择数据源并填写Data Set名称为CustomerSet;然后点击next填写数据源的query语句。

    OrderSet用于获取指定Customer的Order信息,与CustomerSet的创建过程类似。

    由于OrderSet作为内嵌表,需要关联参数CumtomerNumber,因此需要在创建OrderSet的时对查询语句提供where子句“where CLASSICMODELS.ORDERS.CUSTOMERNUMBER=?”。

    CustomerSet和OrderSet的创建过程如图19,20所示。

    图 19. 数据集CustomerSet

    图 20. 数据集OrderSet

    然后为其创建相应的dataset parameter,在“Data Explorer中”双击OrderSet,创建一个dataset parameter名称为CNo,设定其DataType为integer,DefaultValue为任意整数,如图21所示。

    图 21. 数据集参数Cno

    在创建好数据集的基础上,我们就可以在报表界面上面创建nested table了。

    首先创建显示一个customer信息的外层OurterTable,编辑OuterTable的Data Binding并设置与其绑定的DataSet为CustomerSet,然后在OuterTable中并添加需要显示的字段信息并为nested table预留一个空白列。

    如图22所示。

    图 22. 外层表示意图及数据集绑定

    下一步在OuterTable中空白列的detail行中创建显示order信息的InnerTable,设置与其绑定的DataSet为OrderSet,并添加需要显示的字段,如图23所示。

    最后为InnerTable创建DataSet parameter binding,在InnerTable的Data Binding对话框中点击“Dataset Parameter Binding”按钮,设置参数CNo的value是row[“CUSTOMERNUMBER”],如图24所示。

    图 23. 内嵌表

    图 24. 数据集参数绑定

    至此,nested table的创建过程完成,我们可以通过选择preview视图查看报表的输出结果如图25所示。

    图 25. 程序执行结果

    4.2 使用Scripted Data Sets

    本小节中将介绍如何使用两个Sripted Dataset实现nested table。

    仍然以customer和order为例,并以CustomerName作为关联外键。

    第一步创建数据集。

    首先创建一个Scripted Data Source,然后以此创建两个数据集CustomerSet和OrderSet,在CustomerSet中创建两列CustomerNo和CustomerName,在OrderSet中创建三列OrderSet、Content和CustomerName。

    最后为OrderSet创建一个DataSet Parameter CName,Data Type为String,Direction为Input,Default Value为任意整数,如图26所示。

    图 26. OrderSet的数据集参数CName

    第二步在报表界面上创建外层表(OuterTable)和内嵌表(InnerTable),并设置与其绑定的Dataset分别为CustomerSet和OrderSet,步骤与4.1小节类似。

    然后为InnerTable创建Dataset parameter binding,设置参数CName的value为row[“CustomerName”]。

    由于我们使用的是Scripted Data Set,因此在本例中我们需要使用Birt Sript构造一些数据,并实现数据集的数据获取。

    首先,在报表的beforeFactory方法中构造数据,代码如下所示。

    报表的beforeFactory方法importPackage( Packages.java.util );

    importPackage( Packages.java.lang );

    var outerMap = new Hashtable();

    var innerMap = new Hashtable();

    var customer = new Array(2);

    for(var i=0;i<2;i++) {

    var array = new Array(2);

    array[0] = ""+i;

    array[1] = "customer_"+i;

    customer[i] = array;

    }

    outerMap.put(1, customer[0]);

    outerMap.put(2, customer[1]);

    var order = new Array(5);

    for(var i=0;i<5;i++) {

    var array = new Array(2);

    array[0]=i;

    array[1]="order_"+i;

    order[i]=array;

    }

    var orderList1 = new ArrayList();

    orderList1.add(order[0]);

    orderList1.add(order[1]);

    var orderList2 = new ArrayList();

    orderList2.add(order[2]);

    orderList2.add(order[3]);

    orderList2.add(order[4]);

    innerMap.put(customer[0][1], orderList1);

    innerMap.put(customer[1][1], orderList2);

    reportContext.setPersistentGlobalVariable("outerMap", outerMap);

    reportContext.setPersistentGlobalVariable("innerMap", innerMap);

    然后,为CustomerSet和OrderSet添加script代码。

    CustomerSet的open方法代码如下所示。

    CustomerSet的open方法outerMap = reportContext.getPersistentGlobalVariable("outerMap");

    iter = outerMap.entrySet().iterator();

    CustomerSet的fetch方法代码如下所示。

    CustomerSet的fetch方法if( iter.hasNext() ) {

    customer = iter.next().getValue();

    row["CustomerNo"] = customer[0];

    row["CustomerName"] = customer[1];

    return true;

    } else {

    return false;

    }

    OrderSet的open方法代码如下所示,其中inputParams[“CName”]就表示了绑定的Detaset parameter CName的值。

    OrderSet的open方法i = 0;

    customerName = inputParams["CName"];

    iMap = reportContext.getPersistentGlobalVariable("innerMap");

    orderList = iMap.get(customerName);

    OrderSet的fetch方法如如下所示。

    OrderSet的fetch方法if (orderList == null)

    return false;

    if (i < orderList.size()) {

    order = orderList.get(i);

    row["OrderNo"] = order[0];

    row["Content"] = order[1];

    row["CustomerName"] = customerName;

    i++;

    return true;

    }

    else

    return false;

    至此,使用Scripted数据源的nested table的创建过程完成,我们可以通过选择preview视图查看报表的输出结果如图27所示。

    图 27. 程序执行结果

    5 源代码级的参数使用

    对于报表应用程序开发者而言,有时他们需要在源码一级控制报表参数。

    接下来我们将讲述birt报表在源代码一级是怎样处理报表参数的。

    下面的程序片段是使用birt提供的API进行应用程序开发的一个基本框架,如果想获得更加详细的内容,请参考Birt API的源代码。

    清单1主要是进行报表引擎的设置和初始化,其主要目的是将Birt Home设置为Birt runtime下ReportEngine的安装目录。

    清单1//创建一个报表引擎配置对象

    EngineConfig config = new EngineConfig();

    //设置 BIRT报表引擎的安装路径

    config.setEngineHome("C:/birt/");

    清单2就是打开一个报表设计文件。

    报表设计文件就是指我们利用Birt报表开发工具开发的XML格式的,以.rptdesign为后缀的文件。

    清单2//创建一个报表生成引擎

    ReportEngine engine = new ReportEngine(config);

    //打开一个报表设计文件

    IReportRunnable design = engine.openReportDesign("C:/temp/test.rptdesign");

    清单3、4、5是处理报表参数,清单6是创建生成报表的任务,清单7是将处理好的参数设置给报表。

    清单8是进行一些输出选项的设置,比如生成什么格式(pdf,html等)的报表,结果输出到哪里(文件,输出流等),最后就是运行生成报表。

    其中清单3、4、5负责处理参数。

    清单3使用前面一步创建的设计文件对象生成一个IGetParameterDefinitionTask类型的paramTask,paramTask调用getParameterDefns方法获得报表中所有参数的定义,注意这里参数使用false,其效果是将报表中的parameter group 扁平化,从而以标量的形式返回所有的参数。

    这样可以将参数处理的复杂性进行封装,为应用程序开发者提供简单的使用接口。

    清单4是属于用户定制的步骤,因此本文没有给出相关源码。

    在这一步里,用户可以通过GUI 对话框或者HTML表单动态的输入参数值,参数值一般存储到一个HashMap中。

    清单5主要负责将第四步获得参数值赋给清单3中获取的参数定义。这三部分合起来就构成了birt API中处理参数的主要步骤.

    清单3//以打开的报表设计文件为参数,创建一个获取参数的对象

    IGetParameterDefinitionTask paramTask = engine.createGetParameterDefinitionTask(design);

    //获取报表设计文件中的参数定义

    Collection parameters = paramTask.getParameterDefns(false);

    清单4接受由html表单或GUI弹出的对话框输入参数值,假设输入的参数及其值以名/值对的形式存储在一个HashMap类型的变量paramValues中。

    清单5//为获取的参数定义赋值

    HashMap parameterMap=evaluateParameterValues(parameters,paramValues);

    清单6//创建生成报表的任务对象

    IRunAndRenderTask task = engine.createRunAndRenderTask(design);

    清单7//为报表生成任务设置参数集合对象

    task.setParameters(parameterMap);

    清单8//创建报表render选项对象

    IRenderOption options = new RenderOption();

    //设置输出格式(PDF,HTML等)

    options.setOutputFormat( format );

    // 设置输出文件

    options.setOutputFileName( targetFile );

    //设置render options对象

    task.setRenderOption( options );

    清单9为最终运行生成报表的方法。

    清单9//运行生成报表

    task.run();

    清单10是具体为报表中定义的参数赋值的过程。

    其主要思路是遍历清单3中获得参数集合,将其与清单4中传入的参数值以名/值对的方式存储在一个HashMap中。

    清单 9//为报表设计文件中定义的参数赋值

    private HashMap evaluateParameterValues( Collection paramDefns,

    HashMap params) {

    HashMap inputValues = new HashMap( );

    Iterator iter = paramDefns.iterator( );

    while ( iter.hasNext( ) ) {

    IParameterDefnBase pBase = (IParameterDefnBase) iter.next( );

    if ( pBase instanceof IScalarParameterDefn ) {

    IScalarParameterDefn paramDefn = (IScalarParameterDefn) pBase;

    String paramName = paramDefn.getName( );

    String inputValue = (String) params.get( paramName );

    int paramType = paramDefn.getDataType( );

    try {

    Object paramValue = stringToObject( paramType, inputValue );

    if ( paramValue != null ) {

    inputValues.put( paramName, paramValue );

    }

    }

    catch ( BirtException ex ) { }

    }

    }

    return inputValues;

    }

    6 结束语

    Birt是一款非常强大的报表开发工具,它为报表开发提供了非常多的功能强大的特征,参数就是其中最重要的一种。

    本文总结了birt报表开发过程中对参数的各种用法以至源代码级的使用,旨在为报表开发及报表应用程序开发提供一个有益的参考。

    相关主题

    展开全文
  • 1. 安装 xlwings直接安装用 pip install xlwings2.... 打开 Excel 文件#打开存好的Excelapp=xw.App()#设置应用wb=xw.Book('data/小蜜蜂超市销售报表.xlsx')#打开文件ws=wb.sheets['Sheet1']#选择表格4. 获取表格...

    1. 安装 xlwings

    直接安装用 pip install xlwings2. 导入 xlwingsimport xlwings as xw

    3. 打开 Excel 文件

    # 打开存好的 Excelapp = xw.App() # 设置应用wb = xw.Book('data/小蜜蜂超市销售报表.xlsx') # 打开文件ws = wb.sheets['Sheet1']  # 选择表格

    4. 获取表格行列

    last_column = ws.range(1, 1).end('right').get_address(0, 0)[0] # 获取最后一列last_row = ws.range(1, 1).end('down').row # 获取最后一行a_range = f'A1:{last_column}{last_row}'  # 生成表格的数据范围

    这里 a_range 输出的范围是 A1:D6,即数据表的整个内容。

    5. 设置 a_range,也就是 A1:D6 的表格边框

    # 设置边框ws.range(a_range).api.Borders(8).LineStyle = 1  # 上边框ws.range(a_range).api.Borders(9).LineStyle = 1  # 下边框ws.range(a_range).api.Borders(7).LineStyle = 1  # 左边框ws.range(a_range).api.Borders(10).LineStyle = 1  # 右边框ws.range(a_range).api.Borders(12).LineStyle = 1  # 内横边框ws.range(a_range).api.Borders(11).LineStyle = 1  # 内纵边框

    说明:

    6adac3bc62e1857f5fc7e084f0d82af1.png

    LineStyle = 1,这里的 1 指的是边框为实线。

    013ddf6412eb747c5c2f922445873486.png

    到这里还不算完,还要关闭 Excel,保存 xlsx 文件。

    # 保存并关闭 Excelwb.save('data/小蜜蜂超市销售报表.xlsx')wb.close()app.quit()
    展开全文
  • linux red hat 给普通用户开启root权限环境:虚拟机:red hat 6.5:root角色用户:普通用户:宏基笔记本:win7: 操作过程: 1.登录普通用户,进入图形界面(可以设置为启动登录进入命令行界面): 2.按Crl+ALT+F2进 ...eclipse...

    linux red hat 给普通用户开启root权限

    环境:虚拟机:red hat 6.5:root角色用户:普通用户:宏基笔记本:win7: 操作过程: 1.登录普通用户,进入图形界面(可以设置为启动登录进入命令行界面): 2.按Crl+ALT+F2进 ...

    eclipse的设置和优化

    转载:http://my.oschina.net/zhaoqian/blog/66545 1.eclipse下的编码设置: eclipse 中使用模板新建 JSP,xhtml等 文件时,默认的编码为: ...

    &period;net 中连接mysql

    1. 下载mysql驱动.里面包含需要连接mysql的dll.mysql-connector-net    地址:http://dev.mysql.com/downloads/file/?id=463 ...

    &lbrack;TypeScript&rsqb; 0&period;First Example

    Create a greeter.ts file: class Student { fullname : string; constructor(public firstname, public mi ...

    搜索提示時jquery的focusout和click事件沖突問題完美解决

    在主流的搜索引擎上搜索時,輸入內容,往往會彈出智能提示.輸入框为input,智能提示區域为suggest.接下來一般有兩種操作:        1.選擇某一提示,則把內容复制到input中 ...

    TSQL Beginners Challenge 3 - Find the Factorial

    这是一个关于CTE的应用,这里我们用CTE实现阶乘 Factorial,首先来看一个简单的小实验,然后再来看题目.有的童鞋会问怎么没有2就来3了呢,惭愧,TSQL Beginners Challeng ...

    专题:DUILIB Win32 透明效果

    Win32 透明效果相关基础知识 Layered Windows 分层窗口.这是Windows2000开始引入的概念,重新定义了窗口的Hit Testing方法,以前都是把窗口按rectangle的方 ...

    Centos硬盘IO性能检测命令iostat&lbrack;转&rsqb;

    Centos硬盘IO性能检测命令iostat[转] 在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都 ...

    Servlet&lowbar;note

    2015/8/24 Web项目目录结构:总目录my,中有WEB-INF目录,中有classes.lib两目录和web.xml文件.classes保存编译好的java文件,lib保存库文件,web.xm ...

    windows快速进入安装目录

    ctrl+R 输入%LOCALAPPDATA%\+应用名字 %LOCALAPPDATA%\composer

    展开全文
  • 解决Birt报表工具制作报表的几个难题在上一篇《Birt 如何实现不规则月份统计》中,我们讲解了如何帮助 Birt 制作这种报表的详细过程,在本文中我们再继续讨论几个类似的制作难题,并把说明集中在如何编写集算器 ...

    解决Birt等报表工具制作报表的几个难题

    在上一篇《Birt 如何实现不规则月份统计》中,我们讲解了如何帮助 Birt 制作这种报表的详细过程,在本文中我们再继续讨论几个类似的制作难题,并把说明集中在如何编写集算器 SPL 脚本上,不再赘述如何在 Birt 中引入 SPL 的步骤了。

    1. 组内跨行计算

    组内跨行计算是指在计算一行中某个计算列的值时,需要引用到组内其它行的数据来进行计算。比如下面这个例子:

    库表 sample 有三个字段,其中 id 是分组字段。需要设计一张分组表,使用 id 分组,明细字段是 v1,v2 以及计算列 crossline, 其中 crossline 的算法是本条记录 v1、v2 之和加上本组上一条记录的 v1、v2 之和。示例源数据如下:

    idv1v2112123211222333

    最后要展现的报表结果如下图所示:

    编写集算器 SPL 代码如下:

    A1 连接数据库

    A2 查询数据库,同时多产生一列常数备用。

    A3 按 id 分组,并在每组数据中修改计算列 crossline,最后合并,其中 v1[-1]、v2[-1] 是集算器特有的定位上一行记录中字段的写法。

    A4 关闭数据库

    A5 将 A2 中的计算结果数据集返回给报表工具

    2. 跨库数据源

    制作报表的数据往往来自于多种数据源,比如不同的物理数据库、文本文件、Excel 文件等,这些数据在报表中往往还需要相互关联进行运算。

    报表工具本身能实现从多数据源取数,但进行关联运算会有一定的困难,或者运算性能非常差。而由开发者自己编程去做关联运算,工作量一般又会非常大。而集算器 SPL 恰恰能在这一点帮上大忙。

    下面这个例子中,订单表 orders 和订单明细表 orderDetail 数据分别来自两个不同的数据库,二者之间要做 join 运算。两表数据如下:

    最后想要展现的报表结果如下:

    编写集算器 SPL 代码如下:

    A1 连接数据库 1

    A2 连接数据库 2

    A3 查询订单表数据

    A4 查询订单明细表数据

    A5A6 关闭数据库连接

    A7 以 A3 的 orderID 和 A4 的 orderID 为主键进行 left join,连接后的结果集有两个字段,第一个字段是 A3 的记录,第二个字段是 A4 的记录。

    A8 以 A7 中两个字段的字段形成新的数据集,也就是需要的结果

    A9 将 A8 的数据集返回给报表工具

    本例只是演示了两个数据源的 left join,其实 SPL 能做关系数据库能完成的任何数据运算,比如各种 join、union、过滤、分组、排序等。

    3. 字段拆分成记录

    在本例中,数据库表 data 有两个字段,其中 ANOMOALIES 字段是用空格分隔的多个字符串,我们需要把 ANOMOALIES 按空格拆分为多个字符串,并用每个字符串和原 ID 字段形成新的记录。源数据如下:

    IDANOMALIES3903B1 D1 CAT13904D7 D2 B1 CAD4

    最后想要展现的报表结果如下:

    编写集算器 SPL 代码如下:

    A1=connect("db")2=A1.query("select ID,ANOMALIES from data")3=A2.conj(ANOMALIES.array(" ").new(A2.ID:ID,~:ANOMALIES))4>A1.close()5return A3

    A1 连接数据库 1

    A2 查询 data 表数据

    A3 将ANOMALIES字段值按空格拆分,并与原ID形成新的记录

    A4 关闭数据库连接

    A5 将 A3 形成的数据集返回给报表工具

    4. 主表中动态插入子表字段

    在本例中,数据库表 dColThread 是主表,主键是 tID。dColQuestion 是子表,外键是 tID,如下:

    dColThread

    tIDApplicationNameUserPhoneDeclineA01mfcBill+700000001A02mfcJohn+187612212A03javaJack+80140012316A04mfcTim+0086131331234A05dbJohn+187612218

    dColQuestion

    qIDtIDstatus1A01yes2A01no3A01yes4A02yes5A03no6A04no7A04no8A05yes

    报表需要根据 ApplicationName 查询主表并以列表的形式展现数据。可以看到,在子表中,主表每条记录对应的 status 字段值有多个,但不超过 5 个。我们需要把子表中的这些记录横向排列后插入主表的 Phone、Decline 字段之间,依次命名为 QuestionNo1、QuestionNo2…QuestionNo5。同时,如果某列数据都为空,则这一列不显示。最后的表样形如下图:

    用集算器准备数据,SPL 代码如下:

    AB1=connect("db")2=A1. query("select * from dColThread t,dColQuestion q where t.tID=q.tID and t.ApplicationName=?",arg1)3>A1.close()4=A2.group(tID)5=create(ApplicationName,User,Phone,QuestionNo1,QuestionNo2,QuestionNo3,QuestionNo4,QuestionNo5,Decline)6for A4=A6.(status)|["","","","",""]7

    = A5.record(A6.ApplicationName|A6.User|A6.Phone|B6.to(5)|A6.Decline)8return A5

    A1 连接数据库

    A2 执行 SQL,取出主子表关联数据。arg1 是来自报表参数。假如 arg1= "mfc ",则 A1 的计算结果如下:

    A4 按照 tID 分组,每组是一条主表记录及其对应的子表记录,如下图:

    A5 按照报表中列表的结构新建空二维表。

    A6 循环 A4 中的组,每次向 A5 插入一条记录。循环体中可用 A6 引用循环变量,用 #A6 来引用循环计数。

    B6 取当前组中 status 的字段值,并补足至少 5 条记录。

    B7 向 A5 追加新记录。循环结束后 A5 如下:

    A8:返回结果给报表。

    隐藏空列的工作交给 BIRT,设计 list 表,模板如下:

    如果 QuestionNo 列为空则应当隐藏。动态隐藏的方法有很多,这里介绍其中一种。对于 QuestionNo5(其他列类似),可以先在 dataSet 的 onFetch 方法中使用如下脚本:

    if(reportContext.getGlobalVariable("t5")==null){

    reportContext.setGlobalVariable("t5",row.QuestionNo5)

    }else{

    reportContext.setGlobalVariable("t5",reportContext.getGlobalVariable("t5")+row.QuestionNo5)

    }

    再在 QustionNo5 列的 Visibility 属性中使用如下表达式:BirtStr.trim(reportContext.getGlobalVariable("t5"))==""

    预览后可以看到报表结果:

    5. 小结

    通过以上例子可以看出,报表制作时经常遇到不好处理的数据准备工作,而在集算器的帮助下都可以得到完美的解决。这是因为集算器提供了完备的数据源连接功能,能连接市面上常见的各种数据源并从中取数。同时,SPL 还提供了丰富的函数库,能在库外轻松进行数据的各种关联运算。

    展开全文
  • 中国式报表的信息量大,通常一张报表都会包含各种各样的数据,例如明细数据、汇总数据等,Smartbi提供了电子表格设计器工具,可以满足中国式报表的各种需求。那电子表格是什么呢?电子表格是企业报表平台的解决方案...
  • 中国式报表的信息量大,通常一张报表都会包含各种各样的数据,例如明细数据、汇总数据等,Smartbi提供了电子表格设计器工具,可以满足中国式报表的各种需求。那电子表格是什么呢?电子表格是企业报表平台...
  • 提到复杂报表,第一个想到的就是中国式报表。那么到底什么是中国式报表?它到底复杂在哪里?如何应对复杂报表的开发需求?今天我们就聊一聊这些问题。一、啥是中国式报表?都说中国式报表是最复杂的报表,没有之一,...
  • 循环扩展报表是按照某个指定的字段自动循环扩展出多个表格的一类报表。它主要分为纯表格循环扩展和图形循环扩展。下面我们来讲讲如何实现纯表格循环。如下图,员工信息描述数据比较多,希望通过一个表格展现该对象的...
  • 我们明确一个问题,就是说我们在企业级开发过程中,客户会要求我们将页面上显示的数据信息导出来,比较常见的是导出EXCEL格式,按照网站的数据格式导出到对应的EXCEL,今天我们就来讲一讲如何实现将网站报表数据导...
  • 中国式报表的信息量大,通常一张报表都会包含各种各样的数据,例如明细数据、汇总数据等,Smartbi提供了电子表格设计器工具,可以满足中国式报表的各种需求。那电子表格是什么呢?电子表格是企业报表平台...
  • 提到复杂报表,第一个想到的就是中国式报表。那么到底什么是中国式报表?它到底复杂在哪里?如何应对复杂报表的开发需求?今天我们就聊一聊这些问题。一、啥是中国式报表?都说中国式报表是最复杂的报表,没有之一,...
  • 在日常工作中,我们经常需要通过报表来辅助我们进行数据分析,而众所周知,中国式报表的特点就是格式复杂,信息量大,中国式报表的复杂大多都是表头比较复杂,三五层的大格嵌小格、带斜线的表头都很常见,所以中国式...
  • 报表工具开发,核心功能是把各种数据源的数据以表格或图表的形式在线上网页端呈现出来。但是很多场景都是线上和线下结合,既要方便线上在系统中查看到报表,同时还得能和传统的线下业务无缝贴合,比如把结果导出到...
  • 一、原理浅析报表模型:由Xml描述各类报表元素组成(表格、图形、条码等),通过报表设计器生成;数据源:通过推(Push)或拉(Pull)的方式填充报表所需数据,其中Pull模式直接调用框架内服务生成数据源。报表生成:报表...
  • 报表分析大家都多多少少略有接触过,也看了很多好看的报表分析案例,那些排列有序,整齐划一的表格和统计图搭配起来稍有些赏心悦目的感觉,但到了自己下手操作,是不是很难做出各种风格布局的报表分析呢?...
  • 开源报表却越来越受到程序员热烈追捧,如ireport、 Jsper report、jfreechart这样的免费,开源的JAVA报表工具,在一下开源的JAVA报表相关的论坛里面都是热火朝天,发问者众多。发现都会有利有弊,近因为公司需求的...
  • 时针又转了一圈,同事们陆续回了家,你看着手边铺满整个办公桌的报表,揉眼睛再三确认每一个数据,焦虑地长叹了一口气,不知道何时才能把信息录入完。▼经常和各种表格数据打交道的人,一定都拥有一个满满当当的桌面...
  • 领导驾驶舱报表是一款为企业内部领导及相关高管提供企业数据指标分析的报表,用来实时反映企业的运行状况,将企业管理决策提升到一个新的高度。今天小编用亿信华辰的亿信ABI给大家实际演示,通过5个步骤就可以刷刷刷...
  • ​交叉报表是分组报表的一种特殊情况,行列都呈现分组结构,交叉区域展现数据的一类报表。作用:用于多维度统计数据。适用场景:适用数据统计的情况。报表结构:交叉报表主要由有“列组+行组+交叉数据区”一种结构,...
  • 点击上方↑↑↑“ExcelEasy”关注我们很多人问才能如何让报表或图表更好看。这基本上所有人的希望。...表格篇1. 不用缺省设置Excel的缺省字体是宋体,字号是11。首先字号相对于屏幕上的数据报表稍大,显...
  • 在后台产品中,数据报表的重要性毋庸置疑,不过优秀的数据表单并不多见,所以本文就从基础功能、体验升级两方面来聊聊如何设计一个优秀的数据报表。数据报表一直是后台产品的重要组件,相较于复杂的业务处理逻辑来讲...
  • 老板很忙,如果会计把下面格式的报表发给过去,老板会什么样的感受?连数字都要数一数有几位,是十万还是百万...设置公式在表格下方设置引用公式,根据单位进行对应的计算。(根据需要自定义小数保留位数)=IF($J$4...
  • SpreadJSSpreadJS是一款基于HTML5的纯前端电子表格控件,兼容 450 种以上的 Excel 公式,凭借其 “高性能、跨平台、与 Excel 高度兼容”的产品特性,备受以华为、苏宁易购等企业用户青睐。伴随着SpreadJS V13.0 ...
  • 如果你是公司内的一名报表开发人员,那么你肯定遇到过报表任务没完没了的情况:在开发应用系统时经常会发现,总是有新的报表需求源源不断地冒出来,业务人员在应用过程中想到的新统计需求就会很随意地被提出来,报表...
  • 在前一篇《盘点2019年10种最佳报表工具,用于指导更好的决策(上)》中,我们一起了解了报表软件、不同类型的报表、2019年最佳报表工具对比,并深入探讨了5种常用的报表工具,那么接下来,我们继续分析和讨论更多的...
  • BIRT 自带的模板中,表格都没有边框,没有找到怎么弄出来,发现一个带边框的模板,上传供大家使用。
  • 对于报表而言,表格是其最核心的组件之一,做出漂亮的表格几乎是所有报表系统的基本要求,但在事件中,我们经常或做出这样的表格。 或者存在讨厌的双线与间距,而BIRT在这方面做得非常好,最后的效果如下: 做出...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

birt报表表格边框