我正在制作一份报告,需要包含一个“估算”列,该列基于数据集中没有的数据。
理想情况下,我希望能够定义Java接口
public int getEstimate(int foo_id, int bar_id, int quantity);
其中foo_id
,bar_id
和quantity
在我想要估算的行中可用。
生成估算值会有多种策略,因此最好使用界面来允许在需要时进行交换。
看看BIRT文档,我认为我应该使用事件处理程序机制,但这似乎只允许定义要使用的类,我想以某种方式注入一个配置的估算器。
一个非混淆的例子可能是说我有一个包含IP地址列的数据集,我希望能够使用一些GeoIP服务从IP地址解析该国家/地区。在这种情况下,我有一个接口public String getCountryName(String address)
,实际的实现可能使用MaxMind,本地缓存或其他系统。
我将如何做到这一点?
或者..通过编写可以在将计算数据交付给BIRT之前集成计算数据的脚本数据源,我会更好吗?
或..某种脚本数据源然后用于创建连接数据集?
答案 0 :(得分:0)
我认为脚本数据源可以正常工作,但基于Java的事件处理程序会更直接。您可以将其实现为一个简单的POJO,并可以访问任何和所有复杂的对象和工具,以便您计算估算值。最简单的解决方案可能只是将计算字段添加到数据集中。
创建计算字段时,您可以根据可以利用的脚本逻辑获得相当复杂的结果,以便生成结果值。关于这条路线最好的事情是,行中的所有其他列值(我假设您需要计算估计值)通过表达式编辑器提供。您可以使用“包”对象(即var red = new Packages.redwood.HelloWorld()
)拉入复杂对象(POJO)以帮助您进行计算。
如果你想创建Event Handler类,这就是我要做的。我将创建一个文本对象,并将onCreate绑定到您的POJO(通过扩展TextItemEventAdapter)并覆盖“onCreate”方法。在那里,您可以做任何您想要的工作,最后只需调用“text.setText(theEstimateResult);
”即可使估算值可见。至于访问数据值来进行计算,您也可以访问POJO中的数据。我假设估计值将是更大的值表的一部分。您可以通过reportContext访问任何特定的行值。
这是我首先尝试的两个想法。计算列是最快实现的,并且在部署期间最不可能抛出曲线。让我知道您选择哪种方式,如果需要,我们可以进一步散列。