根据BIRT中的另一个表更改表值

时间:2013-12-13 01:47:07

标签: java mysql birt

我看了一遍,如果可能的话,似乎找不到任何东西,所以我去了这里。无论如何,这是我的问题。

我有一个查询,计算每月特定群体的平均调查分数,输出如下:

GRP1    71.2
GRP2    77.2
GRP3    81.6

现在我有另一个表格,其中包含基于这些值得到点值的标准,例如:

min_value    max_value     point
   95           100         80
   85            94         60
   75            84         40
   65            74         20

基本上意味着95-100应该获得80分等等。这是动态的(我的应用程序中的用户可以更改这些值或添加/删除行)所以我想在第一个表的标签上编写脚本,查找第二个表,将其与最小值和最大值进行比较。但是我环顾四周,我没有看到如何做到这一点。我想到了以某种方式将数据集转换为可以循环的对象列表,因此我可以将值与每行进行比较,但我不知道如何执行此操作。

编辑:我发现了一种方法,但它涉及我将第二个表连接到第一个表,然后设置visibility属性,以便不显示得分不在最小值和最大值之间的行。但是我对这个效率有疑问所以我想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:1)

您不必显示第二张表中的数据,对吗?该表仅定义了值边界。如果是这样,您可以通过向绑定到第二个数据库表的报表添加不可见表,从而在javascript对象中从第二个表预加载数据。该表项必须放在显示第一个表中数据的报表项之前。

你必须在Javascript中编程一点:

  • 创建2个数据集:每个数据集一个
  • 添加绑定到第二个数据集的表
  • 使此表不可见:属性编辑器 - >可见性选项卡。该表只是为了使第二个数据集从数据库加载数据
  • 为第二个数据集创建beforeOpen()事件句柄
  • 在beforeOpen()脚本中定义一个新的全局变量:gValueMapping = [];该变量将保留一个二维数组:[第二个表的大小] [2]
  • 为第二个数据集创建onFetch()事件处理程序
  • 将当前行值添加到全局变量gValueMapping:gValueMapping.push([row [“min_value”],row [“point”]])。如果按min_value对第二个数据集进行排序,则无需知道max_value。
  • 现在为绑定到第一个表的表创建一个新的数据绑定
  • 按如下方式对绑定进行编程:以相反的顺序迭代gValueMapping,直到当前值小于gValueMapping [i] [0]中的值,然后返回gValueMapping [i] [1]。它包含相应的“点”值。

答案 1 :(得分:0)

在“编辑数据集”中创建“计算列”

这是我用于类似问题的JavaScript的例子,但我将数字转换为单词字符串。

if (row["Change Assessment"]==1){
"Very High"
}else if (row["Change Assessment"]==2){
"High"
}else if (row["Change Assessment"]==3){
"Low"
}else if (row["Change Assessment"]==4){
"Very Low"
}else {
"Undefined"}

答案 2 :(得分:0)

最有效和最简单的方法是在数据库的存储过程中执行此操作:我们将汇总的调查按月存储在临时表中,然后我们将其连接到min-max表。

对于BIRT中的解决方案,我们可以创建一个连接数据集:

  • 添加一个虚拟列,其值始终设置为“1”(或您喜欢的任何常量值...)到每个现有数据集中。
  • 在这两个数据集之间创建一个新的“连接数据集”,并使用我们的虚拟列链接它们,以便我们获得“笛卡尔产品”
  • 在已合并数据集的“过滤器”标签中,添加一个新过滤器,以选择在最小 - 最大值之间进行调查得分的行
  • 就是这样!