diff --git a/app/TaskFlow/frmValidator.Designer.vb b/app/TaskFlow/frmValidator.Designer.vb index 35ce48a..4cbbe4e 100644 --- a/app/TaskFlow/frmValidator.Designer.vb +++ b/app/TaskFlow/frmValidator.Designer.vb @@ -259,8 +259,8 @@ Partial Class frmValidator 'DocumentViewer1 ' Me.DocumentViewer1.BackColor = System.Drawing.SystemColors.ControlLightLight - Me.DocumentViewer1.FileLoaded = False resources.ApplyResources(Me.DocumentViewer1, "DocumentViewer1") + Me.DocumentViewer1.FileLoaded = False Me.DocumentViewer1.Name = "DocumentViewer1" Me.DocumentViewer1.Viewer_ForceTemporaryMode = False ' diff --git a/app/TaskFlow/frmValidator.resx b/app/TaskFlow/frmValidator.resx index e43e940..e6f2a60 100644 --- a/app/TaskFlow/frmValidator.resx +++ b/app/TaskFlow/frmValidator.resx @@ -630,6 +630,9 @@ 0 + + Fill + 0, 0 @@ -637,7 +640,7 @@ 4, 4, 4, 4 - 1121, 683 + 669, 422 0 diff --git a/app/TaskFlow/frmValidator.vb b/app/TaskFlow/frmValidator.vb index 8cde44c..021f7a6 100644 --- a/app/TaskFlow/frmValidator.vb +++ b/app/TaskFlow/frmValidator.vb @@ -126,6 +126,7 @@ Public Class frmValidator Private frmMessages As frmValidator_Messages Private ReadOnly _SqlDataCache As New Dictionary(Of String, DataTable)(StringComparer.OrdinalIgnoreCase) Private ReadOnly _SqlScalarCache As New Dictionary(Of String, Object)(StringComparer.OrdinalIgnoreCase) + Private _SqlControlsByGuid As Dictionary(Of Integer, List(Of DataRow)) Private Class Translation_Strings Inherits My.Resources.frmValidator_Strings End Class @@ -749,6 +750,35 @@ Public Class frmValidator End Try End Sub + Private Sub EnsureSqlControlLookup() + If _SqlControlsByGuid IsNot Nothing Then + Return + End If + + _SqlControlsByGuid = New Dictionary(Of Integer, List(Of DataRow))() + + If DTCONTROLS_WITH_SQL Is Nothing OrElse DTCONTROLS_WITH_SQL.Rows.Count = 0 Then + Return + End If + + For Each row As DataRow In DTCONTROLS_WITH_SQL.Rows + If row.ItemEx("PROFIL_ID", 0) <> CURRENT_ProfilGUID Then + Continue For + End If + + Dim controlId As Integer + If Not Integer.TryParse(row.Item("GUID").ToString(), controlId) Then + Continue For + End If + + Dim list As List(Of DataRow) = Nothing + If Not _SqlControlsByGuid.TryGetValue(controlId, list) Then + list = New List(Of DataRow)() + _SqlControlsByGuid(controlId) = list + End If + list.Add(row) + Next + End Sub Sub LoadSQLData(control As Control, pControlId As Integer) Try If TypeOf control Is Label Then @@ -757,14 +787,14 @@ Public Class frmValidator MyValidationLogger.Debug($"in LoadSQLData for ControlID [{pControlId}]...") - Dim oDTforControl As DataTable = DTCONTROLS_WITH_SQL.Clone() - Dim oExpression = $"GUID = {pControlId} AND PROFIL_ID = {CURRENT_ProfilGUID}" - DTCONTROLS_WITH_SQL.Select(oExpression).CopyToDataTable(oDTforControl, LoadOption.PreserveChanges) + EnsureSqlControlLookup() - If IsNothing(oDTforControl) Then Exit Sub - If oDTforControl.Rows.Count = 0 Then Exit Sub + Dim rows As List(Of DataRow) = Nothing + If _SqlControlsByGuid Is Nothing OrElse Not _SqlControlsByGuid.TryGetValue(pControlId, rows) Then + Exit Sub + End If - For Each row As DataRow In oDTforControl.Rows + For Each row As DataRow In rows Dim name As String = row.Item("NAME") Dim oGUID As String = row.Item("GUID") Dim oReadOnly As Boolean = row.Item("READ_ONLY") @@ -787,12 +817,12 @@ Public Class frmValidator Dim oSQLStatement As String = row.Item("SQL_UEBERPRUEFUNG") Dim oConnectionId As Integer = row.Item("CONNECTION_ID") - If IsNothing(oSQLStatement) Then + If String.IsNullOrWhiteSpace(oSQLStatement) Then Continue For End If oSQLStatement = clsPatterns.ReplaceAllValues(oSQLStatement, PanelValidatorControl, True) - If IsNothing(oSQLStatement) Then + If String.IsNullOrWhiteSpace(oSQLStatement) Then Continue For End If If clsPatterns.HasComplexPatterns(oSQLStatement) Then @@ -800,18 +830,9 @@ Public Class frmValidator Continue For End If - Dim oDTContent As DataTable = Nothing - Dim cacheKey = $"{oConnectionId}|{oSQLStatement}" - - If Not _SqlDataCache.TryGetValue(cacheKey, oDTContent) Then - oDTContent = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSQLStatement, DatabaseType.ECM) With { - .ConnectionId = oConnectionId - }) - If IsNothing(oDTContent) Then - MyValidationLogger.Warn($"SQL-Query [{oSQLStatement}] for control {control.Name} is invalid.") - Exit Sub - End If - _SqlDataCache(cacheKey) = oDTContent + Dim oDTContent As DataTable = GetCachedDatatable(oSQLStatement, oConnectionId) + If oDTContent Is Nothing OrElse oDTContent.Rows.Count = 0 Then + Continue For End If Dim oValue @@ -824,7 +845,6 @@ Public Class frmValidator lookup.Properties.ValueMember = oDTContent.Columns.Item(0).ColumnName lookup.Properties.DisplayMember = oDTContent.Columns.Item(0).ColumnName Catch ex As Exception - MyValidationLogger.Warn("Error in LookUpLoadSQLData: " & ex.Message) End Try @@ -838,7 +858,6 @@ Public Class frmValidator oValue = value Catch ex As Exception MyValidationLogger.Warn("Error in TextBoxLoadSQLData: " & ex.Message) - End Try ElseIf TypeOf control Is Windows.Forms.ComboBox Then Try @@ -863,10 +882,12 @@ Public Class frmValidator Dim dataGridView As GridControl = control Dim oDataSource As DataTable = dataGridView.DataSource - If oDataSource Is Nothing OrElse oDataSource.Rows.Count = 0 Then - Dim oDatatable As DataTable = oDTContent.Clone() + If oDataSource Is Nothing Then + oDataSource = oDTContent.Clone() + End If - For Each oColumn As DataColumn In oDatatable.Columns + If oDataSource.Rows.Count = 0 Then + For Each oColumn As DataColumn In oDTContent.Columns If oDataSource.Columns(oColumn.ColumnName) Is Nothing Then oDataSource.Columns.Add(oColumn.ColumnName, oColumn.DataType) End If @@ -2784,8 +2805,17 @@ Public Class frmValidator Sub Load_Next_Document(first As Boolean) + Dim perfStart As DateTime = DateTime.MinValue + Dim perfLastCheck As DateTime = DateTime.MinValue + If LOG_HOTSPOTS Then + perfStart = DateTime.Now + perfLastCheck = perfStart + MyValidationLogger.Info("[PERF] Load_Next_Document START") + End If + _SqlDataCache.Clear() _SqlScalarCache.Clear() + _SqlControlsByGuid = Nothing CURRENT_WMFILE = Nothing activate_controls(False) oErrMsgMissingInput = "" @@ -2793,9 +2823,10 @@ Public Class frmValidator Override = False OverrideAll = False - 'Me.lblerror.Visible = False _Indexe_Loaded = False MyValidationLogger.Debug("In Load_Next_Document") + + Dim layoutSuspended As Boolean = False Try If first = True Then MyValidationLogger.Debug("First Document") @@ -2804,17 +2835,12 @@ Public Class frmValidator MyValidationLogger.Debug("Following Document ") End If - ' Controls nicht beim ersten Laden leeren If first = False Then + PanelValidatorControl.SuspendLayout() + layoutSuspended = True Clear_all_Input() End If - 'Select Case navtype - ' Case "next" - ' Case "previous" - ' Case "first" - ' Case "last" - 'End Select MyValidationLogger.Debug($"CURRENT_JUMP_DOC_GUID: {CURRENT_JUMP_DOC_GUID}'") If CURRENT_JUMP_DOC_GUID = 0 Then CURRENT_DOC_GUID = Get_Next_GUID() @@ -2822,11 +2848,23 @@ Public Class frmValidator ElseIf first = False Then CURRENT_DOC_GUID = 0 End If + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach Get_Next_GUID: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + MyValidationLogger.Info("LoadNextDocument - Dokument-GUID: '" & CURRENT_DOC_GUID.ToString & "'") If CURRENT_DOC_GUID > 0 Then If (OPERATION_MODE_FS = ClassConstants.OpModeFS_PWM Or OPERATION_MODE_FS = ClassConstants.OpModeFS_IDBWM) And GetDocPathWindows(0) = False Then SetStatusLabel($"File not accessible: {DocPathWindows}", "DarkOrange") End If + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach GetDocPathWindows: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + If IDB_ACTIVE = False Then If CreateWMObject() = False Then Exit Sub @@ -2843,17 +2881,22 @@ Public Class frmValidator End If End If - ' >> >> >> >> >> >>##### Das Dokument in Bearbeitung nehmen ########################### - 'PRTF_PROFILE_FILES_WORK("InWork") + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach CreateWMObject/Load_IDB_DOC_DATA: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + Dim sql = $"UPDATE TBPM_PROFILE_FILES Set IN_WORK = 1, IN_WORK_WHEN = GETDATE(), WORK_USER = '{USER_USERNAME}' WHERE GUID = {CURRENT_DOC_GUID}" DatabaseFallback.ExecuteNonQueryECM(sql) - ' ############ Infos eintragen ################# + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach IN_WORK-UPDATE: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If If Amount_Docs2Validate > 1 Then Dim omsg = String.Format(Translation_Strings.Verbleibende_Vorgänge___0_, Amount_Docs2Validate) bsiInformation.Caption = omsg - bsiInformation.Caption = omsg If RbnPgGrpActions.Visible = False Then RbnPgGrpActions.Visible = True @@ -2872,21 +2915,21 @@ Public Class frmValidator MyValidationLogger.Debug("AllDocInfo created...") If IDB_ACTIVE = False Then oErrMsgMissingInput = Windream_get_Doc_info() - Else - ' oErrorMessage = IDB_GetDocInfo() + End If + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach Windream_get_Doc_info: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now End If Dim oCurrency As String If PROFIL_CURRENCY_ATTRIBUTE <> "" Then oCurrency = GetVariableValuefromSource(PROFIL_CURRENCY_ATTRIBUTE, 1, False) - MyValidationLogger.Debug(String.Format("Read oCurrency from Attribute: {0} is {1}", PROFIL_CURRENCY_ATTRIBUTE, oCurrency)) Else oCurrency = "EUR" - MyValidationLogger.Debug(String.Format("oCurrency by default is {0}", oCurrency)) End If If Not IsNothing(oCurrency) Then DocCurrency = oCurrency - Dim oValueType = DocCurrency.GetType.ToString If IsDBNull(DocCurrency) Then DocCurrency = "EUR" Else @@ -2897,33 +2940,55 @@ Public Class frmValidator DocCurrency = "EUR" End Try End If - Else - MyValidationLogger.Warn($"oCurrency is Nothing - Check PROFIL_CURRENCY_ATTRIBUTE! ") - End If - - - If oErrMsgMissingInput = "" Then If WMDocPathWindows <> String.Empty Or OPERATION_MODE_FS = ClassConstants.OpModeFS_ZF Then - MyValidationLogger.Debug($"Operationmode is {ClassConstants.OpModeFS_ZF}! Initializing Viewer ...") LoadDocument_DDViewer() - MyValidationLogger.Debug("Viewer loaded!!") If Current_Document.Extension <> "pdf" Then bbtniAnnotation.Visibility = BarItemVisibility.Never End If End If + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach LoadDocument_DDViewer: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + FillIndexValues(first) - For Each oControl As Control In PanelValidatorControl.Controls - LoadSQLData(oControl, DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid) - Next + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach FillIndexValues: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If - MyValidationLogger.Debug("Indexmask loaded") + Dim sqlControls As DataRow() = Nothing + If DTCONTROLS_WITH_SQL IsNot Nothing AndAlso DTCONTROLS_WITH_SQL.Rows.Count > 0 Then + sqlControls = DTCONTROLS_WITH_SQL.Select($"PROFIL_ID = {CURRENT_ProfilGUID}") + End If + + If sqlControls IsNot Nothing AndAlso sqlControls.Length > 0 Then + Dim sqlControlIds As New HashSet(Of Integer)() + For Each r As DataRow In sqlControls + Dim controlId As Integer = 0 + If Integer.TryParse(r.Item("GUID").ToString, controlId) Then + sqlControlIds.Add(controlId) + End If + Next + + For Each oControl As Control In PanelValidatorControl.Controls + Dim controlId = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid + If sqlControlIds.Contains(controlId) Then + LoadSQLData(oControl, controlId) + End If + Next + End If + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach LoadSQLData-Loop: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If - 'Nun loggen das das Profil geladen wurde If PROFIL_LOGINDEX <> "" Then Dim oLogString = $"PMProfile loaded: [{CURRENT_ProfilGUID}-{CURRENT_ProfilName}]{PMDelimiter}{USER_USERNAME}{PMDelimiter}{Now.ToString}" If IDB_ACTIVE = False Then @@ -2951,19 +3016,14 @@ Public Class frmValidator Me.Close() End If End If + Try - - - If DocCurrency <> String.Empty Then If DocCurrency.ToString.Length <> 3 Then - MyValidationLogger.Info("DocCurrency-Length = 3 - Setting to EUR") DocCurrency = "EUR" End If - MyValidationLogger.Debug($"DocCurrency = {DocCurrency}") For Each oControl As Control In PanelValidatorControl.Controls Try - Dim oMeta = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata) If TypeOf oControl Is GridControl Then Dim oGrid As GridControl = DirectCast(oControl, GridControl) Dim oControlMeta = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata) @@ -2978,48 +3038,47 @@ Public Class frmValidator settings.MaskExpression = "c" settings.Culture = oCultureInfo End Sub) - riTextEdit.UseMaskAsDisplayFormat = True 'Optional + riTextEdit.UseMaskAsDisplayFormat = True oGrid.RepositoryItems.Add(riTextEdit) Dim oGridView As GridView = DirectCast(oGrid.FocusedView, GridView) For Each oCol As GridColumn In oGridView.Columns - Dim oColumnData As DataRow = oFilteredDatatable. - Select($"SPALTENNAME = '{oCol.FieldName}'"). - FirstOrDefault() - + Dim oColumnData As DataRow = oFilteredDatatable.Select($"SPALTENNAME = '{oCol.FieldName}'").FirstOrDefault() If oColumnData Is Nothing Then Continue For End If - Dim oColumnType As String = oColumnData.Item("TYPE_COLUMN") - - Select Case oColumnType - Case "CURRENCY" - Console.WriteLine("CurrencyFormatNecessary") - oCol.DisplayFormat.FormatType = FormatType.Custom - oCol.ColumnEdit = riTextEdit - End Select + If oColumnType = "CURRENCY" Then + oCol.DisplayFormat.FormatType = FormatType.Custom + oCol.ColumnEdit = riTextEdit + End If Next End If Catch ex As Exception MyValidationLogger.Error(ex) End Try Next - Else - MyValidationLogger.Warn($"DocCurrency is String.empty! ") End If - Catch ex As Exception MyValidationLogger.Warn($"Unexpected error in display format Currency: " & ex.Message) End Try - Try + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach Currency-Format: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + + Try Show_WF_Messages(False) Catch ex As Exception MyValidationLogger.Error(ex) End Try Controls2B_EnDisabled() + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach Show_WF_Messages + Controls2B_EnDisabled: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + End If + MyValidationLogger.Debug("frmValidator: LoadNextDocument finished!") Catch ex As Exception MyValidationLogger.Error(ex) @@ -3027,6 +3086,13 @@ Public Class frmValidator My.Settings.Save() MyValidationLogger.Info("unexpected error in Load_Next_Document: " & ex.Message) frmError.ShowDialog() + Finally + If layoutSuspended Then + PanelValidatorControl.ResumeLayout() + End If + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Load_Next_Document GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") + End If End Try End Sub Sub Show_WF_Messages(pShow As Boolean)