[转]Crystal Reports XI: 已經到達您系統管理員所設定的最大報表處理工作限制。
Crystal Reports 從 10.0 版開始,因為考量機器負載的緣故,增加了一個預設的報表列印限制數量。當線上使用者人數較多(尤其是 Web 環境),預覽報表時就很容易出現這個錯誤訊息:
「已經到達您系統管理員所設定的最大報表處理工作限制。」
(The maximum report processing jobs limit configured by your system administrator has been reached......)
如果是 .NET 程式,錯誤訊息可能是這樣:
System.Runtime.InteropServices.COMException (0x800003E5): 無法開啟報表。
這個問題蠻多人都碰過,網路上很容易找到解法,主要是調整 PrintJobLimit registry key:
HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects \Suite 11.x\Report Application Server\Server\PrintJobLimit
還有一個:
HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects \Suite 11.x\Report Application Server\InprocServer\PrintJobLimit
PrintJobLimit 預設值是 75,我第一次碰到時把它加到 150 就沒再聽到使用者抱怨了。不過,這個數字不應該隨便調大,因為它會耗費系統資源,並影響系統的效能。該怎麼調,還是得依每個系統的負載、系統資源多寡,以及經驗法則來判斷吧。
除了調整報表數量上限,程式碼的寫法也要配合修改,讓報表物件盡快釋放,以避免 print job 計數值迅速飆高。如果是 ASP.NET 網頁,可以在 Page_Unload 事件中呼叫 ReportDocument.Close()。這篇官方文件亦可參考:http://msdn.microsoft.com/en-us/library/ms225490.aspx。
你也會好奇:Crystal Reports 的報表引擎是怎麼計算報表物件的數量呢?甚麼情況才算一個 print job?這篇討論串 http://forums.msdn.microsoft.com/en-US/vscrystalreports/thread/208525b2-94cd-4af6-9c5a-015e243b3092/ 提到:
- 儲存在 session 裡面的報表物件視為一個 print job;
- 主報表算一個 print job;
- 每個子報表也算一個。