2013-08-19 163 views
2

我正在使用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設置數據源)?

回答

1

好吧,好吧,經過很多無果而終的嘗試之後,我發現只有當主存儲過程返回數據時纔會生成包含子報告的報告。 我使用RowsetCursor

這裏是我的代碼:

// Here I create a metadata using ONLY the database fields 
IRowsetMetaData metadata = new RowsetMetaData(); 
Fields fields = clientDoc.getDataDefController().getDataDefinition().getResultFields(); 
Fields dbFields = new Fields(); 
for (int i = 0; i < fields.size(); i++) { 
    IField field = fields.getField(i); 
    if (field instanceof DBField) { 
     dbFields.add(field); 
    } 
} 
metadata.setDataFields(dbFields); 

// Create the rowset cursor with metadata 
RowsetCursor cursor = clientDoc.getRowsetController().createCursor(null, metadata); 
FetchedRecordCountInfo countInfo = new FetchedRecordCountInfo(); 
countInfo.setIsTotalRecordsKnown(false); 

// Here, if I don't have any record from my stored procedure, I don't execute the report process 
int nbRecords = cursor.getRecordCount(countInfo); 
if (nbRecords <= 0) { 
    throw new ReportingException("UnmanagedJob - Report generation : No data, generation aborted."); 
} 

我希望這將有助於其他 「失去用戶」 水晶報表的Java SDK的:)

相關問題