首页 > 其他 > 详细

在主表中动态插入子表字段

时间:2015-10-31 02:08:01      阅读:245      评论:0      收藏:0      [点我收藏+]

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

??dColThread:


bubuko.com,布布扣
?

? ?dColQuestion;


bubuko.com,布布扣
?

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


bubuko.com,布布扣
?

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

?
bubuko.com,布布扣
?

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


bubuko.com,布布扣
?

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


bubuko.com,布布扣
?

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

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

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

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


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

??然后用BIRT设计list表,模板如下:


bubuko.com,布布扣?

? ?如果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″))==”"

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


bubuko.com,布布扣
?

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

?

在主表中动态插入子表字段

原文:http://datamachine.iteye.com/blog/2253172

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!