我有一个Birt报告,其数据集有一个类型为" Java Object"的计算列。此列将其作为Java对象从周围应用程序输入,然后使用此精确对象计算内容。
计算列的表达式:
var result;
try {
result = application.getValueFromApplication(row["id"]);
} catch (err) {
Packages.java.lang.System.out.println("Error getting value " + row["id"] + ": " + err);
result = null;
}
然而......似乎有一个错误,Birt将这些值转换为JavaScript值。在最好的情况下,这是愚蠢的,但数字更糟糕。因为 所有 号码都转换为相同的愚蠢JavaScript"数字"类型。是的,即使是BigDecimal
和Long
。
因此,在上面的示例中,getValueFromApplication()
返回BigDecimal
,而结果是Javascript number
。
当开始计算的时候,所有这些值都在内部转换回Double
,现在计算失败,因为它要求值是应用程序提供报告的值。
所以某处有这个片段:
application.doMagic(row["value"]);
Birt试图强迫它Double
沿着方法的喉咙向下,即使它在开头有BigDecimal
。
如何防止Birt盲目地将数字转换为某些JavaScript blob而不是使用具体的Java类?