2

ストアド プロシージャまたは ResultSet を使用してレポートを生成するために、Java Crystal Report SDK を使用しています。

これは、数か月前に作成した投稿で、 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);  
 } 

問題は、各SubreportLinkfromlinksが半分埋められているか空であるということです。

  • サブレポート パラメーターがメイン レポートのストアド プロシージャまたは数式フィールドのフィールドにリンクされている場合、このパラメーターの名前はSubreportLink( using getMainReportFieldName()) にありますが、サブレポートからのリンクされたパラメーターの名前 ( using getSubreportFieldName()) はなく、値もありません。リンク。
  • サブレポート パラメーターがメイン レポートのパラメーター フィールドにリンクされている場合、SubreportLinkオブジェクトは空です。

そのため、サブレポートのパラメータをこの状態で設定するのは非常に難しく、それぞれの半分の部分Subreportlink+ParameterFieldなどを使用しても.

私が間違っていることは何ですか?私の場合、必要なすべての情報を入手できますか?

setTablesLocation()または、 (データソースを ) で設定する代わりに、メインレポートでメソッドを使用するときに行われるように、サブレポートパラメーターを自動的に設定する方法はありますResultSetか?

4

1 に答える 1

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.");
}

これがCrystal Report Java SDKの他の「失われたユーザー」に役立つことを願っています:)

于 2013-09-12T20:55:10.183 に答える