Copy and paste the code from Code Illustration 17 below the GenerateFieldsList() end statement.
Writing out to a file that is saved on disk allows you to import the RDL into a report project in VS.NET and make modifications.
The Report Definition Language (RDL) is fully documented in the Reporting Services Books Online. It is an XML-based schema. Developers familiar with XML attributes/elements and HTML tags should find the RDL easy to understand. A sample of programmatically generating RDL, Walkthrough – Generating RDL Using the .NET Framework, is in the Reporting Services Books Online. See inline code comments for additional explanations.
Public Sub GenerateRdl(ByVal m_ReportName As String)
' Open a new RDL file stream for writing
Dim stream As FileStream
Dim i As Integer
Try
' If a file with the same name exists, delete it
If File.Exists(m_ReportName) Then
File.Delete(m_ReportName)
End If
' Open the file for writing
stream = File.OpenWrite(m_ReportName)
' Create an XML text writer to begin writing to the file
Dim writer As New XmlTextWriter(stream, Encoding.UTF8)
' Causes child elements to be indented
writer.Formatting = Formatting.Indented
' Report element
writer.WriteProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
writer.WriteStartElement("Report")
writer.WriteAttributeString("xmlns", Nothing, "http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefinition")
writer.WriteElementString("Width", "6in")
' DataSource element
writer.WriteStartElement("DataSources")
writer.WriteStartElement("DataSource")
writer.WriteAttributeString("Name", Nothing, dsName)
writer.WriteElementString("DataSourceReference", dsName)
writer.WriteEndElement() ' ConnectionProperties
writer.WriteEndElement() ' DataSource
' DataSet element
writer.WriteStartElement("DataSets")
writer.WriteStartElement("DataSet")
writer.WriteAttributeString("Name", Nothing, "DataSet1")
' Query element
writer.WriteStartElement("Query")
writer.WriteElementString("DataSourceName", dsName)
writer.WriteElementString("CommandType", "Text")
writer.WriteElementString("CommandText", m_query)
writer.WriteElementString("Timeout", "30")
writer.WriteEndElement() ' Query
' Fields elements
writer.WriteStartElement("Fields")
' Loop through the fields to add field names
For i = 0 To m_Fields.Count - 1
writer.WriteStartElement("Field")
writer.WriteAttributeString("Name", Nothing, m_Fields(i))
writer.WriteElementString("DataField", Nothing, m_Fields(i))
writer.WriteEndElement() ' Field
Next 'fieldName
' End previous elements
writer.WriteEndElement() ' Fields
writer.WriteEndElement() ' DataSet
writer.WriteEndElement() ' DataSets
' Body element
writer.WriteStartElement("Body")
writer.WriteElementString("Height", "5in")
' ReportItems element
writer.WriteStartElement("ReportItems")
'If report title was specified, create the title text box
If m_ReportTitle <> "" Then
writer.WriteStartElement("Textbox")
writer.WriteAttributeString("Name", Nothing, "Title1")
writer.WriteStartElement("Style")
writer.WriteElementString("FontFamily", "Tahoma")
writer.WriteElementString("FontSize", "18pt")
writer.WriteElementString("Color", "Navy")
writer.WriteElementString("FontWeight", "700")
writer.WriteElementString("TextAlign", "Center")
writer.WriteEndElement() 'style
writer.WriteElementString("Top", "0.125in")
writer.WriteElementString("Height", "0.375in")
writer.WriteElementString("Width", "6.5in")
writer.WriteElementString("CanGrow", "true")
writer.WriteElementString("Value", m_ReportTitle)
writer.WriteElementString("Left", "0.125in")
writer.WriteEndElement() 'Textbox
' Table element
writer.WriteStartElement("Table")
writer.WriteAttributeString("Name", Nothing, "Table1")
writer.WriteElementString("DataSetName", "DataSet1")
writer.WriteElementString("Top", ".5in")
writer.WriteElementString("Left", ".5in")
writer.WriteElementString("Height", ".25in")
Else
' Table element
writer.WriteStartElement("Table")
writer.WriteAttributeString("Name", Nothing, "Table1")
writer.WriteElementString("DataSetName", "DataSet1")
writer.WriteElementString("Top", ".125in")
writer.WriteElementString("Left", ".125in")
writer.WriteElementString("Height", ".25in")
End If
'determine the width of the table by adding the widths of each column together
Dim width As Integer = 0
For i = 0 To m_Fields.Count - 1
Select Case m_Type(i)
Case "Decimal", "Int16", "Int32", "Int64", "Boolean"
width = width + 0.5
Case "DateTime"
width = width + 0.75
Case Else
width = width + 1.5
End Select
Next
writer.WriteElementString("Width", width & "in")
' Table Columns
writer.WriteStartElement("TableColumns")
For i = 0 To m_Fields.Count - 1
writer.WriteStartElement("TableColumn")
Select Case m_Type(i)
Case "Decimal", "Int16", "Int32", "Int64", "Boolean"
writer.WriteElementString("Width", ".5in")
Case "DateTime"
writer.WriteElementString("Width", ".75in")
Case Else
writer.WriteElementString("Width", "1.5in")
End Select
writer.WriteEndElement() ' TableColumn
Next 'fieldName
writer.WriteEndElement() ' TableColumns
' Header Row
writer.WriteStartElement("Header")
writer.WriteStartElement("TableRows")
writer.WriteStartElement("TableRow")
writer.WriteElementString("Height", ".25in")
writer.WriteStartElement("TableCells")
For i = 0 To m_Fields.Count - 1
writer.WriteStartElement("TableCell")
writer.WriteStartElement("ReportItems")
' Textbox
writer.WriteStartElement("Textbox")
writer.WriteAttributeString("Name", Nothing, "Header" + m_Fields(i))
'Set the background color and other header styles
writer.WriteStartElement("Style")
writer.WriteElementString("BackgroundColor", "DarkBlue")
writer.WriteElementString("Color", "White")
' Align cell according to datatype
Select Case m_Type(i)
Case "Decimal", "Int16", "Int32", "Int64"
writer.WriteElementString("PaddingRight", "3pt")
writer.WriteElementString("TextAlign", "Right")
Case Else
writer.WriteElementString("TextAlign", "Left")
End Select
writer.WriteElementString("FontWeight", "700")
writer.WriteEndElement() ' End Style
writer.WriteElementString("Top", "0in")
writer.WriteElementString("Left", "0in")
writer.WriteElementString("Height", ".5in")
Select Case m_Type(i)
Case "Int16", "Int32", "Int64", "Boolean", "Decimal"
writer.WriteElementString("Width", ".5in")
Case "DateTime"
writer.WriteElementString("Width", ".75in")
Case Else
writer.WriteElementString("Width", "1.5in")
writer.WriteElementString("CanGrow", "true")
writer.WriteElementString("CanShrink", "true")
End Select
writer.WriteElementString("Value", m_Fields(i))
writer.WriteEndElement() ' End Textbox
writer.WriteEndElement() ' End ReportItems
writer.WriteEndElement() ' EndTableCell
Next 'fieldName
writer.WriteEndElement() ' TableCells
writer.WriteEndElement() ' TableRow
writer.WriteEndElement() ' TableRows
writer.WriteElementString("RepeatOnNewPage", "true")
writer.WriteEndElement() ' Header
'writer.WriteElementString("KeepTogether", "true")
' Details Row
writer.WriteStartElement("Details")
writer.WriteStartElement("TableRows")
writer.WriteStartElement("TableRow")
writer.WriteElementString("Height", ".25in")
writer.WriteStartElement("TableCells")
' Loop through the field and type arrays to set formatting & styles
For i = 0 To m_Fields.Count - 1
writer.WriteStartElement("TableCell")
writer.WriteStartElement("ReportItems")
' Textbox
writer.WriteStartElement("Textbox")
writer.WriteAttributeString("Name", Nothing, m_Fields(i))
writer.WriteStartElement("Style")
writer.WriteElementString("PaddingLeft", "2pt")
' format and align cell according to datatype
Select Case m_Type(i)
Case "DateTime"
writer.WriteElementString("TextAlign", "Left")
writer.WriteElementString("Format", "MM/dd/yyyy")
Case "Decimal"
writer.WriteElementString("PaddingRight", "3pt")
writer.WriteElementString("TextAlign", "Right")
writer.WriteElementString("Format", "F")
Case "Int16", "Int32", "Int64"
writer.WriteElementString("PaddingRight", "3pt")
writer.WriteElementString("TextAlign", "Right")
Case Else
writer.WriteElementString("TextAlign", "Left")
End Select
writer.WriteEndElement() ' Style
writer.WriteElementString("Top", "0in")
writer.WriteElementString("Left", "0in")
writer.WriteElementString("Height", ".5in")
' Create cell width dependent on datatype
Select Case m_Type(i)
Case "Int16", "Int32", "Boolean", "Decimal"
writer.WriteElementString("Width", ".5in")
Case "DateTime"
writer.WriteElementString("Width", ".75in")
Case Else
writer.WriteElementString("Width", "1.5in")
writer.WriteElementString("CanGrow", "true")
writer.WriteElementString("CanShrink", "true")
End Select
writer.WriteElementString("Value", "=Fields!" + m_Fields(i) + ".Value")
'writer.WriteElementString("HideDuplicates", "DataSet1")
writer.WriteEndElement() ' Textbox
writer.WriteEndElement() ' ReportItems
writer.WriteEndElement() ' TableCell
Next 'fieldName
' End Details element and children
writer.WriteEndElement() ' TableCells
writer.WriteEndElement() ' TableRow
writer.WriteEndElement() ' TableRows
writer.WriteEndElement() ' Details
' End table element and end report definition file
writer.WriteEndElement() ' Table
writer.WriteEndElement() ' ReportItems
writer.WriteEndElement() ' Body
' Set overall report margins
writer.WriteElementString("TopMargin", "0.25in")
writer.WriteElementString("BottomMargin", "0.25in")
writer.WriteElementString("LeftMargin", "0.25in")
writer.WriteElementString("RightMargin", "0.25in")
' End the report
writer.WriteEndElement() ' Report
' Flush the writer
writer.Flush()
Catch ex As Exception
HandleException(ex)
Finally
'Close the stream
stream.Close()
End Try
End Sub 'GenerateRdl
Code Illustration 17