2013-09-24 70 views
3

我有幾個Birt報告,我試圖設置運行在一個cron作業上,每天早上將通過電子郵件發送PDF格式的報告。一代和電子郵件發送一切正常;我堅持的唯一問題是:如果沒有什麼可報告的,只生成報告標題的pdf並通過電子郵件發送(基本上是空白報告)。我想停止生成這個報告,所以如果pdf文件不存在,我可以跳過電子郵件。Birt報告 - 不生成空白報告

我已經在Google上呆了兩天了,最近的我能找到的是這樣的:http://www.eclipse.org/forums/index.php/t/458779/其中有人試圖解決類似的問題,並得到了正確的方向推動,但不是一個完整的解決方案。

看起來好像這可以在beforerender腳本中完成...但是如何? 我知道我需要:

  1. 設置一個持久的全局變量在oncreate如果的確數據報告。

  2. 獲取beforerender腳本中的持久全局變量。

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

我做的一切產生和PHP腳本,而不是Java發送電子郵件的,所以我不能發送類似IEngineTask.cancel()命令(或者我可以???)

是的,我知道我可以在報告中顯示「沒有數據需要報告」,但這不是我的用戶想要的。

是的,我可以查詢報告以外的數據庫,以確定是否有有效的數據報告或不,但我不想。

也許我連打開並閱讀PDF,編程,看看是否有任何那裏,但聽起來更麻煩比它的價值的...

那麼,我該怎麼辦呢?

謝謝。

回答

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包含您需要的信息。