我正在使用Java Crystal Report SDK來使用存儲過程或ResultSets生成報告。Crystal Report - 使用ResultSet的主報告中的子報告
這是我幾個月前做的一篇文章,嘗試使用ResultSet在報表中執行我的子報表的存儲過程:Java Crystal Report SDK - Report & SubReport。 在這種情況下,我知道要設置執行我的存儲過程的參數,所以它很「容易」。我試圖做一樣的事情(即執行一個存儲過程用於在主報表中使用ResultSet填充我的子報表),但是採用了一種通用的方式:我事先不知道這些參數,所以我必須使用ParameterFieldController
來設置每一個,但有些來自主ResultSet,其他來自主要報告中的靜態變量等。
我意識到有很多事情要做,並且要覆蓋很多情況才能成爲儘可能通用。雖然當我沒有爲我的主要報告設置數據源時,所有這些都會自動完成。
那麼,有沒有一種「簡單」的方法來在報表和子報表中混用ResultSet和存儲過程?
或者有沒有辦法繞過useDatasource()
方法?當然決定爲每個子報表使用主ResultSet而不是給定的存儲過程。 (我必須保留主報表的ResultSet,並且不能因性能原因重新執行存儲過程)。
經過很多次嘗試後,我回到了這裏。不幸的是,我仍然想知道如何簡單地使用ResultSet將我的參數傳遞給主報告的子報告...
下面是我用於檢索主報告和子報告和子報告參數之間的鏈接:
IStrings subreports = clientDoc.getSubreportController().getSubreportNames();
for (int i = 0; i < subreports.size(); i++) {
// Get subreport
String subreportName = subreports.getString(i);
ISubreportClientDocument subreport = clientDoc.getSubreportController().getSubreport(subreportName);
// Get datasource tables
databaseController = subreport.getDatabaseController();
tables = databaseController.getDatabase().getTables();
// Get links between subreport and main report
SubreportController subreportController = clientDoc.getSubreportController();
SubreportLinks links = subreportController.getSubreportLinks(subreportName);
Fields params = subreport.getDataDefController().getDataDefinition().getParameterFields();
// Set datasource
setTablesLocation(tables, databaseController, args);
}
事情是從links
的每個SubreportLink
是半滿或空。
- 如果子報表參數鏈接到主報告存儲過程或公式字段的一個字段,我有這樣的參數的名稱在
SubreportLink
(使用getMainReportFieldName()
),但不連接的參數的從子報表中的名稱(使用getSubreportFieldName()
)而不是鏈接的值。 - 如果子報表參數鏈接到主報表的參數字段,則
SubreportLink
對象爲空。
所以,這是非常棘手的設置子報表參數在這種情況下,即使使用的半部分的每個Subreportlink
+的ParameterField
等
我做錯了什麼?我可以得到我案例中所需的所有信息嗎?
或者,有沒有辦法自動設置我的子報表參數,因爲它是在我的主報表上使用setTablesLocation()
方法時完成的(而不是使用ResultSet
設置數據源)?