diff --git a/app/TaskFlow/ControlCreator/GridControl.vb b/app/TaskFlow/ControlCreator/GridControl.vb index 7e679f6..4016618 100644 --- a/app/TaskFlow/ControlCreator/GridControl.vb +++ b/app/TaskFlow/ControlCreator/GridControl.vb @@ -352,8 +352,8 @@ Namespace ControlCreator End If Dim oColumnData As DataRow = pColumnDefinition. - Select($"SPALTENNAME = '{pArgs.Column.FieldName}'"). - FirstOrDefault() + Select($"SPALTENNAME = '{pArgs.Column.FieldName}'"). + FirstOrDefault() If oColumnData Is Nothing Then Return @@ -386,25 +386,25 @@ Namespace ControlCreator If affectedRowsCount > 0 AndAlso confirmationEntry.Count < InheritanceMsgAmount Then Dim confirmMessage As String = String.Format( - "Möchten Sie den Wert '{0}' an {1} nachfolgende Zeile(n) vererben?", - valueToApply, - affectedRowsCount) + "Möchten Sie den Wert '{0}' an {1} nachfolgende Zeile(n) vererben?", + valueToApply, + affectedRowsCount) If USER_LANGUAGE <> "de-DE" Then confirmMessage = String.Format( - "Do you want to inherit the value '{0}' to {1} subsequent row(s)?", - valueToApply, - affectedRowsCount) + "Do you want to inherit the value '{0}' to {1} subsequent row(s)?", + valueToApply, + affectedRowsCount) End If Dim confirmTitle As String = "Wertevererbung bestätigen" If USER_LANGUAGE <> "de-DE" Then confirmTitle = "Confirm Value Inheritance" End If Dim result = MessageBox.Show( - confirmMessage, - confirmTitle, - MessageBoxButtons.YesNo, - MessageBoxIcon.Question, - MessageBoxDefaultButton.Button1) + confirmMessage, + confirmTitle, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question, + MessageBoxDefaultButton.Button1) If result <> DialogResult.Yes Then _Logger.Debug("User cancelled value inheritance") @@ -414,9 +414,39 @@ Namespace ControlCreator confirmationEntry.Count += 1 CONFIG.Save() _Logger.Info("User confirmed value inheritance. Confirmation count: {0}", confirmationEntry.Count) + ElseIf affectedRowsCount > 0 AndAlso confirmationEntry.Count = InheritanceMsgAmount Then + ' Schwellenwert erreicht - User fragen, ob er weiterhin gefragt werden möchte + Dim continueAskingMessage As String = "Sie haben diese Bestätigung bereits mehrfach durchgeführt. Möchten Sie in Zukunft weiterhin gefragt werden?" + If USER_LANGUAGE <> "de-DE" Then + continueAskingMessage = "You have confirmed this action multiple times. Do you want to continue being asked in the future?" + End If + Dim continueAskingTitle As String = "Bestätigungen fortsetzen?" + If USER_LANGUAGE <> "de-DE" Then + continueAskingTitle = "Continue Confirmations?" + End If + + Dim continueResult = MessageBox.Show( + continueAskingMessage, + continueAskingTitle, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question, + MessageBoxDefaultButton.Button2) + + If continueResult = DialogResult.Yes Then + ' User möchte weiterhin gefragt werden - Counter zurücksetzen + confirmationEntry.Count = 0 + CONFIG.Save() + _Logger.Info("User wants to continue being asked. Counter reset to 0.") + Else + ' User möchte nicht mehr gefragt werden - Counter erhöhen + confirmationEntry.Count += 1 + CONFIG.Save() + _Logger.Info("User does not want to be asked anymore. Counter increased to {0}.", confirmationEntry.Count) + End If ElseIf affectedRowsCount > 0 Then _Logger.Info("Skipping confirmation dialog (already confirmed {0} times)", confirmationEntry.Count) End If + isApplyingInheritedValue = True Try _Logger.Info(String.Format("Inherit Value is active for column. So inheritting the value [{0}]...", valueToApply)) diff --git a/app/TaskFlow/ModuleRuntimeVariables.vb b/app/TaskFlow/ModuleRuntimeVariables.vb index 4c5bd05..1609192 100644 --- a/app/TaskFlow/ModuleRuntimeVariables.vb +++ b/app/TaskFlow/ModuleRuntimeVariables.vb @@ -143,7 +143,6 @@ Module ModuleRuntimeVariables Public Property CURRENT_DT_PROFILES As DataTable Public Property CURRENT_DT_PROFILE_LANGUAGE As DataTable Public Property CURRENT_DT_PROFILE As DataTable - Public Property CURRENT_CONTROL_NAME_LIST As New List(Of String) diff --git a/app/TaskFlow/frmMain.Designer.vb b/app/TaskFlow/frmMain.Designer.vb index a29306b..75ea101 100644 --- a/app/TaskFlow/frmMain.Designer.vb +++ b/app/TaskFlow/frmMain.Designer.vb @@ -255,6 +255,7 @@ 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" @@ -272,6 +273,7 @@ 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] @@ -291,11 +293,13 @@ 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 @@ -985,7 +989,6 @@ Partial Class frmMain Me.DocumentViewerBarManager1.DockControls.Add(Me.barDockControlBottom) Me.DocumentViewerBarManager1.DockControls.Add(Me.barDockControlLeft) Me.DocumentViewerBarManager1.DockControls.Add(Me.barDockControlRight) - Me.DocumentViewerBarManager1.DockWindowTabFont = New System.Drawing.Font("Microsoft Sans Serif", 7.8!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.DocumentViewerBarManager1.Form = Me Me.DocumentViewerBarManager1.ImageStream = CType(resources.GetObject("DocumentViewerBarManager1.ImageStream"), DevExpress.Utils.ImageCollectionStreamer) Me.DocumentViewerBarManager1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.PrintPreviewStaticItem1, Me.ProgressBarEditItem1, Me.PrintPreviewBarItem1, Me.PrintPreviewStaticItem2, Me.ZoomTrackBarEditItem1, Me.bbiDocumentMap, Me.bbiParameters, Me.bbiThumbnails, Me.bbiFind, Me.bbiHighlightEditingFields, Me.bbiCustomize, Me.bbiOpen, Me.bbiSave, Me.bbiPrint, Me.bbiPrintDirect, Me.bbiPageSetup, Me.bbiEditPageHF, Me.bbiScale, Me.bbiHandTool, Me.bbiMagnifier, Me.bbiZoomOut, Me.bbiZoom, Me.bbiZoomIn, Me.bbiShowFirstPage, Me.bbiShowPrevPage, Me.bbiShowNextPage, Me.bbiShowLastPage, Me.bbiMultiplePages, Me.bbiFillBackground, Me.bbiWatermark, Me.bbiExportFile, Me.bbiSendFile, Me.bbiClosePreview, Me.miFile, Me.miView, Me.miBackground, Me.miPageLayout, Me.miPageLayoutFacing, Me.miPageLayoutContinuous, Me.miToolbars, Me.PrintPreviewBarCheckItem1, Me.PrintPreviewBarCheckItem2, Me.PrintPreviewBarCheckItem3, Me.PrintPreviewBarCheckItem4, Me.PrintPreviewBarCheckItem5, Me.PrintPreviewBarCheckItem6, Me.PrintPreviewBarCheckItem7, Me.PrintPreviewBarCheckItem8, Me.PrintPreviewBarCheckItem9, Me.PrintPreviewBarCheckItem10, Me.PrintPreviewBarCheckItem11, Me.PrintPreviewBarCheckItem12, Me.PrintPreviewBarCheckItem13, Me.PrintPreviewBarCheckItem14, Me.PrintPreviewBarCheckItem15, Me.PrintPreviewBarCheckItem16, Me.PrintPreviewBarCheckItem17, Me.PrintPreviewBarCheckItem18, Me.PrintPreviewBarCheckItem19}) diff --git a/app/TaskFlow/frmMain.resx b/app/TaskFlow/frmMain.resx index 95fed6a..ef593f4 100644 --- a/app/TaskFlow/frmMain.resx +++ b/app/TaskFlow/frmMain.resx @@ -125,7 +125,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADw - CAAAAk1TRnQBSQFMAgEBAgEAAXgBCwF4AQsBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAAYABCwGAAQsBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -176,9 +176,12 @@ Fill + + 4, 4, 4, 4 + - 233, 24 + 285, 30 Microsoft Sans Serif, 8.25pt @@ -186,6 +189,9 @@ Segoe UI, 12pt + + 4, 4, 4, 4 + Aktualisieren @@ -1496,9 +1502,39 @@ 0, 0 + + 4, 4, 4, 4 + + + Allgemein + + + Auswertungen + + + Verwaltung + + + Grundeinstellungen + + + Workflow + + + Funktionen/App Start + + + Ad Hoc Workflows + Start + + Funktionen + + + Workflow Tabelle + Tabelle @@ -1506,13 +1542,16 @@ Aktionen - 1178, 158 + 1440, 194 - 0, 666 + 0, 841 + + + 4, 4, 4, 4 - 1178, 22 + 1440, 28 RibbonStatusBar1 @@ -1539,7 +1578,7 @@ 4 - 945, 484 + 1155, 617 10 @@ -1556,6 +1595,27 @@ 0 + + True + + + Tahoma, 9.75pt, style=Bold + + + 4, 4 + + + 4, 0, 4, 0 + + + 169, 21 + + + 0 + + + Choose a profile ... + lblCaptionMainGrid @@ -1572,10 +1632,13 @@ Top - 233, 0 + 285, 0 + + + 4, 4, 4, 4 - 945, 24 + 1155, 30 9 @@ -1647,8 +1710,14 @@ 863, 17 + + 261, 26 + + + Starte Validierung für Profil + - 220, 30 + 262, 30 cmsNavPane @@ -1778,11 +1847,14 @@ 0, 0 + + 4, 4, 4, 4 + - 233 + 285 - 233, 508 + 285, 647 5 @@ -1809,10 +1881,13 @@ Tahoma, 9pt - 0, 158 + 0, 194 + + + 4, 4, 4, 4 - 1178, 508 + 1440, 647 4 @@ -1829,69 +1904,6 @@ 2 - - Allgemein - - - Auswertungen - - - Verwaltung - - - Grundeinstellungen - - - Workflow - - - Funktionen/App Start - - - 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 - 17, 56 @@ -1901,8 +1913,29 @@ 250, 56 + + 348, 30 + + + Popup Erinnerung deaktivieren + + + 345, 6 + + + 348, 30 + + + In den Vordergrund + + + 348, 30 + + + Out of Range - Fenster wiederherstellen + - 291, 100 + 349, 100 ContextMenuNotifyIcon @@ -1996,27 +2029,6 @@ True - - 290, 30 - - - Popup Erinnerung deaktivieren - - - 287, 6 - - - 290, 30 - - - In den Vordergrund - - - 290, 30 - - - Out of Range - Fenster wiederherstellen - 605, 17 @@ -2042,10 +2054,13 @@ Bottom - 0, 688 + 0, 869 + + + 4, 4, 4, 4 - 1178, 0 + 1440, 0 barDockControlBottom @@ -2065,8 +2080,11 @@ 0, 0 + + 4, 4, 4, 4 + - 0, 688 + 0, 869 barDockControlLeft @@ -2084,10 +2102,13 @@ Right - 1178, 0 + 1440, 0 + + + 4, 4, 4, 4 - 0, 688 + 0, 869 barDockControlRight @@ -2108,10 +2129,10 @@ 147 - 9, 19 + 11, 24 - 1178, 688 + 1440, 869 Tahoma, 12pt @@ -2283,7 +2304,7 @@ - 4, 5, 4, 5 + 5, 6, 5, 6 Manual @@ -3444,9 +3465,6 @@ &Ansicht - - &Hintergrund - &Seiten Layout @@ -3459,6 +3477,9 @@ Bars + + &Hintergrund + PDF Dokument @@ -3573,8 +3594,11 @@ Graphisches Dokument + + 4, 4, 4, 4 + - 1178, 0 + 1440, 0 barDockControlTop diff --git a/app/TaskFlow/frmMain.vb b/app/TaskFlow/frmMain.vb index b7bb1e6..07d2544 100644 --- a/app/TaskFlow/frmMain.vb +++ b/app/TaskFlow/frmMain.vb @@ -799,6 +799,7 @@ Public Class frmMain Sub LoadNavBar() Dim profileGroupOpen As Boolean = False If Not IsNothing(CurrNavBarGroup) Then + NavBarControl1.BeginUpdate() ' <-- Hinzufügen Try profileGroupOpen = CurrNavBarGroup.Expanded Try @@ -810,8 +811,10 @@ Public Class frmMain End Try Catch ex As Exception - + Finally + NavBarControl1.EndUpdate() ' <-- Hinzufügen End Try + End If Try diff --git a/app/TaskFlow/frmValidator.resx b/app/TaskFlow/frmValidator.resx index 903053f..e43e940 100644 --- a/app/TaskFlow/frmValidator.resx +++ b/app/TaskFlow/frmValidator.resx @@ -488,6 +488,24 @@ 4, 4, 4, 4 + + Top, Bottom, Left, Right + + + Segoe UI, 8.25pt + + + 8, 72 + + + 4, 4, 4, 4 + + + 823, 279 + + + 3 + PanelValidatorControl @@ -500,6 +518,31 @@ 0 + + Top, Left, Right + + + Segoe UI, 9.75pt + + + + None + + + 8, 41 + + + 4, 4, 4, 4 + + + 824, 32 + + + 1 + + + LabelControl1 + DESCRIPTIONLabel @@ -512,6 +555,30 @@ 2 + + Top, Left, Right + + + Segoe UI, 12pt, style=Bold + + + None + + + 6, 6 + + + 4, 4, 4, 4 + + + 824, 35 + + + 1 + + + LabelControl1 + TITLELabel1 @@ -623,109 +690,6 @@ 0 - - Top, Bottom, Left, Right - - - Segoe UI, 8.25pt - - - 8, 72 - - - 4, 4, 4, 4 - - - 823, 279 - - - 3 - - - PanelValidatorControl - - - DevExpress.XtraEditors.XtraScrollableControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - - - pnlMain - - - 0 - - - Top, Left, Right - - - Segoe UI, 9.75pt - - - - None - - - 8, 41 - - - 4, 4, 4, 4 - - - 824, 32 - - - 1 - - - LabelControl1 - - - DESCRIPTIONLabel - - - DevExpress.XtraEditors.LabelControl, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - - - pnlMain - - - 2 - - - Top, Left, Right - - - Segoe UI, 12pt, style=Bold - - - None - - - 6, 6 - - - 4, 4, 4, 4 - - - 824, 35 - - - 1 - - - LabelControl1 - - - TITLELabel1 - - - DevExpress.XtraEditors.LabelControl, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - - - pnlMain - - - 3 - 1514, 26 @@ -1315,6 +1279,39 @@ 4, 4, 4, 4 + + Datei + + + Daten + + + Aktionen + + + Hinweise + + + Anhänge + + + Anhänge zu Beleg + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAALdEVYdFRpdGxlAEluZm87bRIthgAAASZJREFUWEfN + l7ERwjAMRZmAinFeT8cMDMAgbENLyRZ0dKxAG+5zhAuKBDYOiOLd5YykPBJbdmZd180yGQ38mscF8I45 + sAK2wB44AZc7utaYflOMYm3+EzUCC2ADHICuEMUqR7m2XpXAEtg5NyhFuaph6xYJrIGjU7QW1VCtKgEl + nJ1in6JaTxKvBPTIpvjnFtV8vI5IQJOm5Z2/Q7VvEzMS0My1SVOje7gCWrvFS63PG+SPYgJ0j7knoAZi + g0MaBMTKE1AXs4EhjQJbT0Ct1AaGNArsPQH1cxsY0ihw8gS0qdjAkEaBy18KpL+C9EmYvgyrGlEjbiNK + b8WieDNqEAg3I5G+HYvUA0lP6pFsKDHFk/joUNqTeizvSf0wGfLdT7MsRgO/5go/tJcKezdCSgAAAABJ + RU5ErkJggg== + + + + Information + Start @@ -2207,39 +2204,6 @@ Zoom - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFpEZXZFeHByZXNzLlV0aWxzLnYyMS4yLCBWZXJzaW9uPTIxLjIu - NC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFlE - ZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURldkV4cHJlc3MuVXRpbHMuU3VwZXJUb29s - VGlwBwAAAA1BbGxvd0h0bWxUZXh0EUZpeGVkVG9vbFRpcFdpZHRoCkl0ZW1zQ291bnQJaXRlbVR5cGUw - BWl0ZW0wCWl0ZW1UeXBlMQVpdGVtMQQAAAQEBAQfRGV2RXhwcmVzcy5VdGlscy5EZWZhdWx0Qm9vbGVh - bgMAAAABCCVEZXZFeHByZXNzLlV0aWxzLlN1cGVyVG9vbFRpcEl0ZW1UeXBlAgAAACFEZXZFeHByZXNz - LlV0aWxzLlRvb2xUaXBUaXRsZUl0ZW0CAAAAJURldkV4cHJlc3MuVXRpbHMuU3VwZXJUb29sVGlwSXRl - bVR5cGUCAAAAHERldkV4cHJlc3MuVXRpbHMuVG9vbFRpcEl0ZW0CAAAAAgAAAAX8////H0RldkV4cHJl - c3MuVXRpbHMuRGVmYXVsdEJvb2xlYW4BAAAAB3ZhbHVlX18ACAMAAAACAAAAAAIAAAAF+////yVEZXZF - eHByZXNzLlV0aWxzLlN1cGVyVG9vbFRpcEl0ZW1UeXBlAQAAAAd2YWx1ZV9fAAgCAAAAAQAAAAkGAAAA - Afn////7////AAAAAAkIAAAADAkAAABRU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4wLjAuMCwgQ3Vs - dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQYAAAAhRGV2RXhwcmVz - cy5VdGlscy5Ub29sVGlwVGl0bGVJdGVtBwAAAA1BbGxvd0h0bWxUZXh0BEljb24MSW1hZ2VPcHRpb25z - CkxlZnRJbmRlbnQITWF4V2lkdGgST3duZXJBbGxvd0h0bWxUZXh0BFRleHQEBAQAAAABH0RldkV4cHJl - c3MuVXRpbHMuRGVmYXVsdEJvb2xlYW4DAAAAE1N5c3RlbS5EcmF3aW5nLkljb24JAAAAKERldkV4cHJl - c3MuVXRpbHMuVG9vbFRpcEl0ZW1JbWFnZU9wdGlvbnMCAAAACAgBAgAAAAH2/////P///wIAAAAKCQsA - AAAAAAAAiwEAAAAGDAAAAARab29tBQgAAAAcRGV2RXhwcmVzcy5VdGlscy5Ub29sVGlwSXRlbQcAAAAN - QWxsb3dIdG1sVGV4dARJY29uDEltYWdlT3B0aW9ucwpMZWZ0SW5kZW50CE1heFdpZHRoEk93bmVyQWxs - b3dIdG1sVGV4dARUZXh0BAQEAAAAAR9EZXZFeHByZXNzLlV0aWxzLkRlZmF1bHRCb29sZWFuAwAAABNT - eXN0ZW0uRHJhd2luZy5JY29uCQAAAChEZXZFeHByZXNzLlV0aWxzLlRvb2xUaXBJdGVtSW1hZ2VPcHRp - b25zAgAAAAgIAQIAAAAB8/////z///8CAAAACgkOAAAAAAAAAIsBAAAABg8AAAApw4RuZGVybiBkZXIg - Wm9vbS1TdHVmZSBkZXMgUERGLURva3VtZW50cy4FCwAAAChEZXZFeHByZXNzLlV0aWxzLlRvb2xUaXBJ - dGVtSW1hZ2VPcHRpb25zBQAAAAhJbWFnZVVyaQxTdmdJbWFnZVNpemUJQWxpZ25tZW50CkltYWdlSW5k - ZXgTSW1hZ2VUb1RleHREaXN0YW5jZQEEBAAAE1N5c3RlbS5EcmF3aW5nLlNpemUJAAAAJkRldkV4cHJl - c3MuVXRpbHMuVG9vbFRpcEltYWdlQWxpZ25tZW50AgAAAAgIAgAAAAYQAAAAAAXv////E1N5c3RlbS5E - cmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgJAAAAAAAAAAAAAAAF7v///yZEZXZFeHByZXNz - LlV0aWxzLlRvb2xUaXBJbWFnZUFsaWdubWVudAEAAAAHdmFsdWVfXwAIAgAAAAAAAAD/////DgAAAAEO - AAAACwAAAAkQAAAAAe3////v////AAAAAAAAAAAB7P///+7///8AAAAA/////w4AAAAL - - 10 % @@ -2282,6 +2246,39 @@ sichtbare einpassen + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFpEZXZFeHByZXNzLlV0aWxzLnYyMS4yLCBWZXJzaW9uPTIxLjIu + NC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFlE + ZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURldkV4cHJlc3MuVXRpbHMuU3VwZXJUb29s + VGlwBwAAAA1BbGxvd0h0bWxUZXh0EUZpeGVkVG9vbFRpcFdpZHRoCkl0ZW1zQ291bnQJaXRlbVR5cGUw + BWl0ZW0wCWl0ZW1UeXBlMQVpdGVtMQQAAAQEBAQfRGV2RXhwcmVzcy5VdGlscy5EZWZhdWx0Qm9vbGVh + bgMAAAABCCVEZXZFeHByZXNzLlV0aWxzLlN1cGVyVG9vbFRpcEl0ZW1UeXBlAgAAACFEZXZFeHByZXNz + LlV0aWxzLlRvb2xUaXBUaXRsZUl0ZW0CAAAAJURldkV4cHJlc3MuVXRpbHMuU3VwZXJUb29sVGlwSXRl + bVR5cGUCAAAAHERldkV4cHJlc3MuVXRpbHMuVG9vbFRpcEl0ZW0CAAAAAgAAAAX8////H0RldkV4cHJl + c3MuVXRpbHMuRGVmYXVsdEJvb2xlYW4BAAAAB3ZhbHVlX18ACAMAAAACAAAAAAIAAAAF+////yVEZXZF + eHByZXNzLlV0aWxzLlN1cGVyVG9vbFRpcEl0ZW1UeXBlAQAAAAd2YWx1ZV9fAAgCAAAAAQAAAAkGAAAA + Afn////7////AAAAAAkIAAAADAkAAABRU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4wLjAuMCwgQ3Vs + dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQYAAAAhRGV2RXhwcmVz + cy5VdGlscy5Ub29sVGlwVGl0bGVJdGVtBwAAAA1BbGxvd0h0bWxUZXh0BEljb24MSW1hZ2VPcHRpb25z + CkxlZnRJbmRlbnQITWF4V2lkdGgST3duZXJBbGxvd0h0bWxUZXh0BFRleHQEBAQAAAABH0RldkV4cHJl + c3MuVXRpbHMuRGVmYXVsdEJvb2xlYW4DAAAAE1N5c3RlbS5EcmF3aW5nLkljb24JAAAAKERldkV4cHJl + c3MuVXRpbHMuVG9vbFRpcEl0ZW1JbWFnZU9wdGlvbnMCAAAACAgBAgAAAAH2/////P///wIAAAAKCQsA + AAAAAAAAiwEAAAAGDAAAAARab29tBQgAAAAcRGV2RXhwcmVzcy5VdGlscy5Ub29sVGlwSXRlbQcAAAAN + QWxsb3dIdG1sVGV4dARJY29uDEltYWdlT3B0aW9ucwpMZWZ0SW5kZW50CE1heFdpZHRoEk93bmVyQWxs + b3dIdG1sVGV4dARUZXh0BAQEAAAAAR9EZXZFeHByZXNzLlV0aWxzLkRlZmF1bHRCb29sZWFuAwAAABNT + eXN0ZW0uRHJhd2luZy5JY29uCQAAAChEZXZFeHByZXNzLlV0aWxzLlRvb2xUaXBJdGVtSW1hZ2VPcHRp + b25zAgAAAAgIAQIAAAAB8/////z///8CAAAACgkOAAAAAAAAAIsBAAAABg8AAAApw4RuZGVybiBkZXIg + Wm9vbS1TdHVmZSBkZXMgUERGLURva3VtZW50cy4FCwAAAChEZXZFeHByZXNzLlV0aWxzLlRvb2xUaXBJ + dGVtSW1hZ2VPcHRpb25zBQAAAAhJbWFnZVVyaQxTdmdJbWFnZVNpemUJQWxpZ25tZW50CkltYWdlSW5k + ZXgTSW1hZ2VUb1RleHREaXN0YW5jZQEEBAAAE1N5c3RlbS5EcmF3aW5nLlNpemUJAAAAJkRldkV4cHJl + c3MuVXRpbHMuVG9vbFRpcEltYWdlQWxpZ25tZW50AgAAAAgIAgAAAAYQAAAAAAXv////E1N5c3RlbS5E + cmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgJAAAAAAAAAAAAAAAF7v///yZEZXZFeHByZXNz + LlV0aWxzLlRvb2xUaXBJbWFnZUFsaWdubWVudAEAAAAHdmFsdWVfXwAIAgAAAAAAAAD/////DgAAAAEO + AAAACwAAAAkQAAAAAe3////v////AAAAAAAAAAAB7P///+7///8AAAAA/////w4AAAAL + + BarButtonItem1 @@ -2300,39 +2297,6 @@ 232, 128 - - Datei - - - Daten - - - Aktionen - - - Hinweise - - - Anhänge - - - Anhänge zu Beleg - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAALdEVYdFRpdGxlAEluZm87bRIthgAAASZJREFUWEfN - l7ERwjAMRZmAinFeT8cMDMAgbENLyRZ0dKxAG+5zhAuKBDYOiOLd5YykPBJbdmZd180yGQ38mscF8I45 - sAK2wB44AZc7utaYflOMYm3+EzUCC2ADHICuEMUqR7m2XpXAEtg5NyhFuaph6xYJrIGjU7QW1VCtKgEl - nJ1in6JaTxKvBPTIpvjnFtV8vI5IQJOm5Z2/Q7VvEzMS0My1SVOje7gCWrvFS63PG+SPYgJ0j7knoAZi - g0MaBMTKE1AXs4EhjQJbT0Ct1AaGNArsPQH1cxsY0ihw8gS0qdjAkEaBy18KpL+C9EmYvgyrGlEjbiNK - b8WieDNqEAg3I5G+HYvUA0lP6pFsKDHFk/joUNqTeizvSf0wGfLdT7MsRgO/5go/tJcKezdCSgAAAABJ - RU5ErkJggg== - - - - Information - RibbonPage2 diff --git a/app/TaskFlow/frmValidator.vb b/app/TaskFlow/frmValidator.vb index d07dc8e..e8394b7 100644 --- a/app/TaskFlow/frmValidator.vb +++ b/app/TaskFlow/frmValidator.vb @@ -29,7 +29,7 @@ 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 @@ -124,8 +124,9 @@ Public Class frmValidator Private listofControls As New List(Of String) Private frmMessages As frmValidator_Messages - - Private Class S + Private ReadOnly _SqlDataCache As New Dictionary(Of String, DataTable)(StringComparer.OrdinalIgnoreCase) + Private ReadOnly _SqlScalarCache As New Dictionary(Of String, Object)(StringComparer.OrdinalIgnoreCase) + Private Class Translation_Strings Inherits My.Resources.frmValidator_Strings End Class @@ -316,6 +317,15 @@ Public Class frmValidator _step = 6 MyValidationLogger.Debug("Step 6") + Dim profileLangAll = CURRENT_DT_PROFILE_LANGUAGE.AsEnumerable(). + GroupBy(Function(r) r.Field(Of String)("TITLE")). + ToDictionary(Function(g) g.Key, Function(g) g.First()) + + Dim profileLangUser = CURRENT_DT_PROFILE_LANGUAGE.AsEnumerable(). + Where(Function(r) r.Field(Of String)("LANGUAGE") = USER_LANGUAGE). + GroupBy(Function(r) r.Field(Of String)("TITLE")). + ToDictionary(Function(g) g.Key, Function(g) g.First()) + ' === MESSPUNKT 6: Profile-Properties verarbeiten === For Each oProfileRow As DataRow In CURRENT_DT_PROFILE.Rows PROFIL_FINISH_SQL = oProfileRow.Item("SQL_BTN_FINISH") @@ -334,28 +344,28 @@ Public Class frmValidator perfLastCheck = DateTime.Now End If - ' === MESSPUNKT 7: Language-Strings laden (potentiell langsam) === + ' === MESSPUNKT 7: Language-Strings laden (optimiert) === Dim oProfileTitle As String = "" Dim oProfileDescription As String = "" - For Each oRow As DataRow In CURRENT_DT_PROFILE_LANGUAGE.Rows - Console.WriteLine(oRow.Item("TITLE")) - If oRow.Item("TITLE") = $"PROFILE_TITLE{CURRENT_ProfilGUID}" Then - oProfileTitle = oRow.Item("STRING1") - ElseIf oRow.Item("TITLE") = $"PROFILE_DESCRIPTION{CURRENT_ProfilGUID}" Then - oProfileDescription = oRow.Item("STRING1") - ElseIf oRow.Item("TITLE") = $"PROFILE_FINAL_TEXT{CURRENT_ProfilGUID}" And oRow.Item("LANGUAGE") = USER_LANGUAGE Then - If oRow.Item("STRING1") <> "" Then - oProfileFinalText = oRow.Item("STRING1") - End If - ElseIf oRow.Item("TITLE") = $"PROFILE_REJECTION_CAPT{CURRENT_ProfilGUID}" Then - oProfileRejectionText = oRow.Item("STRING1") - ElseIf oRow.Item("TITLE") = $"PROFILE_NOT_RESPONSIBLE_CAPT{CURRENT_ProfilGUID}" And oRow.Item("LANGUAGE") = USER_LANGUAGE Then - oProfileNotResponsibleText = oRow.Item("STRING1") - ElseIf oRow.Item("TITLE") = $"PROFILE_NOT_RESPONSIBLE_QUEST{CURRENT_ProfilGUID}" And oRow.Item("LANGUAGE") = USER_LANGUAGE Then - oProfileNotResponsibleQuestion = oRow.Item("STRING1") - End If - Next + Dim titleKey = $"PROFILE_TITLE{CURRENT_ProfilGUID}" + Dim descKey = $"PROFILE_DESCRIPTION{CURRENT_ProfilGUID}" + Dim finalKey = $"PROFILE_FINAL_TEXT{CURRENT_ProfilGUID}" + Dim rejectKey = $"PROFILE_REJECTION_CAPT{CURRENT_ProfilGUID}" + Dim notRespKey = $"PROFILE_NOT_RESPONSIBLE_CAPT{CURRENT_ProfilGUID}" + Dim notRespQKey = $"PROFILE_NOT_RESPONSIBLE_QUEST{CURRENT_ProfilGUID}" + + Dim row As DataRow = Nothing + + If profileLangAll.TryGetValue(titleKey, row) Then oProfileTitle = row.Item("STRING1") + If profileLangAll.TryGetValue(descKey, row) Then oProfileDescription = row.Item("STRING1") + If profileLangAll.TryGetValue(rejectKey, row) Then oProfileRejectionText = row.Item("STRING1") + + If profileLangUser.TryGetValue(finalKey, row) Then + If row.Item("STRING1").ToString <> "" Then oProfileFinalText = row.Item("STRING1") + End If + If profileLangUser.TryGetValue(notRespKey, row) Then oProfileNotResponsibleText = row.Item("STRING1") + If profileLangUser.TryGetValue(notRespQKey, row) Then oProfileNotResponsibleQuestion = row.Item("STRING1") If LOG_HOTSPOTS Then MyValidationLogger.Info($"[PERF] Nach Language-Loop ({CURRENT_DT_PROFILE_LANGUAGE.Rows.Count} Rows): {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") @@ -556,7 +566,6 @@ Public Class frmValidator End Try End Sub - Private Sub frmValidation_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Try _FormClosing = True @@ -583,24 +592,20 @@ Public Class frmValidator End Try Try - Dim oDel = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID}" + Dim oSQL As String + If CURRENT_DOC_GUID <> 0 Then + oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" & vbNewLine & + $"UPDATE TBPM_PROFILE_FILES Set IN_WORK = 0, IN_WORK_WHEN = NULL, WORK_USER = NULL WHERE GUID = {CURRENT_DOC_GUID};" + Else + oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" + End If - DatabaseFallback.ExecuteNonQueryECM(oDel) + DatabaseFallback.ExecuteNonQueryECM(oSQL) Catch ex As Exception MyValidationLogger.Error(ex) MsgBox("Error in delete jumped files:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try - If CURRENT_DOC_GUID <> 0 Then - Try - Dim sql = $"UPDATE TBPM_PROFILE_FILES Set IN_WORK = 0, IN_WORK_WHEN = NULL, WORK_USER = NULL WHERE GUID = {CURRENT_DOC_GUID}" - DatabaseFallback.ExecuteNonQueryECM(sql) - 'PRTF_PROFILE_FILES_WORK("FreeFile") - - Catch ex As Exception - MyValidationLogger.Error(ex) - End Try - End If Reset_CurrentReferences() Try @@ -764,10 +769,6 @@ Public Class frmValidator Dim oGUID As String = row.Item("GUID") Dim oReadOnly As Boolean = row.Item("READ_ONLY") MyValidationLogger.Debug($"LoadSQLData for Control [{name}] with GUID [{oGUID}] ...") - 'If clsPatterns.HasComplexPatterns(row.Item("SQL_UEBERPRUEFUNG")) Then - ' Logger.Debug($"SQL [{row.Item("SQL_UEBERPRUEFUNG")}] has complex patterns - GUID: {oGUID}") - ' Continue For - 'End If If oReadOnly = True Then MyValidationLogger.Debug("Control for Index [{0}] is read-only. Continuing.") @@ -786,15 +787,9 @@ Public Class frmValidator Dim oSQLStatement As String = row.Item("SQL_UEBERPRUEFUNG") Dim oConnectionId As Integer = row.Item("CONNECTION_ID") - 'If clsPatterns.HasComplexPatterns(sqlStatement) Then - ' Continue For - 'End If If IsNothing(oSQLStatement) Then Continue For End If - 'oSql = clsPatterns.ReplaceUserValues(sqlStatement, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, CURRENT_CLICKED_PROFILE_ID) - 'oSql = clsPatterns.ReplaceInternalValues(oSql) - oSQLStatement = clsPatterns.ReplaceAllValues(oSQLStatement, PanelValidatorControl, True) If IsNothing(oSQLStatement) Then @@ -805,18 +800,22 @@ Public Class frmValidator Continue For End If - Dim oDTContent As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSQLStatement, DatabaseType.ECM) With { - .ConnectionId = oConnectionId - }) + Dim oDTContent As DataTable = Nothing + Dim cacheKey = $"{oConnectionId}|{oSQLStatement}" - If IsNothing(oDTContent) Then - MyValidationLogger.Warn($"SQL-Query [{oSQLStatement}] for control {control.Name} is invalid.") - Exit Sub + 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 End If + Dim oValue - ' Because LookupControl is a subtype of TextEdit, - ' we need to check for LookupControl first! If TypeOf control Is LookupControl3 Then Try Dim lookup As LookupControl3 = control @@ -865,13 +864,10 @@ Public Class frmValidator Dim oDataSource As DataTable = dataGridView.DataSource If oDataSource Is Nothing OrElse oDataSource.Rows.Count = 0 Then - 'dataGridView.DataSource = dt - Dim oDatatable As DataTable = oDTContent.Clone() For Each oColumn As DataColumn In oDatatable.Columns If oDataSource.Columns(oColumn.ColumnName) Is Nothing Then - 'oDataSource.Columns.Add(oColumn) oDataSource.Columns.Add(oColumn.ColumnName, oColumn.DataType) End If Next @@ -1343,10 +1339,9 @@ Public Class frmValidator Try Dim CONTROL_ID = DirectCast(oTextBox.Tag, ClassControlCreator.ControlMetadata).Guid Dim oSql = String.Format("SELECT NAME, CONNECTION_ID, SQL_UEBERPRUEFUNG FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} AND SQL_UEBERPRUEFUNG LIKE '%{1}%'", CURRENT_ProfilGUID, oTextBox.Name) - Dim DTCONTROLS_UEBP As DataTable - DTCONTROLS_UEBP = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS_SQL_UEP", New GetDatatableOptions(oSql, DatabaseType.ECM) With { - .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID} AND SQL_UEBERPRUEFUNG LIKE '%{oTextBox.Name}%'" - }) + Dim oFilter = $"PROFIL_ID = {CURRENT_ProfilGUID} AND SQL_UEBERPRUEFUNG LIKE '%{oTextBox.Name}%'" + + Dim DTCONTROLS_UEBP As DataTable = GetControlMetaBySql("TBPM_PROFILE_CONTROLS_SQL_UEP", oSql, oFilter) If Not IsNothing(DTCONTROLS_UEBP) AndAlso DTCONTROLS_UEBP.Rows.Count > 0 Then For Each oRow As DataRow In DTCONTROLS_UEBP.Rows @@ -1366,9 +1361,7 @@ Public Class frmValidator MyValidationLogger.Error(ex) MyValidationLogger.Info("Unexpected Error in Display SQL result for control: " & oRow.Item("NAME") & " - ERROR: " & ex.Message) End Try - Next - End If ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER) @@ -1549,9 +1542,9 @@ Public Class frmValidator Try Dim CONTROL_ID = DirectCast(dgv.Tag, ClassControlCreator.ControlMetadata).Guid Dim sql = String.Format("select NAME,CONNECTION_ID,SQL_UEBERPRUEFUNG FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, dgv.Name) - Dim DT As DataTable = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS", New GetDatatableOptions(sql, DatabaseType.ECM) With { - .FilterExpression = String.Format("CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, dgv.Name) - }) + Dim oFilter = String.Format("CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, dgv.Name) + + Dim DT As DataTable = GetControlMetaBySql("TBPM_PROFILE_CONTROLS", sql, oFilter) If Not IsNothing(DT) And DT.Rows.Count > 0 Then For Each ROW As DataRow In DT.Rows @@ -1561,39 +1554,32 @@ Public Class frmValidator Dim sql_Statement = ROW.Item("SQL_UEBERPRUEFUNG") Dim cellvalue = dgv.Rows(dgv.Rows.Count - 2).Cells(0).Value.ToString() sql_Statement = sql_Statement.ToString.Replace(dgv.Name, cellvalue) - 'Dim resultDT: DataTable = ClassDatabase.Return_Datatable_ConId(sql_Statement, ROW.Item(1), $"oControlID[{CONTROL_ID}") - Dim resultDT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(sql_Statement, DatabaseType.ECM) With { - .ConnectionId = ROW.Item("CONNECTION_ID") - }) + + 'Dim resultDT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(sql_Statement, DatabaseType.ECM) With { + ' .ConnectionId = ROW.Item("CONNECTION_ID") + '}) + Dim resultDT As DataTable = GetCachedDatatable(sql_Statement, ROW.Item("CONNECTION_ID")) If resultDT.Rows.Count >= 1 Then - 'Nur dediziert einen Wert zurückerhalten For Each row1 As DataRow In resultDT.Rows Dim result = row1.Item(0) If Not IsNothing(result) Then PanelValidatorControl.Controls(displayboxname).Text = result.ToString - Exit For Else PanelValidatorControl.Controls(displayboxname).Text = "RESULT = NOTHING" - Exit For End If Next Else PanelValidatorControl.Controls(displayboxname).Text = "NO RESULT" - End If - - End If Catch ex As Exception MyValidationLogger.Error(ex) MyValidationLogger.Info("Unexpected Error in Display SQL result for control: " & ROW.Item(0).ToString & " - ERROR: " & ex.Message) End Try - Next - End If Catch ex As Exception @@ -1749,9 +1735,7 @@ Public Class frmValidator oControlDataSql = clsPatterns.ReplaceAllValues(oControlDataSql, PanelValidatorControl, True) - Dim oControlDataResult As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oControlDataSql, DatabaseType.ECM) With { - .ConnectionId = oConnectionId - }) + Dim oControlDataResult As DataTable = GetCachedDatatable(oControlDataSql, oConnectionId) If oControlDataResult Is Nothing Then Exit Sub @@ -1962,9 +1946,10 @@ Public Class frmValidator oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True) _DependingControl_In_Action = True 'Dim oDTDEPENDING_RESULT As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oRowDependingControl.Item("CONNECTION_ID"), $"LookupControl_DependingControls - oControlID: {oControlID}") - Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With { - .ConnectionId = oRowDependingControl.Item("CONNECTION_ID") - }) + 'Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With { + ' .ConnectionId = oRowDependingControl.Item("CONNECTION_ID") + '}) + Dim oDTDEPENDING_RESULT As DataTable = GetCachedDatatable(oSqlCommand, oRowDependingControl.Item("CONNECTION_ID")) If Not IsNothing(oDTDEPENDING_RESULT) Then Try Dim oFound As Boolean = False @@ -2090,11 +2075,10 @@ Public Class frmValidator oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True) _DependingControl_In_Action = True MyValidationLogger.Debug($"_DependingControl_In_Action: Control {oDEPENDING_CtrlName} ...") - 'Dim oDTDEPENDING_RESULT As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oRowDependingControl.Item("CONNECTION_ID"), $"CheckBox_DependingControls - oControlID: {oControlID}") - Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With { - .ConnectionId = oRowDependingControl.Item("CONNECTION_ID") - }) - + 'Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With { + ' .ConnectionId = oRowDependingControl.Item("CONNECTION_ID") + '}) + Dim oDTDEPENDING_RESULT As DataTable = GetCachedDatatable(oSqlCommand, oRowDependingControl.Item("CONNECTION_ID")) Try Dim oFound As Boolean = False 'Dim oDependingLookup As LookupControl3 = pnldesigner.Controls.Find(oDEPENDING_CtrlName, False).FirstOrDefault() @@ -2211,11 +2195,10 @@ Public Class frmValidator _DependingColumn_In_Action = True Try - 'Dim oDTDEPENDING_RESULT As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oCONNID, $"LookupControl_DependingColumn - oDEPENDING_CONTROL_ID: {oDEPENDING_CONTROL_ID}") - Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With { - .ConnectionId = oCONNID - }) - + 'Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With { + ' .ConnectionId = oCONNID + '}) + Dim oDTDEPENDING_RESULT As DataTable = GetCachedDatatable(oSqlCommand, oCONNID) If Not IsNothing(oDTDEPENDING_RESULT) Then MyValidationLogger.Debug($"Trying to fill the DropDown (DC) for ControlID [{oDEPENDING_CONTROL_ID}]..RowCount: [{oDTDEPENDING_RESULT.Rows.Count}] ") For Each oControl As Control In PanelValidatorControl.Controls @@ -2284,7 +2267,6 @@ Public Class frmValidator Public Sub OnCmbselectedIndex(sender As System.Object, e As System.EventArgs) Dim oCombobox As Windows.Forms.ComboBox = sender If oCombobox.SelectedIndex <> -1 And _Indexe_Loaded = True Then - ' Dirty-Flag setzen Dim oMeta As ClassControlCreator.ControlMetadata = oCombobox.Tag oMeta.IsDirty = True MyValidationLogger.Debug($"ComboBox [{oMeta.Name}] marked as dirty") @@ -2294,9 +2276,10 @@ Public Class frmValidator Try Dim CONTROL_ID = DirectCast(oCombobox.Tag, ClassControlCreator.ControlMetadata).Guid Dim sql = String.Format("select NAME,CONNECTION_ID,SQL_UEBERPRUEFUNG FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} AND SQL_UEBERPRUEFUNG LIKE '%{1}%'", CURRENT_ProfilGUID, oCombobox.Name) - Dim DT As DataTable = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS", New GetDatatableOptions(sql, DatabaseType.ECM) With { - .FilterExpression = String.Format("CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, oCombobox.Name) - }) + Dim oFilter = String.Format("CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, oCombobox.Name) + + Dim DT As DataTable = GetControlMetaBySql("TBPM_PROFILE_CONTROLS", sql, oFilter) + If Not IsNothing(DT) And DT.Rows.Count > 0 Then If _DependingControl_In_Action = True Then Exit Sub @@ -2318,7 +2301,6 @@ Public Class frmValidator Depending_Control_Set_Result(displayboxname, sql_Statement, ROW.Item(1)) _Step = 5 _DependingControl_In_Action = False - End If Catch ex As Exception MyValidationLogger.Error(ex) @@ -2372,8 +2354,10 @@ Public Class frmValidator Dim oConnectionId As Integer = oRowEnablingControl.Item("CONNECTION_ID") Dim oENABLERESULT As Boolean = False - oENABLERESULT = DatabaseFallback.GetScalarValueWithConnection(oSqlCommand, oConnectionId) - + Dim oResult = GetCachedScalar(oSqlCommand, oConnectionId) + If oResult IsNot Nothing AndAlso Not IsDBNull(oResult) Then + oENABLERESULT = CBool(oResult) + End If Try Dim oFound As Boolean = False @@ -2444,14 +2428,11 @@ Public Class frmValidator If oENABLE_GUID = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid Then MyValidationLogger.Debug($"Found the Control on panel which needs to be checked [{oENABLE_GUID}]...") - 'Dim oSqlCommand = IIf(IsDBNull(oRowEnablingControl.Item("SQL_ENABLE_ON_LOAD")), "", oRowEnablingControl.Item("SQL_ENABLE_ON_LOAD")) - 'Dim oConID = oRowEnablingControl.Item("SQL_ENABLE_ON_LOAD_CONID") - Dim oConnectionId As Integer = oRowEnablingControl.ItemEx("CONNECTION_ID", 0) Dim oSqlCommand = oRowEnablingControl.ItemEx("SQL_ENABLE_ON_LOAD", String.Empty) oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True) - Dim oResult = DatabaseFallback.GetScalarValueWithConnection(oSqlCommand, oConnectionId) + Dim oResult = GetCachedScalar(oSqlCommand, oConnectionId) Try MyValidationLogger.Debug($"Result of Enable SQL [{oResult}]...") @@ -2547,6 +2528,48 @@ Public Class frmValidator End If End If End Sub + Private Function GetControlMetaBySql(tableName As String, sql As String, filter As String) As DataTable + Dim dt As DataTable = Nothing + Dim cacheKey = $"META|{tableName}|{sql}|{filter}" + + If Not _SqlDataCache.TryGetValue(cacheKey, dt) Then + dt = DatabaseFallback.GetDatatable(tableName, New GetDatatableOptions(sql, DatabaseType.ECM) With { + .FilterExpression = filter + }) + If dt IsNot Nothing Then + _SqlDataCache(cacheKey) = dt + End If + End If + + Return dt + End Function + Private Function GetCachedDatatable(sql As String, connectionId As Integer) As DataTable + Dim dt As DataTable = Nothing + Dim cacheKey = $"{connectionId}|{sql}" + + If Not _SqlDataCache.TryGetValue(cacheKey, dt) Then + dt = DatabaseFallback.GetDatatable(New GetDatatableOptions(sql, DatabaseType.ECM) With { + .ConnectionId = connectionId + }) + If dt IsNot Nothing Then + _SqlDataCache(cacheKey) = dt + End If + End If + + Return dt + End Function + + Private Function GetCachedScalar(sql As String, connectionId As Integer) As Object + Dim result As Object = Nothing + Dim cacheKey = $"SCALAR|{connectionId}|{sql}" + + If Not _SqlScalarCache.TryGetValue(cacheKey, result) Then + result = DatabaseFallback.GetScalarValueWithConnection(sql, connectionId) + _SqlScalarCache(cacheKey) = result + End If + + Return result + End Function Private Function CheckValueExists(ByVal control As Control) Try @@ -2696,26 +2719,37 @@ Public Class frmValidator Dim oResult As String - WMDocPathWindows = String.Empty If OPERATION_MODE_FS <> ClassConstants.OpModeFS_ZF Then - Dim oSQL = $"SELECT dbo.FNPM_GET_FILEPATH ({CURRENT_DOC_GUID},{_CheckStandard})" - oResult = DatabaseFallback.GetScalarValueECM(oSQL) - MyValidationLogger.Debug($"First Checking file [{oResult}] exists?...") - If File.Exists(oResult) = False Then + Dim oSQL = $"SELECT dbo.FNPM_GET_FILEPATH({CURRENT_DOC_GUID},{_CheckStandard}) AS PATH0, dbo.FNPM_GET_FILEPATH({CURRENT_DOC_GUID},1) AS PATH1" + Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL) + + If oDT Is Nothing OrElse oDT.Rows.Count = 0 Then + MyValidationLogger.Warn("GetDocPathWindows: No result for file paths!") + Return False + End If + + Dim path0 = ObjectEx.NotNull(oDT.Rows(0).Item("PATH0"), String.Empty).ToString + Dim path1 = ObjectEx.NotNull(oDT.Rows(0).Item("PATH1"), String.Empty).ToString + + MyValidationLogger.Debug($"First Checking file [{path0}] exists?...") + + If path0 <> String.Empty AndAlso File.Exists(path0) Then + oResult = path0 + Else MyValidationLogger.Info($"Getting filepath with standard 1 ...") - oSQL = $"SELECT [dbo].[FNPM_GET_FILEPATH] ({CURRENT_DOC_GUID},1)" - oResult = DatabaseFallback.GetScalarValueECM(oSQL) - MyValidationLogger.Debug($"Second Checking file [{oResult}] exists?...") - If File.Exists(oResult) = False Then - MyValidationLogger.Info($"Second FileExists also returned false [{oResult}]!") - DocPathWindows = oResult - MyValidationLogger.Warn($"GetDocPathWindows: File [{oResult}] not existing!") + MyValidationLogger.Debug($"Second Checking file [{path1}] exists?...") + If path1 <> String.Empty AndAlso File.Exists(path1) Then + oResult = path1 + Else + MyValidationLogger.Info($"Second FileExists also returned false [{path1}]!") + DocPathWindows = path1 + MyValidationLogger.Warn($"GetDocPathWindows: File [{path1}] not existing!") Return False End If End If - DocPathWindows = oResult + DocPathWindows = oResult Else oResult = ClassConstants.OpModeFS_ZF MyValidationLogger.Debug($"GetDocPathWindows: Filestore is {ClassConstants.OpModeFS_ZF}") @@ -2750,7 +2784,8 @@ Public Class frmValidator Sub Load_Next_Document(first As Boolean) - + _SqlDataCache.Clear() + _SqlScalarCache.Clear() CURRENT_WMFILE = Nothing activate_controls(False) oErrMsgMissingInput = "" @@ -2816,7 +2851,7 @@ Public Class frmValidator ' ############ Infos eintragen ################# If Amount_Docs2Validate > 1 Then - Dim omsg = String.Format(S.Verbleibende_Vorgänge___0_, Amount_Docs2Validate) + Dim omsg = String.Format(Translation_Strings.Verbleibende_Vorgänge___0_, Amount_Docs2Validate) bsiInformation.Caption = omsg bsiInformation.Caption = omsg @@ -2908,7 +2943,7 @@ Public Class frmValidator errormessage = oErrMsgMissingInput frmError.ShowDialog() Else - Dim oMsg = S.Ende_des_Profils___Keine_weiteren_Vorgänge + Dim oMsg = Translation_Strings.Ende_des_Profils___Keine_weiteren_Vorgänge MyValidationLogger.Info(oMsg) MyValidationLogger.Debug(oMsg) activate_controls(True) @@ -4335,6 +4370,10 @@ Public Class frmValidator End Sub Private Function ForceGridValidation() + Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing) + Dim perfLastCheck As DateTime = perfStart + If LOG_HOTSPOTS Then MyValidationLogger.Info("[PERF] ForceGridValidation START") + Dim oValidation As Boolean = True Dim oGrids = (From oControl In PanelValidatorControl.Controls Where TypeOf oControl Is GridControl @@ -4357,11 +4396,23 @@ Public Class frmValidator MyValidationLogger.Debug("Validation of Grid [{0}] ended with Result: [{1}]", oGrid.Name, oValidation) + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Grid {oGrid.Name}: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + If oValidation = False Then + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] ForceGridValidation ABORT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") + End If Return False End If Next + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] ForceGridValidation GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") + End If + Return True End Function @@ -4460,6 +4511,7 @@ Public Class frmValidator Return False End Try End Function + Sub Finish_WFStep(Optional includeFI As Boolean = True) btnSave.Enabled = False MyValidationLogger.Debug("Abschluss für DocID " & CURRENT_DOC_ID & " wird gestartet ...") @@ -5235,7 +5287,7 @@ Public Class frmValidator Case oControl.GetType = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType = GetType(MemoEdit) Try - Dim oWrongInputMessage = S.Falsche_Eingabe + Dim oWrongInputMessage = Translation_Strings.Falsche_Eingabe Dim oDevexpressTextEdit As DevExpress.XtraEditors.TextEdit = oControl MyValidationLogger.Debug("Validating Textbox..") @@ -5986,20 +6038,37 @@ Public Class frmValidator End Sub Sub Datei_ueberspringen() + Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing) + Dim perfLastCheck As DateTime = perfStart + If LOG_HOTSPOTS Then MyValidationLogger.Info("[PERF] Datei_ueberspringen START") + Try MyValidationLogger.Debug("Skipping document....(Datei_ueberspringen)") - 'Das Dokument freigeben - 'PRTF_PROFILE_FILES_WORK("FreeFile") - Dim sql = $"UPDATE TBPM_PROFILE_FILES Set IN_WORK = 0, IN_WORK_WHEN = NULL, WORK_USER = NULL WHERE GUID = {CURRENT_DOC_GUID}" - DatabaseFallback.ExecuteNonQueryECM(sql) - Dim oSQL = $"EXECUTE PRPM_FILES_NOT_INDEXED '{USER_USERNAME}',{CURRENT_ProfilGUID},'{WMDocPathWindows}',{CURRENT_DOC_GUID}" + Dim oSQL = $"UPDATE TBPM_PROFILE_FILES SET IN_WORK = 0, IN_WORK_WHEN = NULL, WORK_USER = NULL WHERE GUID = {CURRENT_DOC_GUID};" & vbNewLine & + $"EXECUTE PRPM_FILES_NOT_INDEXED '{USER_USERNAME}',{CURRENT_ProfilGUID},'{WMDocPathWindows}',{CURRENT_DOC_GUID};" + DatabaseFallback.ExecuteNonQueryECM(oSQL) + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach UPDATE+PRPM_FILES_NOT_INDEXED: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + MyValidationLogger.Debug($"Skipped DocGUID {CURRENT_DOC_GUID}") Load_Next_Document(False) + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach Load_Next_Document: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + End If + Catch ex As Exception MyValidationLogger.Error(ex) MsgBox("Fehler bei Überspringen:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) + Finally + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Datei_ueberspringen GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") + End If End Try End Sub Private Function PRTF_PROFILE_FILES_WORK(ByVal pMode As String) As Boolean @@ -6164,7 +6233,7 @@ Public Class frmValidator My.Settings.Save() End Sub Private Sub btnSave_MouseHover(sender As Object, e As EventArgs) - ToolTip1.Show(S.F2_für_Speichern, btnSave) + ToolTip1.Show(Translation_Strings.F2_für_Speichern, btnSave) End Sub Sub Reload_Controls(SingleAttribute As String) @@ -6232,7 +6301,7 @@ Public Class frmValidator Private Sub bbtniRefresh_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniRefresh.ItemClick Reload_Controls("") Try - btnSave.Text = S.Speichern___Nächster_Vorgang__F2_ + btnSave.Text = Translation_Strings.Speichern___Nächster_Vorgang__F2_ Catch ex As Exception End Try @@ -6241,9 +6310,32 @@ Public Class frmValidator End Sub Private Sub bbtniNext_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniNext.ItemClick + Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing) + Dim perfLastCheck As DateTime = perfStart + If LOG_HOTSPOTS Then MyValidationLogger.Info("[PERF] bbtniNext_ItemClick START") + If ForceGridValidation() = True Then + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach ForceGridValidation: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + Reset_CurrentReferences() + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach Reset_CurrentReferences: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + perfLastCheck = DateTime.Now + End If + Datei_ueberspringen() + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] Nach Datei_ueberspringen: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms") + End If + End If + + If LOG_HOTSPOTS Then + MyValidationLogger.Info($"[PERF] bbtniNext_ItemClick GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") End If End Sub @@ -6266,7 +6358,7 @@ Public Class frmValidator If ForceGridValidation() = True Then Dim oRESULT As String 'oRESULT = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("InputSaved") - oRESULT = S.Eingaben_gespeichert + oRESULT = Translation_Strings.Eingaben_gespeichert If Check_UpdateIndexe() = True Then SetStatusLabel($"Data saved", "LimeGreen")