Imports System.Xml
Imports DTools.SystemIntegrator.Reporting
Imports System.Collections.Generic
Private ds As DataDynamics.ActiveReports.Datasources.XMLDatasource = Nothing
Private doc As XmlDocument
Private xmlRoot As XmlElement
Private xmlns As XmlNamespaceManager = Nothing
Sub ActiveReport_ReportStart
try
SortItemsByZone()
catch
'Ignore
End try
End Sub
Sub SortItemsByZone()
ds = rpt.DataSource
doc = ds.Document
xmlRoot = doc.DocumentElement
xmlns = ReportingNamespaceUtility.ReturnXMLNamespaceManager(doc.NameTable)
Dim xmlItemsRootNode As XmlNode = xmlRoot.SelectSingleNode("//dtr:Items",xmlns)
Dim xmlNodeList As XmlNodeList = xmlRoot.SelectNodes("//dtr:Items/dtr:Item",xmlns)
Dim zones As New List(Of String)
Dim zoneDict As New Dictionary(Of String, List(Of XmlNode))
Dim keys As New List(Of String)
Dim zoneNameToCombine As String = "Screens"
Dim zoneOrderToCombine As String = GetZoneOrder(zoneNameToCombine)
Dim zoneOrderToRemove As String = GetZoneOrder("Video")
For Each node As XmlNode In xmlNodeList
Dim zone As String = node.SelectSingleNode("dtr:ZoneOrder",xmlns).InnerText
If(zone = zoneOrderToRemove) Then
node.SelectSingleNode("dtr:ZoneOrder",xmlns).InnerText = zoneOrderToCombine
node.SelectSingleNode("dtr:Zone",xmlns).InnerText = zoneNameToCombine
zone = zoneOrderToCombine
End If
If(zoneDict.ContainsKey(zone)) Then
Dim xmlNodes As List(Of XmlNode) = zoneDict(zone)
xmlNodes.Add(node)
Else
keys.Add(zone)
Dim xmlNodes As New List(Of XmlNode)
xmlNodes.Add(node)
zoneDict.Add(zone, xmlNodes)
End If
Next
keys.Sort()
xmlItemsRootNode.RemoveAll()
For Each key As String in keys
Dim xmlNodes As List(Of XmlNode) = zoneDict(key)
For Each node2 As XmlNode in xmlNodes
xmlItemsRootNode.AppendChild(node2)
Next
Next
ds.Document.Save(ds.FileURL)
Dim xmlDS As New DataDynamics.ActiveReports.DataSources.XMLDataSource(ds.FileURL, ds.RecordsetPattern)
rpt.DataSource = xmlDS
xmlDS.LoadXML(xmlDS.Document.OuterXml)
'reset the Xml Document
ReportUtilities.SetXMLDocument(xmlDS.Document)
End Sub
Function GetZoneOrder( zoneName As String) As String
Dim zoneOrder As String = String.Empty
Dim zoneNode As XmlNode = xmlRoot.SelectSingleNode("//dtr:Project/dtp:Zones/dtp:Zone[dtp:Name='" + zoneName +"']",xmlns)
If Not zoneNode Is Nothing Then
zoneOrder = zoneNode.SelectSingleNode("dtp:Order",xmlns).InnerText
End If
Return zoneOrder
End Function |