このサンプルコードを動かすには
MyReport.rdl
が必要です。
ここにあります。
----------------
Imports System
Imports System.IO
Imports System.Xml
Imports fyiReporting.RdlViewer
Public Partial Class Form1
Private MyReportFileName As String = "C:\MyReport.rdl"
Private MyReportFileName2 As String = "C:\MyReport2.rdl"
Private InvoiceXml As String = "C:/invoice.xml"
Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)
With Me.rdlViewer1
.SourceFile = Nothing
.Update
.Refresh
End With
Call GenerateXML()
Call EditRDL()
With Me.rdlViewer1
.SourceFile = MyReportFileName2
.Update
.Refresh
End With
End Sub
Sub GenerateXML()
Dim MyDataSet As New System.Data.DataSet("invoice")
Dim MyDataTable As New System.Data.DataTable("row")
Dim MyDataColumn As New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.Int32")
.ColumnName = "id"
.AutoIncrement=True
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn = New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.Int32")
.ColumnName = "report_id"
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn = New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.String")
.ColumnName = "code"
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn = New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.String")
.ColumnName = "name"
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn = New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.String")
.ColumnName = "color"
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn = New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.Double")
.ColumnName = "quantity"
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn = New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.Double")
.ColumnName = "unit_price"
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn = New System.Data.DataColumn
With MyDataColumn
.DataType = System.Type.GetType("System.Double")
.ColumnName = "amount"
End With
MyDataTable.Columns.Add(MyDataColumn)
MyDataColumn.Dispose
MyDataSet.Tables.Add(MyDataTable)
Dim i As Integer
For i = 1 To 10
Dim MyDataRow As System.Data.DataRow
MyDataRow = MyDataTable.NewRow()
MyDataRow.Item("report_id") = i
MyDataRow.Item("code") = "001001"
MyDataRow.Item("name") = "バラ売り高級色鉛筆"
MyDataRow.Item("color") = Microsoft.VisualBasic.Format(i,"000")
MyDataRow.Item("quantity") = i*10
MyDataRow.Item("unit_price") = 1000
MyDataRow.Item("amount") = (i*10)*1000
MyDataTable.Rows.Add(MyDataRow)
Next
MyDataTable.AcceptChanges()
MyDataSet.AcceptChanges()
Dim fsWriteXml As New System.IO.FileStream(InvoiceXml, System.IO.FileMode.Create)
Dim xmlWriter As New System.Xml.XmlTextWriter(fsWriteXml, System.Text.Encoding.UTF8)
MyDataSet.WriteXml(xmlWriter)
xmlWriter.Close()
fsWriteXml.Close()
fsWriteXml.Dispose
MyDataTable.Dispose
MyDataSet.Dispose
End Sub
Function ConvertToUrl(ByVal WinAddress As String) As String
WinAddress = Replace(WinAddress, "\", "/")
WinAddress = Replace(WinAddress, ":", "|")
WinAddress = Replace(WinAddress, " ", "%20")
WinAddress = "file:///" + WinAddress
ConvertToUrl = WinAddress
End Function
Sub EditRDL()
' ***** RDL ファイルをXMLとして開く *****
Dim MyReportFileAsXml As XmlDocument = New XmlDocument()
MyReportFileAsXml.Load(MyReportFileName)
' ***** RDL ファイルをXMLとして開く *****
' ***** Namespace追加 *****
Dim NsMng As XmlNamespaceManager = New XmlNamespaceManager(MyReportFileAsXml.NameTable)
NsMng.AddNamespace("myns","http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition")
' ***** Namespace追加 *****
' ***** CommandTextを編集 *****
Dim CommandTextNode As XmlNode = MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:DataSets/myns:DataSet/myns:Query/myns:CommandText", NsMng)
Dim MyXmlUrl As String = ConvertToURL("C:\invoice.xml")
CommandTextNode.InnerText = "url=" & MyXmlUrl & "; RowsXPath=invoice/row;"
' ***** CommandTextを編集 *****
' ***** 既定のプリンタの用紙サイズを取得 *****
' ----- プリンタがインストールされていない場合、エラー処理必須 -----
Dim MyPrintDialog As New System.Windows.Forms.PrintDialog
Dim MyPrinterName As String = MyPrintDialog.PrinterSettings.PrinterName
Dim MyPrintDocument As New Printing.PrintDocument
MyPrintDocument.PrinterSettings.PrinterName = MyPrinterName
Dim MyPaperHeight As Double = MyPrintDocument.DefaultPageSettings.PaperSize.Height
Dim MyPaperWidth As Double = MyPrintDocument.DefaultPageSettings.PaperSize.Width
MyPaperHeight = Math.Round(MyPaperHeight*2.54/100,1)
MyPaperWidth = Math.Round(MyPaperWidth*2.54/100,1)
' ***** 既定のプリンタの用紙サイズを取得 *****
' ***** レポートのサイズ設定 *****
Dim PageHeightNode As XmlNode = _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:PageHeight", NsMng)
PageHeightNode.InnerText = Microsoft.VisualBasic.Format(MyPaperHeight,"0.0") & "cm"
Dim PageWidthNode As XmlNode = _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:PageWidth", NsMng)
PageWidthNode.InnerText= Microsoft.VisualBasic.Format(MyPaperWidth, "0.0") & "cm"
Dim ReportWidthNode As XmlNode = _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:Width", NsMng)
ReportWidthNode.InnerText=Microsoft.VisualBasic.Format((MyPaperWidth-2), "0.0") & "cm"
Dim TopMarginNode As XmlNode = _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:TopMargin", NsMng)
TopMarginNode.InnerText="1.0cm"
Dim LeftMarginNode As XmlNode = _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:LeftMargin", NsMng)
LeftMarginNode.InnerText="1.0cm"
Dim RightMarginNode As XmlNode = _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:RightMargin", NsMng)
RightMarginNode.InnerText="1.0cm"
Dim BottomMarginNode As XmlNode = _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:BottomMargin", NsMng)
BottomMarginNode.InnerText="1.0cm"
' ***** レポートのサイズ設定 *****
' ***** テキストボックスのテキストの置き換え *****
Dim TextBoxTitleNode As XmlNode=MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:PageHeader/myns:ReportItems/myns:Textbox[@Name='TextboxTitle']", NsMng)
Dim TextBoxTitleValueNode As XmlNode=TextBoxTitleNode.SelectSingleNode("myns:Value", NsMng)
TextBoxTitleValueNode.InnerText="商品明細"
Dim TextBoxCustomerNode As XmlNode=MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:PageHeader/myns:ReportItems/myns:Textbox[@Name='TextboxCustomer']", NsMng)
Dim TextBoxCustomerValueNode As XmlNode=TextBoxCustomerNode.SelectSingleNode("myns:Value", NsMng)
TextBoxCustomerValueNode.InnerText="株式会社ABCDEFG"
Dim TextBoxTelNode As XmlNode=MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:PageHeader/myns:ReportItems/myns:Textbox[@Name='TextboxTel']", NsMng)
Dim TextBoxTelValueNode As XmlNode=TextBoxTelNode.SelectSingleNode("myns:Value", NsMng)
TextBoxTelValueNode.InnerText="00-0000-0000"
Dim TextBoxTotalValueNode As XmlNode= _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:Body/myns:ReportItems/myns:Table[@Name='Table1']/myns:Footer/myns:TableRows/myns:TableRow/myns:TableCells/myns:TableCell/myns:ReportItems/myns:Textbox[@Name='TextboxTotal']/myns:Value", NsMng)
TextBoxTotalValueNode.InnerText="合計"
' ***** テキストボックスのテキストの置き換え *****
' ***** テキストボックスの式挿入 *****
Dim TextBoxTotalQtyValueNode As XmlNode= _
MyReportFileAsXml.SelectSingleNode("/myns:Report/myns:Body/myns:ReportItems/myns:Table[@Name='Table1']/myns:Footer/myns:TableRows/myns:TableRow/myns:TableCells/myns:TableCell/myns:ReportItems/myns:Textbox[@Name='TextboxQtyTotal']/myns:Value", NsMng)
TextBoxTotalQtyValueNode.InnerText="=sum(Convert.ToDouble(Fields!quantity.Value))"
' ***** テキストボックスの式挿入 *****
MyReportFileAsXml.Save(MyReportFileName2)
MyReportFileAsXml=Nothing
MyPrintDocument.Dispose
End Sub
End Class