Sql Server Reporting Services 2005でレポートを作成し、Oracle11gデータベースに接続しています。返信を投稿するときに、私がMSSQL Serverに精通しており、Oracleに不慣れであることを知っておくと役立つでしょう。
複数のネストされたサブレポートがあり、外部レポートと同じデータで要約データを使用する必要がありますが、内部レポートで詳細に使用する必要があります。DBサーバーを複数の実行から保護するために、最初にいくつかの一時テーブルにデータを入力してから、レポートとサブレポートでそれらだけを複数回クエリすることを考えました。
SSRSでは、データセットは明らかにRDLファイルに表示される順序で実行されます。また、行セットを返さないデータセットを持つことができます。そこで、4つの一時テーブルにデータを入力するためのストアドプロシージャを作成し、これをレポートの最初のデータセットにしました。このSPは、SQLDeveloperから実行すると機能し、一時テーブルからデータをクエリできます。ただし、SSRSが同じセッションを再利用していないようであるため、これはうまくいかなかったようです。したがって、グローバル一時テーブルがON COMMIT PRESERVE ROWSで作成されたとしても、データセットは空でした。
「実際の」テーブルの使用に切り替え、各テーブルの主キーの一部である、新しい実行ごとに一意に生成される文字列形式のGUIDを渡すようになりました。これにより、次の行のみを取得できます。この実行。
Sql Developerからこれを実行すると、正常に機能します。例:
DECLARE
ActivityCode varchar2(15) := '1208-0916 ';
ExecutionID varchar2(32) := SYS_GUID();
BEGIN
CIPProjectBudget (ActivityCode, ExecutionID);
END;
この例ではGUIDがわからないことを気にしないでください。これは、行が4つのテーブルに挿入されるため、GUIDが機能することを証明するだけです。
しかし、SSRSレポートでは、データセットに行がまだ表示されておらず、SQLDeveloperは行が挿入されていないことを確認しています。
だから私は次のように考えています:
- Oracleは暗黙のトランザクションを使用しますが、変更がコミットされませんか?
- 行セットを返さないSPが実行されていることを証明できますが(パラメーターマッピングを省略した場合、レポートのレンダリング時にパラメーターが不足していると文句を言うため)、実際には実行されていない可能性があります。何とかして。
- 間違った実行順序は問題ではなく、行がテーブルに表示されますが、そうではありません。
これを実現する方法についてのアイデアに興味があります(特に、メインクエリを複数回実行しないことに関する部分)。レポート全体を再設計します。ストアドプロシージャの使用を停止します。あなたが好きなものを提案してください!私はこれを機能させるのに助けが必要で、行き詰まっています。
詳細が必要な場合は、SSRSレポートに、いくつかのヘッダー値を持ち、サブレポートを含むListオブジェクト(データセットの各行に対して1回繰り返されるコンテナー)があります。最終的には、合計4つのレポートが作成されます。1つのメインレポートと3つのネストされたサブレポートです。各サブレポートは、親レポートのリストに含まれます。