在Birt中动态插入子表字段

库表dColThread是主表,主键是tID。dColQuestion是子表,外键是tID,如下:

dColThread

dColQuestion

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

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

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

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

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

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

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

B5:向A3追加新记录。循环结束后A3如下:

A6:返回结果给报表。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库。

然后用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"))==""

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

报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为dColMiddle.dfx,则在BIRT的存储过程设计器中可以用call dColMiddle.dfx(?)来调用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 05:57:28

在Birt中动态插入子表字段的相关文章

ClientDataSet中动态添加计算字段并用计算字段显示记录的UpdateStatus

ClientDataSet中每条记录都有UpdateStatus=(usUnmodified, usModified, usInserted, usDeleted)记录该条数据是修改的,删除的,还是新增的等.有时候我们只想看修改的或新增的或删除的就可能用到这一属性.下图用计算字段显示UpdateStatus状态. ********************************************************************************************

PHP 在 Laravel 中动态隐藏 API 字段

我最近在 Laravel Brasil 社区看到一个问题,结果比看起来更有趣.想象一下你有一个 UsersResource 用下面的实现: 1 <?php 2 namespace App\Http\Resources; 3 use Illuminate\Http\Resources\Json\Resource; 4 class UsersResource extends Resource 5 { 6 /** 7 * Transform the resource into an array. 8

jquery.form插件中动态修改表单数据

jquery.form jquery.form插件(http://malsup.com/jquery/form/)是大家经常会用到的一个jQuery插件,它可以很方便将表单转换为ajax的方式进行提交.以下是官网给出的一个栗子: $(document).ready(function() { var options = { target: '#output1', // target element(s) to be updated with server response beforeSubmit

在SQLAlchemy ORM中动态变更表名

在开发过程中,经常会遇到几张表结构相同,仅仅表名不一样.这在直接使用SQL语句进行查询的环境中处理起来很简单,但如果使用了SQLAlchemy ORM之后,因在model定义时就确定了表名,就需要用其他方法进行表名的变更. 假定数据库中有两张表:user,user_1,下面用一个简单程序展示如何在查询时变更表名. 使用declarative_base定义的model from sqlalchemy import create_engine from sqlalchemy import Table

Mybatis动态传表名(同样适用于动态传表字段)

//设置map参数,innerTable,outTable对应的表名 public String sendDetail(){ pager = getStartPager(); if( null !=msg && msg.equals("succ")){ map.put("innerTable","bs_sent_inner" ); map.put("outTable","bs_sent_out&quo

mybatis动态调用表名和字段名

一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这种情况下,就需要构建sql来动态传入表名.字段名了.现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助. 动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理.下面让我们先

BAP中创建动态内表的三种方法(转载)

BAP中创建动态内表的三种方法 第一种: 如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用CREATE DATA生成,当然也可以是自定义类型. 比如要产生和数据表MARA结构一致的动态内表: DATA : DY_TABLE TYPE REF TO DATA, WA_LINE TYPE REF TO DATA. FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE . CREATE DATA DY_TABLE TYPE TABL

[转]MyBatis动态传入表名,字段名参数的解决办法

一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这种情况下,就需要构建sql来动态传入表名.字段名了.现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助. 动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理.下面让我们先

对数据库表中的某一字段去重分组排序

1.问题背景    某数据库t_tab_ab中有两个字段a和b,如下所示:    查询前:                 查询后:    a     b                  a     b    1     2                  1     2    1     3                  2     3    1     4                  3     4    1     5    2     3    2     4    2