【问题标题】:BIRT data set prints same data for every itemBIRT 数据集为每个项目打印相同的数据
【发布时间】:2014-09-04 04:36:38
【问题描述】:

我有一个包含两个脚本数据集的 Maximo BIRT 报告。采购申请的主数据集和采购申请行的子数据集。问题是子数据集对于单个购买请求工作正常,并为任何给定的 PR 打印正确的数据,但是如果您为多个 PR 运行报告,则为每个 PR 打印出第一个 PR 的 pr 行。

所以我得到的是这样的。

公关 10

第 1 行

第 2 行

公关 20

第 1 行

第 2 行

当 PR 20 应该有 10 行时,它只给了我两行,而这两行与 PR 10 相同。我已将报告设置为打印出通过填充全局数据集创建的 SQL名为 mySQL 的变量并将其打印在报告上。 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);

【问题讨论】:

  • 您是否尝试通过 Properties->Dataset->Advanced->Needs cache for data-engine = false 为 Dataset 禁用缓存?
  • 我找不到那个属性 SiMemon。我使用的是 BIRT 3.7.1 该属性在我的版本中可用吗?
  • 你是对的,它在 BIRT 3.7.1 中不可用。为什么不升级到新版本?
  • 这些报告适用于 Maximo 7.5,因此在 IBM 升级 Maximo 中使用的 BIRT 之前,我一直停留在我们使用的版本上。
  • 好吧..我不知道那些东西

标签: birt


【解决方案1】:

没有阅读详细信息:

一个常见的原因是您的脚本数据集使用了一个变量。 也就是说,结果取决于变量的值,但 BIRT 不知道这一点。 BIRT 数据集结果缓存的工作方式取决于 DS 参数。 如果您将全局变量作为 DS 参数添加到 DS,那么缓存机制知道结果依赖于它,您就完成了。 如果不是,BIRT 认为结果总是一样的。

【讨论】:

  • 嗨,hvb,你能说得更具体一点吗?您是说我需要将数据集的变量添加为全局变量吗?如果是这样,我是否只需要在报告的初始化中将变量声明为全局变量?还是我需要移动整行 toolDataSet = MXReportDataSetProvider.create(this.getDataSource().getName(), this.getName());出入报表初始化?脚本数据集使用的唯一变量是 rows[0]["wonum"] 可以在报告上打印出来吗?即使它显然不能在数据集中工作。
  • 您的详细数据集(用于 PR 行)取决于主数据集的当前行(用于 PR)。更准确地说,在 Java 对象“lineDataSet”上。因此,您必须禁用缓存或为细节 DS 创建一个 DS 参数“ds”,在细节 DS 事件中使用 that 和 this.getInputParameterValue("ds") 并将其绑定到 lineDataSet 对象布局。
  • 你已经超出了我的想象 hvb。 :) 我找不到在 BIRT 3.7.1 中禁用缓存的方法,至于其余部分。我不知道 DS 参数是什么?这与常规报告参数有什么不同?当您说将其绑定到布局中的 lineDataSet 对象时,您是说只有一个隐藏字段将“ds”设置为工单编号(或我要关闭的任何内容)?
  • 你真的应该看看关于 DataSet 参数和绑定的 BIRT 教程 :-)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 2019-12-23
    • 2022-01-21
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多