如何在BIRT报表中循环运行同一数据集并传入不同参数?
在BIRT报表中循环运行同一数据集的实现方案
可以实现你的需求,但需要调整参数和数据集的设计思路,仅用普通列表框参数无法满足循环执行并分别展示结果的要求。以下是具体实现方法:
核心思路
把你的嵌套数据结构拆解为name+单个idNo的扁平参数组,然后通过嵌套表格或脚本循环执行数据集的方式,对每组参数单独运行目标数据集并展示结果。
方法一:嵌套表格(直观易维护)
这是最常用的实现方式,适合需要按参数组分组展示结果的场景:
创建解析数据的脚本数据集
创建一个名为ds_ParamGroups的脚本数据集,把你提供的JSON结构拆解为多行参数组:// 这里可以替换成从报表参数传入的JSON(如果数据是外部动态传入) var sourceData = { type: [ {name: "20150401", idNoList: [0, 1]}, {name: "13212", idNoList: [1, 3]} ] }; // 拆解为扁平参数行 var paramRows = []; for (var i = 0; i < sourceData.type.length; i++) { var typeItem = sourceData.type[i]; for (var j = 0; j < typeItem.idNoList.length; j++) { paramRows.push({ groupName: typeItem.name, groupIdNo: typeItem.idNoList[j] }); } } // 输出数据集行 for (var k = 0; k < paramRows.length; k++) { row.groupName = paramRows[k].groupName; row.groupIdNo = paramRows[k].groupIdNo; next(); }创建目标业务数据集
创建名为ds_TargetData的数据集,设置两个参数p_name和p_idNo,查询语句中用这两个参数过滤数据(例如SQL:SELECT * FROM your_table WHERE name = ? AND id_no = ?)。用嵌套表格绑定数据
- 在报表中插入主表格,绑定
ds_ParamGroups数据集,展示当前参数组的groupName和groupIdNo(可选,用于分组标题)。 - 在主表格的详细行中,插入子表格,子表格绑定
ds_TargetData数据集,并将主表格的groupName和groupIdNo作为参数传递给子数据集的p_name和p_idNo。
运行报表时,主表格每一行对应一组参数,子表格会自动执行一次目标数据集并展示该参数组的查询结果。
- 在报表中插入主表格,绑定
方法二:脚本合并数据集(适合合并展示所有结果)
如果需要把所有参数组的查询结果合并成一个列表展示,可以用脚本在后台循环执行数据集并合并结果:
在报表事件中编写循环脚本
打开报表的beforeFactory事件,添加以下脚本:// 获取目标数据集对象 var targetDsHandle = reportContext.getDesignHandle().findDataSet("ds_TargetData"); var mergedResults = []; var sourceData = { type: [ {name: "20150401", idNoList: [0, 1]}, {name: "13212", idNoList: [1, 3]} ] }; // 循环遍历所有参数组 for (var i = 0; i < sourceData.type.length; i++) { var typeItem = sourceData.type[i]; for (var j = 0; j < typeItem.idNoList.length; j++) { // 设置当前参数 var params = new java.util.HashMap(); params.put("p_name", typeItem.name); params.put("p_idNo", typeItem.idNoList[j]); // 执行数据集并读取结果 var queryResults = targetDsHandle.execute(params); while (queryResults.next()) { var resultRow = { name: typeItem.name, idNo: typeItem.idNoList[j], // 替换为你的业务字段 dataField1: queryResults.getString("field1"), dataField2: queryResults.getInteger("field2") }; mergedResults.push(resultRow); } queryResults.close(); } } // 将合并结果存入全局变量 reportContext.setGlobalVariable("mergedData", mergedResults);创建展示用的脚本数据集
创建名为ds_MergedResult的脚本数据集,读取全局变量中的合并结果:var mergedData = reportContext.getGlobalVariable("mergedData"); for (var i = 0; i < mergedData.length; i++) { row.name = mergedData[i].name; row.idNo = mergedData[i].idNo; row.dataField1 = mergedData[i].dataField1; row.dataField2 = mergedData[i].dataField2; next(); }绑定表格展示合并结果
插入表格绑定ds_MergedResult数据集,即可展示所有参数组的查询结果。
关键注意事项
- 不要使用普通列表框参数:列表框参数是一次性传入多个值,无法实现按组循环执行数据集并分别展示结果。
- 动态数据适配:如果你的JSON数据是从外部传入,可将整个JSON字符串设为报表参数,在脚本中用
JSON.parse(参数值)解析即可。
内容的提问来源于stack exchange,提问作者viki saste
相关产品推荐
相关产品推荐

