none
ReportViewerにおけるサブレポートの使い方について RRS feed

  • 質問

  • 

    VisualStudio2010ProにあるReportViewerを使用して写真の様にサブレポートを配置したいのですが、

    エラーが出てしまい動作しません。

    度々の質問になりますが、何かお心当たりがあれば教えていただけないでしょうか。

    また、このエラーで言っているログファイルというのがどこに保存されているのかも分かりません。

    もしご存じでしたら併せて教えていただければと思います。

    なお、今"form02.rdlc”には中身に“ほげ”と書かれているテキストボックスが一つだけです。


    • 編集済み aquq 2012年7月27日 22:44
    2012年7月27日 9:32

回答

  • 画像をみると、form02.rdlcに貼り付けてあるサブレポートとして、親レポートと同じform02.rdlcを参照してますね。
    サブレポートとして表示したいのがreport02.rdlcなら、"次のレポートをサブレポートして使用"には"report02"が入るはずですよ。

    ちなみにサブレポートにエラーメッセージが表示されるのはサブレポート処理中のエラーが勝手に表示されるからです。参考:Subreport 要素 (RDL)
    デバッグ実行中だとVisualStudioの出力ウィンドウに同じメッセージが表示されます。
    LocalReport.Renderメソッドを使ってた場合に得られるwarningsにも同じメッセージが入ってます。
    ただし、いずれにしてもただの文字列でしかないので情報としてはいまいちだったりします。
    そのためログファイル~とかもあてにならないと思います。

    #サブレポートじゃなければReportErrorイベントが拾えるんですけどねぇ


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク aquq 2012年7月29日 2:54
    2012年7月27日 11:37
  • できますよ。

    ただし、現在のMicrosoft Reportの元になったのがSQL Serverの報告書作成用だったせいなのか、データベースから直接データを引っ張ってくるのは勝手にやってくれるのですが、アプリケーションローカルにあるデータに関しては自動的には読み込んでくれません。
    さらに、親レポートのデータを継承してもくれません。

    ローカルなデータはLocalReport.DataSourcesに必要なデータをプログラムで入れてやらなければなりませんが、親から継承してくれないためにサブレポートのDataSourcesにも必要なデータを入れる必要があります。
    そのため、サブレポートが処理されるタイミングで発生するLocalReport.SubreportProcessingイベントでサブレポートのDataSourcesに必要なデータを入れることになります。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            Microsoft.Reporting.WinForms.LocalReport localReport
                = this.reportViewer1.LocalReport;
    
            //表示するLocalReportに対してSubreportProcessingイベントを登録する
            localReport.SubreportProcessing
                    += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: このコード行はデータを 'TestDBDataSet.TestTable' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            this.TestTableTableAdapter.Fill(this.TestDBDataSet.TestTable);
            this.reportViewer1.RefreshReport();
        }
    
        void LocalReport_SubreportProcessing(object sender, Microsoft.Reporting.WinForms.SubreportProcessingEventArgs e)
        {
            LocalReport parentReport = (LocalReport)sender;
    
            //親レポートに含まれるデータソースを名前で検索できるようにDictionaryに
            var parentSources = new Dictionary<string, ReportDataSource>();
            foreach (ReportDataSource parentSource in parentReport.DataSources)
            {
                parentSources.Add(parentSource.Name, parentSource);
            }
    
            //サブレポート内に必要なデータソース名を調べる
            foreach (string sourceName in e.DataSourceNames)
            {
                if (parentSources.ContainsKey(sourceName))
                {
                    //サブレポート内にあるデータソース一覧に親レポートと同じデータソース名が見つかったら
                    //サブレポートにも親レポートのデータソースを登録する
                    e.DataSources.Add(parentSources[sourceName]);
                }
                else
                {
                    //親レポートにない場合や名前が違う場合は継承させられないので
                    //必要なデータソースを追加してやる
                    //DataTable tableDummy=new DataTable();
                    //ReportDataSource subSource = new ReportDataSource(sourceName, tableDummy);
                }
            }
        }
    }

    #VS2010はDataSource関係のメニューの配置が変更されてて迷っちゃうなぁ

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク aquq 2012年7月29日 2:54
    2012年7月28日 10:11
  • Y.TK様

    サブレポートにデーターセットが追加されているとこの現象が出てしまうようです。

    データーセットを消していただければ直るのではないかと。

    また、消しても直らない場合にはコードの中身にデーターセットを追加したコードがすべて消えきらずに残っているかもしれません。

    その場合は残ったコードの削除、また、新しいレポートを再作成したりすればできるのではないかと思います。

    サブレポートにデーターセットを追加したい場合にはgekka様の返信を見ていただけれるのがよいかと思います。

    私が教えれるほどの知識を持っていませんが、ご参考になればと思います。

    2012年8月13日 4:05

すべての返信

  • 画像をみると、form02.rdlcに貼り付けてあるサブレポートとして、親レポートと同じform02.rdlcを参照してますね。
    サブレポートとして表示したいのがreport02.rdlcなら、"次のレポートをサブレポートして使用"には"report02"が入るはずですよ。

    ちなみにサブレポートにエラーメッセージが表示されるのはサブレポート処理中のエラーが勝手に表示されるからです。参考:Subreport 要素 (RDL)
    デバッグ実行中だとVisualStudioの出力ウィンドウに同じメッセージが表示されます。
    LocalReport.Renderメソッドを使ってた場合に得られるwarningsにも同じメッセージが入ってます。
    ただし、いずれにしてもただの文字列でしかないので情報としてはいまいちだったりします。
    そのためログファイル~とかもあてにならないと思います。

    #サブレポートじゃなければReportErrorイベントが拾えるんですけどねぇ


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク aquq 2012年7月29日 2:54
    2012年7月27日 11:37
  • gekka様

    ご丁寧に教えていただいてありがとうございます。

    私の方で質問内容に誤りがありましたので訂正します。サブレポートにしたいのは“form02.rdlc”になります。

    質問文も修正しておきます。

    なお、添付した画像は親レポートして動かしたいform01.rdlcになり、form02.rdlcをサブレポートとして動かしたいと考えています。

    度々で申し訳ございませんが、再度のアドバイスをいただけますようお願いいたします。


    • 編集済み aquq 2012年7月27日 22:45
    2012年7月27日 22:44
  • 色々と試していたところ、本件自己解決しました。

    データセットが追加されていると本エラーが出てしまうようです。

    解決により追加で疑問が湧いてきたので質問させて下さい。

    サブレポートにはデータセットが使えないのでしょうか?

    サブレポートに“一覧”を作成し、SQLから引っ張ってきたデーターを表示させようかと

    思っていたのですが、出来ないのでしょうか。

    度々の質問で恐れ入ります。

    2012年7月28日 0:27
  • できますよ。

    ただし、現在のMicrosoft Reportの元になったのがSQL Serverの報告書作成用だったせいなのか、データベースから直接データを引っ張ってくるのは勝手にやってくれるのですが、アプリケーションローカルにあるデータに関しては自動的には読み込んでくれません。
    さらに、親レポートのデータを継承してもくれません。

    ローカルなデータはLocalReport.DataSourcesに必要なデータをプログラムで入れてやらなければなりませんが、親から継承してくれないためにサブレポートのDataSourcesにも必要なデータを入れる必要があります。
    そのため、サブレポートが処理されるタイミングで発生するLocalReport.SubreportProcessingイベントでサブレポートのDataSourcesに必要なデータを入れることになります。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            Microsoft.Reporting.WinForms.LocalReport localReport
                = this.reportViewer1.LocalReport;
    
            //表示するLocalReportに対してSubreportProcessingイベントを登録する
            localReport.SubreportProcessing
                    += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: このコード行はデータを 'TestDBDataSet.TestTable' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            this.TestTableTableAdapter.Fill(this.TestDBDataSet.TestTable);
            this.reportViewer1.RefreshReport();
        }
    
        void LocalReport_SubreportProcessing(object sender, Microsoft.Reporting.WinForms.SubreportProcessingEventArgs e)
        {
            LocalReport parentReport = (LocalReport)sender;
    
            //親レポートに含まれるデータソースを名前で検索できるようにDictionaryに
            var parentSources = new Dictionary<string, ReportDataSource>();
            foreach (ReportDataSource parentSource in parentReport.DataSources)
            {
                parentSources.Add(parentSource.Name, parentSource);
            }
    
            //サブレポート内に必要なデータソース名を調べる
            foreach (string sourceName in e.DataSourceNames)
            {
                if (parentSources.ContainsKey(sourceName))
                {
                    //サブレポート内にあるデータソース一覧に親レポートと同じデータソース名が見つかったら
                    //サブレポートにも親レポートのデータソースを登録する
                    e.DataSources.Add(parentSources[sourceName]);
                }
                else
                {
                    //親レポートにない場合や名前が違う場合は継承させられないので
                    //必要なデータソースを追加してやる
                    //DataTable tableDummy=new DataTable();
                    //ReportDataSource subSource = new ReportDataSource(sourceName, tableDummy);
                }
            }
        }
    }

    #VS2010はDataSource関係のメニューの配置が変更されてて迷っちゃうなぁ

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク aquq 2012年7月29日 2:54
    2012年7月28日 10:11
  • ご返信ありがとうございます。

    いただいた回答をよく確認してやってみます。

    本当に、ありがとうございました。

    2012年7月29日 2:54
  • 色々と試していたところ、本件自己解決しました。

    データセットが追加されていると本エラーが出てしまうようです。

    解決により追加で疑問が湧いてきたので質問させて下さい。

    サブレポートにはデータセットが使えないのでしょうか?

    サブレポートに“一覧”を作成し、SQLから引っ張ってきたデーターを表示させようかと

    思っていたのですが、出来ないのでしょうか。

    度々の質問で恐れ入ります。

    aquqさま

    今、上記の問題とまったく同じ問題を抱えていますが、解決できたら、教えて頂けますでしょうか?

    よろしくお願いいたします。

    2012年8月10日 1:14
  • Y.TK様

    サブレポートにデーターセットが追加されているとこの現象が出てしまうようです。

    データーセットを消していただければ直るのではないかと。

    また、消しても直らない場合にはコードの中身にデーターセットを追加したコードがすべて消えきらずに残っているかもしれません。

    その場合は残ったコードの削除、また、新しいレポートを再作成したりすればできるのではないかと思います。

    サブレポートにデーターセットを追加したい場合にはgekka様の返信を見ていただけれるのがよいかと思います。

    私が教えれるほどの知識を持っていませんが、ご参考になればと思います。

    2012年8月13日 4:05
  • aquq様

    ご回答ありがとうございます。

    おかげさまで、レポートを作り直すことで解決しました。

    デバッグでSubreportProcessingイベントが起こるまでも行けなかったので、

    レポートの問題だと分かりますが、さすが原因が分かりませんでした。

    恐らくデザイナーからデータセットを消しても、レポートのXMLファイルに

    一部データセットの情報が残されてしまったと考えられます。

    アドバイス本当に助かりました、ありがとうございます。

    初めてmicrosoft reportsを利用するので、またご相談に乗らせて頂くかもしれませんが

    よろしくお願いします。



    2012年8月14日 13:30