我有几个Birt报告,我试图在cron作业上运行,每天早上都会通过电子邮件发送pdf报告。一代和电子邮件发生的一切都很好;我坚持的唯一问题是:如果没有什么可报告的话,会生成一个只包含报告标题的pdf并通过电子邮件发送(基本上是空白报告)。我想停止生成这个报告,所以如果pdf文件不存在,我可以跳过电子邮件。
我已经在谷歌待了两天了,而我能找到的最接近的是:http://www.eclipse.org/forums/index.php/t/458779/其中有人试图解决类似的问题并且朝着正确的方向前进,但不是完整的解决方案。
好像这可以在beforerender
脚本中完成......但是怎么样?
我知道我需要:
如果确实要报告数据,请在oncreate
中设置一个持久的全局变量。
在beforerender
脚本中获取持久性全局变量。
发送魔术don't generate report
命令。
我正在从PHP脚本而不是Java中进行所有生成和发送电子邮件,因此我无法发送IEngineTask.cancel()
之类的命令(或者我可以???)
是的,我知道我可以在报告中写下“没有要报告的数据”,但这不是我的用户想要的。
是的,我可以在报告之外查询数据库,以确定是否有有效数据要报告,但我不愿意。
也许我甚至可以打开并阅读pdf,以编程方式查看是否有任何内容,但这听起来更像是一件麻烦而不是它的价值......
那么,我该怎么做?
感谢。
答案 0 :(得分:1)
我的回答有点迟了,但我在一个适用于数百份报告的框架中这样做,可能只是针对单个报告进行了简化: 请注意,所有代码都是从内存中写入的(不是从我们的框架中复制的),因此它可能包含一些错误。
在报告中添加外部Javascript文件myframework.js
。
在此文件中,定义一个对象myframework
,如下所示:
if (myframework == undefined) {
myframework = {
dataFound: false,
afterReport: function() {
// Write it to the appContext.
// Using Java, you could read it after the
// runAndRenderTask is done.
reportContext.getAppContext().put("dataFound", this.dataFound);
// But since you probably cannot the context
// (don't like coding Java?), the report has to
// tell it to he world some other way...
var txt = "dataFound=" + (dataFound? "true": "false");
var fw = new java.io.FileWriter("c:\\reportcontext.out");
fw.write(txt);
fw.close();
}
};
}
将JS文件添加到报告的资源中。
在您的报告中,在您确定报告找到某些内容的地方(例如通常在数据集中发现onFetch
事件),请通过调用
myframework.dataFound = true;
在报告的afterFactory
或afterRender
事件中,请致电
myframework.afterReport();
然后你的报告应该创建一个输出文件c:\ reportcontext.out,其中包含你需要的信息。