From 83e31a2e0050e8e9bd369b655f3f8e770176c5f0 Mon Sep 17 00:00:00 2001 From: Developer01 Date: Mon, 2 Feb 2026 11:44:17 +0100 Subject: [PATCH] Geschwindigkeitsoptimierungen Main --- app/TaskFlow/ModuleRuntimeVariables.vb | 2 +- app/TaskFlow/frmMain.Designer.vb | 5 +- app/TaskFlow/frmMain.resx | 266 +++++++++++-------------- app/TaskFlow/frmMain.vb | 222 +++++++++++++-------- app/TaskFlow/frmValidator.vb | 65 +++--- 5 files changed, 307 insertions(+), 253 deletions(-) diff --git a/app/TaskFlow/ModuleRuntimeVariables.vb b/app/TaskFlow/ModuleRuntimeVariables.vb index 3e75b92..596a671 100644 --- a/app/TaskFlow/ModuleRuntimeVariables.vb +++ b/app/TaskFlow/ModuleRuntimeVariables.vb @@ -150,7 +150,7 @@ Module ModuleRuntimeVariables Public Property DTVWCONTROL_INDEX As DataTable Public Property DTCONTROLS_WITH_SQL As DataTable - + Public Property DTTBPM_PROFILE_FINAL_INDEXING As DataTable Public Property CURRENT_CONTROL_ID As Integer Public Property errormessage As String diff --git a/app/TaskFlow/frmMain.Designer.vb b/app/TaskFlow/frmMain.Designer.vb index 75ea101..4de6182 100644 --- a/app/TaskFlow/frmMain.Designer.vb +++ b/app/TaskFlow/frmMain.Designer.vb @@ -246,6 +246,7 @@ Partial Class frmMain ' 'Panel1 ' + Me.Panel1.BackColor = System.Drawing.Color.WhiteSmoke Me.Panel1.Controls.Add(Me.GridControlWorkflows) Me.Panel1.Controls.Add(Me.Panel2) Me.Panel1.Controls.Add(Me.NavBarControl1) @@ -255,7 +256,6 @@ Partial Class frmMain 'GridControlWorkflows ' resources.ApplyResources(Me.GridControlWorkflows, "GridControlWorkflows") - Me.GridControlWorkflows.EmbeddedNavigator.Margin = CType(resources.GetObject("GridControlWorkflows.EmbeddedNavigator.Margin"), System.Windows.Forms.Padding) Me.GridControlWorkflows.MainView = Me.GridViewWorkflows Me.GridControlWorkflows.MenuManager = Me.RibbonControl1 Me.GridControlWorkflows.Name = "GridControlWorkflows" @@ -273,7 +273,6 @@ Partial Class frmMain Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseForeColor = True Me.GridViewWorkflows.Appearance.ViewCaption.Options.UseTextOptions = True Me.GridViewWorkflows.Appearance.ViewCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near - Me.GridViewWorkflows.DetailHeight = 442 Me.GridViewWorkflows.GridControl = Me.GridControlWorkflows Me.GridViewWorkflows.Name = "GridViewWorkflows" Me.GridViewWorkflows.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.[False] @@ -293,13 +292,11 @@ Partial Class frmMain ' 'RibbonControl1 ' - Me.RibbonControl1.EmptyAreaImageOptions.ImagePadding = New System.Windows.Forms.Padding(37, 38, 37, 38) Me.RibbonControl1.ExpandCollapseItem.Id = 0 Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.bbtniRefresh, Me.bbtniMonitor, Me.bbiProfilverwaltung, Me.bbiKonfiguration, Me.bbtniGrundeinstellung, Me.bbtnitemInfo, Me.BarButtonItem1, Me.bsiUser, Me.bsiLicenses, Me.bsiUserLoggedIn, Me.bsiVersion, Me.bsilastsync, Me.bsiDebug, Me.bsiMessage, Me.bbtniMetadataFile, Me.BarEditItem1, Me.bbtnitDashboardInv, Me.bsiGeneralInfo, Me.bbtnitmGhostMode, Me.bsi_GhostMode, Me.BarButtonItemGhostMode, Me.SearchItem1, Me.SearchItem2, Me.BarStaticItemAppServer, Me.bbtniCW, Me.bsiInactivityCheck, Me.BarButtonItem2, Me.BarCheckItemAutofilter, Me.BarCheckItem2, Me.BarButtonItemResetLayout, Me.BarButtonItem4, Me.BarButtonItemExportExcel, Me.BarButtonItem6, Me.BarButtonItem7, Me.BarButtonItemWFSingle, Me.BarButtonItemWFGroup, Me.BarButtonItemFileLink, Me.BarButtonItemMassValidation, Me.BarCheckItemShowSearch, Me.barItemGridFontSize, Me.BarButtonItem8, Me.BbtnitmAHWF1, Me.BbtnitmAHWF2, Me.BbtnitmAHWF3, Me.BbtnitmAHWF4, Me.bbtnitmLanguage_Change, Me.BarButtonItem10, Me.BBtnItmNotfications, Me.BSIVERSION1, Me.barbtnitmsaveLogfiles, Me.bsitmCount}) resources.ApplyResources(Me.RibbonControl1, "RibbonControl1") Me.RibbonControl1.MaxItemId = 57 Me.RibbonControl1.Name = "RibbonControl1" - Me.RibbonControl1.OptionsMenuMinWidth = 403 Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPageStart, Me.RibbonPageTabelle, Me.RibbonPageAktionen}) Me.RibbonControl1.RepositoryItems.AddRange(New DevExpress.XtraEditors.Repository.RepositoryItem() {Me.RepositoryItemProgressBar1, Me.RepositoryItemTrackBar1, Me.cmbGridFontSize}) Me.RibbonControl1.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonControlStyle.Office2013 diff --git a/app/TaskFlow/frmMain.resx b/app/TaskFlow/frmMain.resx index 366b12d..8df7c95 100644 --- a/app/TaskFlow/frmMain.resx +++ b/app/TaskFlow/frmMain.resx @@ -125,7 +125,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADw - CAAAAk1TRnQBSQFMAgEBAgEAAZABCwGQAQsBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAAaABCwGgAQsBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -176,12 +176,9 @@ Fill - - 4, 4, 4, 4 - - 285, 30 + 233, 24 Microsoft Sans Serif, 8.25pt @@ -189,9 +186,6 @@ Segoe UI, 12pt - - 4, 4, 4, 4 - Aktualisieren @@ -1502,39 +1496,9 @@ 0, 0 - - 4, 4, 4, 4 - - - Allgemein - - - Auswertungen - - - Verwaltung - - - Grundeinstellungen - - - Workflow - - - Funktionen/App Start - - - Ad Hoc Workflows - Start - - Funktionen - - - Workflow Tabelle - Tabelle @@ -1542,16 +1506,13 @@ Aktionen - 1440, 194 + 1178, 158 - 0, 841 - - - 4, 4, 4, 4 + 0, 666 - 1440, 28 + 1178, 22 RibbonStatusBar1 @@ -1578,7 +1539,7 @@ 4 - 1155, 617 + 945, 484 10 @@ -1595,27 +1556,6 @@ 0 - - True - - - Tahoma, 9.75pt, style=Bold - - - 4, 4 - - - 4, 0, 4, 0 - - - 169, 21 - - - 0 - - - Choose a profile ... - lblCaptionMainGrid @@ -1632,13 +1572,10 @@ Top - 285, 0 - - - 4, 4, 4, 4 + 233, 0 - 1155, 30 + 945, 24 9 @@ -1710,14 +1647,8 @@ 863, 17 - - 261, 26 - - - Starte Validierung für Profil - - 262, 30 + 220, 30 cmsNavPane @@ -1847,14 +1778,11 @@ 0, 0 - - 4, 4, 4, 4 - - 285 + 233 - 285, 647 + 233, 508 5 @@ -1881,13 +1809,10 @@ Tahoma, 9pt - 0, 194 - - - 4, 4, 4, 4 + 0, 158 - 1440, 647 + 1178, 508 4 @@ -1904,38 +1829,80 @@ 2 - - 17, 56 - - - 490, 17 - - - 250, 56 - - - 348, 30 + + Allgemein - - Popup Erinnerung deaktivieren + + Auswertungen - - 345, 6 + + Verwaltung - - 348, 30 + + Grundeinstellungen - - In den Vordergrund + + Workflow - - 348, 30 + + Funktionen/App Start - - Out of Range - Fenster wiederherstellen + + Ad Hoc Workflows + + + Funktionen + + + Workflow Tabelle + + + True + + + Tahoma, 9.75pt, style=Bold + + + 3, 3 + + + 127, 16 + + + 0 + + + Choose a profile ... + + + lblCaptionMainGrid + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Panel2 + + + 0 + + + 219, 26 + + + Starte Validierung für Profil + + 986, 17 + + + 490, 17 + + + 1220, 17 + - 349, 100 + 291, 100 ContextMenuNotifyIcon @@ -2029,6 +1996,27 @@ True + + 290, 30 + + + Popup Erinnerung deaktivieren + + + 287, 6 + + + 290, 30 + + + In den Vordergrund + + + 290, 30 + + + Out of Range - Fenster wiederherstellen + 605, 17 @@ -2036,10 +2024,10 @@ 728, 17 - 525, 95 + 643, 54 - 151, 56 + 1120, 17 Top @@ -2048,19 +2036,16 @@ 0, 0 - 17, 95 + 138, 54 Bottom - 0, 869 - - - 4, 4, 4, 4 + 0, 688 - 1440, 0 + 1178, 0 barDockControlBottom @@ -2080,11 +2065,8 @@ 0, 0 - - 4, 4, 4, 4 - - 0, 869 + 0, 688 barDockControlLeft @@ -2102,13 +2084,10 @@ Right - 1440, 0 - - - 4, 4, 4, 4 + 1178, 0 - 0, 869 + 0, 688 barDockControlRight @@ -2129,10 +2108,10 @@ 147 - 11, 24 + 9, 19 - 1440, 869 + 1178, 688 Tahoma, 12pt @@ -2304,7 +2283,7 @@ - 5, 6, 5, 6 + 4, 5, 4, 5 Manual @@ -3465,6 +3444,9 @@ &Ansicht + + &Hintergrund + &Seiten Layout @@ -3477,9 +3459,6 @@ Bars - - &Hintergrund - PDF Dokument @@ -3594,11 +3573,8 @@ Graphisches Dokument - - 4, 4, 4, 4 - - 1440, 0 + 1178, 0 barDockControlTop @@ -3616,25 +3592,25 @@ RibbonPage2 - 432, 56 + 1402, 17 - 584, 56 + 1554, 17 - 677, 56 + 1649, 17 PDF Dateien (*.pdf*)|*.pdf - 814, 56 + 17, 54 - 235, 95 + 353, 54 - 394, 95 + 510, 54 BarButtonItem5 diff --git a/app/TaskFlow/frmMain.vb b/app/TaskFlow/frmMain.vb index 4c58127..f3ba934 100644 --- a/app/TaskFlow/frmMain.vb +++ b/app/TaskFlow/frmMain.vb @@ -2,6 +2,7 @@ Imports System.Globalization Imports System.IO Imports System.Threading +Imports System.Threading.Tasks Imports DevExpress.LookAndFeel Imports DevExpress.Utils Imports DevExpress.XtraBars.Ribbon @@ -482,6 +483,8 @@ Public Class frmMain Else bbtnitmLanguage_Change.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If + LoadCURRENT_DT_PROFILES() + LoadVWPM_CONTROL_INDEX() LOGGER.Debug("MainForm initialized!") @@ -676,28 +679,38 @@ Public Class frmMain If GridViewWorkflows.Columns.Count = 0 Then Exit Sub End If - GridViewWorkflows.Columns.Item("PROFILE_ID").Visible = False - GridViewWorkflows.Columns.Item("GUID").Visible = False + + ' Sichere Prüfung für jede Spalte + If GridViewWorkflows.Columns.ColumnByFieldName("PROFILE_ID") IsNot Nothing Then + GridViewWorkflows.Columns.Item("PROFILE_ID").Visible = False + End If + + If GridViewWorkflows.Columns.ColumnByFieldName("GUID") IsNot Nothing Then + GridViewWorkflows.Columns.Item("GUID").Visible = False + End If + Try - GridViewWorkflows.Columns.Item(FullFilepatColName).Visible = False + If GridViewWorkflows.Columns.ColumnByFieldName(FullFilepatColName) IsNot Nothing Then + GridViewWorkflows.Columns.Item(FullFilepatColName).Visible = False + End If Catch ex As Exception - End Try + Try - 'GridViewWorkflows.Columns.Item("DocID").Visible = False - GridViewWorkflows.Columns.Item("TL_STATE").Visible = False + If GridViewWorkflows.Columns.ColumnByFieldName("TL_STATE") IsNot Nothing Then + GridViewWorkflows.Columns.Item("TL_STATE").Visible = False + End If Catch ex As Exception - End Try + Try - If Not IsNothing(GridViewWorkflows.Columns("CONV_YN")) Then + If GridViewWorkflows.Columns.ColumnByFieldName("CONV_YN") IsNot Nothing Then GridViewWorkflows.Columns.Item("CONV_YN").Visible = False End If Catch ex As Exception - End Try Catch ex As Exception - + LOGGER.Warn($"Error in COLUMNS_INVISIBLE: {ex.Message}") End Try End Sub Private Sub ResetLayout() @@ -875,7 +888,6 @@ Public Class frmMain Private Async Sub navBar_LinkClicked(ByVal sender As Object, ByVal e As NavBarLinkEventArgs) If Not Application.OpenForms().OfType(Of frmValidator).Any Then Else - 'FormHelper.ShowInfoMessage(omsgOpenWorkflow, omsgTitleWarning) FormHelper.ShowInfoMessage(S.Bitte_schließen_Sie_den_offenen_Workflow_, omsgTitleWarning) Exit Sub End If @@ -896,12 +908,13 @@ Public Class frmMain CURRENT_CLICKED_PROFILE_TITLE = e.Link.Item.Caption End If - GRID_LOAD_TYPE = "PROFILE#" & _tag.ToString TimerRefresh.Stop() GridViewWorkflows.ShowLoadingPanel() + Await Task.Delay(10) DetailLinkActive = True Await Load_single_Profile(True) + ' Caption wird in Load_single_Profile aktualisiert GridViewWorkflows.HideLoadingPanel() TimerRefresh.Start() Else @@ -913,6 +926,7 @@ Public Class frmMain OverviewOrDEtail = "OVERVIEW" GRID_LOAD_TYPE = "OVERVIEW" GridViewWorkflows.ShowLoadingPanel() + Await Task.Delay(10) TimerRefresh.Stop() Dim oForce As Boolean = False If DetailLinkActive = True Then @@ -921,6 +935,7 @@ Public Class frmMain OVERVIEW_ADDED_WHEN = "" End If Await Load_Grid_Overview(False, True, True) + ' Caption wird in Load_Grid_Overview aktualisiert GridViewWorkflows.HideLoadingPanel() TimerRefresh.Start() RefreshHelper.LoadViewInfo() @@ -1002,8 +1017,24 @@ Public Class frmMain Dim oChanged = GET_LAST_CHANGED(DT_CURR_WF_ITEMS) Dim oCOUNT = DT_CURR_WF_ITEMS.Rows.Count + ' Workflowitems-Status setzen + NO_WORKFLOWITEMS = (oCOUNT = 0) + + ' Caption IMMER aktualisieren (vor Hash-Prüfung!) + UpdateGridCaption() + + ' Datenquelle bei leeren Items zurücksetzen + If NO_WORKFLOWITEMS Then + GridControlWorkflows.Visible = False + bindsourcegrid.DataSource = Nothing + GridControlWorkflows.DataSource = Nothing + Exit Function + End If + + ' Hash-Prüfung für Performance-Optimierung If ForceReload = False Then If oADDED = OVERVIEW_ADDED_WHEN And oChanged = OVERVIEW_CHANGED_WHEN And OVERVIEW_COUNT = oCOUNT Then + LOGGER.Debug("No data changes - skipping grid reload") Exit Function End If OVERVIEW_ADDED_WHEN = oADDED @@ -1011,18 +1042,6 @@ Public Class frmMain OVERVIEW_COUNT = oCOUNT End If - If DT_CURR_WF_ITEMS.Rows.Count = 0 Then - NO_WORKFLOWITEMS = True - lblCaptionMainGrid.Text = String.Format(S.Aktuell_keine_Workflowdaten_vorhanden___0_, CURRENT_CLICKED_PROFILE_TITLE) - GridControlWorkflows.Visible = False - bindsourcegrid.DataSource = Nothing - GridControlWorkflows.DataSource = Nothing - Exit Function - End If - - NO_WORKFLOWITEMS = False - lblCaptionMainGrid.Text = CURRENT_CLICKED_PROFILE_TITLE - Create_Basic_View() RestoreLayout() @@ -1061,33 +1080,48 @@ Public Class frmMain LOGGER.Warn("Could not clear GridViewWorkflows.Columns") End Try - If TL_ICON = True AndAlso DT_CURR_WF_ITEMS IsNot Nothing AndAlso DT_CURR_WF_ITEMS.Columns.Contains("ICON") = False Then + ' Prüfen, ob TL_STATE-Spalte vorhanden ist + Dim hasTLStateColumn As Boolean = False + If DT_CURR_WF_ITEMS IsNot Nothing Then + hasTLStateColumn = DT_CURR_WF_ITEMS.Columns.Contains("TL_STATE") + End If + + ' ICON-Spalte nur hinzufügen, wenn TL_ICON aktiv UND TL_STATE verfügbar ist + If TL_ICON = True AndAlso hasTLStateColumn AndAlso DT_CURR_WF_ITEMS IsNot Nothing AndAlso DT_CURR_WF_ITEMS.Columns.Contains("ICON") = False Then Dim columnStateIcon As New DataColumn() With { - .DataType = GetType(Image), - .ColumnName = "ICON", - .Caption = "" - } + .DataType = GetType(Image), + .ColumnName = "ICON", + .Caption = "" + } DT_CURR_WF_ITEMS.Columns.Add(columnStateIcon) End If RedDocuments = 0 YellowDocuments = 0 GreenDocuments = 0 - If TL_ICON = True AndAlso DT_CURR_WF_ITEMS IsNot Nothing Then - For Each row As DataRow In DT_CURR_WF_ITEMS.Rows - Dim State As Integer = row.Item("TL_STATE") - Select Case State - Case 1 - RedDocuments += 1 - row.Item("ICON") = My.Resources.bullet_red - Case 2 - YellowDocuments += 1 - row.Item("ICON") = My.Resources.bullet_orange - Case 3 - GreenDocuments += 1 - row.Item("ICON") = My.Resources.bullet_green - End Select - Next + + ' Icons nur setzen, wenn TL_STATE-Spalte vorhanden ist + If TL_ICON = True AndAlso hasTLStateColumn AndAlso DT_CURR_WF_ITEMS IsNot Nothing Then + Try + For Each row As DataRow In DT_CURR_WF_ITEMS.Rows + Dim State As Integer = CInt(row.Item("TL_STATE")) + Select Case State + Case 1 + RedDocuments += 1 + row.Item("ICON") = My.Resources.bullet_red + Case 2 + YellowDocuments += 1 + row.Item("ICON") = My.Resources.bullet_orange + Case 3 + GreenDocuments += 1 + row.Item("ICON") = My.Resources.bullet_green + End Select + Next + Catch ex As Exception + LOGGER.Warn($"Could not set ICON values: {ex.Message}") + End Try + ElseIf TL_ICON = True AndAlso Not hasTLStateColumn Then + LOGGER.Warn("TL_ICON is enabled but TL_STATE column is missing in dataset") End If bindsourcegrid.DataSource = DT_CURR_WF_ITEMS @@ -1097,13 +1131,14 @@ Public Class frmMain COLUMNS_INVISIBLE() Try - If TL_ICON = True AndAlso GridViewWorkflows.Columns.Count > 0 Then + If TL_ICON = True AndAlso GridViewWorkflows.Columns.Count > 0 AndAlso GridViewWorkflows.Columns.ColumnByFieldName("ICON") IsNot Nothing Then GridViewWorkflows.Columns.Item("ICON").MaxWidth = 24 GridViewWorkflows.Columns.Item("ICON").MinWidth = 24 GridViewWorkflows.Columns.Item("ICON").AppearanceCell.BackColor = Color.White GridViewWorkflows.Columns.Item("ICON").Fixed = FixedStyle.Left End If Catch ex As Exception + LOGGER.Warn($"Could not configure ICON column: {ex.Message}") End Try Try @@ -1116,8 +1151,12 @@ Public Class frmMain End Try Try - GridViewWorkflows.Columns.Item("GROUP_TEXT").Visible = False - GridViewWorkflows.Columns.Item("GROUP_COLOR").Visible = False + If GridViewWorkflows.Columns.ColumnByFieldName("GROUP_TEXT") IsNot Nothing Then + GridViewWorkflows.Columns.Item("GROUP_TEXT").Visible = False + End If + If GridViewWorkflows.Columns.ColumnByFieldName("GROUP_COLOR") IsNot Nothing Then + GridViewWorkflows.Columns.Item("GROUP_COLOR").Visible = False + End If Catch ex As Exception If OverviewOrDEtail = "OVERVIEW" Then LOGGER.Warn("ATTENTION: GROUP COLUMNS NOT PART OF GRID") @@ -1315,8 +1354,9 @@ Public Class frmMain useWaitCursorApplied = True End If - bsiMessage.Caption = "Daten werden geladen..." + bsiMessage.Caption = "Data loading..." GridViewWorkflows.ShowLoadingPanel() + Await Task.Delay(10) showLoadingPanel = True TimerRefresh.Stop() @@ -1905,12 +1945,21 @@ Public Class frmMain useWaitCursorApplied = True End If - bsiMessage.Caption = "Daten werden geladen..." + bsiMessage.Caption = "Overviewdata loading..." loadingMessageApplied = True GridViewWorkflows.ShowLoadingPanel() + Await Task.Delay(10) showLoadingPanel = True + + If GridControlWorkflows.Visible Then + GridControlWorkflows.BeginUpdate() + gridUpdateStarted = True + GridViewWorkflows.BeginUpdate() + viewUpdateStarted = True + End If + If BASEDATA_DT_VW_PROFILE_USER.Rows.Count = 0 Then LOGGER.Info("Attention: No profiles for user: '" & USER_USERNAME & "' configured!", False) NO_WORKFLOWITEMS = True @@ -1921,12 +1970,7 @@ Public Class frmMain Exit Function End If - If GridControlWorkflows.Visible Then - GridControlWorkflows.BeginUpdate() - gridUpdateStarted = True - GridViewWorkflows.BeginUpdate() - viewUpdateStarted = True - End If + Dim oStopWatch1 As New RefreshHelper.SW("LGO#Load_Profiles_for_User") Load_Profiles_for_User() @@ -1982,20 +2026,14 @@ Public Class frmMain Dim oADDED = GET_LAST_ADDED(DT_CURR_WF_ITEMS) Dim oChanged = GET_LAST_CHANGED(DT_CURR_WF_ITEMS) Dim oCOUNT = DT_CURR_WF_ITEMS.Rows.Count - If pForceReload = False Then - If oADDED = OVERVIEW_ADDED_WHEN And oChanged = OVERVIEW_CHANGED_WHEN And oCOUNT = OVERVIEW_COUNT Then - LOGGER.Debug("No changes on OverviewHash - so exit Load_Grid_overview") - Exit Function - Else - OVERVIEW_ADDED_WHEN = oADDED - OVERVIEW_CHANGED_WHEN = oChanged - OVERVIEW_COUNT = oCOUNT - End If - End If - NO_WORKFLOWITEMS = (DT_CURR_WF_ITEMS.Rows.Count = 0) + ' Workflowitems-Status setzen + NO_WORKFLOWITEMS = (oCOUNT = 0) + + ' Caption IMMER aktualisieren + UpdateGridCaption() + If NO_WORKFLOWITEMS Then - lblCaptionMainGrid.Text = String.Format(S.Aktuell_keine_Workflowdaten_vorhanden___0_, "") GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing @@ -2357,15 +2395,15 @@ Public Class frmMain End If End Sub Sub LoadCURRENT_DT_PROFILES() - Dim oSQL = $"select * from TBPM_PROFILE where ACTIVE = 1" + Dim oSQL = $"select * from TBPM_PROFILE WITH (NOLOCK)where ACTIVE = 1" CURRENT_DT_PROFILES = DatabaseFallback.GetDatatable("TBPM_PROFILE", New GetDatatableOptions(oSQL, DatabaseType.ECM)) - oSQL = $"select * from TBDD_GUI_LANGUAGE_PHRASE where LANGUAGE = '{USER_LANGUAGE}' AND MODULE = 'PM' AND TITLE LIKE 'PROFILE_%'" + oSQL = $"select * from TBDD_GUI_LANGUAGE_PHRASE WITH (NOLOCK) where LANGUAGE = '{USER_LANGUAGE}' AND MODULE = 'PM' AND TITLE LIKE 'PROFILE_%'" CURRENT_DT_PROFILE_LANGUAGE = DatabaseFallback.GetDatatable("TBPMPROFILE_LANGUAGE_TERMS", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = $"LANGUAGE = '{USER_LANGUAGE}'" }) End Sub Sub LoadVWPM_CONTROL_INDEX() - Dim oSQL = $"SELECT * FROM VWPM_CONTROL_INDEX ORDER BY PROFIL_ID,Y_LOC, X_LOC" + Dim oSQL = $"SELECT * FROM VWPM_CONTROL_INDEX WITH (NOLOCK) ORDER BY PROFIL_ID,Y_LOC, X_LOC" 'DTVWCONTROLS_INDEX = DataASorDB.GetDatatable("DD_ECM", oSQL, "VWPM_CONTROL_INDEX", "") DTVWCONTROLS_INDEX = DatabaseFallback.GetDatatable("VWPM_CONTROL_INDEX", New GetDatatableOptions(oSQL, DatabaseType.ECM)) End Sub @@ -2389,7 +2427,7 @@ Public Class frmMain LOGGER.Debug($"VWPM_PROFILE_ACTIVE-SELECT used from DD-SQL-Config..") Else oSQL = $"SELECT [dbo].[FNDD_LANGUAGE_PHRASE] ('PROFILE_TITLE' + CONVERT(VARCHAR(4),T.GUID),'{USER_LANGUAGE}','PM') as GROUP_TEXT_LANG, T.* -FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_GET_ACTIVE_PROFILES_USER] ({USER_ID}))" +FROM VWPM_PROFILE_ACTIVE T WITH (NOLOCk) WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_GET_ACTIVE_PROFILES_USER] ({USER_ID}))" End If @@ -2411,7 +2449,7 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G CURRENT_DT_PROFILE = CURRENT_DT_PROFILES.Clone() End If If pMode = "bwBasicData" Then bwBasicData.ReportProgress(40) - oSQL = "select * from TBPM_PROFILE_SEARCH where TYPE = 'DOC' AND ACTIVE = 1 ORDER BY PROFILE_ID,TAB_INDEX" + oSQL = "select * from TBPM_PROFILE_SEARCH WITH (NOLOCK) where TYPE = 'DOC' AND ACTIVE = 1 ORDER BY PROFILE_ID,TAB_INDEX" If SQL_VALIDATOR_SEARCHES <> String.Empty Then SQL_VALIDATOR_SEARCHES = SQL_VALIDATOR_SEARCHES.Replace("@USR_LANG_CODE", User.Language) oSQL = SQL_VALIDATOR_SEARCHES @@ -2423,13 +2461,13 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G DT_FILTERED_PROFILE_SEARCHES_DOC = BASEDATA_DT_PROFILES_SEARCHES_DOC.Clone() End If If pMode = "bwBasicData" Then bwBasicData.ReportProgress(50) - oSQL = "select * from TBPM_PROFILE_SEARCH where TYPE = 'SQL' AND ACTIVE = 1 ORDER BY PROFILE_ID,TAB_INDEX" + oSQL = "select * from TBPM_PROFILE_SEARCH WITH (NOLOCK) where TYPE = 'SQL' AND ACTIVE = 1 ORDER BY PROFILE_ID,TAB_INDEX" BASEDATA_DT_PROFILES_SEARCHES_SQL = DatabaseFallback.GetDatatable("TBPM_PROFILE_SEARCH", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = "TYPE = 'SQL'", .SortByColumn = "PROFILE_ID,TAB_INDEX" }) - oSQL = String.Format("SELECT [dbo].[FNPM_LANGUAGE_CONTROL_TEXT] (NAME,'{0}',CTRL_TYPE,CTRL_TEXT) CTRL_CAPTION_LANG, * FROM TBPM_PROFILE_CONTROLS", {USER_LANGUAGE}) + oSQL = String.Format("SELECT [dbo].[FNPM_LANGUAGE_CONTROL_TEXT] (NAME,'{0}',CTRL_TYPE,CTRL_TEXT) CTRL_CAPTION_LANG, '{0}' as LANGUAGE, * FROM TBPM_PROFILE_CONTROLS WITH (NOLOCK)", {USER_LANGUAGE}) BASEDATA_TBPM_PROFILE_CONTROLS = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS_LANGUAGE", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = String.Format("LANGUAGE = '{0}'", {USER_LANGUAGE}) }) @@ -2442,11 +2480,13 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G If pMode = "Load" Then DTVWCONTROL_INDEX = DTVWCONTROLS_INDEX.Clone() End If - oSQL = $"SELECT * FROM TBPM_PROFILE_CONTROLS WHERE LEN(ISNULL(SQL_UEBERPRUEFUNG,'')) > 0 AND CTRL_TYPE <> 'BUTTON'" - + oSQL = $"SELECT * FROM TBPM_PROFILE_CONTROLS WITH (NOLOCK) WHERE LEN(ISNULL(SQL_UEBERPRUEFUNG,'')) > 0 AND CTRL_TYPE <> 'BUTTON'" DTCONTROLS_WITH_SQL = DatabaseFallback.GetDatatable("DTCONTROLS_WITH_SQL", New GetDatatableOptions(oSQL, DatabaseType.ECM)) If pMode = "bwBasicData" Then bwBasicData.ReportProgress(85) + oSQL = "SELECT * FROM TBPM_PROFILE_FINAL_INDEXING with (NOLOCK) WHERE ACTIVE = 1" + DTTBPM_PROFILE_FINAL_INDEXING = DatabaseFallback.GetDatatable("TBPM_PROFILE_FINAL_INDEXING", New GetDatatableOptions(oSQL, DatabaseType.ECM)) + If pMode = "bwBasicData" Then bwBasicData.ReportProgress(100) Catch ex As Exception LOGGER.Warn($"Error in GetBaseData - Error: [{ex.Message}]") @@ -2848,15 +2888,37 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G LOGGER.Error(ex.Message) End Try End Sub - - Sub Create_View_Caption() + Private Sub UpdateGridCaption() Try - lblCaptionMainGrid.Text = S.Gesamtübersicht + LOGGER.Debug($"UpdateGridCaption called - GRID_LOAD_TYPE: [{GRID_LOAD_TYPE}], CURRENT_CLICKED_PROFILE_TITLE: [{CURRENT_CLICKED_PROFILE_TITLE}], NO_WORKFLOWITEMS: [{NO_WORKFLOWITEMS}]") + If GRID_LOAD_TYPE = "OVERVIEW" Then + ' Übersicht-Caption + lblCaptionMainGrid.Text = S.Gesamtübersicht - Catch ex As Exception + ' Filter-Info hinzufügen, falls aktiv + If GridViewWorkflows.ActiveFilterString <> String.Empty Then + Dim oTermFilterActive As String = String.Format("{0} ({1})", S.Filter_aktiv, GridViewWorkflows.RowCount) + lblCaptionMainGrid.Text = String.Format("{0} - {1}", S.Gesamtübersicht, oTermFilterActive) + End If + ElseIf GRID_LOAD_TYPE.StartsWith("PROFILE#") Then + ' Profil-Caption + If Not String.IsNullOrEmpty(CURRENT_CLICKED_PROFILE_TITLE) Then + If NO_WORKFLOWITEMS Then + lblCaptionMainGrid.Text = String.Format(S.Aktuell_keine_Workflowdaten_vorhanden___0_, CURRENT_CLICKED_PROFILE_TITLE) + Else + lblCaptionMainGrid.Text = CURRENT_CLICKED_PROFILE_TITLE + End If + End If + End If + LOGGER.Debug($"Grid Caption updated: [{lblCaptionMainGrid.Text}]") + Catch ex As Exception + LOGGER.Error(ex) End Try End Sub + Sub Create_View_Caption() + UpdateGridCaption() + End Sub Sub Grid_Export() XtraSaveFileDialog1.FileName = "Overview.xlsx" XtraSaveFileDialog1.DefaultExt = ".xlsx" diff --git a/app/TaskFlow/frmValidator.vb b/app/TaskFlow/frmValidator.vb index 4b743d5..1e5d431 100644 --- a/app/TaskFlow/frmValidator.vb +++ b/app/TaskFlow/frmValidator.vb @@ -1,4 +1,6 @@ -Imports System.ComponentModel +Imports System.Collections.Generic +Imports System.ComponentModel +Imports System.Data.Entity.Core.Common.CommandTrees 'Imports System.Data.SqlClient Imports System.Globalization Imports System.IO @@ -29,8 +31,6 @@ Imports DigitalData.Modules.Interfaces Imports DigitalData.Modules.Logging Imports DigitalData.Modules.ZooFlow Imports DigitalData.Modules.ZooFlow.Constants -Imports System.Collections.Generic - 'Imports System.Windows.Forms.VisualStyles.VisualStyleElement 'Imports System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox Imports WINDREAMLib @@ -128,6 +128,8 @@ Public Class frmValidator Private ReadOnly _SqlScalarCache As New Dictionary(Of String, Object)(StringComparer.OrdinalIgnoreCase) Private _SqlControlsByGuid As Dictionary(Of Integer, List(Of DataRow)) Private _LookupControlsByRepository As Dictionary(Of RepositoryItemLookupControl3, LookupControl3) + Private _CachedFinalIndexing As DataTable = Nothing + Private Class Translation_Strings Inherits My.Resources.frmValidator_Strings End Class @@ -202,6 +204,16 @@ Public Class frmValidator _FormClosing = False _FormLoaded = False + + ' In Load_Next_Document (einmalig): + If _CachedFinalIndexing Is Nothing AndAlso DTTBPM_PROFILE_FINAL_INDEXING IsNot Nothing Then + Dim rows = DTTBPM_PROFILE_FINAL_INDEXING.Select($"PROFIL_ID = {CURRENT_ProfilGUID} AND ACTIVE = 1", "SEQUENCE") + If rows.Length > 0 Then + _CachedFinalIndexing = rows.CopyToDataTable() + End If + End If + + If LOG_HOTSPOTS Then MyValidationLogger.Info($"[PERF] Nach Initialisierung: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") perfLastCheck = DateTime.Now @@ -936,11 +948,15 @@ Public Class frmValidator PanelValidatorControl.Controls.Clear() _LookupControlsByRepository = New Dictionary(Of RepositoryItemLookupControl3, LookupControl3)() - Dim oSQL = $"SELECT [dbo].[FNPM_LANGUAGE_CONTROL_TEXT] (NAME,'{USER_LANGUAGE}',CTRL_TYPE,CTRL_TEXT) CTRL_CAPTION_LANG, * FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {CURRENT_ProfilGUID} ORDER BY Y_LOC, X_LOC" - DT_CONTROLS = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS_LANGUAGE", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { - .FilterExpression = $"LANGUAGE = '{USER_LANGUAGE}' AND PROFIL_ID = {CURRENT_ProfilGUID}", - .SortByColumn = "Y_LOC, X_LOC" - }) + Dim oSQL As String + Dim oFilter As String = $"LANGUAGE = '{USER_LANGUAGE}' AND PROFIL_ID = {CURRENT_ProfilGUID}" + DT_CONTROLS = GetControlMetaBySql(oFilter, "Y_LOC, X_LOC") + + 'Dim oSQL = $"SELECT [dbo].[FNPM_LANGUAGE_CONTROL_TEXT] (NAME,'{USER_LANGUAGE}',CTRL_TYPE,CTRL_TEXT) CTRL_CAPTION_LANG, * FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {CURRENT_ProfilGUID} ORDER BY Y_LOC, X_LOC" + 'DT_CONTROLS = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS_LANGUAGE", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { + ' .FilterExpression = $"LANGUAGE = '{USER_LANGUAGE}' AND PROFIL_ID = {CURRENT_ProfilGUID}", + ' .SortByColumn = "Y_LOC, X_LOC" + '}) oSQL = $"SELECT IIF(LANG.CAPTION IS NULL,T.SPALTEN_HEADER,LANG.CAPTION) SPALTEN_HEADER_LANG, T.* from TBPM_CONTROL_TABLE T INNER JOIN TBPM_PROFILE_CONTROLS T1 ON T.CONTROL_ID = T1.GUID LEFT JOIN (SELECT * FROM TBPM_CONTOL_TABLE_LANG WHERE LANG_CODE = '{USER_LANGUAGE}') LANG ON T.GUID = LANG.COL_ID WHERE T1.CONTROL_ACTIVE = 1 AND T.CONTROL_ID = T1.GUID AND T1.PROFIL_ID = {CURRENT_ProfilGUID} ORDER BY T.SEQUENCE" @@ -2610,9 +2626,9 @@ Public Class frmValidator End If End If End Sub - Private Function GetControlMetaBySql(filter As String) As DataTable + Private Function GetControlMetaBySql(filter As String, Optional SortBy As String = "") As DataTable Dim dt As DataTable = Nothing - Dim cacheKey = $"META|{filter}" + Dim cacheKey = $"META|{filter}|{SortBy}" If _SqlDataCache.TryGetValue(cacheKey, dt) Then Return dt @@ -2620,14 +2636,17 @@ Public Class frmValidator If BASEDATA_TBPM_PROFILE_CONTROLS IsNot Nothing Then Try + Dim rows As DataRow() + If String.IsNullOrWhiteSpace(filter) Then - dt = BASEDATA_TBPM_PROFILE_CONTROLS.Copy() + rows = BASEDATA_TBPM_PROFILE_CONTROLS.Select() Else - Dim rows = BASEDATA_TBPM_PROFILE_CONTROLS.Select(filter) - dt = BASEDATA_TBPM_PROFILE_CONTROLS.Clone() - If rows.Length > 0 Then - dt = rows.CopyToDataTable() - End If + rows = BASEDATA_TBPM_PROFILE_CONTROLS.Select(filter, SortBy) + End If + + dt = BASEDATA_TBPM_PROFILE_CONTROLS.Clone() + If rows.Length > 0 Then + dt = rows.CopyToDataTable() End If _SqlDataCache(cacheKey) = dt @@ -2637,6 +2656,7 @@ Public Class frmValidator End Try End If + ' Fallback zu SQL Dim query As String If String.IsNullOrWhiteSpace(filter) Then query = "SELECT * FROM TBPM_PROFILE_CONTROLS" @@ -2644,6 +2664,10 @@ Public Class frmValidator query = $"SELECT * FROM TBPM_PROFILE_CONTROLS WHERE {filter}" End If + If Not String.IsNullOrWhiteSpace(SortBy) Then + query &= $" ORDER BY {SortBy}" + End If + dt = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS", New GetDatatableOptions(query, DatabaseType.ECM)) If dt IsNot Nothing Then _SqlDataCache(cacheKey) = dt @@ -4531,7 +4555,6 @@ Public Class frmValidator End Sub Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click btnSave.Enabled = False - ' TODO: Use when working on Validation If ForceGridValidation() = True Then Finish_WFStep() @@ -4714,12 +4737,8 @@ Public Class frmValidator If includeFI = True Then Try - Dim oSQL = $"SELECT * FROM TBPM_PROFILE_FINAL_INDEXING WHERE PROFIL_ID = {CURRENT_ProfilGUID} AND ACTIVE = 1 ORDER BY SEQUENCE" - Dim oDTFinalIndexing As DataTable - oDTFinalIndexing = DatabaseFallback.GetDatatable("TBPM_PROFILE_FINAL_INDEXING", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { - .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}", - .SortByColumn = "SEQUENCE" - }) + + Dim oDTFinalIndexing As DataTable = _CachedFinalIndexing If oDTFinalIndexing?.Rows.Count > 0 Then 'Jetzt finale Indexe setzen