不确定我是否完全理解要求,但您的基本问题“将数据集列拆分为多行”可以使用脚本数据集或纯 SQL(取决于您的数据库)来解决。
无论哪种方式,您都需要第二个数据集(例如,您的数据模型是主从数据,在您的布局中,您需要类似
Table/List "主控绑定到主控 DS
表/列表“详细信息”绑定到详细信息 DS
明细 DS 需要来自主 DS 的逗号分隔结果列作为“String”类型的输入参数。
如果您了解 Javascript 并且您了解脚本数据集的工作原理,使用脚本数据集执行此操作非常容易:创建一个默认值为 null 的对象类型的报表变量“myValues”和第二个类型的报表变量“myValuesIndex”整数,默认值为 0。
(注意:这都是未经测试的!)
将数据集“detail”创建为脚本 DS,其中一个输入参数“csv”为 String 类型,一个输出参数“value”为 String 类型。
在脚本DS的open事件中,代码:
vars["myValues"] = this.getInputParameterValue("csv").split(",");
vars["myValuesIndex"] = 0;
在fetch事件中,代码:
var i = vars["myValuesIndex"];
var len = vars["myValues"].length;
if (i < len) {
row["value"] = vars["myValues"][i];
vars["myValuesIndex"] = i+1;
return true;
} else {
return false;
}
例如,对于 csv = "1,2,3-4,foo" 的主 DS 结果行,详细 DS 将产生 4 行
值 = "1"
值 = “2”
值 = “3-4”
值 = “富”
使用 Oracle 数据库,这可以在没有 Javascript 的情况下完成。细节 DS(具有与上面相同的输入参数)将如下所示:
select t.value as value from table(split(?)) t
拆分函数的定义见RedFilter关于
Is there a function to split a string in PL/SQL?
如果你得到ORA-22813,你应该改变原来的定义
create or replace type split_tbl as table of varchar2(32767);
到
create or replace type split_tbl as table of varchar2(4000);
如https://community.oracle.com/thread/2288603?tstart=0中所述
11g 中的纯 SQL 也可以使用 regexp_substr(参见同一页)。