【发布时间】:2014-07-22 14:50:33
【问题描述】:
见文末更新
我有一个脚本数据源。数据集基于包含许多集合的 Java 对象。
我的报告包含一个页眉、正文和页脚,所有这些都有绑定到此数据集的项目。顶级数据集存储对 Java 对象的引用。这被传递给返回各种列表的子数据集。
POJO
public class Protocol {
String name;
int id;
List<Device> devices;
List<TestResult> results;
...
}
DAO
public class DAO {
public List<Protocol> getProtocols(String filePath) {
return deserialise(filePath);
}
}
协议数据集
open:
model = new Packages.com.acme.atf.model.dao.AtfObjects();
path = inputParams["ProtocolPath"];
iterP = model.getProtocols(path).iterator();
countP = 0;
fetch:
if(iterP.hasNext()) {
var p = iterP.next();
row["ProductId"] = p.getId();
row["ProductVersion"] = p.getProductVersion();
row["ProtocolObject"] = p;
log("po=" + p);
return true;
}
return false;
设备数据集
open:
protocol = inputParams["ProtocolObject"];
if(protocol == null) {
log("Protocol is NULL");
return;
}
iterD = protocol.getDevices().iterator();
日志输出记录:
po=com.acme.atf.model.Protocol@5a5901
Protocol is NULL
表示对象在添加到结果时不为空,但在传递到第二个数据集时为空。
我还尝试将协议数据集拉入报告中,从而创建一个表格。 ProtocolObject 的值已经为空。 (为了清楚起见,其他属性都填充了合理的值)
什么可能导致row['ProtocolObject'] 变为空?
更新
我基于包含上述脚本的库创建了一个简单的报告。我将协议数据集作为表格拉入,ProtocolObject 的单元格 not 为空!我拉了第二张表,ProtocolObject 的两个单元格都为空。在日志中,我可以看到完成了 2 次获取,并且每次获取了不同的协议实例:
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) ===========================================
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) Open protocol: testcase.protocol
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) exit open P
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) po=com.acme.atf.model.Protocol@2892c0
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) Protocol: no more records
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) ===========================================
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) Open protocol: testcase.protocol
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) exit open P
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) po=com.acme.atf.model.Protocol@13ea352
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST) Protocol: no more records
【问题讨论】:
-
如果您从数据集协议创建一个简单的表,并使用表达式进行数据绑定:dataSetRow['ProtocolObject'].getId() 它是否有效或者这个对象已经为空?
-
@Dominique - 已经尝试过了。它是空的。
-
我在这里没有发现任何问题,但请注意 BIRT 将缓存 DS 结果。这可能会起作用。如果您的外部 DS 协议不能像您对 Dominique 问题的回答所暗示的那样工作,您应该首先尝试列出一个简单的“协议”工作清单。
-
@hvb - 我考虑了这一点,并在 DS 中添加了一个虚拟参数。每个表使用不同的虚拟值来防止缓存。没有变化:-(