2014-08-28 61 views
0

我有一个Maximo的BIRT报告和两个脚本数据集。采购申请的主要数据集和采购申请行的子数据集。问题是子数据集适用于单个购买请求,并为任何给定PR打印正确的数据,但如果您为多个PR运行报表,则会为每个PR打印第一个PR的pr行。BIRT数据集为每个项目打印相同的数据

所以我得到的是这样的。

PR 10

行1

行2

PR 20

行1

2行

当PR 20应该有10条线,它仅给了我两个,这两个和PR 10一样。我设定了该报告通过填充名为mySQL的全局变量并将其打印在报告上来打印出由数据集创建的SQL。 SQL看起来很好,我可以将它剪切并粘贴到我的SQL编辑器中并获得正确的结果,但这不是报表上打印的内容。我检查过表绑定,我试图清空脚本中的数据集并强制重新填充,但没有任何效果。我已经创建了一个新的数据集,但是新的数据集完成了同样的事情。

有没有人遇到过这个?任何想法都可以检查什么?或者我该如何清理每个PR的数据集,以便PRLINE数据集对每个PR都是干净的?

这是数据集的开放脚本。

lineDataSet = MXReportDataSetProvider.create(this.getDataSource().getName(),   this.getName()); 
lineDataSet.open(); 

var sqlText = new String(); 

// Add query to sqlText variable. 
sqlText = "select orderqty, orderunit, itemnum, description, unitcost, linecost, prnum, prlinenum, refwo, assetnum, location, project,tasknum, siteid from maximo.prline_vw " 
+ " where prnum = '" + rows[0]["prnum"].replace(/'/g,"''") + "'" 
+ " and siteid = '" + rows[0]["siteid"] + "'" 
//+ " where prnum = '" + row._outer["prnum"] + "'" 
//+ " and siteid = '" + row._outer["siteid"] + "'" 
// Include the Maximo where clause 
//+ " and " + params["where"] 
; 

lineDataSet.setQuery(sqlText); 

mySQL = sqlText; 

这就是抓取脚本。

if (!lineDataSet.fetch()) 
return (false); 

// Add a line for each output column 
// The specific get method should match the data type of the output column. 
row["prlinenum"] = lineDataSet.getString("prlinenum"); 
row["orderqty"] = lineDataSet.getFloat("orderqty"); 
row["orderunit"] = lineDataSet.getString("orderunit"); 
row["unitcost"] = lineDataSet.getFloat("unitcost"); 
row["linecost"] = lineDataSet.getFloat("linecost"); 
row["prnum"] = lineDataSet.getString("prnum"); 
row["itemnum"] = lineDataSet.getString("itemnum"); 
row["refwo"] = lineDataSet.getString("refwo"); 
row["siteid"] = lineDataSet.getString("siteid"); 
row["description"] = lineDataSet.getString("description"); 
row["project"] = lineDataSet.getString("project"); 
row["tasknum"] = lineDataSet.getString("tasknum"); 
row["assetnum"] = lineDataSet.getString("assetnum"); 
row["location"] = lineDataSet.getString("location"); 


return (true); 
+0

您是否尝试通过属性 - >数据集 - >高级 - >需要数据引擎缓存= false来禁用数据集缓存? – SiMemon 2014-09-02 05:49:47

+0

我无法找到属性SiMemon。我在BIRT 3.7.1上我的版本上有这个属性吗? – user3393181 2014-09-03 13:25:59

+0

你是对的,它在BIRT 3.7.1中不可用。你为什么不升级到更新的版本? – SiMemon 2014-09-04 05:28:30

回答

0

,而不必阅读细节:

一个常见的原因是你的脚本化数据集使用的变量。 也就是说,结果取决于变量的值,但BIRT不知道这一点。 BIRTs数据集结果缓存取决于DS参数。 如果将全局变量作为DS参数添加到DS,则缓存机制知道结果取决于它,并且您已完成。 如果不是,BIRT认为结果总是相同的。

+0

嗨hvb,你能更具体的smidge?您是否在说我需要将数据集的变量添加为全局变量?如果是这样,我是否需要在报告初始化时将该变量声明为全局变量?或者我需要移动整个行toolDataSet = MXReportDataSetProvider.create(this.getDataSource()。getName(),this.getName());进入报告初始化?脚本数据集使用的唯一变量是行[0] [“wonum”]在报告上打印出来的罚款?尽管它显然不在数据集中工作。 – user3393181 2014-09-03 13:22:27

+0

您的详细信息DataSet(对于PR行)取决于主数据集的当前行(对于PR)。更确切地说,在Java对象“lineDataSet”上。因此,您必须禁用缓存或为详细信息DS创建DS参数“ds”,在具有this.getInputParameterValue(“ds”)的详细DS事件中使用* that *并将其绑定到布局中的lineDataSet对象。 – hvb 2014-09-04 18:01:24

+0

你在我头上hvb。 :)我找不到在BIRT 3.7.1中禁用缓存的方法,至于其他方面。我不知道DS参数是什么?这与常规报告参数不同吗?并且,当你说将它绑定到布局中的lineDataSet对象时,你是说只是有一个隐藏的字段,将“ds”设置为工作订单号(或任何我正在键入的)? – user3393181 2014-09-05 13:46:41

0

这似乎只发生在我查看Eclipse BIRT开发人员的报告时。如果我将报告上传到工作环境并进行测试,它似乎工作正常。所以它必须与缓存脚本数据源的方式以及开发人员如何处理它有关?