データソースとしてXMLファイルを利用する
ActiveReportsでは、RDB(リレーショナルデータベース)やExcelで使われているような「表形式」のデータだけでなく、XMLファイルをデータソースとしてそのまま利用することができます。
データソースにXMLファイルを設定するには、これまでと同様、Detailセクションに表示されているアイコンをクリックして「レポートデータソース」ダイアログを設定します。「レポートデータソース」ダイアログでは「XML」タブを選択して、ファイルのURLとレコードセットパターンを指定します。レコードセットパターンには、基準となるノードのXPathを設定します。今回はstudentタグの部分が繰り返し項目になるので、レコードセットパターンに「//student」と入力します。

レポートデータソースにXMLファイルとレコードセットパターンを設定すると、レポートエクスプローラの「フィールド」にXMLのデータ構造が展開され、ツリー形式で表示されます。黄色の矢印部分がレコードセットパターンとして設定した箇所です。

レポートエクスプローラに表示されている「name」や「@id」などのノードをレポートデザイナにドラッグ&ドロップすると、値をバインドさせたTextBoxコントロールを配置できます。ドロップされたTextBoxコントロールにはコントロール名やプロパティが自動的に設定され、DataFieldプロパティにはバインド先のXPathが設定されます。ここではDetailセクションの「クラス」「受講科目」「氏名」のTextboxコントロールをドラッグ&ドロップで貼り付けます。
また、他のデータソースから参照したいので生徒のIDもTextBoxとして貼り付けていますが、帳票に表示させる必要はないのでVisibleプロパティをfalseに設定し、非表示の項目とします。このような非表示項目は他の表示項目と見た目が同じでは紛らわしいため、背景色にあえて鮮やかな色を使い、区別できるようにしています。

基準よりも上位のノードのコントロールを張り付けると、DataFieldプロパティには「../@id」のように相対パス形式でXPathが指定されます。今回はgradeHeaderセクションの「学年」の部分に上位ノードのコントロールを使用しています。
XMLファイルを動的にデータソースとして指定する
レポートデータソースにXMLファイルを指定すると、レポートエクスプローラに表示されるノードをドラッグ&ドロップしてコントロールを配置できるため大変便利なのですが、ファイルの配置場所やレコードセットパターンがアプリケーション実行時の条件によって変更される場合、事前に固定の値を与えることができません。
アプリケーション実行時にXML形式のデータソースを動的に設定したい場合は、ActiveReports帳票を実行するアプリケーション側でDataDynamics.ActiveReports.DataSources.XMLDataSource
のインスタンスを生成します。この場合もレポートデザイナでデータソースを設定するのと同じように、FileURLプロパティにはXMLファイルのパスを、RecordSetPatternプロパティにはレコードセットパターンをそれぞれ設定します。以下のサンプルコードでは、ボタンを押下するとビューワにXMLデータソースをバインドした帳票が表示されます。
private void btnExecute_Click(object sender, EventArgs e) { NewActiveReport1 rpt = new NewActiveReport1(); DataDynamics.ActiveReports.DataSources.XMLDataSource xmlds = new DataDynamics.ActiveReports.DataSources.XMLDataSource(); try { // XML文書のファイル名を設定します。 xmlds.FileURL = @"C:\ActiveReports3\Sample_05\2007Student.xml"; //データセットパターンを設定します。 xmlds.RecordsetPattern = "//student"; if (xmlds.Count == 0) { rpt.Dispose(); Console.WriteLine("NoDataError"); return; } rpt.DataSource = xmlds; rpt.Show(); } catch (DataDynamics.ActiveReports.ReportDataException rde) { Console.WriteLine(rde.Message); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click Dim report As New NewActiveReport1 Dim xmlds As _ New DataDynamics.ActiveReports.DataSources.XMLDataSource Try xmlds.FileURL = _ "C:\\ActiveReports3\\Sample_05\\2007Student.xml" xmlds.RecordsetPattern = "//student" If xmlds.Count = 0 Then report.Dispose() Console.WriteLine("NoDataError") Return End If report.DataSource = xmlds report.Show() Catch rdex As DataDynamics.ActiveReports.ReportDataException Console.WriteLine(rdex.Message) Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
XMLDataSourceを使用するときにRecordSetPatternプロパティを設定していないと、ReportDataExceptionが発生し「FileURLが設定されていないか、空です。」というエラーメッセージが表示されます。また、XMLファイルの中身が空であった場合もエラーになります。しかし、設定してあるRecordsetPatternが「間違っていた場合」はエラーが発生せず、データのない(白紙の)レポートが作成されてしまいます。
この問題を回避するには、上記サンプルコードのようにXMLDataSourceのCountプロパティでデータ件数を確認するか、ActiveReport側のNoDataイベントにコードを記述して処理を停止させる必要があります。
レポートデザイナでXMLを設定した場合は、設定後すぐにファイルの中身が確認されるので、指定したレコードセットパターンが間違っているとエラーがポップアップ表示されます。また、レポートエクスプローラーのフィールドにも赤字でエラー表示されます。