Imports C1.Win.C1TrueDBGrid Imports System Imports System.Data Imports System.Data.SqlTypes Imports System.Data.SqlClient Namespace TKB.VV.Vertrag Public Class clsVertragsuebersicht_Strukturen Dim TreeData As New DataTable Public fnt_Strikeout As Font Public fnt_normal As Font Dim SelectionType As String ''' ''' Treedaten auselsen ''' ''' ''' Neu: Nur noc Selectiontype "Vertragspartner" ''' 1: Nur aktive Partner ''' 0: Alle partner ''' 1: Suche nach Vertragspartner ''' 2: Suche nach Vertragselement ''' ''' ''' Public Function Get_Struktur(ByRef tree As TreeView, Optional ByVal SelectionType As Integer = 0, Optional ByVal Aktiv As Boolean = True, Optional ByVal suchtype As Integer = 0, Optional ByVal suchstring As String = "", Optional ByVal partnernr As Integer = 0) Me.TreeData = Get_Treedata(SelectionType, Aktiv, suchtype, suchstring, partnernr) Select Case SelectionType Case 0 Me.SelectionType = "Vertragspartner" Case 1 Me.SelectionType = "Vertragstyp" Case Else Me.SelectionType = "Unknown" End Select Load_Tree(tree) End Function ''' ''' Auslesen der Partner für die Vertragsuebersicht ''' ''' Vertragspartner oder Vertragstyp ''' Aktiv=0 ''' ''' Private Function Get_Treedata(ByVal Selectiontype As Integer, ByVal aktiv As Boolean, Optional ByVal suchtype As Integer = 0, Optional ByVal suchstring As String = "", Optional ByVal Partnernr As Integer = 0) As DataTable Dim scmCmdToExecute As SqlCommand = New SqlCommand() Dim dtToReturn As DataTable = New DataTable() Dim sdaAdapter As SqlDataAdapter = New SqlDataAdapter(scmCmdToExecute) scmCmdToExecute.CommandText = "dbo.sp_vertragsuebersicht_get_TreeRoot" scmCmdToExecute.CommandType = CommandType.StoredProcedure scmCmdToExecute.Connection = conn.scoDBConnection Try scmCmdToExecute.Parameters.Add(New SqlParameter("@mitarbeiternr", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Globals.clsmitarbeiter.iMitarbeiternr.Value)) scmCmdToExecute.Parameters.Add(New SqlParameter("@SelectionType", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Selectiontype)) scmCmdToExecute.Parameters.Add(New SqlParameter("@Aktiv", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, aktiv)) scmCmdToExecute.Parameters.Add(New SqlParameter("@Suchtype", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, suchtype)) scmCmdToExecute.Parameters.Add(New SqlParameter("@SuchString", SqlDbType.VarChar, 255, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, suchstring)) scmCmdToExecute.Parameters.Add(New SqlParameter("@partnernr", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, partnernr)) sdaAdapter.Fill(dtToReturn) Return dtToReturn Catch ex As Exception Throw New Exception("clsVertragsuebersicht::" & scmCmdToExecute.CommandText & "::Error occured." & ex.Message, ex) Finally scmCmdToExecute.Dispose() sdaAdapter.Dispose() End Try End Function ''' ''' Treeview laden und je eintrag einen "Dummy-Eintrag" erstellen ''' ''' ''' ''' Private Function Load_Tree(ByRef Tree As TreeView) fnt_Strikeout = New System.Drawing.Font(Tree.Font.FontFamily, Tree.Font.Size, FontStyle.Strikeout) fnt_normal = New System.Drawing.Font(Tree.Font.FontFamily, Tree.Font.Size, FontStyle.Regular) Tree.Enabled = False Tree.Nodes.Clear() For Each dr As DataRow In Me.TreeData.Rows Dim tn As New TreeNode tn.Text = dr.Item("Description") tn.Tag = New Treenode_Descriptor(Me.SelectionType, dr.Item("KeyValue"), dr.Item("KeyValue"), dr.Item("KeyValue")) Select Case Me.SelectionType Case "Vertragspartner" If dr.Item("aktiv") = True Then tn.ImageIndex = 0 tn.SelectedImageIndex = 0 tn.StateImageIndex = 0 Else tn.ImageIndex = 6 tn.SelectedImageIndex = 6 tn.StateImageIndex = 6 End If Case "Vertragstyp" tn.ImageIndex = 1 tn.SelectedImageIndex = 1 tn.StateImageIndex = 1 End Select Tree.Nodes.Add(tn) Dim subtn As New TreeNode subtn.Tag = New Treenode_Descriptor("", -99, 0, 0) tn.Nodes.Add(subtn) Next Tree.Enabled = True End Function Dim xVertragspartnernr As Integer ''' ''' Datenstruktur für den Tree lasen ''' ''' Parent-Node ''' ''' Abhängig vom Type wird die Struktur nach Vertragspartner oder Vertragstyp aufgebaut Public Function Load_SubStruktur(ByRef Node As TreeNode, ByVal Details As Integer, ByVal Suchstring As String) Dim x As Treenode_Descriptor = Node.Tag Dim substrukturdata As New DataTable Select Case x.Type Case "Vertragspartner" Me.xVertragspartnernr = x.Vertragspartnernr substrukturdata = Get_SubStruktur(0, x.Vertragspartnernr, Details, suchstring) Case "Vertragstyp" substrukturdata = Get_SubStruktur(x.Vertragstypnr, 0, Details, suchstring) End Select Update_Node(substrukturdata, Node, x.Type, Details) End Function ''' ''' Parent-Beziehung herstellen und Struktur abfüllen ''' ''' ''' ''' Private Sub Update_Node(ByVal oSourceData As DataTable, ByRef node As TreeNode, ByVal type As String, ByVal Details As Integer) If Not (oSourceData Is Nothing) Then Dim oView As DataView = oSourceData.DefaultView Dim oTable As DataTable = oView.Table Dim oDS As DataSet = New DataSet() oDS.Tables.Add(oTable.Copy()) If oDS.Relations.Contains("SelfRefenceRelation") = False Then oDS.Relations.Add("SelfRefenceRelation", _ oDS.Tables(0).Columns("Vertragselementnr"), _ oDS.Tables(0).Columns("Parentid")) End If oTable.Dispose() oTable = Nothing LoadNode(oDS, node, type, Details) oDS.Dispose() oDS = Nothing End If End Sub ''' ''' Tree aufbauen ''' ''' Input-Dataset ''' Aktueller Node ''' Type Vertragspartner oder Vertragstyp ''' Private Sub LoadNode(ByVal oDS As DataSet, ByRef oNode As TreeNode, ByVal type As String, ByVal Details As Integer) 'Dim oTreeView As TreeView = New TreeView() Dim oDataRow As DataRow For Each oDataRow In oDS.Tables(0).Rows If Not oDataRow.IsNull("Parentid") Then If oDataRow.Item("Parentid") = 0 Then 'If oDataRow.IsNull("Parentid") Then Dim oNode1 As New TreeNode() oNode1.Text = oDataRow("Bezeichnung").ToString() Select Case type Case "Vertragspartner" oNode1.Tag = New Treenode_Descriptor("Vertragstyp", oDataRow("vertragselementnr").ToString, xVertragspartnernr, oDataRow("vertragstypnr").ToString) If oDataRow("Aktiv") = 0 Then oNode1.ImageIndex = 7 oNode1.SelectedImageIndex = 7 oNode1.StateImageIndex = 7 oNode1.NodeFont = Me.fnt_Strikeout Else oNode1.NodeFont = Me.fnt_normal oNode1.ImageIndex = 1 oNode1.SelectedImageIndex = 1 oNode1.StateImageIndex = 1 End If Case "Vertragstyp" If oDataRow("aktiv") = True Then oNode1.Tag = New Treenode_Descriptor("Vertragspartner", oDataRow("vertragselementnr").ToString, xVertragspartnernr, oDataRow("vertragstypnr").ToString) oNode1.ImageIndex = 0 oNode1.SelectedImageIndex = 0 oNode1.StateImageIndex = 0 Else oNode1.Tag = New Treenode_Descriptor("Vertragspartner", oDataRow("vertragselementnr").ToString, xVertragspartnernr, oDataRow("vertragstypnr").ToString) oNode1.ImageIndex = 4 oNode1.SelectedImageIndex = 4 oNode1.StateImageIndex = 4 End If End Select oNode.Nodes.Add(oNode1) RecursivelyLoadNode(oDataRow, oNode1, type, Details) End If End If Next oDataRow oDS.Dispose() oDS = Nothing End Sub ''' ''' Child-Nodes hinzufügen ''' ''' ''' ''' Private Sub RecursivelyLoadNode(ByVal oDataRow As DataRow, ByRef oNode As TreeNode, ByVal type As String, ByVal Details As Integer) Dim oChildRow As DataRow For Each oChildRow In oDataRow.GetChildRows("SelfRefenceRelation") Dim oChildNode As New TreeNode() oChildNode.Text = oChildRow("Bezeichnung").ToString() oChildNode.Tag = New Treenode_Descriptor("Vertragselement", oChildRow("Vertragselementnr").ToString(), xVertragspartnernr, oDataRow("vertragstypnr").ToString) If oChildRow("Aktiv") = 0 Then oChildNode.ImageIndex = 8 oChildNode.SelectedImageIndex = 8 oChildNode.StateImageIndex = 8 oChildNode.NodeFont = Me.fnt_Strikeout Else oChildNode.ImageIndex = 2 oChildNode.SelectedImageIndex = 2 oChildNode.StateImageIndex = 2 oChildNode.NodeFont = Me.fnt_normal End If oNode.Nodes.Add(oChildNode) RecursivelyLoadNode(oChildRow, oChildNode, type, Details) Next oChildRow End Sub ''' ''' Laden der Substruktur ''' ''' Nummer des aktuellen Vertragspartners ''' ''' Private Function Get_SubStruktur(ByVal vertragstypnr As Integer, ByVal Vertragspartnernr As Integer, ByVal Details_anzeigen As Integer, ByVal Suchstring As String) As DataTable Dim scmCmdToExecute As SqlCommand = New SqlCommand() Dim dtToReturn As DataTable = New DataTable() Dim sdaAdapter As SqlDataAdapter = New SqlDataAdapter(scmCmdToExecute) scmCmdToExecute.CommandText = "dbo.sp_vertragsuebersicht_get_struktur" scmCmdToExecute.CommandType = CommandType.StoredProcedure scmCmdToExecute.Connection = conn.scoDBConnection Try scmCmdToExecute.Parameters.Add(New SqlParameter("@vertragstypnr", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, vertragstypnr)) scmCmdToExecute.Parameters.Add(New SqlParameter("@vertragspartnernr", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Vertragspartnernr)) scmCmdToExecute.Parameters.Add(New SqlParameter("@mitarbeiternr", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Globals.clsmitarbeiter.iMitarbeiternr.Value)) scmCmdToExecute.Parameters.Add(New SqlParameter("@Details", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Details_anzeigen)) scmCmdToExecute.Parameters.Add(New SqlParameter("@Suchstring", SqlDbType.VarChar, 255, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Suchstring)) sdaAdapter.Fill(dtToReturn) Return dtToReturn Catch ex As Exception Throw New Exception("clsVertragsuebersicht::" & scmCmdToExecute.CommandText & "::Error occured." & ex.Message, ex) Finally scmCmdToExecute.Dispose() sdaAdapter.Dispose() End Try End Function ''' ''' Vertrasgdetail abhängig des gewählten Nodes auslesen ''' ''' ''' ''' ''' Public Function Update_Vertragsuebersicht(ByVal SelectedTag As Object, Optional ByVal SelNachVertragstyp As Boolean = False, Optional ByVal Suchstring As String = "") As DataTable Dim x As Treenode_Descriptor = SelectedTag Select Case x.Type Case "Vertragspartner" Return Get_Vertragsdetails(x.Type, 0, x.Vertragspartnernr, suchstring) Case "Vertragstyp" If SelNachVertragstyp = True Then Return Get_Vertragsdetails(x.Type, x.Vertragstypnr, 0, suchstring) Else Return Get_Vertragsdetails(x.Type, x.Vertragstypnr, x.Vertragspartnernr, Suchstring) End If Case "Vertragselement" Return Get_Vertragsdetails(x.Type, x.Keyvalue, x.Vertragspartnernr, Suchstring) End Select End Function ''' ''' Laden der Substruktur ''' ''' Nummer des aktuellen Vertragspartners ''' ''' Private Function Get_Vertragsdetails(ByVal Elementtyp As String, ByVal EntryRoot As Integer, ByVal Vertragspartnernr As Integer, ByVal Suchstring As String) Dim scmCmdToExecute As SqlCommand = New SqlCommand() Dim dtToReturn As DataTable = New DataTable() Dim sdaAdapter As SqlDataAdapter = New SqlDataAdapter(scmCmdToExecute) scmCmdToExecute.CommandText = "dbo.sp_vertragsuebersicht_get_Details" scmCmdToExecute.CommandType = CommandType.StoredProcedure scmCmdToExecute.Connection = conn.scoDBConnection Try scmCmdToExecute.Parameters.Add(New SqlParameter("@Elementtyp", SqlDbType.VarChar, 255, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Elementtyp)) scmCmdToExecute.Parameters.Add(New SqlParameter("@EntryRoot", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, EntryRoot)) scmCmdToExecute.Parameters.Add(New SqlParameter("@vertragspartnernr", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Vertragspartnernr)) scmCmdToExecute.Parameters.Add(New SqlParameter("@mitarbeiternr", SqlDbType.Int, 4, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Globals.clsmitarbeiter.iMitarbeiternr.Value)) scmCmdToExecute.Parameters.Add(New SqlParameter("@suchstring", SqlDbType.VarChar, 255, ParameterDirection.Input, True, 10, 0, "", DataRowVersion.Proposed, Suchstring)) sdaAdapter.Fill(dtToReturn) Return dtToReturn Catch ex As Exception Throw New Exception("clsVertragsuebersicht::" & scmCmdToExecute.CommandText & "::Error occured." & ex.Message, ex) Finally scmCmdToExecute.Dispose() sdaAdapter.Dispose() End Try End Function End Class ''' ''' Treenode-Descriptor zur Befüllung des Tree-Node-Tags ''' ''' Treenode-Tags werden mit den 2 Elementen (Type und Keyvalue) befüllt: ''' Type: Vertragspartner, Vertragstyp ''' Keyvalue: Primary-Key des Elementes Public Class Treenode_Descriptor Dim m_type As String Property Type() As String Get Return m_type End Get Set(ByVal value As String) m_type = value End Set End Property Dim m_keyvalue As Integer Property Keyvalue() As Integer Get Return m_keyvalue End Get Set(ByVal value As Integer) m_keyvalue = value End Set End Property Dim m_vertragspartnernr As Integer Property Vertragspartnernr() As Integer Get Return m_vertragspartnernr End Get Set(ByVal value As Integer) m_vertragspartnernr = value End Set End Property Dim m_vertragstypnr As Integer Property Vertragstypnr() As Integer Get Return m_vertragstypnr End Get Set(ByVal value As Integer) m_vertragstypnr = value End Set End Property Sub New(ByVal Type As String, ByVal Keyvalue As Integer, ByVal Vertragspartnernr As Integer, ByVal vertragstypnr As Integer) Me.Type = Type Me.Keyvalue = Keyvalue Me.Vertragspartnernr = Vertragspartnernr Me.Vertragstypnr = vertragstypnr End Sub End Class End Namespace