Chart-Integration

This commit is contained in:
PitzM 2023-04-05 10:42:52 +02:00
parent 41338b596e
commit 72a831619f
6 changed files with 389 additions and 18 deletions

View File

@ -19,6 +19,7 @@
Undefined
Table
TreeView
ChartView
End Enum
Public Enum DataTypeEnum
@ -34,4 +35,21 @@
List
SQL
End Enum
Public Enum ChartPosEnum
Undefined
TopLeft
BottomLeft
TopRight
BottomRight
End Enum
Public Enum ChartTypeEnum
Undefined
Bar
Line
Area
Pie
End Enum
End Namespace

View File

@ -0,0 +1,14 @@
Public Class ChartParameter
Public Id As Integer
Public Title As String
Public ChartPos As Constants.ChartPosEnum
Public SQLCommand As String
Public ChartType As Constants.ChartTypeEnum
Public Argument As String
Public Value As String
Public SearchId As Integer
Public Overrides Function ToString() As String
Return Title
End Function
End Class

View File

@ -1,5 +1,4 @@
Imports System.Runtime.CompilerServices
Imports System.Text.RegularExpressions
Imports System.Text.RegularExpressions
Imports DevExpress.Utils
Imports DevExpress.XtraEditors.Controls
Imports DevExpress.XtraEditors.Repository
@ -11,6 +10,7 @@ Imports DevExpress.XtraTab
Imports DevExpress.XtraTreeList
Imports DevExpress.XtraTreeList.Columns
Imports DevExpress.XtraTreeList.Nodes
Imports DevExpress.XtraCharts
Imports DigitalData.Controls.DocumentViewer
Imports DigitalData.GUIs.Common
Imports DigitalData.GUIs.Monitor.Constants
@ -20,6 +20,8 @@ Imports DigitalData.Modules.Language
Imports DigitalData.Modules.Language.Utils
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Patterns
Imports DevExpress.XtraEditors
Public Class frmMonitor
Private ReadOnly InvisibleColumnMarkers As New List(Of String) From {"[HTML]", "[SQL]", "[FILENAME]"}
@ -57,6 +59,8 @@ Public Class frmMonitor
Private GridControlResults As GridControl
Private GridViewResults As GridView
Private ChartViewResultContainer As SplitContainerControl
Private InvisibleMarkedColumns As New List(Of GridColumn)
Private VisibleMarkedColumns As New List(Of GridColumn)
Private ActiveSearch As Search = Nothing
@ -123,6 +127,8 @@ Public Class frmMonitor
InitGrid()
InitTreeList()
'InitChartView()
InitChartContainer()
Dim oGrids As GridView() = New List(Of GridView) From {GridView1, GridView2, GridView3, GridView4}.ToArray
GridBuilder.SetDefaults(oGrids)
@ -154,7 +160,6 @@ Public Class frmMonitor
End Sub
Next
For Each oViewer As DocumentViewer In FileResultViewers
oViewer.Init(LogConfig, oLicense)
Next
@ -164,7 +169,6 @@ Public Class frmMonitor
SetResultCount(0)
SetVersion()
Catch ex As Exception
FormHelper.ShowErrorMessage(ex, "frmStart_Load")
End Try
@ -210,16 +214,23 @@ Public Class frmMonitor
End If
Dim oControls As List(Of Control) = LayoutControl1.Controls.Cast(Of Control).ToList()
Dim oSQL = Patterns.ReplaceControlValues(oSearch.SQLCommand, oControls)
Dim oTable As DataTable = Await Database.GetDatatableAsync(oSQL)
Dim oSQL As String
Dim oTable As DataTable
If oSearch.SQLCommand.Length > 0 Then
oSQL = Patterns.ReplaceControlValues(oSearch.SQLCommand, oControls)
oTable = Await Database.GetDatatableAsync(oSQL)
End If
Dim oStartTime = Now
If oSearch.ReturnType = Constants.ReturnTypeEnum.TreeView Then
GridControlResults.Visible = False
GridControlResults.Dock = DockStyle.None
If oSearch.ReturnType = ReturnTypeEnum.TreeView Then
' Baum
SetResultVisbility(ReturnTypeEnum.TreeView)
TreeListResults.Visible = True
TreeListResults.Dock = DockStyle.Fill
If oTable Is Nothing Then
Return False
End If
TreeListResults.DataSource = oTable
@ -258,12 +269,70 @@ Public Class frmMonitor
SetResultCount(TreeListResults.AllNodesCount)
TreeListResults.Focus()
Else
GridControlResults.Visible = True
GridControlResults.Dock = DockStyle.Fill
ElseIf oSearch.ReturnType = Constants.ReturnTypeEnum.ChartView Then
' Charts
SetResultVisbility(ReturnTypeEnum.ChartView)
TreeListResults.Visible = False
TreeListResults.Dock = DockStyle.None
' Oberer SplitContainer
Dim splitContainer1 As SplitContainerControl = CType(ChartViewResultContainer.Panel1.Controls(0), SplitContainerControl)
' Unterer SplitContainer
Dim splitContainer2 As SplitContainerControl = CType(ChartViewResultContainer.Panel2.Controls(0), SplitContainerControl)
ChartViewResultContainer.PanelVisibility = SplitPanelVisibility.Both
splitContainer1.PanelVisibility = SplitPanelVisibility.Both
splitContainer2.PanelVisibility = SplitPanelVisibility.Both
Dim chartArray(4) As ChartControl
' TopLeft
chartArray(0) = CType(splitContainer1.Panel1.Controls(0), ChartControl)
' TopRight
chartArray(1) = CType(splitContainer1.Panel2.Controls(0), ChartControl)
' BottomLeft
chartArray(2) = CType(splitContainer2.Panel1.Controls(0), ChartControl)
' BottomRight
chartArray(3) = CType(splitContainer2.Panel2.Controls(0), ChartControl)
For i As Integer = 0 To 3
chartArray(i).Titles.Clear()
chartArray(i).Series.Clear()
Next
ResizeCharContainer()
Dim oChartParameters As List(Of ChartParameter)
oChartParameters = SearchLoader.ChartParameters.Where(Function(p) p.SearchId = oSearch.Id And p.ChartType <> ChartTypeEnum.Undefined).ToList()
For Each oChartParameterSet In oChartParameters
Dim ChartViewResults As ChartControl
Select Case oChartParameterSet.ChartPos
Case ChartPosEnum.TopLeft
ChartViewResults = chartArray(0)
Case ChartPosEnum.TopRight
ChartViewResults = chartArray(1)
Case ChartPosEnum.BottomLeft
ChartViewResults = chartArray(2)
Case ChartPosEnum.BottomRight
ChartViewResults = chartArray(3)
Case Else
ChartViewResults = chartArray(0)
End Select
SetChartTitle(ChartViewResults, oChartParameterSet.Title)
Dim oSerie As Series = Await GetChartSerie(oChartParameterSet, oControls)
ChartViewResults.Series.Add(oSerie)
Next
SetPanelVisibility(chartArray)
ChartViewResultContainer.Focus()
Else
' Tabelle
SetResultVisbility(ReturnTypeEnum.Table)
If oTable Is Nothing Then
Return False
End If
GridControlResults.DataSource = oTable
GridViewResults.PopulateColumns()
@ -343,6 +412,133 @@ Public Class frmMonitor
SplashScreenManager1.CloseWaitForm()
End Try
End Function
Private Async Function GetChartSerie(pChartParameters As ChartParameter, pControls As List(Of Control)) As Threading.Tasks.Task(Of Series)
Dim oSerie As Series
Select Case pChartParameters.ChartType
Case ChartTypeEnum.Bar
oSerie = New Series(pChartParameters.Title, ViewType.Bar)
Case ChartTypeEnum.Line
oSerie = New Series(pChartParameters.Title, ViewType.Line)
Case ChartTypeEnum.Area
oSerie = New Series(pChartParameters.Title, ViewType.Area)
Case ChartTypeEnum.Pie
oSerie = New Series(pChartParameters.Title, ViewType.Pie)
oSerie.Label.TextPattern = "{V}"
oSerie.LegendTextPattern = "{A}"
Case Else
Return Nothing
End Select
Dim oSQL As String = Patterns.ReplaceControlValues(pChartParameters.SQLCommand, pControls)
Dim oTable As DataTable = Await Database.GetDatatableAsync(oSQL)
Dim xAxisTitle As String = pChartParameters.Argument
Dim yAxisTitle As String = pChartParameters.Value
For Each oRow In oTable.Rows
Dim value1 As String = oRow.Item(xAxisTitle)
Dim value2 As String = oRow.Item(yAxisTitle)
oSerie.Points.Add(New SeriesPoint(value1, value2))
Next
oSerie.ArgumentScaleType = ScaleType.Qualitative
Return oSerie
End Function
Private Sub SetChartTitle(pChartView As ChartControl, pTitle As String)
' Wenn bereits ein Titel vorhanden ist, wird kein neuer ergänzt
' relevant bei mehrere Charts in einem ChartControl
If pChartView.Titles.Count = 0 Then
Dim oTitle As ChartTitle = New ChartTitle()
oTitle.Text = pTitle
pChartView.Titles.Add(oTitle)
End If
End Sub
Private Sub SetPanelVisibility(chartArray() As ChartControl)
If chartArray.Length < 4 Then
Exit Sub
End If
Dim showTop As Boolean = True
Dim showBottom As Boolean = True
If chartArray(0).Titles.Count = 0 And chartArray(1).Titles.Count = 0 Then
showTop = False
End If
If chartArray(2).Titles.Count = 0 And chartArray(3).Titles.Count = 0 Then
showBottom = False
End If
If showBottom = False Then
ChartViewResultContainer.PanelVisibility = SplitPanelVisibility.Panel1
ElseIf showTop = False Then
ChartViewResultContainer.PanelVisibility = SplitPanelVisibility.Panel2
End If
If showTop = True Then
Dim showLeft As Boolean = chartArray(0).Titles.Count > 0
Dim showRight As Boolean = chartArray(1).Titles.Count > 0
Dim splitContainer1 As SplitContainerControl = CType(ChartViewResultContainer.Panel1.Controls(0), SplitContainerControl)
If showRight = False Then
splitContainer1.PanelVisibility = SplitPanelVisibility.Panel1
ElseIf showLeft = False Then
splitContainer1.PanelVisibility = SplitPanelVisibility.Panel2
End If
End If
If showBottom = True Then
Dim showLeft As Boolean = chartArray(2).Titles.Count > 0
Dim showRight As Boolean = chartArray(3).Titles.Count > 0
Dim splitContainer2 As SplitContainerControl = CType(ChartViewResultContainer.Panel2.Controls(0), SplitContainerControl)
If showRight = False Then
splitContainer2.PanelVisibility = SplitPanelVisibility.Panel1
ElseIf showLeft = False Then
splitContainer2.PanelVisibility = SplitPanelVisibility.Panel2
End If
End If
End Sub
Private Sub SetResultVisbility(pSearchMode As ReturnTypeEnum)
Select Case pSearchMode
Case ReturnTypeEnum.TreeView
GridControlResults.Visible = False
GridControlResults.Dock = DockStyle.None
TreeListResults.Visible = True
TreeListResults.Dock = DockStyle.Fill
ChartViewResultContainer.Visible = False
ChartViewResultContainer.Dock = DockStyle.None
Case ReturnTypeEnum.ChartView
GridControlResults.Visible = False
GridControlResults.Dock = DockStyle.None
TreeListResults.Visible = False
TreeListResults.Dock = DockStyle.None
ChartViewResultContainer.Visible = True
ChartViewResultContainer.Dock = DockStyle.Fill
Case ReturnTypeEnum.Table
GridControlResults.Visible = True
GridControlResults.Dock = DockStyle.Fill
TreeListResults.Visible = False
TreeListResults.Dock = DockStyle.None
ChartViewResultContainer.Visible = False
ChartViewResultContainer.Dock = DockStyle.None
End Select
End Sub
''' <summary>
''' Linklogik für Hyperlink-Spalten
''' </summary>
@ -391,7 +587,7 @@ Public Class frmMonitor
Private Sub SetColumnsToDisAllowEditInGridViewResults()
For Each oColumn As GridColumn In GridViewResults.Columns
If Not TypeOf oColumn.ColumnEdit Is RepositoryItemHyperLinkEdit Then
If TypeOf oColumn.ColumnEdit IsNot RepositoryItemHyperLinkEdit Then
' Verbietet Spaltenweise die Bearbeitung
oColumn.OptionsColumn.AllowEdit = False
End If
@ -419,6 +615,7 @@ Public Class frmMonitor
Private Sub LoadSearches()
Try
SearchLoader.LoadSearchParameters()
SearchLoader.LoadChartParameters()
SearchLoader.LoadSearches()
cmbSearches.Properties.Items.Clear()
@ -999,6 +1196,23 @@ Public Class frmMonitor
SplitContainerSQL.Panel1.Controls.Add(TreeListResults)
End Sub
Private Sub InitChartContainer()
ChartViewResultContainer = GridLoader.InitChartViewResultContainer()
SplitContainerSQL.Panel1.Controls.Add(ChartViewResultContainer)
End Sub
Private Sub ResizeCharContainer()
If ChartViewResultContainer.Visible = True Then
Dim splitContainer1 As SplitContainerControl = CType(ChartViewResultContainer.Panel1.Controls(0), SplitContainerControl)
Dim splitContainer2 As SplitContainerControl = CType(ChartViewResultContainer.Panel2.Controls(0), SplitContainerControl)
ChartViewResultContainer.SplitterPosition = ChartViewResultContainer.Height / 2
splitContainer1.SplitterPosition = splitContainer1.Width / 2
splitContainer2.SplitterPosition = splitContainer2.Width / 2
End If
End Sub
Private Sub BarButtonItem2_ItemClick_1(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick
If ActiveSearch Is Nothing Then
Exit Sub
@ -1014,5 +1228,6 @@ Public Class frmMonitor
FormHelper.ShowErrorMessage(ex, "Log Verzeichnis öffnen")
End Try
End Sub
End Class

View File

@ -1,4 +1,6 @@
Imports DevExpress.Utils
Imports DevExpress.Utils.Extensions
Imports DevExpress.XtraCharts
Imports DevExpress.XtraEditors
Imports DevExpress.XtraEditors.Controls
Imports DevExpress.XtraEditors.Repository
@ -81,6 +83,62 @@ Public Class GridLoader
Return oGrid
End Function
Public Function InitChartViewResultContainer() As SplitContainerControl
' Vorbereiten der SplitContainer-Struktur inkl. der ChartControls
Dim oChartViewResultContainer As SplitContainerControl
Dim oSplitContainer1 As SplitContainerControl
Dim oSplitContainer2 As SplitContainerControl
oChartViewResultContainer = New SplitContainerControl With {
.Name = "ChartViewResultContainer",
.Visible = False,
.Dock = DockStyle.Fill,
.Horizontal = False,
.IsSplitterFixed = True
}
oSplitContainer1 = New SplitContainerControl With {
.Name = "SplitContainer1",
.Dock = DockStyle.Fill,
.Horizontal = True,
.IsSplitterFixed = True
}
oSplitContainer2 = New SplitContainerControl With {
.Name = "SplitContainer2",
.Dock = DockStyle.Fill,
.Horizontal = True,
.IsSplitterFixed = True
}
oChartViewResultContainer.Panel1.AddControl(oSplitContainer1)
oChartViewResultContainer.Panel2.AddControl(oSplitContainer2)
Dim oChartControl11 As ChartControl = New ChartControl With {
.Name = "ChartControl11",
.Dock = DockStyle.Fill
}
Dim oChartControl12 As ChartControl = New ChartControl With {
.Name = "ChartControl12",
.Dock = DockStyle.Fill
}
Dim oChartControl21 As ChartControl = New ChartControl With {
.Name = "ChartControl21",
.Dock = DockStyle.Fill
}
Dim oChartControl22 As ChartControl = New ChartControl With {
.Name = "ChartControl22",
.Dock = DockStyle.Fill
}
oSplitContainer1.Panel1.AddControl(oChartControl11)
oSplitContainer1.Panel2.AddControl(oChartControl12)
oSplitContainer2.Panel1.AddControl(oChartControl21)
oSplitContainer2.Panel2.AddControl(oChartControl22)
Return oChartViewResultContainer
End Function
Public Sub InitTreeListColumns(pTreeList As TreeList, pMaxLength As Integer)
Dim oColumn1 = pTreeList.Columns.Item("COLUMN1")
Dim oColumn2 = pTreeList.Columns.Item("COLUMN2")

View File

@ -12,6 +12,7 @@ Public Class SearchLoader
Public Searches As New List(Of Search)
Public Parameters As New List(Of SearchParameter)
Public ChartParameters As New List(Of ChartParameter)
Public Sub New(pLogConfig As LogConfig, pConfig As Config, pDatabase As MSSQLServer)
MyBase.New(pLogConfig)
@ -49,7 +50,8 @@ Public Class SearchLoader
End If
' Es wurde kein SQL Command definiert, ohne geht nix
If oSearch.SQLCommand Is Nothing Or oSearch.SQLCommand.Length = 0 Then
' Außer es ist eine Chart-Suche
If oSearch.ReturnType <> ReturnTypeEnum.ChartView And (oSearch.SQLCommand Is Nothing Or oSearch.SQLCommand.Length = 0) Then
Logger.Error($"For searchId [{0}] is NO SQLCommand defined!", oSearch.Id)
Continue For
End If
@ -90,6 +92,27 @@ Public Class SearchLoader
Parameters = oParameters
End Sub
Public Sub LoadChartParameters()
Dim oSQL As String = $"SELECT * FROM TBMON_CHARTS"
Dim oTable As DataTable = Database.GetDatatable(oSQL)
Dim oParameters As New List(Of ChartParameter)
For Each oRow As DataRow In oTable.Rows
oParameters.Add(New ChartParameter With {
.Id = oRow.ItemEx("GUID", 0),
.Title = oRow.ItemEx("TITLE", String.Empty),
.SearchId = oRow.ItemEx("PROFILE_ID", 0),
.ChartPos = GetChartPosType(oRow.ItemEx("POS_ID", 0)),
.SQLCommand = oRow.ItemEx("SQL_COMMAND", String.Empty),
.ChartType = GetChartType(oRow.ItemEx("CHART_TYPE", String.Empty)),
.Argument = oRow.ItemEx("ARGUMENT", String.Empty),
.Value = oRow.ItemEx("VALUE", String.Empty)
})
Next
ChartParameters = oParameters
End Sub
Private Function GetItemType(pTypeString As String) As ItemTypeEnum
Select Case pTypeString
Case "LIST"
@ -107,6 +130,8 @@ Public Class SearchLoader
Return ReturnTypeEnum.Table
Case "TreeView"
Return ReturnTypeEnum.TreeView
Case "ChartView"
Return ReturnTypeEnum.ChartView
Case Else
Return ReturnTypeEnum.Undefined
End Select
@ -127,6 +152,34 @@ Public Class SearchLoader
End Select
End Function
Private Function GetChartType(pTypeString As String) As ChartTypeEnum
Select Case pTypeString.ToUpper
Case "BAR"
Return ChartTypeEnum.Bar
Case "AREA"
Return ChartTypeEnum.Area
Case "LINE"
Return ChartTypeEnum.Line
Case "PIE"
Return ChartTypeEnum.Pie
Case Else
Return ChartTypeEnum.Undefined
End Select
End Function
Private Function GetChartPosType(pPosTypeId As Integer) As ChartPosEnum
Select Case pPosTypeId
Case 1
Return ChartPosEnum.TopLeft
Case 2
Return ChartPosEnum.TopRight
Case 3
Return ChartPosEnum.BottomLeft
Case 4
Return ChartPosEnum.BottomRight
Case Else
Return ChartPosEnum.Undefined
End Select
End Function
End Class

View File

@ -59,6 +59,18 @@
<Reference Include="DevExpress.Utils.v21.2" />
<Reference Include="DevExpress.XtraBars.v21.2" />
<Reference Include="DevExpress.Sparkline.v21.2.Core" />
<Reference Include="DevExpress.XtraCharts.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>D:\ProgramFiles\DevExpress 21.2\Components\Bin\Framework\DevExpress.XtraCharts.v21.2.dll</HintPath>
</Reference>
<Reference Include="DevExpress.XtraCharts.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>D:\ProgramFiles\DevExpress 21.2\Components\Bin\Framework\DevExpress.XtraCharts.v21.2.UI.dll</HintPath>
</Reference>
<Reference Include="DevExpress.XtraCharts.v21.2.Wizard, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>D:\ProgramFiles\DevExpress 21.2\Components\Bin\Framework\DevExpress.XtraCharts.v21.2.Wizard.dll</HintPath>
</Reference>
<Reference Include="DevExpress.XtraDialogs.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraEditors.v21.2" />
<Reference Include="DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
@ -133,6 +145,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="ApplicationEvents.vb" />
<Compile Include="Data\ChartParameter.vb" />
<Compile Include="Data\Config.vb" />
<Compile Include="Constants.vb" />
<Compile Include="Forms\frmMonitor.Designer.vb">