有些特殊布局难用报表工具提供的功能直接实现,但如果准备出合适的数据源,就能大大降低报表设计的难度。
使用免费的集算器可以弥补这一不足。集算器支持集合运算、有序计算、动态脚本执行,还提供了简单易用的JDBC接口,报表工具可将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果,详情参考集算器辅助报表工具的应用过程。
下面举例说明报表常见的特殊布局,以及集算器对应的解法。
横向分栏
报表工具大多有纵向分栏的功能,但很少有提供横向分栏的。使用集算器事先准备数据集可以可以弥补这一不足:
库表emp有3个字段,部分数据如下:
期望的报表布局是记录先横后纵摆放,且横向分为3栏,如下:
用集算器将原来的3字段数据转为9字段,就可以用报表工具实现横向分栏了:
将数据按序号分成3部分,存在A2\B2\C2,再将B2\C2中的字段依次加入A2:
错行分栏
将库表emp横向分为两栏,每行的第2栏和下一行的第1栏相同,报表布局如下:
集算器代码:
A2:错位拼接,将上一条记录和当前记录依次拼接起来,从第3行开始取拼接结果。结果如下:
A3、B3、A4:按照前面的例子横向分两栏。
单字段纵向动态分栏
按照先纵后横的布局将单字段结果集展现在报表中,行数和列数都是参数。源数据如下:
集算器代码:
A1:取出单字段数据,转换为序列(有序集合)。
A2:生成与报表布局相同的二维表,初始值为空。参数Row和Col来自报表。
A3:向A2追加数据,最终结果如下:
宽表横向打印
sOrderEmp是数据库中的宽表,一张纸打印不下,报表要求每张纸打印列头和列号,在第1张纸打印前1到N列,第2张纸打印N+1到2N列,以此类推,示意图:
集算器代码如下:
上面是通用代码,可横向打印任意库表argSource,每页argPageCol列,argPageRow行。A2:动态生成列数为argPageCol的空二维表。A3:将A1每隔argPageRow行分一组。A4:将A1中的字段名每argPageCol个分为一组。A5:拼字符串,在A6中可动态执行。A6:循环A3的每组数据,每次向A2插入argPageCol*argPageRow行,依次插入每页的字段名、字段值。A7:将A2返回给报表工具。
A2计算结果如下:
复制行
按次序将记录复制3份,并用报表展现。
集算器代码:
A2: []表示序列(有序集合),[~]表示将A1当前记录作为单成员序列,[~]*3可将当前记录复制3份,函数conj对A1每个记录执行计算,最后进行合并。计算结果如下:
用条件控制分组表的格式
展现一张分组表,数据来自库表sOrder,分组字段是Seller,明细字段是Client和Amount。特殊要求是:
1.每组明细中,从第2条直到结束需要显示“+”号,第1条不显示。
2.如果每组明细多于1条,则在该组最后显示对Amount的汇总求和,明细只有1条时不显示汇总。表样示意如下:
集算器代码:
解释:查询数据库,按照SellerId分组,并循环访问每组数据。循环中向空序表A2追加当前组的明细,如果序号#大于1,则在Client之前加“+”,如果当前组记录数大于1,则向A2追加subtotal。A2最终结果如下:
A5:将A2通过jdbc传回报表工具。
将子表动态插入主表
库表dColThread是主表,主键是tID。dColQuestion是子表,外键是tID,如下。
dColThread
dColQuestion
报表需要根据ApplicationName查询主表并以列表的形式展现数据。主表每条记录对应的status字段值有多个,但不超过5个,需要横向插入主表的Phone、Decline字段之间,依次命名为QuestionNo1、QuestionNo2…QuestionNo5。如果某列数据都为空,则这一列不显示。表样形如:
集算器代码如下:
解释:用SQL取出主子表关联数据,按照tID分组,循环访问每组数据。每次循环向空序表A3插入一条记录,主表字段直接插入,子表字段列变行后再插入,并补足至少5个字段。循环结束后A3如下:
横向拼接列表
table1是Oracle数据库表,table2.xlsx文件,两者结构相同,部分数据如下:
需要将table1、table2分别按name分组并对各组计数对active字段求和,最后在报表中并排展示。理想表样如下:
集算器代码:
解释:分别从数据库和excel文件取数,将两者进行全连接,将需要的字段拼合到一个数据集中。A5存储合并的结果,如下:
交叉表列间计算
数据库表store存储着多种产品在2014、2015年的销售量,需要用交叉表呈现每种产品每年的销售量,并计算出各产品的年增长率。部分源数据如下:
理想表样如下:
集算器代码:
解释:交叉表的列是动态生成的,进行列间计算时需要二次动态引用,用报表脚本实现难度较大,此时可以用集算器将列间计算的结果事先追加到源数据中,之后只需设计简单的交叉表就能实现需求。
A1的计算结果如下:
相关推荐
### Java报表打印的若干问题 #### 一、问题的提出 报表打印是大多数信息系统不可或缺的功能之一,对于企业的中高层管理者来说尤为重要。当前市面上存在多种成熟的报表处理工具,例如VC、VB、PB、Delphi等,这些...
这个版本可能包含了若干个预设的演示项目,每个项目都展示了nui的不同功能和使用场景,例如表单设计、页面布局、数据展示、交互逻辑等。通过这些实例,开发者可以直观地了解如何在EOS平台上使用nui进行界面开发。 *...
罗斯文示例数据库中的窗体设计有助于理解如何自定义布局、添加控件、设置事件处理程序等。 4. **报表**:报表用于打印和分析数据,通常包含计算、总计和分组等功能。罗斯文数据库的报表示例可以帮助我们掌握如何...
7. **源代码示例**:手册可能包含了若干示例项目的源代码,帮助读者通过实践加深理解,快速上手。 8. **资源下载**:可能提供相关的资源下载链接,如额外的组件、插件或更新信息,以供开发者进一步探索和提升...
2. **页面布局**:定义报表的页面大小和边距,这可以通过创建一个PageSetup对象并设置其属性来完成。例如,可以设置纸张尺寸为A4,上下左右的边距分别为若干毫米。 3. **行计算与分页**:计算每页可以容纳多少行...
FastReport的核心功能在于其可视化报表设计界面,用户可以通过拖拽操作,轻松创建复杂的报表布局。它支持多种数据源,包括数据库、XML、CSV等,能够处理各种类型的数据,并提供丰富的预处理和后处理功能,如数据过滤...
题目中的“投影”是指从关系模式中选取若干属性组成新的关系的操作。 ### 7. 编程语言基础 - **switch语句**:`switch`语句用于基于不同条件执行不同的代码块。在C/C++等编程语言中,`switch`语句中的条件表达式...
关系型数据库如ACCESS,是基于关系模型的,其中数据以表格的形式存在,每个表格有若干列(字段)和行(记录),通过键(Key)来关联不同表格,实现数据之间的关系。 **数据库设计** 1. 表(Table)设计:创建数据库...
在报表设计中,创建分组报表通常使用报表设计视图(Report Design View),它允许开发者手动设计布局并添加分组功能。 ### 14. MySQL中的存储过程和函数调用 在MySQL中,调用存储过程使用`CALL`语句,例如:`CALL ...
- **报表生成**:快速生成各种定制化的业务报表。 - **数据导入导出**:提供用户友好的数据导入和导出功能,如批量更新数据。 - **自动化测试**:在测试中,可以自动生成预期结果的Excel文件,便于对比和验证。 **...
- **特殊情况**:当菜单项的快捷字母与主菜单的快捷字母相同但没有加上`&`符号时,直接按快捷字母不会触发子菜单的点击事件。 #### 知识点十:C语言基础知识 - **语法规则**:C语言中的每个语句必须以分号结尾;一...
JFreeChart 1.0 版本引入了若干新特性与改进,提高了性能和稳定性。其中,源码包含官方注释,对于开发者理解其内部工作机制大有裨益。同时,提供的 demo 源码则为学习和实践提供了直观的例子。 2. **核心组件与类*...
1. **源代码**:Delphi项目通常包含若干个.pas文件,这些是源代码文件,其中包含了类定义、函数和过程实现,以及对Delphi组件的使用。CSV解释器的源代码会有一个或多个主要的类,负责读取文件、解析CSV数据,并可能...
3. **格式化输出**:COBOL的描述性输入/输出语句使得打印报表和屏幕显示非常直观,可以方便地创建复杂的布局。 4. **过程控制**:通过使用IF-THEN-ELSE、PERFORM、GOTO等控制结构,COBOL可以实现条件分支和循环逻辑...
设计报表布局时,可以调整控件的位置、大小和间距。 **知识点解析**: - 控件的位置、大小和间距都是可以调整的,但控件的属性通常在属性窗口中设置。 #### Access中的参照完整性 在Access数据库中,参照完整性是...
- **关系模型的特性**:在关系模型中,数据的物理布局和存取路径对用户隐藏,以确保数据的安全性和独立性(选项D错误)。 - **SQL操作**:查询学生的姓名和年龄的操作属于投影操作(选项B)。投影是从关系中选择若干...
- **财务管理**(14小时):包含科目维护、凭证输入与审核、预算和利润中心管理、账表查询及财务报表编制等关键步骤。 - **服务管理**(5小时):专注于服务合同、员工主数据、产品保修服务流程及一般服务流程等...