#眉標=SQL Server #副標= 如何擴展Reporting Services的深度 #大標=SQL Server Reporting Service的開發作業 #作者=文/彭靖灝 #引言= 在這篇文章中,作者把討論的重心放在Reporting Services的程式設計作業上。 ============================= [程式1] Public Class Management Dim rs As New localhost.ReportingService Public Function ListReportNames() As String() Dim ReportNames As String() ' 取得根資料夾下的項目清單 Dim TempItems As localhost.CatalogItem() Dim i, iUBound As Integer TempItems = rs.ListChildren("/", False) ' 建立報表名稱清單 For i = 0 To TempItems.GetUpperBound(0) If TempItems(i).Type = localhost.ItemTypeEnum.Report Then ReDim Preserve ReportNames(iUBound) ReportNames(iubound) = TempItems(i).Name iUBound += 1 End If Next Return ReportNames End Function Public Function GetProperties(ByVal Path As String, ByVal Properties() As localhost.Property) _    As localhost.Property() Return rs.GetProperties(Path, Properties) End Function Public Sub New() ' 指定登入資訊 rs.Credentials = System.Net.CredentialCache.DefaultCredentials End Sub End Class ===================================== ===========<box>================= [程式2 包裝Web services的Manage類別] Public Class Management Dim rs As New localhost.ReportingService Public Function ListReportNames() As String() Dim ReportNames As String() ' 取得根資料夾下的項目清單 Dim TempItems As localhost.CatalogItem() Dim i, iUBound As Integer TempItems = rs.ListChildren("/", False) ' 建立報表名稱清單 For i = 0 To TempItems.GetUpperBound(0) If TempItems(i).Type = localhost.ItemTypeEnum.Report Then ReDim Preserve ReportNames(iUBound) ReportNames(iubound) = TempItems(i).Name iUBound += 1 End If Next Return ReportNames End Function Public Function GetProperties(ByVal Path As String, ByVal Properties() As localhost.Property) _    As localhost.Property() Return rs.GetProperties(Path, Properties) End Function Public Sub New() ' 指定登入資訊 rs.Credentials = System.Net.CredentialCache.DefaultCredentials End Sub End Class    ================================ =========<box>======================= [程式3] Private Sub btnListReports_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _   Handles btnListReports.Click Dim ReportManager As New Management Dim objCatalogItem As localhost.CatalogItem ' 清空清單方塊 lstReports.Items.Clear() ' 取得報表名稱並加入清單 Dim ReportNames As String() = ReportManager.ListReportNames() Dim i As Integer For i = 0 To ReportNames.GetUpperBound(0) lstReports.Items.Add(ReportNames(i)) Next End Sub ===================== ======================= [程式5] Private Sub lstReports_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As _   System.EventArgs) Handles lstReports.SelectedIndexChanged Dim ReportManager As New Management Dim strProperties As String Dim strSelectedReportName As String = lstReports.SelectedItem.ToString ' 傳入Nothing,代表取得所有的屬性值 Dim Properties As localhost.Property() Properties = ReportManager.GetProperties("/" & strSelectedReportName, Nothing) ' 取得報表屬性並填入文字方塊 Dim prop As localhost.Property For Each prop In Properties strProperties &= "[" & prop.Name & "] : " & prop.Value & ControlChars.NewLine Next txtProperties.Text = strProperties End Sub ============================== ===========================    [程式4 MainForm主表單的程式] Private Sub btnListReports_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _   Handles btnListReports.Click Dim ReportManager As New Management Dim objCatalogItem As localhost.CatalogItem ' 清空清單方塊 lstReports.Items.Clear() ' 取得報表名稱並加入清單 Dim ReportNames As String() = ReportManager.ListReportNames() Dim i As Integer For i = 0 To ReportNames.GetUpperBound(0) lstReports.Items.Add(ReportNames(i)) Next End Sub ===================== ======================= [程式5] Private Sub lstReports_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As _   System.EventArgs) Handles lstReports.SelectedIndexChanged Dim ReportManager As New Management Dim strProperties As String Dim strSelectedReportName As String = lstReports.SelectedItem.ToString ' 傳入Nothing,代表取得所有的屬性值 Dim Properties As localhost.Property() Properties = ReportManager.GetProperties("/" & strSelectedReportName, Nothing) ' 取得報表屬性並填入文字方塊 Dim prop As localhost.Property For Each prop In Properties strProperties &= "[" & prop.Name & "] : " & prop.Value & ControlChars.NewLine Next txtProperties.Text = strProperties End Sub ========================= ==========================    [程式 6 UrlAccess類別] Public Class UrlAccess Private m_ReportName As String ' 報表名稱 Private m_Path As String ' 伺服器及報表所在資料夾完整路徑 Private m_Url As String ' 完整的命令路徑 Property ReportName() As String Get Return m_ReportName End Get Set(ByVal Value As String) m_ReportName = Value End Set End Property Property Path() As String Get Return m_Path End Get Set(ByVal Value As String) m_Path = Value End Set End Property Property Url() As String Get Return m_Url End Get Set(ByVal Value As String) m_Url = Value End Set End Property Public Sub New() ' Standard constructor End Sub Public Sub New(ByVal Path As String, ByVal ReportName As String) Me.ReportName = ReportName Me.Path = Path BuildUrlString() End Sub Public Sub BuildUrlString() Me.m_Url = Path & ReportName & "&rs:Command=Render" End Sub End Class ================================ ============================    [程式 7 ReportViewerForm表單中的程式碼] Private Const c_ServerPath = "http://localhost/reportserver" Public Sub ShowReport() Dim UrlCommand As New UrlAccess(c_ServerPath & "?/", lblReportName.Text) ieReportViewer.Navigate2(UrlCommand.Url) End Sub ============================= ============================    [程式 8 lstReports的DoubleClick事件程序。] Private Sub lstReports_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles lstReports.DoubleClick Dim frmReportViewer As New ReportViewerForm frmReportViewer.lblReportName.Text = lstReports.SelectedItem.ToString frmReportViewer.ShowReport() frmReportViewer.ShowDialog() End Sub ===========================