4

我有几个 Birt 报告,我正在尝试设置它们以在每天早上通过电子邮件发送报告的 pdf 的 cron 作业上运行。就生成和电子邮件而言,一切正常;我唯一遇到的问题是:如果没有要报告的内容,则会生成仅包含报告标题的 pdf 并通过电子邮件发送(基本上是空白报告)。我想完全停止生成此报告,因此如果 pdf 文件不存在,我可以跳过电子邮件。

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

似乎这可以在beforerender脚本期间完成......但是如何?我知道我需要:

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

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

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

我正在从 php 脚本而不是 Java 生成和发送电子邮件,所以我不能发送类似的命令 IEngineTask.cancel()(或者我可以吗???)

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

是的,我可以在报告之外查询数据库以确定是否有有效数据要报告,但我不希望这样做。

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

那么,我该怎么做呢?

谢谢。

4

1 回答 1

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。

于 2015-02-25T07:59:57.503 回答