MS FlowSearch

This commit is contained in:
2021-01-20 16:55:50 +01:00
parent 0a77e55b7d
commit 0bd0d0d40c
7 changed files with 246 additions and 574 deletions

View File

@@ -11,14 +11,14 @@ Public Class frmFlowSearch
Private SecondaryFont As New Font("Segoe UI", 8)
Dim oLastAttribute As String = ""
Dim oAttributeCount As Integer = 1
Dim BASE_SSEARCHCommand As String
Dim BASE_SEARCHCommand As String
Private LastSearchForm As frmDocumentResultList
Public Sub New(pBaseSearchSql As String)
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
BASE_SSEARCHCommand = pBaseSearchSql
BASE_SEARCHCommand = pBaseSearchSql
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
Logger = My.LogConfig.GetLogger()
End Sub
@@ -27,6 +27,7 @@ Public Class frmFlowSearch
Try
If txtSearch.Text = String.Empty Then
Reset_Form()
Exit Sub
End If
lblFoundResult.Visible = False
@@ -38,101 +39,92 @@ Public Class frmFlowSearch
Logger.Error(ex)
End Try
End Sub
Sub SearchContent(oSearchValue As String)
oLastAttribute = ""
Dim oSQL = BASE_SSEARCHCommand.Replace("@SEARCH_STRING", oSearchValue)
Dim oResultCount As Integer = 0
Sub Reset_Form()
TileControlMatch.Groups.Clear()
lblFoundResult.Visible = False
End Sub
Sub SearchContent(oSearchValue As String)
Try
oLastAttribute = ""
Dim oSQL = BASE_SEARCHCommand.Replace("@SEARCH_STRING", oSearchValue)
Dim oResultCountAttributes As Integer = 0
TileControlMatch.Groups.Clear()
Dim ODT As DataTable = My.DatabaseIDB.GetDatatable(oSQL)
If Not IsNothing(ODT) Then
Dim oResultsfromSearchDT As DataTable = My.DatabaseIDB.GetDatatable(oSQL)
If Not IsNothing(oResultsfromSearchDT) Then
Dim oView As DataView = New DataView(ODT)
Dim oDTDistinctValues As DataTable = oView.ToTable(True, "ATTRIBUTE", "ATTR_ID")
Dim oGroups = ODT.AsEnumerable().GroupBy(Function(row) row.Field(Of String)("ATTRIBUTE"))
Dim oNewTable As New DataTable
oNewTable.Columns.Add("ATTRIBUTE")
oNewTable.Columns.Add("COUNT", Type.GetType("System.Int32"))
For Each oGroup In oGroups
oNewTable.Rows.Add(oGroup.Key, oGroup.Sum(Function(row) row.Field(Of Int32)("COUNT_OBJ")))
Next
If Not IsNothing(oNewTable) Then
Dim oAttrCount As Integer = 0
For Each orow As DataRow In oNewTable.Rows
oAttrCount += 1
oResultCount += orow.Item(1)
Dim oView As DataView = New DataView(oResultsfromSearchDT)
Dim oDTDistinctValues As DataTable = oView.ToTable(True, "ATTRIBUTE", "ATTR_ID")
Dim oGroups = oResultsfromSearchDT.AsEnumerable().GroupBy(Function(row) row.Field(Of String)("ATTRIBUTE"))
Dim oNewTable As New DataTable
oNewTable.Columns.Add("ATTRIBUTE")
oNewTable.Columns.Add("COUNT", Type.GetType("System.Int32"))
For Each oGroup In oGroups
oNewTable.Rows.Add(oGroup.Key, oGroup.Sum(Function(row) row.Field(Of Int32)("COUNT_OBJ")))
Next
lblFoundResult.Text = GetResultString(oResultCount, oAttrCount, oSearchValue)
lblFoundResult.Visible = True
If Not IsNothing(oNewTable) Then
Dim oAttrCount As Integer = 0
End If
oNewTable.DefaultView.Sort = "COUNT ASC"
oNewTable = oNewTable.DefaultView.ToTable
For Each orow As DataRow In oNewTable.Rows
oAttrCount += 1
oResultCountAttributes += orow.Item(1)
Next
lblFoundResult.Text = GetResultString(oResultCountAttributes, oAttrCount, oSearchValue)
lblFoundResult.Visible = True
End If
oNewTable.DefaultView.Sort = "COUNT ASC"
oNewTable = oNewTable.DefaultView.ToTable
For Each oGroupRow As DataRow In oNewTable.Rows
Dim oGroup As New TileGroup
oGroup.Text = $"{oGroupRow.Item(0).ToString} [{oGroupRow.Item(1).ToString}]"
oGroup.Visible = True
For Each oitemRow As DataRow In oResultsfromSearchDT.Rows
If oitemRow.Item("ATTRIBUTE") = oGroupRow.Item(0) Then
Dim oItem = CreateTile(oitemRow.Item("TERM_VALUE"), oitemRow.Item("COUNT_OBJ"), oGroupRow.Item(0).ToString, oitemRow.Item("ATTR_ID"), oitemRow.Item("TERM_GUID"))
If Not IsNothing(oItem) Then
oGroup.Items.Add(oItem)
End If
End If
Next
TileControlMatch.Groups.Add(oGroup)
Next
'Wenn weniger als 45 Belege gefunden wurden wird direkt die Suche ausgeführt
If oResultCountAttributes > 0 And oResultCountAttributes <= 45 Then
StartSearch_Full(oSearchValue)
Else
If oResultsfromSearchDT.Rows.Count = 0 Then
Reset_Form()
For Each oGroupRow As DataRow In oNewTable.Rows
Dim oGroup As New TileGroup
oGroup.Text = $"{oGroupRow.Item(0).ToString} [{oGroupRow.Item(1).ToString}]"
oGroup.Visible = True
For Each oitemRow As DataRow In ODT.Rows
If oitemRow.Item("ATTRIBUTE") = oGroupRow.Item(0) Then
Dim oItem = CreateTile(oitemRow.Item("TERM_VALUE"), oitemRow.Item("COUNT_OBJ"), oGroupRow.Item(0).ToString, oitemRow.Item("ATTR_ID"), oitemRow.Item("TERM_GUID"))
oGroup.Items.Add(oItem)
End If
Next
TileControlMatch.Groups.Add(oGroup)
Next
End If
'Wenn weniger als 45 Belege gefunden wurden wird direkt die Suche ausgeführt
If oResultCount > 0 And oResultCount <= 45 Then
StartSearch_Full(oSearchValue)
Else
lblFoundResult.Text = "Result from DB Is Nothing..Check SQL"
lblFoundResult.Visible = True
End If
Catch ex As Exception
Logger.Error(ex)
End Try
Else
lblFoundResult.Text = "Result from DB Is Nothing..Check SQL"
lblFoundResult.Visible = True
End If
End Sub
Private Function StartSearch_Full(pSearchValue As String) As Boolean
Dim oHandle As IOverlaySplashScreenHandle = Nothing
Dim oItemsFound As Boolean = False
Dim oState = My.Application.Search
Dim oSearchData = My.Application.Search
Try
oHandle = SplashScreenManager.ShowOverlayForm(Me)
Dim oEXECSQL = $"EXEC PRFLOW_SEARCH_GET_RESULT '{pSearchValue}',{My.Application.User.UserId},'{oState.StringAttributeId}','{oState.IntegerAttributeId}'"
Dim oEXECSQL = $"EXEC PRFLOW_SEARCH_GET_RESULT '{pSearchValue}',{My.Application.User.UserId},'{oSearchData.SelectInStringAttributeIds}','{oSearchData.SelectInIntegerAttributeIds}'"
Dim oDTOBJECT_RESULT As DataTable = My.DatabaseIDB.GetDatatable(oEXECSQL)
If Not IsNothing(oDTOBJECT_RESULT) Then
Dim oEnvironment As New Modules.ZooFlow.Environment() With {
.User = My.Application.User,
.Modules = My.Application.Modules,
.Database = My.Database,
.DatabaseIDB = My.DatabaseIDB,
.Settings = My.Application.Settings,
.Service = My.Application.Service
}
Dim oShortGuid = Guid.NewGuid()
Dim oWindowGuid = $"FLOWSEARCH-{My.User.Name}"
Dim oParams = New DocumentResultParams() With {
.WindowGuid = oWindowGuid,
.Results = New List(Of DocumentResult) From {
New DocumentResult() With {
.Title = "FlowSearchResult",
.Datatable = oDTOBJECT_RESULT
}
}
}
Dim oForm As New frmDocumentResultList(My.LogConfig, oEnvironment, oParams)
oForm.Show()
LastSearchForm = oForm
' Position Result Window below this window
LastSearchForm.Location = GetResultFormLocation()
LastSearchForm.Size = GetResultFormSize()
oItemsFound = True
OpenResultForm(oDTOBJECT_RESULT)
End If
@@ -144,6 +136,40 @@ Public Class frmFlowSearch
End Try
Return oItemsFound
End Function
Private Sub OpenResultForm(pDTRESULT As DataTable)
Try
Dim oEnvironment As New Modules.ZooFlow.Environment() With {
.User = My.Application.User,
.Modules = My.Application.Modules,
.Database = My.Database,
.DatabaseIDB = My.DatabaseIDB,
.Settings = My.Application.Settings,
.Service = My.Application.Service
}
Dim oShortGuid = Guid.NewGuid()
Dim oWindowGuid = $"FLOWSEARCH-{My.User.Name}"
Dim oParams = New DocumentResultParams() With {
.WindowGuid = oWindowGuid,
.Results = New List(Of DocumentResult) From {
New DocumentResult() With {
.Title = "FlowSearchResult",
.Datatable = pDTRESULT
}
}
}
Dim oForm As New frmDocumentResultList(My.LogConfig, oEnvironment, oParams)
oForm.Show()
LastSearchForm = oForm
' Position Result Window below this window
LastSearchForm.Location = GetResultFormLocation()
LastSearchForm.Size = GetResultFormSize()
Catch ex As Exception
Logger.Error(ex)
End Try
End Sub
Private Function GetResultFormLocation() As Point
Return Location
@@ -160,64 +186,73 @@ Public Class frmFlowSearch
Return String.Format(oBase, oResultString, oProfileString, SearchContent)
End Function
Private Function CreateTile(pTermValue As String, pCount_Obj As String, pAttribute As String, pAttributeID As String, pTermGuid As Long) As TileItem
Dim oItem As New TileItem() With {.Tag = $"{pTermGuid}#{pAttributeID}"}
Try
Dim oItem As New TileItem() With {.Tag = $"{pTermGuid}|{pAttributeID}"}
oItem.AppearanceItem.Normal.BackColor = Color.FromArgb(255, 214, 47)
If oLastAttribute <> pAttribute Then
oAttributeCount = 1
oLastAttribute = pAttribute
oItem.ItemSize = TileItemSize.Wide
ElseIf oAttributeCount = 2 Then
oItem.ItemSize = TileItemSize.Medium
End If
oAttributeCount += 1
If oLastAttribute <> pAttribute Then
oAttributeCount = 1
oLastAttribute = pAttribute
oItem.ItemSize = TileItemSize.Wide
oItem.AppearanceItem.Normal.BackColor = Color.FromArgb(165, 36, 49) ' GELB 255, 214, 47)
Else
oItem.ItemSize = TileItemSize.Medium
oItem.AppearanceItem.Normal.BackColor = Color.White
End If
oAttributeCount += 1
oItem.Elements.Clear()
oItem.Elements.Clear()
Dim oNameElement = New TileItemElement With {
.Text = pTermValue,
.TextAlignment = TileItemContentAlignment.TopLeft
}
Select Case oItem.ItemSize
Case TileItemSize.Wide
oNameElement.Appearance.Normal.Font = FontLargeBold
Case Else
oNameElement.Appearance.Normal.Font = SecondaryFontBold
End Select
Dim oNameElement = New TileItemElement With {
.Text = pTermValue,
.TextAlignment = TileItemContentAlignment.TopLeft
}
Select Case oItem.ItemSize
Case TileItemSize.Wide
oNameElement.Appearance.Normal.Font = FontLargeBold
oNameElement.Appearance.Normal.ForeColor = Color.White
Case Else
oNameElement.Appearance.Normal.Font = SecondaryFontBold
oNameElement.Appearance.Normal.ForeColor = Color.FromArgb(165, 36, 49)
End Select
oNameElement.Appearance.Normal.ForeColor = Color.Black
oItem.Elements.Add(oNameElement)
'oNameElement.Appearance.Normal.ForeColor = Color.Black
oItem.Elements.Add(oNameElement)
'Dim oCommentElement = New TileItemElement With {
' .Text = "Anzahl Objekte: " & pCount_Obj,
' .TextAlignment = TileItemContentAlignment.MiddleLeft
'}
'Dim oCommentElement = New TileItemElement With {
' .Text = "Anzahl Objekte: " & pCount_Obj,
' .TextAlignment = TileItemContentAlignment.MiddleLeft
'}
'Select Case oItem.ItemSize
' Case TileItemSize.Wide
' oCommentElement.Appearance.Normal.Font = FontLargeNormal
' Case Else
' oCommentElement.Appearance.Normal.Font = SecondaryFont
'End Select
'Select Case oItem.ItemSize
' Case TileItemSize.Wide
' oCommentElement.Appearance.Normal.Font = FontLargeNormal
' Case Else
' oCommentElement.Appearance.Normal.Font = SecondaryFont
'End Select
'oCommentElement.Appearance.Normal.ForeColor = Color.Black
'oItem.Elements.Add(oCommentElement)
'oCommentElement.Appearance.Normal.ForeColor = Color.Black
'oItem.Elements.Add(oCommentElement)
Dim oCountElement = New TileItemElement With {
.Text = "Anzahl Objekte: " & pCount_Obj,
.TextAlignment = TileItemContentAlignment.BottomRight
}
Select Case oItem.ItemSize
Case TileItemSize.Wide
oCountElement.Appearance.Normal.Font = FontLargeNormal
Case Else
oCountElement.Appearance.Normal.Font = SecondaryFont
End Select
oCountElement.Appearance.Normal.ForeColor = Color.Black
Dim oCountElement = New TileItemElement With {
.Text = "Anzahl Objekte: " & pCount_Obj,
.TextAlignment = TileItemContentAlignment.BottomRight
}
Select Case oItem.ItemSize
Case TileItemSize.Wide
oCountElement.Appearance.Normal.Font = FontLargeNormal
oCountElement.Appearance.Normal.ForeColor = Color.White
Case Else
oCountElement.Appearance.Normal.Font = SecondaryFont
oCountElement.Appearance.Normal.ForeColor = Color.FromArgb(165, 36, 49)
End Select
oItem.Elements.Add(oCountElement)
oItem.Elements.Add(oCountElement)
Return oItem
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
Return oItem
End Function
Private Sub txtSearch_Enter(sender As Object, e As EventArgs) Handles txtSearch.GotFocus
@@ -227,4 +262,38 @@ Public Class frmFlowSearch
Private Sub frmFlowSearch_Load(sender As Object, e As EventArgs) Handles Me.Load
TileControlMatch.Groups.Clear()
End Sub
Private Sub TileControlMatch_ItemClick(sender As Object, e As TileItemEventArgs) Handles TileControlMatch.ItemClick
Try
Dim oItem As TileItem = e.Item
Dim oItemTag = oItem.Tag
Dim oHandle As IOverlaySplashScreenHandle = Nothing
Dim oItemsFound As Boolean = False
Dim oSearchData = My.Application.Search
Dim oSplit = oItem.Tag.ToString.Split("|")
Try
oHandle = SplashScreenManager.ShowOverlayForm(Me)
Dim oEXECSQL = $"EXEC PRFLOW_SEARCH_GET_RESULT_PER_TILE '{oSplit(0)}',{My.Application.User.UserId},'{oSearchData.SelectInStringAttributeIds}','{oSearchData.SelectInIntegerAttributeIds}'"
Dim oDTOBJECT_RESULT As DataTable = My.DatabaseIDB.GetDatatable(oEXECSQL)
If Not IsNothing(oDTOBJECT_RESULT) Then
oItemsFound = True
OpenResultForm(oDTOBJECT_RESULT)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, Text)
Finally
SplashScreenManager.CloseOverlayForm(oHandle)
End Try
Return oItemsFound
Catch ex As Exception
MsgBox($"Error while loading Searches: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, Text)
Logger.Error(ex)
End Try
End Sub
End Class