Java 基于BIRT中的另一个表更改表值
我找遍了所有地方,如果可能的话,似乎找不到任何东西,所以我来到这里。不管怎样,这是我的问题 我有一个查询,用于计算特定群体每月的平均调查分数,结果如下:Java 基于BIRT中的另一个表更改表值,java,mysql,birt,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
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
现在,我有了另一个表,其中包含了基于这些条件获取分值的标准,例如:
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分,等等。这是动态的(我的应用程序中的用户可以更改这些值或添加/删除行),因此我考虑在第一个表的标签上编写一个脚本,查找第二个表,将其与最小值和最大值进行比较。然而,我环顾四周,没有看到任何关于如何做到这一点的信息。我想把数据集转换成一个可以循环的对象列表,这样我就可以比较每一行的值,但我不知道怎么做
编辑:我发现了一种方法,但它涉及到将第二个表连接到第一个表,然后设置可见性属性,以便不显示分数不在最小值和最大值之间的行。但是,我对这种方法的效率有疑问,所以我想知道是否有更好的方法。在“编辑数据集”中创建一个“计算列”
下面是我在模拟问题中使用的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"}
在“编辑数据集”中创建“计算列”
下面是我在模拟问题中使用的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"}
最有效、最简单的方法是在数据库的存储过程中执行此操作:我们将按月汇总的调查存储在临时表中,然后将其连接到最小-最大表 仅对于BIRT中的解决方案,我们可以创建一个连接的数据集:
- 向两个现有数据集中的每个数据集中添加一个虚拟列,其值始终设置为“1”(或任何您喜欢的常量值…)李>
- 在这两个数据集之间创建一个新的“连接数据集”,并使用我们虚构的列链接它们,从而得到一个“笛卡尔乘积”
- 在联接数据集的“过滤器”选项卡中,添加一个新过滤器,以选择调查分数在最小值和最大值之间的行
- 就这样李>
- 向两个现有数据集中的每个数据集中添加一个虚拟列,其值始终设置为“1”(或任何您喜欢的常量值…)李>
- 在这两个数据集之间创建一个新的“连接数据集”,并使用我们虚构的列链接它们,从而得到一个“笛卡尔乘积”
- 在联接数据集的“过滤器”选项卡中,添加一个新过滤器,以选择调查分数在最小值和最大值之间的行
- 就这样李>
- 您不必显示第二个表中的数据,对吗?该表仅定义了值边界。如果是这样,您可以通过向绑定到第二个数据库表的报表中添加一个不可见的表,从javascript对象的第二个表中预加载数据。该表项必须放在显示第一个表中数据的报表项之前
您必须使用Javascript编写一点程序:
- 创建2个数据集:每个db表一个
- 添加绑定到第二个数据集的表
- 使此表不可见:属性编辑器->可见性选项卡。该表仅用于使第二个数据集从数据库加载数据
- 为第二个数据集创建beforeOpen()事件句柄
- 在beforeOpen()脚本中定义一个新的全局变量:gValueMapping=[];此变量将保留一个二维数组:[第二个表的大小][2]
- 为第二个数据集创建onFetch()事件处理程序
- 将当前行值添加到全局变量gValueMapping:gValueMapping.push([row[“min_value”]、row[“point”])。如果按最小值对第二个数据集进行排序,则不需要知道最大值
- 现在为绑定到第一个表的表创建一个新的数据绑定
- 按如下方式编程绑定:按相反顺序迭代gValueMapping,直到当前值小于gValueMapping[i][0]中的值,然后返回gValueMapping[i][1]。它包含相应的“点”值
- 创建2个数据集:每个db表一个
- 添加绑定到第二个数据集的表
- 使此表不可见:属性编辑器->可见性选项卡。该表仅用于使第二个数据集从数据库加载数据
- 为第二个数据集创建beforeOpen()事件句柄
- 在beforeOpen()脚本中定义一个新的全局变量:gValueMapping=[];此变量将保留一个二维数组:[第二个表的大小][2]
- 为第二个数据集创建onFetch()事件处理程序
- 将当前行值添加到全局变量gValueMapping:gValueMapping.push([row[“min_value”]、row[“point”])。如果按最小值对第二个数据集进行排序,则不需要知道最大值
- 现在为绑定到第一个表的表创建一个新的数据绑定
- 按如下方式编程绑定:按相反顺序迭代gValueMapping,直到当前值小于gValueMapping[i][0]中的值,然后返回gValueMapping[i][1]。它包含相应的“点”值。
- 您不必显示第二个表中的数据,对吗?该表仅定义了值边界。如果是这样,您可以通过向绑定到第二个数据库表的报表中添加一个不可见的表,从javascript对象的第二个表中预加载数据。该表项必须放在显示第一个表中数据的报表项之前
您必须使用Javascript编写一点程序: