【问题标题】:Changing table value based on another table in BIRT根据 BIRT 中的另一个表更改表值
【发布时间】:2013-12-13 01:47:06
【问题描述】:

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

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

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 分,等等。这是动态的(我的应用程序中的用户可以更改这些值或添加/删除行)所以我想在第一个表的标签上编写一个脚本,查找第二个表,将其与最小值和最大值进行比较。但是,我环顾四周,没有看到有关如何执行此操作的任何信息。我想以某种方式将数据集转换为可以循环的对象列表,以便我可以将值与每一行进行比较,但我不知道该怎么做。

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

【问题讨论】:

    标签: java mysql birt


    【解决方案1】:

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

    您将不得不使用 Javascript 进行一些编程:

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

    【讨论】:

      【解决方案2】:

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

      这是我用于类似问题的 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"}
      

      【讨论】:

        【解决方案3】:

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

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

        • 为您现有的 2 个数据集添加一个虚拟列,其值始终设置为“1”(或您喜欢的任何常数值...)。
        • 在这两个数据集之间创建一个新的“连接数据集”,并使用我们的虚构列将它们链接起来,这样我们就得到了一个“笛卡尔积”
        • 在连接数据集的“过滤器”选项卡中,添加一个新过滤器以选择调查得分介于 min-max 之间的行
        • 就是这样!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          • 2017-01-05
          相关资源
          最近更新 更多