サブレポート(subreport)


VB TIPS AND SAMLPE CrystalReportの基本

サブレポート(subreport)

サブレポートとは、2つのデータテーブルを1つのクリスタルレポートの画面に、関係性を持たせて表示する機能です。
たぶん。
で、そのやり方ですが、サンプルとして
都道府県のデータテーブルと、都道府県、市のテーブルを1つの画面に表示してみます。
まずは、都道府県のデータを表示してみます。
これは、今までの記事を読んでいただければ簡単に出来るはず。
通常のレポート
次に、新規追加で、サブレポートの元(だみーでしかない)クリスタルレポートrptファイルをプロジェクトに追加します。
自分はいつもこのやり方なのですが、他の方法も今後検討しないと・・・・
ここでは「SubReport.rpt」です。
追加したレポートを、メインのレポートに追加します。
サブレポートの挿入
ウィザードが開くので、追加した「SubReport.rpt」を選択。 追加したレポートを選択
で、そのサブレポートの編集ですが、
独立した「SubReport.rpt」ではなく、メインレポートの中にある「SubReport.rpt」
を編集する必要があります。
サブレポートの編集
mainレポートの中
フィールドを追加し終わったら、
メインのデータセットとリンクさせます。
リンクの編集
都道府県=PREFでリンクさせます。
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


後は、実行。 サブレポートの完成です。
サブレポートの完成