Birt Reports - 不生成空报告

时间:2013-09-24 18:59:43

标签: birt

我有几个Birt报告,我试图在cron作业上运行,每天早上都会通过电子邮件发送pdf报告。一代和电子邮件发生的一切都很好;我坚持的唯一问题是:如果没有什么可报告的话,会生成一个只包含报告标题的pdf并通过电子邮件发送(基本上是空白报告)。我想停止生成这个报告,所以如果pdf文件不存在,我可以跳过电子邮件。

我已经在谷歌待了两天了,而我能找到的最接近的是:http://www.eclipse.org/forums/index.php/t/458779/其中有人试图解决类似的问题并且朝着正确的方向前进,但不是完整的解决方案。

好像这可以在beforerender脚本中完成......但是怎么样? 我知道我需要:

  1. 如果确实要报告数据,请在oncreate中设置一个持久的全局变量。

  2. beforerender脚本中获取持久性全局变量。

  3. 发送魔术don't generate report命令。

  4. 我正在从PHP脚本而不是Java中进行所有生成和发送电子邮件,因此我无法发送IEngineTask.cancel()之类的命令(或者我可以???)

    是的,我知道我可以在报告中写下“没有要报告的数据”,但这不是我的用户想要的。

    是的,我可以在报告之外查询数据库,以确定是否有有效数据要报告,但我不愿意。

    也许我甚至可以打开并阅读pdf,以编程方式查看是否有任何内容,但这听起来更像是一件麻烦而不是它的价值......

    那么,我该怎么做?

    感谢。

1 个答案:

答案 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;

在报告的afterFactoryafterRender事件中,请致电

myframework.afterReport();

然后你的报告应该创建一个输出文件c:\ reportcontext.out,其中包含你需要的信息。