サブレポート(subreport)
サブレポートとは、2つのデータテーブルを1つのクリスタルレポートの画面に、関係性を持たせて表示する機能です。たぶん。
で、そのやり方ですが、サンプルとして
都道府県のデータテーブルと、都道府県、市のテーブルを1つの画面に表示してみます。
まずは、都道府県のデータを表示してみます。
これは、今までの記事を読んでいただければ簡単に出来るはず。
次に、新規追加で、サブレポートの元(だみーでしかない)クリスタルレポートrptファイルをプロジェクトに追加します。
自分はいつもこのやり方なのですが、他の方法も今後検討しないと・・・・
ここでは「SubReport.rpt」です。
追加したレポートを、メインのレポートに追加します。
ウィザードが開くので、追加した「SubReport.rpt」を選択。
で、そのサブレポートの編集ですが、
独立した「SubReport.rpt」ではなく、メインレポートの中にある「SubReport.rpt」
を編集する必要があります。
フィールドを追加し終わったら、
メインのデータセットとリンクさせます。
都道府県=PREFでリンクさせます。
で、ソースをゴリゴリと書いておきます。
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 'MYSQLからデータを読み出す Dim cnstr As String cnstr = "Database=test;Data Source=centos5vm;User Id=vbuser;Password=sa" Dim con As New MySql.Data.MySqlClient.MySqlConnection(cnstr) Try con.Open() Dim sql As String = "select DISTINCT PREF,CITY from KEN_ALL" Dim Cmd As New MySqlCommand(sql, con) Dim myAd As New MySqlDataAdapter 'Dim dt As New DataTable("KEN_ALL") Dim dts As New DataSet myAd.SelectCommand = Cmd 'データテーブルに取得 myAd.Fill(dtSub) 'xsdファイルを保存します。 'DB ---→ xsd ----→ クリスタルレポート 'というデータの流れになります 'dt.WriteXmlSchema("KEN_ALL.xsd") sql = "SELECT DISTINCT pref FROM `KEN_ALL" Cmd.CommandText = sql myAd.SelectCommand = Cmd 'データテーブルに取得 myAd.Fill(dt) 'dt.WriteXmlSchema("PREF.xsd") 'プロジェクトに追加したクリスタルレポートオブジェクトを参照 Dim rpt As New MainReport 'Debug.Print(dtSub.Rows.Count) 'サブレポートにデータテーブルを渡す rpt.OpenSubreport("SubReport.rpt") rpt.Subreports(0).SetDataSource(dtSub) 'デーソースにデータセットを rpt.SetDataSource(dt) 'ビュワーにレポートをセット CrystalReportViewer1.ReportSource = rpt Catch ex As Exception Debug.Print(ex.Message.ToString) MessageBox.Show(ex.Message.ToString) End Try con.Clone() con.Dispose() MessageBox.Show("終了") End Sub |
後は、実行。 サブレポートの完成です。