Imports System.ComponentModel Imports System.Globalization Imports System.IO Imports System.Threading Imports System.Threading.Tasks Imports DevExpress.LookAndFeel Imports DevExpress.Utils Imports DevExpress.XtraBars.Ribbon Imports DevExpress.XtraExport.Helpers Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Columns Imports DevExpress.XtraGrid.Views.BandedGrid Imports DevExpress.XtraGrid.Views.Base Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Views.Grid.ViewInfo Imports DevExpress.XtraNavBar Imports DevExpress.XtraPrinting Imports DevExpress.XtraSplashScreen Imports DigitalData.GUIs.Common Imports DigitalData.Modules.Base Imports DigitalData.Modules.EDMI.API.Constants Imports DigitalData.Modules.EDMI.API.DatabaseWithFallback Imports DigitalData.Modules.Windream Imports DigitalData.Modules.ZooFlow Imports GdPicture.Internal.CAD.DWG.Entities Public Class frmMain Private Property FormHelper As FormHelper Private UserLoggedin As Integer = 0 Private CURR_DT_VWPM_PROFILE_ACTIVE As DataTable Private CURR_DT_VWPM_PROFILE_AH_WORKFLOW As DataTable Private DT_CURR_WF_ITEMS As DataTable Private OVERVIEW_ADDED_WHEN As String Private OVERVIEW_CHANGED_WHEN As String Private OVERVIEW_COUNT As Integer = 0 Private RedDocuments As Integer = 0 Private YellowDocuments As Integer = 0 Private GreenDocuments As Integer = 0 Private GridViewItem_Clicked = Nothing Private GridCursorLocation As System.Drawing.Point Private GRID_LOAD_TYPE As String = "OVERVIEW" Private GRID_INV_COL_REMOVED As Boolean = False Private NO_WORKFLOWITEMS As Boolean = False Private InResetlayout As Boolean = False Private RefreshHelper As RefreshHelper Private _FormValidator As frmValidator Private FormOpenClose As Boolean = False Private FormShown As Boolean = False Private GridIsLoaded As Boolean = False Private OverviewOrDEtail As String = "OVERVIEW" Private GridBuilder As GridBuilder Private allgFunk As New ClassAllgemeineFunktionen Private _Init As New ClassInit Private CurrNavBarGroup As NavBarGroup 'Private DataASorDB As ClassDataASorDB Private DT_CHECKUSER_MODULE As DataTable Private NOTIFICATIONS_DT As DataTable Private IsFilterMode As Boolean Private DetailLinkActive As Boolean = False Private FRONTEND_ACTION As String = "NONE" Private Ev_Filter_Panel_Closed As Boolean = False Private _overlayActive As Boolean = False Dim omsgOpenWorkflow As String Dim omsgTitleWarning As String Dim omsgTitleAttention As String Private Const FullFilepatColName = "FULL_FILE_PATH" Private Const FA_NONE = "NONE" Public Const NAVBAR_CLICKED = "NAVBAR LINK CLICKED" Private Class S Inherits My.Resources.frmMain_Strings End Class Private Function GET_LAST_ADDED(pDatatable As DataTable) As String Dim oADDED As String Try If IsNothing(pDatatable) Then oADDED = "NOTHING" ElseIf LAST_ADDED_COLUMN = FA_NONE Then oADDED = Now.ToShortTimeString.ToString Else Dim result As Object result = pDatatable.Compute($"MAX({LAST_ADDED_COLUMN})", "") oADDED = result End If Catch ex As Exception oADDED = "Exception" End Try Return oADDED End Function Private Function GET_LAST_CHANGED(pDatatable As DataTable) As String Dim oCHANGED As String Try If IsNothing(pDatatable) Then oCHANGED = "NOTHING" ElseIf LAST_EDITED_COLUMN = FA_NONE Then oCHANGED = Now.ToShortTimeString.ToString Else Dim result As Object result = pDatatable.Compute($"MAX({LAST_EDITED_COLUMN})", "") oCHANGED = result End If Catch ex As Exception oCHANGED = "Exception" End Try Return oCHANGED End Function Public Sub SaveInheritanceConfirmationsToDatabase() Try LOGGER.Debug("Saving inheritance confirmations to database for user {0}", USER_ID.ToString) Dim entries = UserInheritance_ConfirmationByColumn If entries Is Nothing OrElse entries.Count = 0 Then LOGGER.Debug("No confirmation entries to save") Return End If For Each entry As UserInheritanceConfirmation In entries Dim keyName As String = $"INHERITANCE_CONFIRM_{entry.ColumnName.ToUpperInvariant()}" Dim valueText As String = entry.Count.ToString() SaveOrUpdateKeyValuePair(keyName, valueText) Next LOGGER.Debug("Successfully saved {0} confirmation entries", entries.Count) Catch ex As Exception LOGGER.Error("Error saving inheritance confirmations to database") LOGGER.Error(ex) End Try End Sub Private Sub SaveOrUpdateKeyValuePair(keyName As String, valueText As String) Try ' Prüfen ob der Eintrag bereits existiert Dim oSQL As String = String.Format("DECLARE @Out_PK_ID bigint EXECUTE [dbo].[PRDD_TBDD_USER_KEY_VALUE_PAIR_Upsert] {0} ,'{1}' ,'{2}' ,{3} ,@Out_PK_ID OUTPUT;", USER_ID, keyName, valueText, USER_MODULE_ID) If DatabaseFallback.ExecuteNonQueryECM(oSQL) Then LOGGER.Debug("Saved/Updated key-value pair: {0} = {1}", keyName, valueText) End If Catch ex As Exception LOGGER.Error("Error saving key-value pair for key {0}", keyName) LOGGER.Error(ex) End Try End Sub Private Sub frmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing Try FormOpenClose = True ' Position und Größe speichern My.Settings.frmMainSize = Me.Size My.Settings.frmMainPosition = Me.Location My.Settings.Save() Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Error in Save FormLayout: " & ex.Message) End Try SaveInheritanceConfirmationsToDatabase() If IDB_ACTIVE = False Then Try If WINDREAM?.oSession?.aLoggedin = True Then WINDREAM.Stop_WMCC_andCo() End If Catch ex As Exception End Try End If If INACTIVITYRecognized Then Exit Sub End If Try ClassAllgemeineFunktionen.LoginOut("LOGOUT") LOGGER.Info("taskFLOW closed - " & Now, False) Catch ex As Exception LOGGER.Error(ex) End Try End Sub Private Sub frmMain_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp Select Case e.KeyCode Case Keys.F12 frmLicense.ShowDialog() End Select End Sub Private Sub frmMain_Load(sender As Object, e As System.EventArgs) Handles Me.Load FormOpenClose = True LOGGER.Debug("Initializing MainForm....") GridBuilder = New GridBuilder(GridViewWorkflows) GridBuilder.WithFontSizeDelta(CONFIG.Config.GridFontSizeDelta) Dim oFontSettings = New List(Of FontSetting) From { New FontSetting With {.Title = S.Kleiner, .Value = -2}, New FontSetting With {.Title = S.Normal, .Value = 0}, New FontSetting With {.Title = S.Größer, .Value = 2} } cmbGridFontSize.Items.Clear() cmbGridFontSize.Items.AddRange(oFontSettings) barItemGridFontSize.EditValue = oFontSettings. Where(Function(item) item.Value = CONFIG.Config.GridFontSizeDelta). FirstOrDefault() ' Create helper to save/load expanded GroupColumns at runtime RefreshHelper = New RefreshHelper(LOGCONFIG, GridViewWorkflows, "GUID") omsgOpenWorkflow = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("WorkflowIsActive1") omsgTitleWarning = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("MsgboxTitleWarning") omsgTitleAttention = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("MsgboxTitleAttention") Dim oVErsion = My.Application.Info.Version.ToString 'String.Format("{0}.{1}.{2}", My.Application.Info.Version.Major, My.Application.Info.Version.Minor, My.Application.Info.Version.Build) BSIVERSION1.Caption = oVErsion If ERROR_STATE = "NO DB-CONNECTION" Or ERROR_STATE = "FAILED DBCONNECTION" Then MsgBox(S.Bitte_konfigurieren_Sie_eine_Datenbankverbindung_, MsgBoxStyle.Critical, "Fehlende Konfiguration:") frmKonfig.ShowDialog() End If Try If CultureInfo.CurrentUICulture.ThreeLetterISOLanguageName = "eng" Then LOGGER.Info("## CurrentUICulture.Name: " & CultureInfo.CurrentUICulture.Name, False) INDEX_DMS_ERSTELLT = "DMS Created" INDEX_DMS_ERSTELLT_ZEIT = "DMS Created Time" My.Settings.Save() End If Try Dim oCultureInfo As System.Globalization.CultureInfo oCultureInfo = New System.Globalization.CultureInfo(USER_LANGUAGE) oCultureInfo.DateTimeFormat.ShortDatePattern = USER_DATE_FORMAT Thread.CurrentThread.CurrentCulture = oCultureInfo Thread.CurrentThread.CurrentUICulture = oCultureInfo CultureInfo.DefaultThreadCurrentCulture = oCultureInfo CultureInfo.DefaultThreadCurrentUICulture = oCultureInfo Catch ex As Exception End Try Catch ex As Exception LOGGER.Error(ex) MessageBox.Show("Error loading CurrentUICulture-Info!", "Attention:", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try Try 'DataASorDB = New ClassDataASorDB If User.IsAdmin = True Then 'Dim oCaption As String = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("NumberLicenses") 'bsiLicenses.Caption = $"{oCaption} {LICENSE_COUNT}" Dim oCaption As String = String.Format(S.Anzahl_Lizenzen___0_, LICENSE_COUNT) bsiLicenses.Caption = oCaption bsiLicenses.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Else bsiLicenses.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If LOGGER.Debug("Initializing MainForm....") If ERROR_STATE = "NO USER" Then Dim oDT As DataTable = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("No Userconfig") MsgBox(oDT.Rows(0).Item("STRING1") & vbNewLine & oDT.Rows(0).Item("STRING2"), MsgBoxStyle.Critical, "Exception") Me.Close() ElseIf USER_IN_MODULE = False Then If USER_IS_ADMIN = False Then Dim oDT As DataTable = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("No Module Configuration") MsgBox(oDT.Rows(0).Item("STRING1") & vbNewLine & oDT.Rows(0).Item("STRING2"), MsgBoxStyle.Critical, "Exception") Me.Close() End If ElseIf SYS_LOCKED_MAINTENANCE = True Then Dim msg = $"Wegen Wartungsarbeiten ist der Zugriff auf den Workflow aktuell gesperrt!" & vbNewLine & "Vielen Dank für Ihre Geduld!" If USER_LANGUAGE <> "de-DE" Then msg = $"Due to maintenance work, access to the workflow is currently blocked!" & vbNewLine & "Thank You for Your patience!" End If MsgBox(msg, MsgBoxStyle.Exclamation, ADDITIONAL_TITLE) Me.Close() Else LOGGER.Info("Username: " & USER_USERNAME, False) 'Wenn license abgelaufen und der User nicht admin ist! If LICENSE_EXPIRED = True Then If USER_IS_ADMIN = False Then MsgBox("License expired or invalid!" & vbNewLine & "Please contact the AdminTeam!", MsgBoxStyle.Critical, "Attention:") Me.Close() End If End If If USER_IS_ADMIN = True Then RibbonPageGroup3.Visible = True 'Anzahl der eingeloggten User bsiUserLoggedIn.Visibility = DevExpress.XtraBars.BarItemVisibility.Always 'Dim oCaption As String = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("NumberUserLoggedIn") 'bsiUserLoggedIn.Caption = $"{oCaption} {USERCOUNT_LOGGED_IN}" Dim oCaption As String = String.Format(S.Anzahl_angemeldete_Benutzer___0_, USERCOUNT_LOGGED_IN) bsiUserLoggedIn.Caption = oCaption If GHOSTMODE_ACTIVE = True Then bbtnitmGhostMode.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Else bbtnitmGhostMode.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If Else RibbonPageGroup3.Visible = False bsiUserLoggedIn.Visibility = DevExpress.XtraBars.BarItemVisibility.Never bbtnitmGhostMode.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If If MONITORING_ACTIVE = False Then RibbonPageGroup2.Visible = False Else RibbonPageGroup2.Visible = True End If Try If SEARCH1 <> String.Empty Then Dim oindex = SEARCH1.IndexOf("~") Dim oCaption = SEARCH1.Substring(0, oindex) Dim oCommand = SEARCH1.Replace(oCaption + "~", "") SearchItem1.Caption = oCaption SearchItem1.Tag = oCommand SearchItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Always RibbonPageGroup4.Visible = True End If Catch ex As Exception End Try Try If SEARCH2 <> String.Empty Then Dim oindex = SEARCH2.IndexOf("~") Dim oCaption = SEARCH2.Substring(0, oindex) Dim oCommand = SEARCH2.Replace(oCaption + "~", "") SearchItem2.Caption = oCaption SearchItem2.Tag = oCommand SearchItem2.Visibility = DevExpress.XtraBars.BarItemVisibility.Always RibbonPageGroup4.Visible = True End If Catch ex As Exception End Try If START_CW = True Then Dim oPath Select Case START_CW_LOC_VARIANT Case "-1" oPath = Directory.GetParent(Application.StartupPath).ToString Case "0" oPath = Application.StartupPath.ToString End Select oPath &= "\easyFLOW\easyFLOW.exe" If File.Exists(oPath) Then bbtniCW.Caption = START_CW_CAPTION bbtniCW.Tag = oPath bbtniCW.Visibility = DevExpress.XtraBars.BarItemVisibility.Always RibbonPageGroup4.Visible = True Else LOGGER.Warn($"Error in CW-Button init: Could not find CW.Exe {oPath}") End If End If End If Catch ex As Exception LOGGER.Error(ex) MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Error in User Check:") End Try bsiUser.Caption = USER_USERNAME GetBaseData("Load") Try If TimerRefresh.Enabled = False Then TimerRefresh.Start() End If Timer5Mins.Start() Catch ex As Exception LOGGER.Error(ex) MsgBox("Unexpected Error in LoadForm - Step 4: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:") End Try LoadNavBar() AddHandler NavBarControl1.LinkClicked, AddressOf navBar_LinkClicked If Not IsNothing(CURR_DT_VWPM_PROFILE_AH_WORKFLOW) Then If CURR_DT_VWPM_PROFILE_AH_WORKFLOW.Rows.Count > 0 And LIC_MODULES.Contains("MOD_AdhocWorkflow_BlindFile") Then RibbonPageGroupAHW.Visible = True Dim OCounter As Integer = 1 For Each oRow As DataRow In CURR_DT_VWPM_PROFILE_AH_WORKFLOW.Rows Select Case OCounter Case 1 BbtnitmAHWF1.Caption = oRow.Item("TITLE") BbtnitmAHWF1.Visibility = DevExpress.XtraBars.BarItemVisibility.Always BbtnitmAHWF1.Tag = oRow.Item("GUID") Case 2 BbtnitmAHWF2.Caption = oRow.Item("TITLE") BbtnitmAHWF2.Visibility = DevExpress.XtraBars.BarItemVisibility.Always BbtnitmAHWF2.Tag = oRow.Item("GUID") Case 3 BbtnitmAHWF3.Caption = oRow.Item("TITLE") BbtnitmAHWF3.Visibility = DevExpress.XtraBars.BarItemVisibility.Always BbtnitmAHWF3.Tag = oRow.Item("GUID") Case 4 End Select OCounter += 1 Next Else LOGGER.Info($"NO ADHOC-WFs Blindfiles ({CURR_DT_VWPM_PROFILE_AH_WORKFLOW.Rows.Count}) or License AHWF_NoBlindFile not integrated...") End If Else LOGGER.Debug("NO ADHOC-WFs Blindfiles (Nothing)...") End If Try If SHOW_CHARTS = True Then If BASEDATA_DT_CHARTS.Rows.Count = 0 Then LOGGER.Debug("No Charts: BASEDATA_DT_CHARTS.RowCount = 0") bbtnitDashboardInv.Visibility = DevExpress.XtraBars.BarItemVisibility.Never Else LOGGER.Debug($"We got Charts: {BASEDATA_DT_CHARTS.Rows.Count}") bbtnitDashboardInv.Visibility = DevExpress.XtraBars.BarItemVisibility.Always End If Else LOGGER.Debug("No Charts: SHOW_CHARTS = False") bbtnitDashboardInv.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If Catch ex As Exception LOGGER.Warn($"Could not load Charts: {ex.Message}") End Try If MONITORING_ACTIVE = False Then bbtniMonitor.Visibility = DevExpress.XtraBars.BarItemVisibility.Never Else bbtniMonitor.Visibility = DevExpress.XtraBars.BarItemVisibility.Always End If Check_Timer_Notification() Timer_Inactivity_Reset_Disable("FormLoad") 'Restore_Form_Position() Dim oSavedPosition As System.Drawing.Point = My.Settings.frmMainPosition ' Prüfen, ob die Position sichtbar ist If IsPositionVisible(oSavedPosition) Then ' Position ist sichtbar, das Formular wird dort angezeigt ScreenEx.RestoreFormPosition(Me, My.Settings.frmMainPosition) ScreenEx.RestoreFormState(Me, My.Settings.frmMainWindowState) ScreenEx.RestoreFormSize(Me, My.Settings.frmMainSize) Else ' Position ist unsichtbar, Standardposition verwenden Me.StartPosition = FormStartPosition.CenterScreen End If If IDB_ACTIVE = False And ERROR_STATE = "" Then Try If Init_windream() = True Then WINDREAM.Start_WMCC_andCo() BarButtonItemFileLink.Visibility = DevExpress.XtraBars.BarItemVisibility.Always If Not IsNothing(WINDREAM.oSession) Then If WINDREAM.oSession.aLoggedin = False Then LOGGER.Warn("⚠️ You could not be logged in to windream") MsgBox(S.Es_ist_keine_Windream_Session_vorhanden__Bitte_überprüfen_Sie_das_Log_, MsgBoxStyle.Critical) End If Else LOGGER.Warn("⚠️ Login on windream was not possible.") MsgBox(S.Es_ist_keine_Windream_Session_vorhanden__Bitte_überprüfen_Sie_das_Log_, MsgBoxStyle.Critical) End If End If Catch ex As Exception LOGGER.Error(ex) MsgBox("Unexpected Error in windream-login - Step 5: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:") End Try Else BarButtonItemFileLink.Visibility = DevExpress.XtraBars.BarItemVisibility.Never SOURCE_INIT = Init_IDB() If SOURCE_INIT = True Then Dim oSQL = $"SELECT SQL_COMMAND FROM TBDD_SQL_COMMANDS WITH (NOLOCK) WHERE TITLE = 'PM_IDB_DOC_DATA'" Dim DTIDB_DOC_DATA_SQL = DatabaseFallback.GetDatatable("TBDD_SQL_COMMANDS", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = "TITLE = 'PM_IDB_DOC_DATA'" }) IDB_DOC_DATA_SQL = DTIDB_DOC_DATA_SQL.Rows(0).Item("SQL_COMMAND") LOGGER.Debug($"Got the IDB_DOC_DATA_SQL..{IDB_DOC_DATA_SQL}") End If bsiGeneralInfo.Caption = S.IDB_Aktiv End If If EDMIAppServerActive = True Then BarStaticItemAppServer.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Else BarStaticItemAppServer.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If If BASIC_CONF_VISIBLE = False Then RibbonPageGroupBasicConf.Visible = False barbtnitmsaveLogfiles.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Else RibbonPageGroupBasicConf.Visible = True End If If MAINFORM_CREATE_LOG_FILES = True Then barbtnitmsaveLogfiles.Visibility = DevExpress.XtraBars.BarItemVisibility.Always End If If EXCEL_OVERVIEW = True Then BarButtonItemExportExcel.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Else BarButtonItemExportExcel.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If If BASEDATA_DT_LANGUAGE.Rows.Count > 1 Then bbtnitmLanguage_Change.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Else bbtnitmLanguage_Change.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If LoadCURRENT_DT_PROFILES() LoadVWPM_CONTROL_INDEX() LOGGER.Debug("MainForm initialized!") FormOpenClose = False End Sub Private Function IsPositionVisible(position As System.Drawing.Point) As Boolean For Each scr As Screen In Screen.AllScreens If scr.WorkingArea.Contains(position) Then Return True ' Punkt ist auf diesem Bildschirm sichtbar End If Next Return False ' Punkt ist außerhalb aller sichtbaren Bereiche End Function Public Class FontSetting Public Property Title As String Public Property Value As Integer Public Overrides Function ToString() As String Return Title End Function End Class Sub Check_Timer_Notification() Try If CONFIG.Config.ReminderTimer <> 0 Then TimerReminder.Stop() TimerReminder.Interval = CONFIG.Config.ReminderTimer * 60000 TimerReminder.Start() Else TimerReminder.Enabled = False TimerReminder.Stop() End If Catch ex As Exception LOGGER.Error(ex) End Try End Sub Public Sub Timer_Inactivity_Reset_Disable(pTrigger As String) Try If Timer5Mins_running = True Or TimerRefresh_running = True Or FormShown = False Then Exit Sub End If If INACTIVITY_DURATION <> 0 Then TimerInactivity.Enabled = False TimerInactivity.Stop() TimerInactivity.Interval = INACTIVITY_DURATION * 60000 TimerInactivity.Enabled = True TimerInactivity.Start() bsiInactivityCheck.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Dim StartTime As DateTime = #12:00:00 AM# Dim oStarttime As DateTime = Now oStarttime = oStarttime.AddMinutes(INACTIVITY_DURATION) If LOGCONFIG.Debug = False Then pTrigger = "" Else pTrigger = $"({pTrigger})" End If bsiInactivityCheck.Caption = String.Format(S.Nächste_Aktivitätsüberprüfung___0___1_, oStarttime.ToShortTimeString, pTrigger) Else TimerInactivity.Enabled = False TimerInactivity.Stop() bsiInactivityCheck.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If Catch ex As Exception LOGGER.Error(ex) End Try End Sub Sub Restore_Form_Position() Try 'Sind Werte hinterlegt? If My.Settings.frmMainPosition.IsEmpty = False Then If My.Settings.frmMainPosition.X > 0 And My.Settings.frmMainPosition.Y > 0 Then If Not My.Settings.frmMainSize.IsEmpty Then If My.Settings.frmMainWindowState = "Normal" Then Dim oisonscreen = IsOnScreen(My.Settings.frmMainPosition, My.Settings.frmMainSize) If oisonscreen = False Then Me.StartPosition = FormStartPosition.CenterScreen Exit Sub Else ' Gespeicherte Werte verwenden Me.Location = Screen.AllScreens(UBound(Screen.AllScreens)).Bounds.Location + My.Settings.frmMainPosition End If Else Me.WindowState = FormWindowState.Maximized End If End If Else LOGGER.Info("FormPosition is out of range!..Standard will be loaded!") If My.Settings.frmMainWindowState = "Normal" Then Me.StartPosition = FormStartPosition.CenterScreen Else Me.WindowState = FormWindowState.Maximized End If End If End If 'Sind Werte hinterlegt? 'If Not My.Settings.frmMainSize.IsEmpty Then ' If My.Settings.frmMainWindowState = "Normal" Then ' Dim oisonscreen = IsOnScreen(My.Settings.frmMainPosition, My.Settings.frmMainSize) ' If oisonscreen = False Then ' Me.StartPosition = FormStartPosition.CenterScreen ' Exit Sub ' End If ' ' Gespeicherte Werte verwenden ' Try ' Me.Size = My.Settings.frmMainSize ' Catch ex As Exception ' End Try ' Else ' Me.WindowState = FormWindowState.Maximized ' End If 'End If Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Error in Load FormLayout: " & ex.Message) End Try End Sub Function IsOnScreen(ByVal RecLocation As System.Drawing.Point, ByVal RecSize As System.Drawing.Size, Optional MinPercentOnScreen As Double = 0.2) Try Dim PixelsVisible As Double = 0 Dim Rec As System.Drawing.Rectangle = New System.Drawing.Rectangle(RecLocation, RecSize) For Each Scrn As Screen In Screen.AllScreens Dim r As System.Drawing.Rectangle = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea) 'intersect rectangle with screen If (r.Width <> 0 And r.Height <> 0) Then PixelsVisible += (r.Width * r.Height) 'tally visible pixels End If Next Return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen Catch ex As Exception Return False End Try End Function Private Function GetLayoutName_GridMain() Dim Filename As String = String.Format("DevExpressGridViewOverview_UserLayout_{0}_{1}.xml", GRID_LOAD_TYPE, USER_LANGUAGE) LOGGER.Debug($"LayoutFilename is: {Filename}") Return System.IO.Path.Combine(USER_CONFIG_DIRECTORY, Filename) End Function Private Sub SaveGridLayout() Timer_Inactivity_Reset_Disable("SaveGridLayout") If NO_WORKFLOWITEMS = True Then Exit Sub End If Try Dim oXmlPath As String = GetLayoutName_GridMain() GridViewWorkflows.SaveLayoutToXml(oXmlPath, OptionsLayoutBase.FullLayout) LOGGER.Debug("Layout saved successfully!") Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Error while saving GridLayout MainGrid: " & ex.Message) End Try End Sub Private Sub RestoreLayout() If NO_WORKFLOWITEMS = True Then Exit Sub End If Try Dim oXmlPath As String = GetLayoutName_GridMain() If System.IO.File.Exists(oXmlPath) Then GridViewWorkflows.RestoreLayoutFromXml(oXmlPath, OptionsLayoutBase.FullLayout) Else LOGGER.Info("oXmlPath not existing - Saving Layout") COLUMNS_INVISIBLE() SaveGridLayout() End If Catch ex As Exception LOGGER.Info("Error while restoring layout MainGrid: " & ex.Message) End Try End Sub Private Sub COLUMNS_INVISIBLE() Try If GridViewWorkflows.Columns.Count = 0 Then Exit Sub End If ' 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 If GridViewWorkflows.Columns.ColumnByFieldName(FullFilepatColName) IsNot Nothing Then GridViewWorkflows.Columns.Item(FullFilepatColName).Visible = False End If Catch ex As Exception End Try Try 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 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() Try Timer_Inactivity_Reset_Disable("ResetLayout") Dim xml As String = GetLayoutName_GridMain() IO.File.Delete(xml) Try GridViewWorkflows.Columns.Clear() Catch ex As Exception If IsNothing(GridViewWorkflows) Then LOGGER.Warn("⚠️ Somehow GridViewWorkflows is nothing....") Else If IsNothing(GridViewWorkflows.Columns) Then LOGGER.Warn("⚠️ Somehow GridViewWorkflows.Columns is nothing....") End If End If Exit Sub End Try GridViewWorkflows.PopulateColumns() If GridViewWorkflows.Columns.Count > 0 Then Try If TL_ICON = True 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 End Try 'If IDB_ACTIVE = True Then ' Try ' If GridViewWorkflows.Columns.Item("CONV_YN") IsNot Nothing Then ' GridViewWorkflows.Columns.Item("CONV_YN").Visible = False ' End If ' Catch ex As Exception ' LOGGER.Info("ResetLayout - Check wether Column CONV_YN is part of select/view..now checking CONVERSATION") ' End Try ' Try ' GridViewWorkflows.Columns.Item("CONVERSATION").MaxWidth = 24 ' GridViewWorkflows.Columns.Item("CONVERSATION").MinWidth = 24 ' GridViewWorkflows.Columns.Item("CONVERSATION").Fixed = FixedStyle.Left ' Catch ex As Exception ' LOGGER.Info("ResetLayout - Column CONVERSATION obviously is not part of GridViewWorkflows") ' End Try 'End If Dim oReducedColName As String If Not IsNothing(GridViewWorkflows.Columns) Then Try oReducedColName = LAST_EDITED_COLUMN.Replace("[", "") oReducedColName = oReducedColName.Replace("]", "") 'GridViewWorkflows.Columns(oReducedColName).DisplayFormat.FormatType = FormatType.DateTime 'GridViewWorkflows.Columns(oReducedColName).DisplayFormat.FormatString = "dd.MM.yyyy HH:MM:ss" Catch ex As Exception Try If oReducedColName <> "Zuletzt bearbeitet" Then End If Catch ex1 As Exception LOGGER.Warn($"(ResetLayout)Column [{oReducedColName}] or [Zuletzt bearbeitet] not part of OverviewSQL") End Try End Try End If Try GridViewWorkflows.Columns.Item("GROUP_TEXT").Visible = False GridViewWorkflows.Columns.Item("GROUP_COLOR").Visible = False Catch ex As Exception End Try Try If GridViewWorkflows.Columns.ColumnByFieldName("ROW_COLOR") IsNot Nothing Then GridViewWorkflows.Columns.Item("ROW_COLOR").Visible = False End If Catch ex As Exception End Try ' GridViewWorkflows.OptionsView.ShowIndicator = False COLUMNS_INVISIBLE() End If Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Error while resetting layout: " & ex.Message) End Try End Sub Sub LoadNavBar() Dim profileGroupOpen As Boolean = False If Not IsNothing(CurrNavBarGroup) Then NavBarControl1.BeginUpdate() ' <-- Hinzufügen Try profileGroupOpen = CurrNavBarGroup.Expanded Try CurrNavBarGroup.ItemLinks.Clear() Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("CurrGroupClear - Error: " & ex.Message) End Try Catch ex As Exception Finally NavBarControl1.EndUpdate() ' <-- Hinzufügen End Try End If Try If Load_Profiles_for_User() = False Then Throw New Exception("Could not load Profiles. Datatable is empty") Exit Sub End If If NO_DETAIL_PROFILES = False Then NavBarControl1.Visible = True Dim oCountItems As Integer = 0 For Each oProfileRow As DataRow In CURR_DT_VWPM_PROFILE_ACTIVE.Rows Dim ODisplayMode = oProfileRow.Item("DISPLAY_MODE") If (ODisplayMode = "Overview and Detail" Or ODisplayMode = "Detail") Then oCountItems += 1 Dim item1 As NavBarItem = NavBarControl1.Items.Add() item1.Caption = oProfileRow.Item("TITLE") item1.Hint = oProfileRow.Item("TITLE") item1.Appearance.TextOptions.WordWrap = WordWrap.Wrap item1.Tag = "itmProfile#" & oProfileRow.Item("GUID").ToString Dim _image As Image = Nothing _image = DevExpress.Images.ImageResourceCache.Default.GetImage("images/business%20objects/bofileattachment_16x16.png") item1.LargeImage = _image item1.SmallImage = _image NavBarControl1.Groups(1).ItemLinks.Add(item1) End If Next If oCountItems > 0 Then If NavBarControl1.Groups(1).Visible = False Then NavBarControl1.Groups(1).Visible = True End If Else If NavBarControl1.Groups(1).Visible = True Then NavBarControl1.Groups(1).Visible = False End If End If If Not IsNothing(CurrNavBarGroup) Then CurrNavBarGroup.Expanded = profileGroupOpen Else NavBarControl1.Groups(1).Expanded = True End If Else LOGGER.Debug("NavBarControl - No Detail Profiles") NavBarControl1.Visible = False End If Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Load_Profile_items - Error: " & ex.Message) 'MsgBox("Unexpected Error in Load_Profile_items - Error: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Sub Private Async Sub navBar_LinkClicked(ByVal sender As Object, ByVal e As NavBarLinkEventArgs) If Application.OpenForms().OfType(Of frmValidator).Any Then FormHelper.ShowInfoMessage(S.Bitte_schließen_Sie_den_offenen_Workflow_, omsgTitleWarning) Exit Sub End If FRONTEND_ACTION = NAVBAR_CLICKED Dim _tag = e.Link.Item.Tag Timer_Inactivity_Reset_Disable("navBar_LinkClicked") Try If Not IsNothing(_tag) Then If _tag.ToString.Contains("itmProfile#") Then ' ========== PROFIL WURDE GEKLICKT ========== _tag = _tag.ToString.Replace("itmProfile#", "") If IsNumeric(_tag) Then If CURRENT_CLICKED_PROFILE_ID <> _tag Then LOGGER.Debug($"Profile with ID {_tag} clicked in NavBarControl...loading Profile...") OverviewOrDEtail = "DETAIL" If Not Application.OpenForms().OfType(Of frmValidator).Any Then CURRENT_CLICKED_PROFILE_ID = _tag CURRENT_CLICKED_PROFILE_TITLE = e.Link.Item.Caption End If GRID_LOAD_TYPE = "PROFILE#" & _tag.ToString DetailLinkActive = True ' RefreshHelper VORHER speichern If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.SaveViewInfo() End If Me.Cursor = Cursors.WaitCursor Try LOGGER.Debug($"Loading profile with ID {_tag}...") ' Zentral über Decide_Load laden Await Decide_Load(False, True) Finally Me.Cursor = Cursors.Default End Try Else LOGGER.Debug($"Profile with ID {_tag} clicked in NavBarControl is already active...ignoring click.") End If End If ElseIf _tag = "OVERVIEW" Then ' ========== OVERVIEW WURDE GEKLICKT ========== OverviewOrDEtail = "OVERVIEW" GRID_LOAD_TYPE = "OVERVIEW" Dim oForce As Boolean = False If DetailLinkActive = True Then oForce = True DetailLinkActive = False OVERVIEW_ADDED_WHEN = "" End If ' RefreshHelper VORHER speichern If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.SaveViewInfo() End If ' Zentral über Decide_Load laden Await Decide_Load(False, oForce) ' RefreshHelper NACHHER laden If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() End If ' Gruppierung prüfen If GridViewWorkflows.GroupCount = 0 And Not IsNothing(GridViewWorkflows.Columns("GROUP_TEXT")) Then LOGGER.Info("NO GROUPS AFTER CLICK OVERVIEW...CREATING GROUPS NEW...") Await Decide_Load(False, True) If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() End If End If End If End If Catch ex As Exception LOGGER.Error(ex) FormHelper.ShowInfoMessage($"Fehler beim Laden: {ex.Message}", omsgTitleWarning) Finally FRONTEND_ACTION = FA_NONE End Try End Sub Function Load_Profiles_for_User() As Boolean Try LOGGER.Debug($"Load_Profiles_for_User ...") If IsNothing(CURR_DT_VWPM_PROFILE_ACTIVE) Then LOGGER.Info($"ATTENTION: CURR_DT_VWPM_PROFILE_ACTIVE is nothing!") Return False End If Return True Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Load_Profiles_for_User - Error: " & ex.Message) Return False End Try End Function Sub GridControlWorkflows_Visible() Try If GridControlWorkflows.Visible = False Then GridControlWorkflows.Visible = True End If Catch ex As Exception LOGGER.Error(ex) End Try End Sub Async Function Load_single_Profile(Optional ForceReload As Boolean = False) As Tasks.Task Dim gridUpdateStarted As Boolean = False Dim viewUpdateStarted As Boolean = False Try FRONTEND_ACTION = "Load_single_Profile" Load_Profiles_for_User() GridControlWorkflows_Visible() Dim expression As String = "GUID = " & CURRENT_CLICKED_PROFILE_ID Dim foundRow As DataRow = CURR_DT_VWPM_PROFILE_ACTIVE.Select(expression).FirstOrDefault() If foundRow Is Nothing Then Exit Function End If If GridControlWorkflows.Visible Then GridControlWorkflows.BeginUpdate() gridUpdateStarted = True GridViewWorkflows.BeginUpdate() viewUpdateStarted = True End If Dim oSQL = foundRow.Item("SQL_VIEW") oSQL = clsPatterns.ReplaceInternalValues(oSQL) oSQL = clsPatterns.ReplaceUserValues(oSQL) oSQL = oSQL.Replace("@USER_ID", USER_ID) oSQL = oSQL.Replace("@USERNAME", USER_USERNAME) oSQL = oSQL.Replace("@MACHINE_NAME", System.Environment.MachineName) oSQL = oSQL.Replace("@DATE", Now.ToShortDateString) oSQL = oSQL.Replace("@PROFILE_ID", CURRENT_CLICKED_PROFILE_ID) DT_CURR_WF_ITEMS = Await DatabaseFallback.GetDatatableECMAsync(oSQL) If IsNothing(DT_CURR_WF_ITEMS) Then Exit Function End If 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 ' 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 OVERVIEW_CHANGED_WHEN = oChanged OVERVIEW_COUNT = oCOUNT End If Create_Basic_View() RestoreLayout() Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Load_single_Profile - Error: " & ex.Message) Finally If viewUpdateStarted Then GridViewWorkflows.EndUpdate() End If If gridUpdateStarted Then GridControlWorkflows.EndUpdate() End If FRONTEND_ACTION = FA_NONE End Try End Function Sub Create_Basic_View() Dim gridUpdateStarted As Boolean = False Dim viewUpdateStarted As Boolean = False Try FRONTEND_ACTION = "Create_Basic_View" If GridControlWorkflows.Visible Then GridControlWorkflows.BeginUpdate() gridUpdateStarted = True GridViewWorkflows.BeginUpdate() viewUpdateStarted = True End If GridControlWorkflows.DataSource = Nothing Try GridViewWorkflows.Columns.Clear() Catch ex As Exception LOGGER.Error(ex) LOGGER.Warn("⚠️ Could not clear GridViewWorkflows.Columns") End Try ' 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 = "" } DT_CURR_WF_ITEMS.Columns.Add(columnStateIcon) End If RedDocuments = 0 YellowDocuments = 0 GreenDocuments = 0 ' 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 GridControlWorkflows.DataSource = bindsourcegrid RestoreLayout() COLUMNS_INVISIBLE() Try 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 Dim oReducedColName = LAST_EDITED_COLUMN.Replace("[", "").Replace("]", "") Catch ex As Exception Try Catch ex1 As Exception LOGGER.Warn("⚠️ (CreateBasicView)Column [Last edited] or [Zuletzt bearbeitet] not part of OverviewSQL") End Try End Try Try 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") End If End Try Catch ex As Exception LOGGER.Error(ex) Finally If viewUpdateStarted Then GridViewWorkflows.EndUpdate() End If If gridUpdateStarted Then GridControlWorkflows.EndUpdate() End If FRONTEND_ACTION = FA_NONE End Try End Sub Private Function GridLayoutChanged() As Boolean Try For Each oViewColumn As DataColumn In DT_CURR_WF_ITEMS.Columns If oViewColumn.Caption = "" Then Continue For End If Dim oViewColumn_exists As Boolean = False For Each oActGridColumn As GridColumn In GridViewWorkflows.Columns Dim oGridDXFieldName = oActGridColumn.FieldName Dim GridDXColumnEditName = oActGridColumn.ColumnEditName Dim GridDXFieldName = oActGridColumn.FieldName If oViewColumn.Caption = oGridDXFieldName Then If oActGridColumn.Visible = False Then If oViewColumn.Caption <> "GUID" And oViewColumn.Caption <> "TL_STATE" And oViewColumn.Caption <> "PROFILE_ID" And oViewColumn.Caption <> "DocID" And oViewColumn.Caption <> "GROUP_COLOR" And oViewColumn.Caption <> "GROUP_TEXT" Then 'And oViewColumn.Caption <> "CONV_YN" Console.WriteLine($"ViewColumn [{oViewColumn.Caption}] is invisible") Else oViewColumn_exists = True End If Else oViewColumn_exists = True End If End If Next If oViewColumn_exists = False Then If oViewColumn.Caption = FullFilepatColName And IDB_ACTIVE = False Then LOGGER.Info($"Following ViewColumn no longer exists in the view: [{oViewColumn.Caption}]") Return True End If End If Next For Each oActGridColumn As GridColumn In GridViewWorkflows.Columns If oActGridColumn.Caption = "" Then Continue For End If Dim oGridColumn_exists As Boolean = False Dim oGridDXFieldName = oActGridColumn.FieldName For Each oViewColumn As DataColumn In DT_CURR_WF_ITEMS.Columns If oViewColumn.Caption = oGridDXFieldName Then oGridColumn_exists = True End If Next If oGridColumn_exists = False Then LOGGER.Info($"Following GridColumn no longer exists in the View: [{oGridDXFieldName}]") Return True End If Next Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Unexpected Error in GridLayoutChanged: " & ex.Message) Return False End Try End Function Private Function Column_inGridViewLayout(Col2bChecked As String) As Boolean Try Dim oGridView As New GridView Dim oXml As String = GetLayoutName_GridMain() oGridView.RestoreLayoutFromXml(oXml, OptionsLayoutBase.FullLayout) Dim oViewColumn_exists As Boolean = False For Each oActGridColumn As GridColumn In oGridView.Columns Dim oGridDXFieldName = oActGridColumn.FieldName Dim GridDXColumnEditName = oActGridColumn.ColumnEditName Dim GridDXFieldName = oActGridColumn.FieldName If Col2bChecked = oGridDXFieldName Then oViewColumn_exists = True Exit For End If Next If oViewColumn_exists = False Then LOGGER.Info($"Following ViewColumn is not existing in the view: [{Col2bChecked}]") Return Not False End If Catch ex As Exception LOGGER.Info("Unexpected Error in Column_inGridViewLayout: " & ex.Message) Return Not False End Try End Function Private Sub NotifyIcon1_MouseDoubleClick(sender As System.Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick BringMonitor2Front() End Sub Sub BringMonitor2Front() Me.BringToFront() Visible = True End Sub Private Async Sub TimerRefresh_Tick(sender As System.Object, e As EventArgs) Handles TimerRefresh.Tick Try If TimerRefresh.Enabled = False Then Exit Sub If bwBasicData.IsBusy Then LOGGER.Info("backGroundWorker BasicData in Action - no Client-Sync") bsiMessage.Caption = "bwBasicData is busy - no Refreshing" bsiMessage.ItemAppearance.Normal.BackColor = Color.Yellow bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Exit Sub End If TimerRefresh_running = True ' Cancel Refresh if Validator/Admin Form is opened If Application.OpenForms().OfType(Of frmMassValidator).Any() Or Application.OpenForms().OfType(Of frmValidator).Any() Or Application.OpenForms().OfType(Of frmAdministration).Any() Or Application.OpenForms().OfType(Of frmAdmin2).Any() Then Exit Sub End If ' ✅ Prüfung ob Fenster aktiv ist Dim isWindowActive As Boolean = (Me.ContainsFocus OrElse Me Is Form.ActiveForm) If isWindowActive Then ' ====== FENSTER IST AKTIV → MIT Overlay ====== bsilastsync.Caption = String.Format(S.Letzte_Synchronisation___0_, Now.ToLongTimeString) If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.SaveViewInfo() End If If bwSync.IsBusy Then TimerRefresh_running = False Exit Sub End If Try LoadNavBar() Dim oStopWatch As New RefreshHelper.SW("Decide_Load") Await Decide_Load(False, ForceReload:=False, AllowOverlay:=True) ' ✅ Overlay ERLAUBT oStopWatch.Done() If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() End If Handling_DEBUG_USER() Catch ex As Exception LOGGER.Error(ex) End Try Else ' ====== FENSTER IST INAKTIV → OHNE Overlay ====== LOGGER.Debug("TimerRefresh: Silent background update (window not active)") Try LoadNavBar() Await Decide_Load(False, ForceReload:=False, AllowOverlay:=False) ' ✅ Overlay VERBOTEN ' KEIN RefreshHelper.LoadViewInfo() → verhindert UI-Flackern Catch ex As Exception LOGGER.Error(ex) End Try End If Catch ex As Exception LOGGER.Error(ex) End Try TimerRefresh_running = False End Sub Private Sub NotifyIcon1_Click(sender As System.Object, e As EventArgs) Handles NotifyIcon1.Click BringMonitor2Front() End Sub ' ======================================== ' HAUPTLADEMETHODE - Koordiniert den gesamten Ladevorgang ' ======================================== Private Async Function Decide_Load(pIsFormLoad As Boolean, Optional ForceReload As Boolean = False, Optional AllowOverlay As Boolean = True) As Tasks.Task Dim oHandle As Object = Nothing Dim overlayStartedHere As Boolean = False ' ✅ Overlay nur anzeigen, wenn explizit erlaubt UND Fenster aktiv ist Dim shouldShowOverlay As Boolean = AllowOverlay AndAlso (Me.ContainsFocus OrElse Me Is Form.ActiveForm) If shouldShowOverlay AndAlso Not _overlayActive Then oHandle = SplashScreenManager.ShowOverlayForm(Me) _overlayActive = True overlayStartedHere = True End If Dim perfStart As DateTime = DateTime.MinValue Dim refreshWasEnabled As Boolean = False If LOG_HOTSPOTS Then perfStart = DateTime.Now LOGGER.Info($"[PERF Decide_Load] START - pIsFormLoad:[{pIsFormLoad}] ForceReload:[{ForceReload}] GRID_LOAD_TYPE:[{GRID_LOAD_TYPE}]") End If Try LOGGER.Debug($"Decide_Load: pIsFormLoad [{pIsFormLoad}] - ForceReload [{ForceReload}] - GRID_LOAD_TYPE [{GRID_LOAD_TYPE}]") ' ========== VORBEDINGUNGEN PRÜFEN ========== If pIsFormLoad = True Then FormShown = False End If GridIsLoaded = False If USER_EXISTS = False Then LOGGER.Warn($"USER IS NOT EXISTING - CHECK FNDD_LOGIN_USER_MODULE") Exit Function End If ' ========== TIMER MANAGEMENT ========== If TimerRefresh.Enabled Then refreshWasEnabled = True TimerRefresh.Stop() End If FRONTEND_ACTION = "DECIDE_LOAD" ' ========== UI VORBEREITEN (NUR BEI OVERVIEW) ========== Dim loadSuccess As Boolean = False If GRID_LOAD_TYPE = "OVERVIEW" Then If LOG_HOTSPOTS Then LOGGER.Info("[PERF Decide_Load] ruft LoadOverviewData auf...") End If Await Task.Yield() ' Daten laden loadSuccess = Await LoadOverviewData(pIsFormLoad, ForceReload) ElseIf GRID_LOAD_TYPE.StartsWith("PROFILE#") Then If LOG_HOTSPOTS Then LOGGER.Info("[PERF Decide_Load] ruft LoadProfileData auf...") End If Await Task.Yield() ' Daten laden loadSuccess = Await LoadProfileData(ForceReload) End If If Not loadSuccess Then LOGGER.Warn("Daten konnten nicht geladen werden") Exit Function End If ' ========== NACHBEARBEITUNG ========== ApplyPostLoadSettings() GridIsLoaded = True ' ========== CAPTION FINAL SICHERSTELLEN ========== ' ApplyPostLoadSettings kann durch Spalten-Events den Caption überschreiben, ' daher hier nochmals den korrekten Caption setzen UpdateGridCaption() Catch ex As Exception GridIsLoaded = True LOGGER.Error(ex) LOGGER.Info("Unexpected error in Decide_load: " & ex.Message) Finally FRONTEND_ACTION = FA_NONE If overlayStartedHere AndAlso _overlayActive Then SplashScreenManager.CloseOverlayForm(oHandle) _overlayActive = False End If If refreshWasEnabled Then TimerRefresh.Start() End If If pIsFormLoad = True Then FormShown = True End If If LOG_HOTSPOTS Then LOGGER.Info($"[PERF Decide_Load] GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") End If End Try End Function ' ======================================== ' OVERVIEW DATEN LADEN - Spezialisiert auf Overview ' ======================================== Private Async Function LoadOverviewData(pFormLoad As Boolean, pForceReload As Boolean) As Task(Of Boolean) Dim perfStart As DateTime = DateTime.MinValue Dim perfStep As DateTime = DateTime.MinValue Dim gridUpdateStarted As Boolean = False Dim viewUpdateStarted As Boolean = False If LOG_HOTSPOTS Then perfStart = DateTime.Now perfStep = perfStart LOGGER.Info($"[PERF LoadOverviewData] START - pFormLoad:[{pFormLoad}] pForceReload:[{pForceReload}]") End If Try ' ========== GRID UPDATES VORBEREITEN ========== If GridControlWorkflows.Visible Then GridControlWorkflows.BeginUpdate() gridUpdateStarted = True GridViewWorkflows.BeginUpdate() viewUpdateStarted = True End If ' ========== PROFILE VALIDIEREN ========== If BASEDATA_DT_VW_PROFILE_USER.Rows.Count = 0 Then LOGGER.Info("Attention: No profiles for user: '" & USER_USERNAME & "' configured!", False) NO_WORKFLOWITEMS = True bsiMessage.Caption = "NO PROFILES FOR USER" bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black GridControlWorkflows.Visible = False Return False End If If LOG_HOTSPOTS Then LOGGER.Info($"[PERF LoadOverviewData] Load_Profiles_for_User wird aufgerufen...") End If Load_Profiles_for_User() If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ Load_Profiles_for_User LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LoadOverviewData] Load_Profiles_for_User: {elapsed}ms") End If perfStep = DateTime.Now End If ' ========== SQL VORBEREITEN ========== Dim oSQLOverview = BASEDATA_DT_CONFIG.Rows(0).Item("SQL_PROFILE_MAIN_VIEW") If IsDBNull(oSQLOverview) OrElse Not oSQLOverview.ToString.Contains("GROUP_TEXT") Then NO_WORKFLOWITEMS = True GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing Return False End If ' SQL-Platzhalter ersetzen oSQLOverview = PrepareSQLWithReplacements(oSQLOverview) If LOG_HOTSPOTS Then Dim rowCount = If(DT_CURR_WF_ITEMS IsNot Nothing, DT_CURR_WF_ITEMS.Rows.Count, 0) LOGGER.Info($"[PERF LoadOverviewData] SQL-Abfrage für Workflows startet (aktuelle Rows: {rowCount})...") End If ' ========== DATEN ABRUFEN ========== DT_CURR_WF_ITEMS = Await DatabaseFallback.GetDatatableECMAsync(oSQLOverview) If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds Dim rowCount = If(DT_CURR_WF_ITEMS IsNot Nothing, DT_CURR_WF_ITEMS.Rows.Count, 0) If elapsed > 4000 Then LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ Datenbank-Abfrage für Workflows LANGSAM: {elapsed}ms ({rowCount} Zeilen) (Schwellwert: 4000ms) - SQL prüfen!") Else LOGGER.Info($"[PERF LoadOverviewData] Datenbank-Abfrage für Workflows: {elapsed}ms ({rowCount} Zeilen)") End If perfStep = DateTime.Now End If If IsNothing(DT_CURR_WF_ITEMS) Then NO_WORKFLOWITEMS = True GridControlWorkflows.Visible = False Return False End If LOGGER.Debug($"Datatable CURR_DT_OVERVIEW loaded: {DT_CURR_WF_ITEMS.Rows.Count} rows") ' ========== DATEN VERARBEITEN ========== NO_WORKFLOWITEMS = (DT_CURR_WF_ITEMS.Rows.Count = 0) UpdateGridCaption() If NO_WORKFLOWITEMS Then GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing Return False End If ' ========== ICON-SPALTE VORBEREITEN ========== If LOG_HOTSPOTS Then LOGGER.Info($"[PERF LoadOverviewData] Icon-Verarbeitung startet ({DT_CURR_WF_ITEMS.Rows.Count} Zeilen)...") End If Await Task.Run(Sub() PrepareIconColumn()) If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ Icon-Verarbeitung LANGSAM: {elapsed}ms ({DT_CURR_WF_ITEMS.Rows.Count} Zeilen) (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LoadOverviewData] Icon-Verarbeitung: {elapsed}ms") End If perfStep = DateTime.Now End If ' ========== GRID MIT DATEN FÜLLEN ========== bindsourcegrid.DataSource = DT_CURR_WF_ITEMS GridControlWorkflows.DataSource = bindsourcegrid GridControlWorkflows.ForceInitialize() Create_View_Caption() If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ Grid-DataSource-Zuweisung LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LoadOverviewData] Grid-DataSource-Zuweisung: {elapsed}ms") End If perfStep = DateTime.Now End If ' ========== LAYOUT ANWENDEN ========== If LOG_HOTSPOTS Then LOGGER.Info($"[PERF LoadOverviewData] Layout-Anwendung startet...") End If Await ApplyGridLayout(pForceReload) If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ Layout-Wiederherstellung LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LoadOverviewData] Layout-Wiederherstellung: {elapsed}ms") End If End If Return True Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("LoadOverviewData - Fehler: " & ex.Message) Return False Finally ' ========== AUFRÄUMEN ========== If viewUpdateStarted Then GridViewWorkflows.EndUpdate() End If If gridUpdateStarted Then GridControlWorkflows.EndUpdate() End If If LOG_HOTSPOTS Then Dim totalElapsed = (DateTime.Now - perfStart).TotalMilliseconds If totalElapsed > 4000 Then LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ GESAMT LANGSAM: {totalElapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LoadOverviewData] GESAMT: {totalElapsed}ms") End If End If End Try End Function ' ======================================== ' PROFILE DATEN LADEN - Spezialisiert auf einzelnes Profil ' ======================================== Private Async Function LoadProfileData(ForceReload As Boolean) As Task(Of Boolean) Dim gridUpdateStarted As Boolean = False Dim viewUpdateStarted As Boolean = False Try Load_Profiles_for_User() Dim expression As String = "GUID = " & CURRENT_CLICKED_PROFILE_ID Dim foundRow As DataRow = CURR_DT_VWPM_PROFILE_ACTIVE.Select(expression).FirstOrDefault() If foundRow Is Nothing Then Return False End If ' === FIX: Grid sichtbar machen bevor BeginUpdate === GridControlWorkflows_Visible() If GridControlWorkflows.Visible Then GridControlWorkflows.BeginUpdate() gridUpdateStarted = True GridViewWorkflows.BeginUpdate() viewUpdateStarted = True End If ' ========== SQL VORBEREITEN UND AUSFÜHREN ========== Dim oSQL = foundRow.Item("SQL_VIEW") oSQL = PrepareSQLWithReplacements(oSQL) DT_CURR_WF_ITEMS = Await DatabaseFallback.GetDatatableECMAsync(oSQL) If IsNothing(DT_CURR_WF_ITEMS) Then LOGGER.Warn("Daten konnten nicht geladen werden für Profil: " & CURRENT_CLICKED_PROFILE_TITLE) Return False End If ' ========== DATEN VERARBEITEN ========== NO_WORKFLOWITEMS = (DT_CURR_WF_ITEMS.Rows.Count = 0) UpdateGridCaption() If NO_WORKFLOWITEMS Then GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing LOGGER.Info("Keine Workflow-Items für Profil: " & CURRENT_CLICKED_PROFILE_TITLE) Return False End If ' ========== BASIC VIEW ERSTELLEN ========== Await CreateBasicViewForProfile() LOGGER.Debug("Basic View für Profil erstellt: " & CURRENT_CLICKED_PROFILE_TITLE) Return True Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("LoadProfileData - Error: " & ex.Message) Return False Finally If viewUpdateStarted Then GridViewWorkflows.EndUpdate() End If If gridUpdateStarted Then GridControlWorkflows.EndUpdate() End If End Try End Function ' ======================================== ' HILFSMETHODEN - Extrahierte Logik für Wiederverwendung ' ======================================== Private Function PrepareSQLWithReplacements(oSQL As String) As String oSQL = clsPatterns.ReplaceInternalValues(oSQL) oSQL = clsPatterns.ReplaceUserValues(oSQL) oSQL = oSQL.Replace("@USER_ID", USER_ID) oSQL = oSQL.Replace("@USERNAME", USER_USERNAME) oSQL = oSQL.Replace("@MACHINE_NAME", System.Environment.MachineName) oSQL = oSQL.Replace("@DATE", Now.ToShortDateString) oSQL = oSQL.Replace("@PROFILE_ID", CURRENT_CLICKED_PROFILE_ID) Return oSQL End Function Private Sub PrepareIconColumn() If TL_ICON = True 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 = "" } 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 = 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 End If End Sub Private Async Function ApplyGridLayout(pForceReload As Boolean) As Tasks.Task Dim oColNotPartofLayout As Boolean = False If pForceReload = True And (GridLayoutChanged() = True Or oColNotPartofLayout = True) Then LOGGER.Debug("Now GridLayout_Reset..") Await GridLayout_Reset(False) Else RestoreLayout() End If If pForceReload = True And (GridLayoutChanged() = True Or oColNotPartofLayout = True) Then Create_GroupBy_Parts() End If ' Icon-Spalte konfigurieren If TL_ICON = True Then Try 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 = DevExpress.XtraGrid.Columns.FixedStyle.Left Catch ex As Exception End Try End If If GridViewWorkflows.Columns.Count <= 5 Then LOGGER.Info("GridViewWorkflows.Columns.Count <= 5 - Reset_Gridlayout will be forced...", False) Await Reset_GridLayout(False) Else RestoreLayout() End If COLUMNS_INVISIBLE() ' Spaltenformatierung anwenden ApplyColumnFormatting() End Function Private Sub ApplyColumnFormatting() Try For Each oColumn As DevExpress.XtraGrid.Columns.GridColumn In GridViewWorkflows.Columns For Each oRow As DataRow In BASEDATA_TBDD_COLUMNS_FORMAT.Rows Dim colName = oRow("COLUMN_TITLE").ToString() If oColumn.FieldName = colName Then Dim oSollFormatType = oRow("TYPE2FORMAT").ToString() If oSollFormatType = "DateTime" Then If oColumn.ColumnType <> GetType(DateTime) Then oColumn.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime End If If oColumn.ColumnType = GetType(DateTime) And oColumn.DisplayFormat.FormatString <> "dd.MM.yyyy HH:mm:ss" Then oColumn.DisplayFormat.FormatString = "dd.MM.yyyy HH:mm:ss" End If ElseIf oSollFormatType = "Numeric" Then If oColumn.ColumnType <> GetType(Int32) Then oColumn.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric End If End If End If Next Next Catch ex As Exception LOGGER.Warn("⚠️ Fehler beim Anwenden der Formatierung aus TBDD_COLUMNS_FORMAT: " & ex.Message) End Try End Sub Private Async Function CreateBasicViewForProfile() As Task GridControlWorkflows.DataSource = Nothing Try GridViewWorkflows.Columns.Clear() Catch ex As Exception LOGGER.Error(ex) LOGGER.Warn("⚠️ Could not clear GridViewWorkflows.Columns") End Try Await Task.Run(Sub() PrepareIconColumn()) bindsourcegrid.DataSource = DT_CURR_WF_ITEMS GridControlWorkflows.DataSource = bindsourcegrid RestoreLayout() COLUMNS_INVISIBLE() ' Icon-Spalte konfigurieren If TL_ICON = True Then Try 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 Catch ex As Exception End Try End If End Function Private Sub ApplyPostLoadSettings() If SHOW_MASS_VALIDATOR = False Then GridViewWorkflows.OptionsSelection.MultiSelect = False GridViewWorkflows.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect BarButtonItemMassValidation.Visibility = DevExpress.XtraBars.BarItemVisibility.Never Else BarButtonItemMassValidation.Visibility = DevExpress.XtraBars.BarItemVisibility.Always GridViewWorkflows.OptionsSelection.MultiSelect = True GridViewWorkflows.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect End If If GridViewWorkflows.OptionsView.ShowAutoFilterRow = True Then BarCheckItemAutofilter.Checked = True End If If GridViewWorkflows.OptionsFind.AlwaysVisible Then BarCheckItemShowSearch.Checked = True End If COLUMNS_INVISIBLE() End Sub Private Sub ToolStripButton2_Click_2(sender As Object, e As EventArgs) frmAdminPasswort.ShowDialog() End Sub Public Sub New() Dim splash As New frmSplash() Try splash.ShowDialog() Catch ex As Exception LOGGER.Error(ex) LOGGER.Info($"Error in Splash: {ex.Message}") End Try ' LookAndFeel ZUERST global setzen ConfigureGlobalLookAndFeel() Try If USER_LANGUAGE <> "" Then Dim cultureInfo As New System.Globalization.CultureInfo(USER_LANGUAGE) cultureInfo.DateTimeFormat.ShortDatePattern = USER_DATE_FORMAT Thread.CurrentThread.CurrentCulture = cultureInfo Thread.CurrentThread.CurrentUICulture = cultureInfo CultureInfo.DefaultThreadCurrentCulture = cultureInfo CultureInfo.DefaultThreadCurrentUICulture = cultureInfo End If Catch ex As Exception LOGGER.Error(ex) End Try Try InitializeComponent() FormHelper = New FormHelper(LOGCONFIG, Me) ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. Catch ex As Exception LOGGER.Error(ex) LOGGER.Info($"Error in InitializeComponent: {ex.Message}") End Try End Sub Private Sub TimerReminder_Tick(sender As Object, e As EventArgs) Handles TimerReminder.Tick Try If Application.OpenForms().OfType(Of frmValidator).Any Then Exit Sub End If If DT_CURR_WF_ITEMS.Rows.Count > 0 And POPUP_REMINDER_ACTIVE = True Then Dim oMessage As String = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("App.ReminderPipeline") NotifyIcon1.ShowBalloonTip(30000, $"Reminder {ADDITIONAL_TITLE}", oMessage, ToolTipIcon.Info) End If Catch ex As Exception LOGGER.Warn($"Unexpected error in TimerReminderTick: {ex.Message}") End Try End Sub Public Function GetEnvironment() As Environment Return New Environment With { .Database = DatabaseECM, .DatabaseIDB = DatabaseIDB, .Service = EDMIService, .User = User } End Function Sub Load_Profil_from_Grid(pProfilID As Integer) Dim perfStart As DateTime = DateTime.MinValue Dim useWaitCursorApplied As Boolean = False Dim previousMessage As String = bsiMessage.Caption Dim messageApplied As Boolean = False Dim oHandle As Object = Nothing Dim overlayStartedHere As Boolean = False If LOG_HOTSPOTS Then perfStart = DateTime.Now LOGGER.Info($"[PERF Load_Profil_from_Grid START - pProfilID:[{pProfilID}]") End If Try CURRENT_ProfilGUID = pProfilID WM_AHWF_docPath = String.Empty ' ========== OVERLAY ANZEIGEN ========== If Not _overlayActive Then oHandle = SplashScreenManager.ShowOverlayForm(Me) _overlayActive = True overlayStartedHere = True End If ' ========== UI-VORBEREITUNG ========== Me.UseWaitCursor = True useWaitCursorApplied = True bsiMessage.Caption = "Loading profile..." messageApplied = True If Not Application.OpenForms().OfType(Of frmValidator).Any Then ' ========== TIMER MANAGEMENT ========== If TimerRefresh.Enabled Then TimerRefresh.Enabled = False End If ' ========== FORM DESIGN CHECK ========== If CHANGES_FORM_DESIGN = True Then LoadCURRENT_DT_PROFILES() LoadVWPM_CONTROL_INDEX() CHANGES_FORM_DESIGN = False End If ' ========== PROFILE DATA PREPARATION ========== Dim oExpression = $"GUID = {CURRENT_ProfilGUID}" CURRENT_DT_PROFILE = Nothing CURRENT_DT_PROFILE = CURRENT_DT_PROFILES.Clone CURRENT_DT_PROFILES.Select(oExpression).CopyToDataTable(CURRENT_DT_PROFILE, LoadOption.PreserveChanges) If CURRENT_DT_PROFILE.Rows.Count = 1 Then CURRENT_ProfilName = CURRENT_DT_PROFILE.Rows(0).Item("NAME") CURRENT_WMObjecttype = CURRENT_DT_PROFILE.Rows(0).Item("WD_OBJECTTYPE") PROFILE_SHOW_DOCUMENT = Convert.ToBoolean(CURRENT_DT_PROFILE.Rows(0).Item("SHOW_DOCUMENT")) ActiveWorkflowType = 1 Else MsgBox("Could not get a Profile - Check Your log!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE) Exit Sub End If ' ========== SEARCH DOCUMENTS PREPARATION ========== oExpression = $"PROFILE_ID = {CURRENT_ProfilGUID} " DT_FILTERED_PROFILE_SEARCHES_DOC = Nothing Dim rows = BASEDATA_DT_PROFILES_SEARCHES_DOC.Select(oExpression, "TAB_INDEX") If rows.Length > 0 Then DT_FILTERED_PROFILE_SEARCHES_DOC = rows.CopyToDataTable() Else DT_FILTERED_PROFILE_SEARCHES_DOC = BASEDATA_DT_PROFILES_SEARCHES_DOC.Clone() End If ' ========== SEARCH SQL PREPARATION ========== DT_FILTERED_PROFILE_SEARCHES_DATA = Nothing rows = BASEDATA_DT_PROFILES_SEARCHES_DATA.Select(oExpression, "TAB_INDEX") If rows.Length > 0 Then DT_FILTERED_PROFILE_SEARCHES_DATA = rows.CopyToDataTable() Else DT_FILTERED_PROFILE_SEARCHES_DATA = BASEDATA_DT_PROFILES_SEARCHES_DATA.Clone() End If ' ========== VALIDATOR-FORM ÖFFNEN ========== Try If LOG_HOTSPOTS Then LOGGER.Info("[PERF Load_Profil_from_Grid öffnet frmValidator...") End If Dim oEnvironment = GetEnvironment() _FormValidator = New frmValidator(oEnvironment) AddHandler _FormValidator.FormClosed, AddressOf ValidatorClosed _FormValidator.Show() Catch ex As Exception LOGGER.Warn($"Error opening Form frmValidator [{ex.Message}]") If Not IsNothing(ex.InnerException) Then LOGGER.Warn($"ex.InnerException.Message [{ex.InnerException.Message}]") LOGGER.Warn($"ex.InnerException.Source [{ex.InnerException.Source}]") LOGGER.Error(ex.InnerException) End If MsgBox(ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE) End Try ' ========== ROW AUS ÜBERSICHT ENTFERNEN ========== Try Dim iterateIndex As Integer = 0 Dim oNewDataTable As DataTable = DT_CURR_WF_ITEMS.Copy For Each row As DataRow In oNewDataTable.Rows If row("GUID") = CURRENT_DOC_GUID Then DT_CURR_WF_ITEMS.Rows.RemoveAt(iterateIndex) Exit For Else iterateIndex += 1 End If Next Catch ex As Exception LOGGER.Warn("⚠️ Unexpected Error in Removing Row after Loading Record from Grid: " & ex.Message) End Try ' ========== TIMER RE-ENABLE ========== TimerRefresh.Enabled = True Else LOGGER.Debug("Validator is already open...") FormHelper.ShowInfoMessage(S.Es_existiert_bereits_ein_aktiver_Workflow_, omsgTitleAttention) End If Catch ex As Exception LOGGER.Error(ex) MsgBox("Unexpected error in Load_Profil_from_Grid: " & ex.Message & vbNewLine & ADDITIONAL_TITLE & " will try to reload the overview - Please try again!", MsgBoxStyle.Information, ADDITIONAL_TITLE) Dim task = Decide_Load(False, True) Finally ' ========== OVERLAY SCHLIESSEN (FALLBACK) ========== If overlayStartedHere AndAlso _overlayActive Then SplashScreenManager.CloseOverlayForm(oHandle) LOGGER.Debug("Overlay closed in Load_Profil_from_Grid") _overlayActive = False End If ' ========== UI AUFRÄUMEN ========== If useWaitCursorApplied Then Me.UseWaitCursor = False End If If messageApplied AndAlso bsiMessage.Caption = "Loading profile..." Then bsiMessage.Caption = previousMessage End If If LOG_HOTSPOTS Then LOGGER.Info($"[PERF Load_Profil_from_Grid GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") End If End Try End Sub Private Async Function Item_Scope(startedFrom As String) As Task ' ========== FRÜHE VALIDIERUNGEN (VOR UI-ÄNDERUNGEN) ========== If Application.OpenForms().OfType(Of frmValidator).Any Then bsiMessage.Caption = S.Es_existiert_bereits_ein_aktiver_Workflow_ LOGGER.Info("Item Scope - Workflow open! - Exit") bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Exit Function End If Dim perfStart As DateTime = DateTime.MinValue Dim useWaitCursorApplied As Boolean = False Dim previousMessage As String = bsiMessage.Caption Dim messageApplied As Boolean = False If LOG_HOTSPOTS Then perfStart = DateTime.Now LOGGER.Info($"[PERF Item_Scope] START - startedFrom:[{startedFrom}]") End If Try LOGGER.Info("Starting Profile Loading") ' ========== UI-VORBEREITUNG ========== Me.UseWaitCursor = True useWaitCursorApplied = True bsiMessage.Caption = "Processing selection..." messageApplied = True ' ========== HITINFO NUR EINMAL BERECHNEN ========== Dim hitInfo As GridHitInfo = GridViewWorkflows.CalcHitInfo(GridCursorLocation) ' ========== STARTEDROM NORMALISIEREN ========== If startedFrom = "DOUBLECLICK" Then startedFrom = If(hitInfo.InGroupRow, "CMGROUP", "CMROW") LOGGER.Debug($"User clicked {If(hitInfo.InGroupRow, "group", "normal")} row.") End If ' ========== PROFIL-ID ERMITTELN (OPTIMIERT) ========== Dim oHitProfilID As Object = Nothing If hitInfo.InGroupRow Then oHitProfilID = GridViewWorkflows.GetRowCellValue( GridViewWorkflows.GetDataRowHandleByGroupRowHandle(hitInfo.RowHandle), GridViewWorkflows.Columns("PROFILE_ID")) ElseIf hitInfo.InDataRow Then oHitProfilID = GridViewWorkflows.GetRowCellValue( GridViewWorkflows.GetDataRowHandleByGroupRowHandle( GridViewWorkflows.GetParentRowHandle(hitInfo.RowHandle)), GridViewWorkflows.Columns("PROFILE_ID")) End If LOGGER.Debug("Clicked ProfileId: [{0}], Started From: [{1}]", oHitProfilID, startedFrom) ' ========== PROFIL-ID VALIDIERUNG UND UPDATE ========== If oHitProfilID IsNot Nothing AndAlso IsNumeric(oHitProfilID) AndAlso CInt(oHitProfilID) > 0 Then If oHitProfilID <> CURRENT_CLICKED_PROFILE_ID Then LOGGER.Debug($"Item_Scope: oHitProfilID {oHitProfilID} <> CURRENT_CLICKED_PROFILE_ID {CURRENT_CLICKED_PROFILE_ID}") CURRENT_CLICKED_PROFILE_ID = oHitProfilID End If End If ' ========== GRUPPE VERARBEITEN (MIT KORREKTER GRUPPEN-ERMITTLUNG) ========== If startedFrom = "CMGROUP" Then LOGGER.Debug("Loading Child DocIds from focused expanded group..") Dim oIds As New List(Of Integer) Dim oGroupRowHandle As Integer ' KRITISCH: Den RICHTIGEN Gruppen-Handle ermitteln If GridViewWorkflows.IsGroupRow(hitInfo.RowHandle) Then ' User hat direkt auf die Gruppen-Zeile geklickt oGroupRowHandle = hitInfo.RowHandle LOGGER.Debug($"User clicked directly on group row, handle: {oGroupRowHandle}") Else ' User hat auf eine Daten-Zeile INNERHALB einer Gruppe geklickt ' → Parent-Gruppe ermitteln oGroupRowHandle = GridViewWorkflows.GetParentRowHandle(hitInfo.RowHandle) LOGGER.Debug($"User clicked on data row {hitInfo.RowHandle}, parent group handle: {oGroupRowHandle}") If Not GridViewWorkflows.IsGroupRow(oGroupRowHandle) Then LOGGER.Warn($"⚠️ Parent handle {oGroupRowHandle} is not a group row!") FormHelper.ShowWarningMessage("Bitte klicken Sie direkt auf die Gruppenzeile!", omsgTitleAttention) Exit Function End If End If ' Spalten-Objekt VOR der Schleife holen Dim docIdColumn As GridColumn = GridViewWorkflows.Columns.ColumnByFieldName("DocID") If docIdColumn Is Nothing Then docIdColumn = GridViewWorkflows.Columns.ColumnByFieldName("DOCID") End If If docIdColumn Is Nothing Then LOGGER.Error("⚠️ Column 'DocID' not found in GridView!") ' DEBUG: Alle verfügbaren Spalten ausgeben LOGGER.Debug("=== Available Columns ===") For Each col As GridColumn In GridViewWorkflows.Columns LOGGER.Debug($" {col.FieldName} (Caption: {col.Caption})") Next LOGGER.Debug("=== END Available Columns ===") FormHelper.ShowInfoMessage("Column 'DocID' not found!", omsgTitleWarning) Exit Function End If ' JETZT GetChildRowCount auf der RICHTIGEN Gruppe Dim oChildRowCount = GridViewWorkflows.GetChildRowCount(oGroupRowHandle) LOGGER.Debug($"Group handle {oGroupRowHandle} has {oChildRowCount} total child rows") ' WICHTIG: Wenn 0 Kinder → Gruppe ist zugeklappt oder leer If oChildRowCount = 0 Then ' Versuche die Gruppe aufzuklappen LOGGER.Debug($"Expanding group at handle {oGroupRowHandle}...") GridViewWorkflows.ExpandGroupRow(oGroupRowHandle) ' UI-Thread Zeit geben Application.DoEvents() ' Erneut prüfen oChildRowCount = GridViewWorkflows.GetChildRowCount(oGroupRowHandle) LOGGER.Debug($"After expanding: {oChildRowCount} child rows") If oChildRowCount = 0 Then LOGGER.Warn($"⚠️ Group has 0 children even after expanding") Dim omsg = "Die Gruppe ist leer!" FormHelper.ShowWarningMessage(omsg, omsgTitleAttention) Exit Function End If End If ' JETZT sollten Kinder vorhanden sein For childIndex = 0 To oChildRowCount - 1 Dim oChildRowHandle = GridViewWorkflows.GetChildRowHandle(oGroupRowHandle, childIndex) ' WICHTIG: Nur Daten-Rows verarbeiten, KEINE Gruppen If Not GridViewWorkflows.IsDataRow(oChildRowHandle) Then LOGGER.Debug($"Skipping non-data row at child index {childIndex} (Handle: {oChildRowHandle})") Continue For End If ' DocId auslesen - MIT COLUMN-OBJEKT Try Dim oDocId = GridViewWorkflows.GetRowCellValue(oChildRowHandle, docIdColumn) If oDocId IsNot Nothing AndAlso IsNumeric(oDocId) Then oIds.Add(CInt(oDocId)) LOGGER.Debug($"Added DocId: {oDocId} from child index {childIndex} (Handle: {oChildRowHandle})") Else LOGGER.Warn($"⚠️ DocId is Nothing/Invalid at child index {childIndex}, Handle: {oChildRowHandle}") End If Catch ex As Exception LOGGER.Error($"Error reading DocId at child index {childIndex}: {ex.Message}") End Try Next LOGGER.Debug($"[{oIds.Count}] DocIds collected from focused group") If oIds.Count = 0 Then Dim omsg = String.Format(S.System_konnte_die_Profilworkflows_nicht_auswerten_, vbNewLine) FormHelper.ShowInfoMessage(omsg, omsgTitleAttention) Exit Function End If If oIds.Count > 1000 Then Dim omsg = String.Format("You chose more than 1000 Workflows. Please select fewer items.", vbNewLine) FormHelper.ShowInfoMessage(omsg, omsgTitleAttention) Exit Function End If ' ========== DB-OPERATIONEN ========== LOGGER.Debug("Cleaning up queued DocIds..") Dim oDelete = $"DELETE FROM TBPM_VALIDATION_PROFILE_GROUP_USER WHERE UserID = {USER_ID}" If DatabaseFallback.ExecuteNonQueryECM(oDelete) = True Then LOGGER.Debug("Adding {0} queued DocIds..", oIds.Count) Dim oInsertBatch As New System.Text.StringBuilder() oInsertBatch.AppendLine("INSERT INTO TBPM_VALIDATION_PROFILE_GROUP_USER ([PROFIL_ID],[DocID],[UserID],[ADDED_WHO]) VALUES") For i As Integer = 0 To oIds.Count - 1 If i > 0 Then oInsertBatch.Append(",") oInsertBatch.AppendLine($"({CURRENT_CLICKED_PROFILE_ID},{oIds(i)},{USER_ID},'{USER_USERNAME}')") Next ' WICHTIG: Debug-Logging des Batch-Inserts LOGGER.Debug(String.Format("Batch-Insert {0}", oInsertBatch.ToString)) DatabaseFallback.ExecuteNonQueryECM(oInsertBatch.ToString()) End If End If CURRENT_JUMP_DOC_GUID = 0 ' ========== HITINFO VALIDIERUNG ========== If hitInfo Is Nothing Then bsiMessage.Caption = "Could not specify hitinfo via click event (CalcHitInfo)" LOGGER.Info("Could not specify hitinfo via click event (CalcHitInfo)") bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Exit Function End If ' ========== PROFIL-TITEL ERMITTELN ========== Dim PROFIL_TITLE As String = String.Empty If hitInfo.InGroupRow Then GridViewItem_Clicked = "GROUP" startedFrom = "CMGROUP" LOGGER.Debug($"Item_Scope: InGroupRow") Dim groupRowText = GridViewWorkflows.GetGroupRowDisplayText(hitInfo.RowHandle) LOGGER.Debug($"Item_Scope: groupRowText {groupRowText}") If GRID_LOAD_TYPE = "OVERVIEW" Then groupRowText = groupRowText.Replace("Profile (Fixed): ", "").Trim() Dim splitIndex = groupRowText.IndexOf("|") PROFIL_TITLE = If(splitIndex >= 0, groupRowText.Substring(0, splitIndex).Trim(), groupRowText) End If ElseIf hitInfo.InDataRow Then GridViewItem_Clicked = "ROW" LOGGER.Debug($"Item_Scope: InDataRow") If GRID_LOAD_TYPE = "OVERVIEW" Then LOGGER.Debug($"Item_Scope: GRID_LOAD_TYPE = OVERVIEW") Dim groupRowText = GridViewWorkflows.GetGroupRowDisplayText( GridViewWorkflows.GetParentRowHandle(hitInfo.RowHandle)) LOGGER.Debug($"Item_Scope: OVERVIEWgroupRowText {groupRowText}") groupRowText = groupRowText.Replace("Profile (Fixed): ", "").Trim() Dim splitIndex = groupRowText.IndexOf("|") PROFIL_TITLE = If(splitIndex >= 0, groupRowText.Substring(0, splitIndex).Trim(), groupRowText) Else LOGGER.Debug($"Item_Scope: NOT GRID_LOAD_TYPE = OVERVIEW") If Not IsNothing(CURRENT_CLICKED_PROFILE_ID) AndAlso CURRENT_CLICKED_PROFILE_ID <> 0 Then LOGGER.Debug($"Item_Scope: CURRENT_CLICKED_PROFILE_ID [{CURRENT_CLICKED_PROFILE_ID}]") oHitProfilID = CURRENT_CLICKED_PROFILE_ID Else LOGGER.Warn("⚠️ ItemScope: CURRENT_CLICKED_PROFILE_ID is nothing or 0!!!") Exit Function End If End If Else Exit Function End If ' ========== PROFIL-TITEL SETZEN ========== If Not String.IsNullOrEmpty(PROFIL_TITLE) Then CURRENT_CLICKED_PROFILE_TITLE = PROFIL_TITLE.Replace("GROUP_TEXT:", "") End If ' ========== PROFIL LADEN ========== If Not IsNothing(CURRENT_CLICKED_PROFILE_ID) AndAlso IsNumeric(CURRENT_CLICKED_PROFILE_ID) Then LOGGER.Debug($"Item_Scope: Valid PROFIL_ID") If hitInfo.InGroupRow OrElse (startedFrom = "CMGROUP" AndAlso hitInfo.InDataRow) Then ' GRUPPE: Workflow ohne spezifisches Dokument CURRENT_JUMP_DOC_GUID = 0 CURRENT_DOC_GUID = 0 CURRENT_DOC_ID = 0 CURRENT_ProfilGUID = CURRENT_CLICKED_PROFILE_ID LOGGER.Debug($"Item_Scope: hitInfo.InGroupRow...CURRENT_CLICKED_PROFILE_ID [{CURRENT_CLICKED_PROFILE_ID}]") Load_Profil_from_Grid(CURRENT_CLICKED_PROFILE_ID) ElseIf hitInfo.InDataRow Then ' EINZELNE ZEILE: Mit spezifischem Dokument LOGGER.Debug($"Item_Scope: hitInfo.InDataRow...") ' ========== DOKUMENT-DATEN ABRUFEN ========== Dim oFocusedDocGUID = GridViewWorkflows.GetFocusedRowCellValue(GridViewWorkflows.Columns("GUID")) Dim oFocusedDocID = GridViewWorkflows.GetFocusedRowCellValue(GridViewWorkflows.Columns("DocID")) ' Validierungen If oFocusedDocID Is Nothing Then LOGGER.Warn("⚠️ In hitInfo.InDataRow: DocID is nothing!!!") bsiMessage.Caption = "Error getting DocID!" bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Exit Function End If If oFocusedDocGUID Is Nothing Then LOGGER.Warn("⚠️ In hitInfo.InDataRow: oFocusedDocGUID is nothing!!!") bsiMessage.Caption = "Error getting DocGUID!" bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Exit Function End If LOGGER.Debug($"Item_Scope: GotDocID {oFocusedDocID} and DocGUID {oFocusedDocGUID}") ' ========== DATEIPFAD (OPTIONAL) ========== If GridViewWorkflows.Columns(FullFilepatColName) IsNot Nothing Then Dim DOC_PATH = GridViewWorkflows.GetFocusedRowCellValue(GridViewWorkflows.Columns(FullFilepatColName)) If DOC_PATH IsNot Nothing Then DOC_PATH = DOC_PATH.Replace("W:\", "\\windream\objects\").Replace("K:\", "\\windream\objects\") End If End If ' ========== DOKUMENT-DATEN SETZEN ========== CURRENT_DOC_ID = oFocusedDocID CURRENT_JUMP_DOC_GUID = oFocusedDocGUID CURRENT_DOC_GUID = CURRENT_JUMP_DOC_GUID ' ========== DOKUMENT-VALIDIERUNG (OPTIMIERT) ========== Dim oSQL = $"SELECT [dbo].[FNPM_CHECK_DocGUID_Valid] ({CURRENT_DOC_GUID})" Dim oResult = DatabaseFallback.GetScalarValueECM(oSQL) If CBool(oResult) = True Then Load_Profil_from_Grid(CURRENT_CLICKED_PROFILE_ID) Else Dim omsg = S.Der_gewählte_Beleg_ist_durch_einen_anderen_Benutzer_bereits_in_Bearbeitung_oder_anderweitig_gesperrt_ FormHelper.ShowInfoMessage(omsg, omsgTitleAttention) End If End If Else FormHelper.ShowInfoMessage("Could not get the ProfileID of file! - Check Your configuration of MainView!", omsgTitleWarning) End If Catch ex As Exception LOGGER.Error(ex) bsiMessage.Caption = "Warning in Item_Scope: " & ex.Message bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Finally ' ========== UI AUFRÄUMEN ========== If useWaitCursorApplied Then Me.UseWaitCursor = False End If bsiMessage.Caption = "" bsiMessage.ItemAppearance.Normal.BackColor = Color.Transparent If LOG_HOTSPOTS Then LOGGER.Info($"[PERF Item_Scope] GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms") End If End Try End Function Private Async Sub ValidatorClosed(sender As Object, e As FormClosedEventArgs) Try ' LoadingPanel-Verwaltung erfolgt in Decide_Load Await Decide_Load(False, True) If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() End If Catch ex As Exception LOGGER.Error(ex) End Try End Sub Private Function Init_IDB() Try IDBData = New ClassIDBData() Return True Catch ex As Exception LOGGER.Error(ex) MsgBox("Error Init_IDB:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:") LOGGER.Info("Unexpected error in Init_IDB: " & ex.Message, True) Return False End Try End Function Private Function Init_windream() Try WINDREAM = New ClassPMWindream() WINDREAM_MOD = New Windream(LOGCONFIG, False, WMDRIVE_LETTER, WMSUFFIX, True, "", "", "", "") WINDREAM.Create_Session() WINDREAM_ALLG = New ClassWindream_allgemein Return WINDREAM.IsLoggedIn Catch ex As Exception LOGGER.Error(ex) MsgBox("Error Init_windream:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:") LOGGER.Info("Unexpected error in Init_windream: " & ex.Message, True) Return False End Try End Function Private Sub Create_GroupBy_Parts() Try LOGGER.Debug("Now Create_GroupBy_Parts ...") GridViewWorkflows.OptionsView.ShowGroupPanel = False Dim oindex As Integer = 0 If Not IsNothing(BASEDATA_DTGRID_GROUPS) Then For Each oGridGroup As DataRow In BASEDATA_DTGRID_GROUPS.Rows Dim oGroupName = oGridGroup.Item("GROUPNAME") LOGGER.Debug($"Adding group [{oGroupName}] for Grid...") Try Dim oGroupColumn As GridColumn = GridViewWorkflows.Columns.Item(oGroupName) If oGroupColumn IsNot Nothing Then oGroupColumn.GroupIndex = oindex oGroupColumn.Group() oGroupColumn.OptionsColumn.AllowGroup = DefaultBoolean.False oGroupColumn.OptionsColumn.AllowMove = False oGroupColumn.OptionsColumn.AllowShowHide = False oGroupColumn.Caption = "Profile (Fixed)" End If Catch ex As Exception End Try oindex += 1 Next End If Try GridViewWorkflows.Columns.Item("GROUP_TEXT").Visible = False GridViewWorkflows.Columns.Item("GROUP_COLOR").Visible = False Catch ex As Exception End Try For index = 0 To GridViewWorkflows.GroupCount - 1 'Dim v = GridViewWorkflows.GroupedColumns(index).ToString LOGGER.Debug($"Adding tag [{GridViewWorkflows.Columns.Item("PROFILE_ID")}] for group...") Dim sd = GridViewWorkflows.GroupedColumns(index).GetTextCaption GridViewWorkflows.GroupedColumns(index).Tag = GridViewWorkflows.Columns.Item("PROFILE_ID") Next GridViewWorkflows.CollapseAllGroups() LOGGER.Debug("finished Grouping!") Catch ex As Exception LOGGER.Error(ex) End Try End Sub Async Function Load_Grid_Overview(pFormLoad As Boolean, pForceReload As Boolean, pNavbarClick As Boolean) As Tasks.Task Dim perfStart As DateTime = DateTime.MinValue Dim perfStep As DateTime = DateTime.MinValue Dim gridUpdateStarted As Boolean = False Dim viewUpdateStarted As Boolean = False Dim layoutRestored As Boolean = False Dim resetLayoutTriggered As Boolean = False Dim useWaitCursorApplied As Boolean = False Dim previousMessage As String = bsiMessage.Caption Dim loadingMessageApplied As Boolean = False If LOG_HOTSPOTS Then perfStart = DateTime.Now perfStep = perfStart LOGGER.Info($"[PERF Load_Grid_Overview] START - pFormLoad:[{pFormLoad}] pForceReload:[{pForceReload}] pNavbarClick:[{pNavbarClick}]") End If ' ========== LOADING PANEL UND UI-VORBEREITUNG ========== ' SCHRITT 1: Grid sichtbar machen If GridControlWorkflows.Visible = False Then GridControlWorkflows.Visible = True End If GRID_LOAD_TYPE = "OVERVIEW" CURRENT_CLICKED_PROFILE_ID = 0 If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LGO] ⚠️ UI-Vorbereitung LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LGO] UI-Vorbereitung: {elapsed}ms") End If perfStep = DateTime.Now End If ' WaitCursor setzen If Me.UseWaitCursor = False Then Me.UseWaitCursor = True useWaitCursorApplied = True End If ' Statusmeldung aktualisieren bsiMessage.Caption = "Overviewdata loading..." loadingMessageApplied = True Try ' ========== GRID UPDATES VORBEREITEN ========== If GridControlWorkflows.Visible Then GridControlWorkflows.BeginUpdate() gridUpdateStarted = True GridViewWorkflows.BeginUpdate() viewUpdateStarted = True End If ' ========== DATEN VALIDIEREN ========== If BASEDATA_DT_VW_PROFILE_USER.Rows.Count = 0 Then LOGGER.Info("Attention: No profiles for user: '" & USER_USERNAME & "' configured!", False) NO_WORKFLOWITEMS = True bsiMessage.Caption = "NO PROFILES FOR USER" bsiMessage.ItemAppearance.Normal.BackColor = Color.Red bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black GridControlWorkflows.Visible = False Exit Try End If If LOG_HOTSPOTS Then LOGGER.Info($"[PERF LGO] Load_Profiles_for_User wird aufgerufen...") End If Load_Profiles_for_User() If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LGO] ⚠️ Load_Profiles_for_User LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LGO] Load_Profiles_for_User: {elapsed}ms") End If perfStep = DateTime.Now End If ' ========== SQL UND DATEN LADEN ========== Dim oSQLOverview = BASEDATA_DT_CONFIG.Rows(0).Item("SQL_PROFILE_MAIN_VIEW") If IsDBNull(oSQLOverview) Then bsiMessage.Caption = "No SQL_PROFILE_MAIN_VIEW in Baseconfig" Exit Try End If If oSQLOverview.ToString.Contains("GROUP_TEXT") = False Then LOGGER.Info($"SQL SO FAR: {oSQLOverview} ") FormHelper.ShowInfoMessage("Incomplete Overview-Source (No Group-Columns). Column", omsgTitleWarning) NO_WORKFLOWITEMS = True GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing Try GridViewWorkflows.Columns.Clear() Catch ex As Exception LOGGER.Error(ex) End Try Exit Try End If ' SQL-Platzhalter ersetzen oSQLOverview = clsPatterns.ReplaceInternalValues(oSQLOverview) oSQLOverview = clsPatterns.ReplaceUserValues(oSQLOverview) oSQLOverview = oSQLOverview.Replace("@USER_ID", USER_ID) oSQLOverview = oSQLOverview.Replace("@USERNAME", USER_USERNAME) oSQLOverview = oSQLOverview.Replace("@MACHINE_NAME", System.Environment.MachineName) oSQLOverview = oSQLOverview.Replace("@DATE", Now.ToShortDateString) oSQLOverview = oSQLOverview.Replace("@PROFILE_ID", CURRENT_CLICKED_PROFILE_ID) If LOG_HOTSPOTS Then LOGGER.Info($"[PERF LGO] SQL-Abfrage startet (Rows erwartet: {If(DT_CURR_WF_ITEMS IsNot Nothing, DT_CURR_WF_ITEMS.Rows.Count.ToString(), "N/A")})...") End If DT_CURR_WF_ITEMS = Await DatabaseFallback.GetDatatableECMAsync(oSQLOverview) If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds Dim rowCount = If(DT_CURR_WF_ITEMS IsNot Nothing, DT_CURR_WF_ITEMS.Rows.Count, 0) If elapsed > 4000 Then LOGGER.Warn($"[PERF LGO] ⚠️ Datenbank-Abfrage Overview LANGSAM: {elapsed}ms ({rowCount} Zeilen) (Schwellwert: 4000ms) - SQL prüfen!") Else LOGGER.Info($"[PERF LGO] Datenbank-Abfrage Overview: {elapsed}ms ({rowCount} Zeilen)") End If perfStep = DateTime.Now End If If IsNothing(DT_CURR_WF_ITEMS) Then NO_WORKFLOWITEMS = True GridControlWorkflows.Visible = False GridControlWorkflows.DataSource = Nothing Try GridViewWorkflows.Columns.Clear() Catch ex As Exception LOGGER.Error(ex) End Try Exit Try End If LOGGER.Debug($"Datatable CURR_DT_OVERVIEW loaded: {DT_CURR_WF_ITEMS.Rows.Count} rows") ' ========== DATEN ANALYSIEREN ========== 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 NO_WORKFLOWITEMS = (oCOUNT = 0) UpdateGridCaption() If NO_WORKFLOWITEMS Then GridControlWorkflows.Visible = False bindsourcegrid.DataSource = Nothing GridControlWorkflows.DataSource = Nothing Try GridViewWorkflows.Columns.Clear() Catch ex As Exception LOGGER.Error(ex) End Try Exit Try End If ' ========== ICON-SPALTE VORBEREITEN ========== If TL_ICON = True AndAlso DT_CURR_WF_ITEMS.Columns.Contains("ICON") = False Then Dim columnStateIcon As New DataColumn() With { .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 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 End If If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LGO] ⚠️ Icon-Verarbeitung LANGSAM: {elapsed}ms ({DT_CURR_WF_ITEMS.Rows.Count} Zeilen) (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LGO] Icon-Verarbeitung: {elapsed}ms") End If perfStep = DateTime.Now End If ' ========== GRID MIT DATEN FÜLLEN ========== bindsourcegrid.DataSource = DT_CURR_WF_ITEMS GridControlWorkflows.DataSource = bindsourcegrid GridControlWorkflows.ForceInitialize() Create_View_Caption() If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LGO] ⚠️ Grid-DataSource-Zuweisung LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LGO] Grid-DataSource-Zuweisung: {elapsed}ms") End If perfStep = DateTime.Now End If ' ========== LAYOUT WIEDERHERSTELLEN ODER ZURÜCKSETZEN ========== Dim oColNotPartofLayout As Boolean = False If pNavbarClick = False Then If pForceReload = True And (GridLayoutChanged() = True Or oColNotPartofLayout = True) Then LOGGER.Debug("Now GridLayout_Reset..") Await GridLayout_Reset(False) resetLayoutTriggered = True ElseIf oColNotPartofLayout = False Then RestoreLayout() layoutRestored = True End If Else RestoreLayout() layoutRestored = True End If If pForceReload = True And (GridLayoutChanged() = True Or oColNotPartofLayout = True) Then Create_GroupBy_Parts() End If If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LGO] ⚠️ Layout-Wiederherstellung LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LGO] Layout-Wiederherstellung: {elapsed}ms") End If perfStep = DateTime.Now End If ' ========== ICON-SPALTE KONFIGURIEREN ========== If TL_ICON = True Then Try 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 = DevExpress.XtraGrid.Columns.FixedStyle.Left Catch ex As Exception End Try End If If GridViewWorkflows.Columns.Count <= 5 Then LOGGER.Info("GridViewWorkflows.Columns.Count <= 5 - Reset_Gridlayout will be forced...", False) Await Reset_GridLayout(pFormLoad) resetLayoutTriggered = True End If If Not layoutRestored And Not resetLayoutTriggered Then RestoreLayout() End If COLUMNS_INVISIBLE() ' ========== SPALTENFORMATIERUNG ANWENDEN ========== Try For Each oColumn As DevExpress.XtraGrid.Columns.GridColumn In GridViewWorkflows.Columns For Each oRow As DataRow In BASEDATA_TBDD_COLUMNS_FORMAT.Rows Dim colName = oRow("COLUMN_TITLE").ToString() If oColumn.FieldName = colName Then Dim oSollFormatType = oRow("TYPE2FORMAT").ToString() If oSollFormatType = "DateTime" Then If oColumn.ColumnType <> GetType(DateTime) Then oColumn.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime End If If oColumn.ColumnType = GetType(DateTime) And oColumn.DisplayFormat.FormatString <> "dd.MM.yyyy HH:mm:ss" Then oColumn.DisplayFormat.FormatString = "dd.MM.yyyy HH:mm:ss" End If ElseIf oSollFormatType = "Numeric" Then If oColumn.ColumnType <> GetType(Int32) Then oColumn.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric End If End If End If Next Next Catch ex As Exception LOGGER.Warn("⚠️ Fehler beim Anwenden der Formatierung aus TBDD_COLUMNS_FORMAT: " & ex.Message) End Try If LOG_HOTSPOTS Then Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds If elapsed > 4000 Then LOGGER.Warn($"[PERF LGO] ⚠️ Spaltenformatierung LANGSAM: {elapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF LGO] Spaltenformatierung: {elapsed}ms") End If End If Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Load_Grid_Overview - Fehler: " & ex.Message) Finally ' ========== AUFRÄUMEN ========== If viewUpdateStarted Then GridViewWorkflows.EndUpdate() End If If gridUpdateStarted Then GridControlWorkflows.EndUpdate() End If ' WaitCursor entfernen If useWaitCursorApplied Then Me.UseWaitCursor = False End If ' Statusmeldung zurücksetzen If loadingMessageApplied AndAlso bsiMessage.Caption = "Overviewdata loading..." Then bsiMessage.Caption = previousMessage End If If LOG_HOTSPOTS Then Dim totalElapsed = (DateTime.Now - perfStart).TotalMilliseconds If totalElapsed > 4000 Then LOGGER.Warn($"[PERF Load_Grid_Overview] ⚠️ GESAMT LANGSAM: {totalElapsed}ms (Schwellwert: 4000ms)") Else LOGGER.Info($"[PERF Load_Grid_Overview] GESAMT: {totalElapsed}ms") End If End If End Try End Function Private Sub tsmiValidationProfil_Click(sender As Object, e As EventArgs) Handles tsmiValidationProfil.Click If CURRENT_CLICKED_PROFILE_ID <> 0 Then Load_Profil_from_Grid(CURRENT_CLICKED_PROFILE_ID) Else FormHelper.ShowInfoMessage(S.Bitte_wählen_Sie_ein_Profil_aus_, omsgTitleWarning) End If End Sub Private Async Function GridLayout_Reset(Also_decideload As Boolean) As Tasks.Task FRONTEND_ACTION = "RESET_LAYOUT" Await Reset_GridLayout(False) If Also_decideload Then Await Decide_Load(False, True) End If GridViewWorkflows.OptionsView.ShowViewCaption = False SaveGridLayout() If GridViewWorkflows.GroupCount = 0 And Not IsNothing(GridViewWorkflows.Columns("GROUP_TEXT")) Then LOGGER.Info("NO GROUPS AFTER GridLayout_Reset Load...") Create_GroupBy_Parts() End If GridBuilder.WithFontSizeDelta(CONFIG.Config.GridFontSizeDelta) If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() FRONTEND_ACTION = FA_NONE End Function Async Function Reset_GridLayout(FormLoad As Boolean) As Tasks.Task If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.SaveViewInfo() End If InResetlayout = True ' Layout zurücksetzen ResetLayout() ' Ansicht neu laden LoadNavBar() Await Decide_Load(FormLoad) InResetlayout = False End Function Private Async Sub GridViewWorkflows_DoubleClick(sender As Object, e As EventArgs) Handles GridViewWorkflows.DoubleClick Me.Cursor = Cursors.WaitCursor Await Item_Scope("DOUBLECLICK") Me.Cursor = Cursors.Default End Sub 'Private Sub GridViewWorkflows_CustomDrawGroupRow(sender As Object, e As Views.Base.RowObjectCustomDrawEventArgs) Handles GridViewWorkflows.CustomDrawGroupRow ' Try ' ' Added ' If FormOpenClose = True And GridIsLoaded = False Then ' Exit Sub ' End If ' Dim info As GridGroupRowInfo = TryCast(e.Info, GridGroupRowInfo) ' Dim view As GridView = sender ' If info.Column.FieldName = "GROUP_TEXT" Then ' info.GroupText = info.GroupValueText ' Dim oColorString As String = "LightGray" ' Dim oFontColorString As String = "Black" ' Dim oFoundConfig As Boolean = False ' Dim oGROUP_TEXT_COL As String ' If USER_LANGUAGE = "de-DE" Then ' oGROUP_TEXT_COL = "GROUP_TEXT" ' Else ' oGROUP_TEXT_COL = "GROUP_TEXT_LANG" ' End If ' For Each oProfileRow As DataRow In CURR_DT_VWPM_PROFILE_ACTIVE.Rows ' If oProfileRow.Item(oGROUP_TEXT_COL) = info.GroupValueText Then ' oFoundConfig = True ' oColorString = oProfileRow.Item("GROUP_COLOR") ' oFontColorString = oProfileRow.Item("GROUP_FONT_COLOR") ' ' Added ' Exit For ' End If ' Next ' If oFoundConfig = False Then ' LOGGER.Info($"CustomDrawGroupRow: Could not find a ColorConfig for ProfileGroupValueText [{info.GroupValueText}]...") ' ' Added ' Exit Sub ' End If ' Dim oColor As Color = ParseColorString(oColorString, Color.LightGray, "Background Color") ' Dim oFontColor As Color = ParseColorString(oFontColorString, Color.Black, "Font Color") ' info.Appearance.BackColor = oColor ' info.Appearance.ForeColor = oFontColor ' End If ' Catch ex As Exception ' LOGGER.Error(ex) ' End Try 'End Sub Private Sub GridViewWorkflows_CustomDrawGroupRow(sender As Object, e As Views.Base.RowObjectCustomDrawEventArgs) Handles GridViewWorkflows.CustomDrawGroupRow Try If FormOpenClose = True And GridIsLoaded = False Then Exit Sub End If Dim oInfo As GridGroupRowInfo = TryCast(e.Info, GridGroupRowInfo) If oInfo Is Nothing OrElse oInfo.Column Is Nothing Then Exit Sub End If Dim oView As GridView = sender If oInfo.Column.FieldName = "GROUP_TEXT" Then oInfo.GroupText = oInfo.GroupValueText Dim oColorString As String = "LightGray" Dim oFontColorString As String = "Black" Dim oChildRowHandle As Integer = oView.GetChildRowHandle(oInfo.RowHandle, 0) oColorString = oView.GetRowCellValue(oChildRowHandle, "GROUP_COLOR") Dim oColor As Color = ParseColorString(oColorString, Color.LightGray, "Background Color") Dim oFontColor As Color = ParseColorString(oFontColorString, Color.Black, "Font Color") oInfo.Appearance.BackColor = oColor oInfo.Appearance.ForeColor = oFontColor End If Catch ex As Exception LOGGER.Error(ex) End Try End Sub Private Function ParseColorString(ColorString As String, DefaultColor As Color, ColorDescription As String) As Color Dim oResultColor As Color If ColorString.Contains(";") Or ColorString.Contains(".") Then Dim oSplitColorString As String() If ColorString.Contains(";") Then oSplitColorString = ColorString.Split(";") Else oSplitColorString = ColorString.Split(".") End If Try oResultColor = Color.FromArgb(oSplitColorString(0), oSplitColorString(1), oSplitColorString(2)) Catch ex As Exception oResultColor = DefaultColor LOGGER.Info("ParseColorString: Could not get Color.FromArgb [{0}] for {1}", ColorString, ColorDescription) End Try Else Try oResultColor = Color.FromName(ColorString) Catch ex As Exception LOGGER.Info("ParseColorString: Could not get Color.FromArgb [{0}] for {1}", ColorString, ColorDescription) oResultColor = DefaultColor End Try End If Return oResultColor End Function Private Sub GridViewWorkflows_MouseDown(sender As Object, e As MouseEventArgs) Handles GridViewWorkflows.MouseDown Dim view As GridView = sender Dim hi As GridHitInfo = view.CalcHitInfo(e.Location) Dim groupRowButtonClicked = (hi.HitTest = GridHitTest.RowGroupButton) GridCursorLocation = e.Location 'If e.Button = MouseButtons.Left Then ' wenn in eine Group Row Doppelt geklickt wurde.. If hi.InGroupRow And Not groupRowButtonClicked Then ' Ein/Ausklappen verhindern DXMouseEventArgs.GetMouseArgs(e).Handled = True GridViewItem_Clicked = "GROUP" If Not Application.OpenForms().OfType(Of frmValidator).Any Then CURRENT_CLICKED_PROFILE_ID = GridViewWorkflows.GetRowCellValue(GridViewWorkflows.GetDataRowHandleByGroupRowHandle(hi.RowHandle), GridViewWorkflows.Columns("PROFILE_ID")) End If ElseIf hi.InDataRow Then GridViewItem_Clicked = "ROW" If Not Application.OpenForms().OfType(Of frmValidator).Any Then CURRENT_CLICKED_PROFILE_ID = GridViewWorkflows.GetRowCellValue(GridViewWorkflows.GetDataRowHandleByGroupRowHandle(hi.RowHandle), GridViewWorkflows.Columns("PROFILE_ID")) End If Else GridViewItem_Clicked = Nothing If hi.HitTest = GridHitTest.FilterPanelCloseButton Then Ev_Filter_Panel_Closed = True Grid_Reset_Filter() Ev_Filter_Panel_Closed = False End If End If If Not IsNothing(CURRENT_CLICKED_PROFILE_ID) Then If IsNumeric(CURRENT_CLICKED_PROFILE_ID) Then If CURRENT_CLICKED_PROFILE_ID > 0 Then For Each orow As DataRow In CURRENT_DT_PROFILES.Rows If orow.Item("GUID") = CURRENT_CLICKED_PROFILE_ID Then If Not Application.OpenForms().OfType(Of frmValidator).Any Then CURRENT_CLICKED_PROFILE_TITLE = orow.Item("TITLE") End If Exit For End If Next End If End If End If End Sub Private Sub GridViewWorkflows_ColumnWidthChanged(sender As Object, e As Views.Base.ColumnEventArgs) Handles GridViewWorkflows.ColumnWidthChanged GridLayout_Changed("ColumnWidthChanged") End Sub Private Sub GridViewWorkflows_EndSorting(sender As Object, e As EventArgs) Handles GridViewWorkflows.EndSorting GridLayout_Changed("EndSorting") End Sub Private Sub GridViewWorkflows_LostFocus(sender As Object, e As EventArgs) Handles GridViewWorkflows.LostFocus ' Save expanded GroupRows If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.SaveViewInfo() End If End Sub Sub LoadCURRENT_DT_PROFILES() 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 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" 'DTVWCONTROLS_INDEX = DataASorDB.GetDatatable("DD_ECM", oSQL, "VWPM_CONTROL_INDEX", "") DTVWCONTROLS_INDEX = DatabaseFallback.GetDatatable("VWPM_CONTROL_INDEX", New GetDatatableOptions(oSQL, DatabaseType.ECM)) End Sub Sub GetBaseData(pMode As String) Dim oStopWatch As New RefreshHelper.SW("GetBaseData") Try Dim oSQL = String.Format("SELECT * FROM [dbo].[FNDD_LOGIN_USER_MODULE] ('{0}','PM',{1})", USER_USERNAME, CLIENT_SELECTED) Dim DT_CHECKUSER_MODULE As DataTable DT_CHECKUSER_MODULE = DatabaseFallback.GetDatatable("TBDD_USER_MODULE", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = $"USERNAME = '{USER_USERNAME.ToLower}' AND MODULE_SHORT = 'PM'" }) If pMode = "bwBasicData" Then bwBasicData.ReportProgress(10) If pMode <> "Load" Then ClassParamRefresh.Refresh_Params(DT_CHECKUSER_MODULE, pMode) End If If pMode = "bwBasicData" Then bwBasicData.ReportProgress(20) If SQL_PROFILES_USER <> "" Then oSQL = SQL_PROFILES_USER.Replace("@USER_ID", USER_ID) 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}))" End If CURR_DT_VWPM_PROFILE_ACTIVE = DatabaseFallback.GetDatatableECM(oSQL) CURR_DT_VWPM_PROFILE_AH_WORKFLOW = CURR_DT_VWPM_PROFILE_ACTIVE.Copy CURR_DT_VWPM_PROFILE_AH_WORKFLOW.Clear() Dim AHWFRows As DataRow() = CURR_DT_VWPM_PROFILE_ACTIVE.Select($"TYPE = {ConstAHWorkflow_BlindFile}", "PRIORITY") If AHWFRows.Length > 0 Then LOGGER.Info($"...NUMBER OF ADHOC-WORKFLOW PROFILES ({AHWFRows.Length})") CURR_DT_VWPM_PROFILE_AH_WORKFLOW = AHWFRows.CopyToDataTable() Else LOGGER.Debug($"...NO ADHOC-WORKFLOW PROFILES!") End If If pMode = "bwBasicData" Then bwBasicData.ReportProgress(30) LoadCURRENT_DT_PROFILES() If pMode = "Load" Then CURRENT_DT_PROFILE = CURRENT_DT_PROFILES.Clone() End If If pMode = "bwBasicData" Then bwBasicData.ReportProgress(40) 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 End If BASEDATA_DT_PROFILES_SEARCHES_DOC = DatabaseECM.GetDatatable(oSQL) EnsureProfileSearchType(BASEDATA_DT_PROFILES_SEARCHES_DOC, "DOC", NameOf(BASEDATA_DT_PROFILES_SEARCHES_DOC)) If pMode = "Load" Then 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 WITH (NOLOCK) where TYPE = 'SQL' AND ACTIVE = 1 ORDER BY PROFILE_ID,TAB_INDEX" BASEDATA_DT_PROFILES_SEARCHES_DATA = DatabaseFallback.GetDatatable("TBPM_PROFILE_SEARCH", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = "TYPE = 'SQL'", .SortByColumn = "PROFILE_ID,TAB_INDEX" }) EnsureProfileSearchType(BASEDATA_DT_PROFILES_SEARCHES_DATA, "SQL", NameOf(BASEDATA_DT_PROFILES_SEARCHES_DATA)) 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) WHERE CONTROL_ACTIVE = 1", {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}) }) If pMode = "Load" Then DT_FILTERED_PROFILE_SEARCHES_DATA = BASEDATA_DT_PROFILES_SEARCHES_DATA.Clone() End If If pMode = "bwBasicData" Then bwBasicData.ReportProgress(60) LoadVWPM_CONTROL_INDEX() If pMode = "bwBasicData" Then bwBasicData.ReportProgress(80) If pMode = "Load" Then DTVWCONTROL_INDEX = DTVWCONTROLS_INDEX.Clone() End If 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}]") End Try oStopWatch.Done() End Sub Private Sub EnsureProfileSearchType(ByRef pTable As DataTable, expectedType As String, tableName As String) Try If pTable Is Nothing Then LOGGER.Warn($"{tableName} is Nothing - type guard skipped") Exit Sub End If If pTable.Columns.Contains("TYPE") = False Then LOGGER.Warn($"{tableName} has no TYPE column - type guard skipped") Exit Sub End If Dim cleanedTable As DataTable = pTable.Clone() Dim removedCount As Integer = 0 Dim sampleInvalidSql As String = String.Empty For Each row As DataRow In pTable.Rows Dim rowType As String = String.Empty If row("TYPE") IsNot DBNull.Value Then rowType = row("TYPE").ToString().Trim().ToUpperInvariant() End If If rowType = expectedType.ToUpperInvariant() Then cleanedTable.ImportRow(row) Else removedCount += 1 If sampleInvalidSql = String.Empty AndAlso pTable.Columns.Contains("SQL_COMMAND") Then If row("SQL_COMMAND") IsNot DBNull.Value Then sampleInvalidSql = row("SQL_COMMAND").ToString() End If End If End If Next If removedCount > 0 Then LOGGER.Warn($"{tableName}: removed {removedCount} row(s) with unexpected TYPE. Expected TYPE='{expectedType}'.") If sampleInvalidSql <> String.Empty Then LOGGER.Warn($"{tableName}: sample unexpected SQL_COMMAND => {sampleInvalidSql}") End If End If LOGGER.Debug($"{tableName}: {cleanedTable.Rows.Count} rows with TYPE='{expectedType}' after type guard.") pTable = cleanedTable Catch ex As Exception LOGGER.Error(ex) LOGGER.Warn($"EnsureProfileSearchType failed for {tableName}") End Try End Sub Private Sub ConfigureGlobalLookAndFeel() If RIBBON_COLOR_SCHEME <> "" Then UserLookAndFeel.Default.UseDefaultLookAndFeel = False If RIBBON_COLOR_SCHEME = "Blue".ToUpper Then LookAndFeel.SetSkinStyle(SkinStyle.Office2019White, SkinSvgPalette.Office2019White.Yale) ElseIf RIBBON_COLOR_SCHEME = "Green".ToUpper Then LookAndFeel.SetSkinStyle(SkinStyle.Office2019White, SkinSvgPalette.Office2019White.Pine) ElseIf RIBBON_COLOR_SCHEME = "Purple".ToUpper Then LookAndFeel.SetSkinStyle(SkinStyle.Office2019White, SkinSvgPalette.Office2019White.Plum) ElseIf RIBBON_COLOR_SCHEME = "Red".ToUpper Then LookAndFeel.SetSkinStyle(SkinStyle.Office2019White, SkinSvgPalette.Office2019White.FireBrick) Else RibbonControl1.ColorScheme = DevExpress.XtraBars.Ribbon.RibbonControlColorScheme.Default End If LOGGER.Debug($" RibbonControl1.ColorScheme [{RIBBON_COLOR_SCHEME}]") End If End Sub Private Async Sub frmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown Me.Text = ADDITIONAL_TITLE CurrNavBarGroup = NavBarControl1.Groups(1) FormShown = True Timer_Inactivity_Reset_Disable("Decide_Load") LOGGER.Debug("FormShown..Now Decide_Load...") Await Decide_Load(True) If GridViewWorkflows.GroupCount = 0 And Not IsNothing(GridViewWorkflows.Columns("GROUP_TEXT")) Then LOGGER.Info("NO GROUPS AFTER SHOWN_Decide Load...") Create_GroupBy_Parts() End If Handling_DEBUG_USER() Dim oSQL = $"SELECT * FROM TBDD_NOTIFICATIONS_SYSTEM NOTE WITH (NOLOCK) INNER JOIN (SELECT * FROM TBDD_NOTIFICATIONS_SYSTEM WITH (NOLOCK) WHERE LANG_CODE = '{USER_LANGUAGE}' OR LANG_CODE = 'ALL') LANG ON NOTE.GUID = LANG.GUID where (CONVERT(DATE,GETDATE()) <= NOTE.DISPLAY_UNTIL or NOTE.DISPLAY_UNTIL IS NULL) AND NOTE.MODULE = 'PM' AND NOTE.GUID NOT IN (SELECT NOTIFY_ID FROM TBDD_NOTIFICATIONS_USER_HISTORY WITH (NOLOCK) WHERE USR_ID = {USER_ID})" Dim oDT As DataTable = DatabaseFallback.GetDatatable("TBDD_NOTIFICATIONS_SYSTEM", New GetDatatableOptions(oSQL, DatabaseType.ECM)) If Not IsNothing(oDT) Then If oDT.Rows.Count > 0 Then NOTIFICATIONS_DT = oDT BBtnItmNotfications.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Open_Notifications_Form() End If End If End Sub Sub Open_Notifications_Form() Try Dim oEnvironment = GetEnvironment() Dim oNForm As New frmNotification_Startup(NOTIFICATIONS_DT, LOGCONFIG, GDPICTURE_LICENSE, TITLE_NOTIFICATIONS, oEnvironment) oNForm.ShowDialog() Catch ex As Exception LOGGER.Error(ex) End Try End Sub Sub Handling_DEBUG_USER() If DEBUG = True Then 'bsiDebug.Caption = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("DebugModeActive") bsiDebug.Caption = S.HINWEIS__Debug_Modus_ist_eingeschaltet_ bsiDebug.Visibility = DevExpress.XtraBars.BarItemVisibility.Always Else bsiDebug.Visibility = DevExpress.XtraBars.BarItemVisibility.Never End If End Sub Sub DebuglogBackgroundthread() Dim oSQL As String = FA_NONE Try For Each oSLogstring As String In LOGCONFIG.Logs Dim oLogSplit As String() = oSLogstring.Split("|") Dim oMessage = PrepareLogMessage(oSLogstring) Dim oDateTime As Date = CDate(oLogSplit(0)) oSQL = $"INSERT INTO [dbo].[TBPM_LOG_DEBUG] ([USERID] , [LOGMSG], [ADDED_WHEN],DATE_STR) VALUES({USER_ID},'{oMessage}',GetDate(),'{oDateTime}')" DatabaseFallback.ExecuteNonQueryECM(oSQL) Next LOGCONFIG.ClearLogs() Catch ex As Exception LOGGER.Error(ex) LOGGER.Warn($"oSQL so far [{oSQL}]") End Try End Sub Private Sub tsslblDEBUG_LOG_MouseHover(sender As Object, e As EventArgs) MsgBox("UserDebugMode is activated remotely. Debugdata will be transferred to database and will be deleted after 10 days!!", MsgBoxStyle.Information, ADDITIONAL_TITLE) End Sub Private Sub frmMain_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing If Application.OpenForms().OfType(Of frmValidator).Any Then _FormValidator.Close() End If If Not IsNothing(WINDREAM_MOD) And IDB_ACTIVE = False Then LOGGER.Debug("Closing frmMain - Now logging out...") Try WINDREAM_MOD.Session.Logout() LOGGER.Debug("WINDREAM_MOD Session logged out successfully.") Catch ex As Exception LOGGER.Warn("Error while logging out WINDREAM_MOD Session: {0}", ex.Message) LOGGER.Error(ex) End Try End If End Sub Sub Grid_Reset_Filter() Timer_Inactivity_Reset_Disable("LöscheAlleFilterToolStripMenuItem") Try GridViewWorkflows.ClearFindFilter() GridViewWorkflows.ClearColumnsFilter() SaveGridLayout() Catch ex As Exception End Try End Sub Private Sub ContextMenuNotifyIcon_Opening(sender As Object, e As CancelEventArgs) Handles ContextMenuNotifyIcon.Opening If CONFIG.Config.ReminderTimer <> 0 Then PopupErinnerungInaktivierenToolStripMenuItem.Text = "Popup Erinnerung inaktivieren" Else PopupErinnerungInaktivierenToolStripMenuItem.Text = $"Popup Erinnerung aktivieren ({CONFIG.Config.ReminderTimer} min)" End If End Sub Private Sub PopupErinnerungInaktivierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PopupErinnerungInaktivierenToolStripMenuItem.Click If CONFIG.Config.ReminderTimer <> 0 Then TimerReminder.Stop() TimerReminder.Enabled = False Else CONFIG.Config.ReminderTimer = 5 CONFIG.Save() Check_Timer_Notification() End If End Sub Private Sub AnzeigenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AnzeigenToolStripMenuItem.Click BringMonitor2Front() End Sub Private Sub frmMain_Resize(sender As Object, e As EventArgs) Handles Me.Resize Try If FormShown = False Then Exit Sub End If If WindowState = FormWindowState.Maximized Then My.Settings.frmMainWindowState = "Maximized" ElseIf WindowState = FormWindowState.Normal Then My.Settings.frmMainWindowState = "Normal" End If My.Settings.Save() Catch ex As Exception LOGGER.Error(ex) End Try End Sub Private Sub BarButtonItem3_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtniGrundeinstellung.ItemClick Try frmKonfig.ShowDialog() ' Load_Profil() Check_Timer_Notification() Catch ex As Exception LOGGER.Error(ex) MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler beim Laden Grundeinstellungen:") End Try End Sub Private Async Sub bbtniRefresh_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtniRefresh.ItemClick If Application.OpenForms().OfType(Of frmValidator).Any Then 'FormHelper.ShowInfoMessage(omsgOpenWorkflow, omsgTitleWarning) FormHelper.ShowInfoMessage(S.Bitte_schließen_Sie_den_offenen_Workflow_, omsgTitleWarning) Exit Sub End If Timer_Inactivity_Reset_Disable("OverviewRefreshClick") 'If GridControlWorkflows.Visible = True And FormOpenClose = False Then ' RefreshHelper.SaveViewInfo() ' SaveGridLayout() 'End If Await Decide_Load(False, True) LoadNavBar() If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() End If End Sub Private Sub bbtniMonitor_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtniMonitor.ItemClick If Not Application.OpenForms().OfType(Of frmMonitor).Any Then frmMonitor.Show() End If End Sub Private Sub bbiProfilverwaltung_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbiProfilverwaltung.ItemClick 'Dim AdminSecurity As Boolean = False 'AdminSecurity = TBPM_KONFIGURATIONTableAdapter.cmdGetAdminSecurity() 'If AdminSecurity = True Then ' frmLoginAdmin.ShowDialog() 'Else frmAdministration.Show() ' End If End Sub Private Sub bbiKonfiguration_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbiKonfiguration.ItemClick frmAdmin2.ShowDialog() End Sub Private Sub bbtniMetadataFile_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtniMetadataFile.ItemClick frmDesignerLayout.Show() End Sub Private Sub bwSync_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwSync.DoWork End Sub Private Sub bwSync_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bwSync.ProgressChanged BarEditItem1.EditValue = e.ProgressPercentage End Sub Private Sub Timer5Mins_Tick(sender As Object, e As EventArgs) Handles Timer5Mins.Tick Try Timer5Mins_running = True If Not bwBasicData.IsBusy Then BarEditItem1.Caption = "Get BasicData" BarEditItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Always bwBasicData.RunWorkerAsync() End If If DEBUG = True Then ' 'Jetzt der insert der Inhalte If Not IsNothing(LOGCONFIG.Logs) Then If LOGCONFIG.Logs.Count > 0 Then Dim thread As New Thread(AddressOf DebuglogBackgroundthread) thread.Start() End If End If End If Catch ex As Exception LOGGER.Warn($"Timer5Mins Error: {ex.Message}") End Try Timer5Mins_running = False End Sub Private Sub bwBasicData_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwBasicData.DoWork GetBaseData("bwBasicData") End Sub Private Sub bwBasicData_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bwBasicData.RunWorkerCompleted Try If e.Error IsNot Nothing Then LOGGER.Error(e.Error) LOGGER.Warn($"bwBasicData completed with error: {e.Error.Message}") End If If USER_IS_ADMIN Then bsiDebug.Caption = String.Format(S.Anzahl_Lizenzen___0_, USERCOUNT_LOGGED_IN) End If Catch ex As Exception LOGGER.Error(ex) Finally BarEditItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Never ' Caption zurücksetzen, falls sie noch auf "busy" steht If bsiMessage.Caption = "bwBasicData is busy - no Refreshing" Then bsiMessage.Caption = "" bsiMessage.ItemAppearance.Normal.BackColor = Color.Transparent bsiMessage.ItemAppearance.Normal.ForeColor = Color.Empty End If End Try End Sub Private Sub bwBasicData_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bwBasicData.ProgressChanged BarEditItem1.EditValue = e.ProgressPercentage End Sub Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitDashboardInv.ItemClick If Application.OpenForms().OfType(Of frmInvDashboard).Any Then Exit Sub End If frmInvDashboard.Show() End Sub Private Sub OutOfRangePMFixierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OutOfRangePMFixierenToolStripMenuItem.Click Dim myPoint As System.Drawing.Point = New System.Drawing.Point(50, 50) Me.Location = Screen.AllScreens(UBound(Screen.AllScreens)).Bounds.Location + myPoint BringMonitor2Front() End Sub Private Sub GridViewWorkflows_RowStyle(sender As Object, e As RowStyleEventArgs) Handles GridViewWorkflows.RowStyle If FormShown = False Then Exit Sub End If If e.RowHandle = -1 Then IsFilterMode = True Exit Sub End If If e.RowHandle = DevExpress.XtraGrid.GridControl.AutoFilterRowHandle Then IsFilterMode = True ' e.Appearance.BackColor = Color.Yellow Else IsFilterMode = False Try Dim oRowColorCellValue = GridViewWorkflows.GetRowCellValue(e.RowHandle, "ROW_COLOR") If Not IsNothing(oRowColorCellValue) Then Dim oColor As Color Try If oRowColorCellValue.ToString.Contains(";") Or oRowColorCellValue.ToString.Contains(".") Then Dim oColorSplit As String() If oRowColorCellValue.Contains(";") Then oColorSplit = oRowColorCellValue.Split(";") ElseIf oRowColorCellValue.Contains(".") Then oColorSplit = oRowColorCellValue.Split(".") End If Try oColor = Color.FromArgb(oColorSplit(0), oColorSplit(1), oColorSplit(2)) Catch ex As Exception LOGGER.Info($"RowColorHandler: Could not get Color.FromArgb [{oRowColorCellValue}]") oColor = Color.LightGray End Try Else Try oColor = Color.FromName(oRowColorCellValue) Catch ex As Exception LOGGER.Info($"RowColorHandler: Could not get Color.FromName [{oRowColorCellValue}]") End Try End If Catch ex As Exception LOGGER.Info("RowBackColor: " & ex.Message, False) Exit Sub End Try e.Appearance.BackColor = oColor e.HighPriority = True End If Catch ex As Exception LOGGER.Info("Unexpected Error in RowStyle: " & ex.Message, False) End Try End If End Sub Private Async Sub BarButtonItem2_ItemClick_1(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitmGhostMode.ItemClick frmGhostMode.ShowDialog() If USER_GHOST_MODE_ACTIVE = True And USER_GHOST_MODE_USRNAME <> String.Empty Then LOGGER.Info($"GHOST MODE for User {USER_GHOST_MODE_USRNAME} will now be initialized!") Dim oUserLanguage = User.Language USER_USERNAME_ORG = USER_USERNAME BarButtonItemGhostMode.Caption = String.Format(S.Ghost_Modus___0___deaktivieren, USER_GHOST_MODE_USRNAME) BarButtonItemGhostMode.Visibility = DevExpress.XtraBars.BarItemVisibility.Always _Init.InitBasics() _Init.InitUserLogin() _Init.InitBasics2() Dim onewUserLanguage = User.Language GetBaseData("Load") LoadNavBar() If oUserLanguage <> onewUserLanguage Then MsgBox($"Layout will be reset as language changed from {oUserLanguage} to {onewUserLanguage}", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE) Await GridLayout_Reset(True) Else Await Decide_Load(False) End If If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() End If End Sub Private Async Sub BarButtonItem2_ItemClick_2(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemGhostMode.ItemClick USER_GHOST_MODE_ACTIVE = False USER_GHOST_MODE_USRNAME = String.Empty USER_ID = 0 USER_USERNAME = USER_USERNAME_ORG BarButtonItemGhostMode.Visibility = DevExpress.XtraBars.BarItemVisibility.Never _Init.InitUserLogin() GetBaseData("InactivateGM") LoadNavBar() Await Decide_Load(False) If GridControlWorkflows.Visible = True And FormOpenClose = False Then RefreshHelper.LoadViewInfo() End Sub Private Sub GridViewWorkflows_ColumnFilterChanged(sender As Object, e As EventArgs) Handles GridViewWorkflows.ColumnFilterChanged Try If FormShown = False Or FRONTEND_ACTION <> FA_NONE Then Exit Sub End If Timer_Inactivity_Reset_Disable("GridViewWorkflows.ColumnFilterChanged") If DetailLinkActive = False Then Create_View_Caption() End If If GridViewWorkflows.ActiveFilterEnabled Then End If If Ev_Filter_Panel_Closed = False Then Dim oTermFilterActive As String = String.Format("{0} ({1})", S.Filter_aktiv, GridViewWorkflows.DataRowCount) If GridViewWorkflows.ActiveFilterString <> String.Empty Then If lblCaptionMainGrid.Text.Contains(oTermFilterActive) Then Ev_Filter_Panel_Closed = False End If ' Caption korrekt setzen: Profil-Titel oder Gesamtübersicht If GRID_LOAD_TYPE.StartsWith("PROFILE#") AndAlso Not String.IsNullOrEmpty(CURRENT_CLICKED_PROFILE_TITLE) Then LOGGER.Debug($"Setting Grid Caption with Profile Title [{CURRENT_CLICKED_PROFILE_TITLE}] and Filter Active Term [{oTermFilterActive}]") lblCaptionMainGrid.Text = String.Format("{0} - {1}", CURRENT_CLICKED_PROFILE_TITLE, oTermFilterActive) Else LOGGER.Debug($"Setting Grid Caption with Gesamtübersicht and Filter Active Term [{oTermFilterActive}]") lblCaptionMainGrid.Text = String.Format("{0} - {1}", S.Gesamtübersicht, oTermFilterActive) End If bsitmCount.Visibility = DevExpress.XtraBars.BarItemVisibility.Always bsitmCount.Caption = oTermFilterActive Else bsitmCount.Visibility = DevExpress.XtraBars.BarItemVisibility.Never LOGGER.Debug("No active filter - resetting caption to default") End If End If GridLayout_Changed("ColumnFilterChanged") Catch ex As Exception LOGGER.Error(ex.Message) End Try End Sub Private Sub UpdateGridCaption() Try 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 ' Filter-Info hinzufügen, falls aktiv If GridViewWorkflows.ActiveFilterString <> String.Empty Then Dim oTermFilterActive As String = String.Format("{0} ({1})", S.Filter_aktiv, GridViewWorkflows.DataRowCount) 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" If XtraSaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then Dim oOptions As New XlsxExportOptions() With { .ExportMode = XlsxExportMode.SingleFile } GridViewWorkflows.ExportToXlsx(XtraSaveFileDialog1.FileName, oOptions) End If End Sub Private Sub TimerInactivity_Tick(sender As Object, e As EventArgs) Handles TimerInactivity.Tick Try If Application.OpenForms().OfType(Of frmValidator).Any Then bsiMessage.Caption = "Validation Active - no Inactivity-Logout" bsiMessage.ItemAppearance.Normal.BackColor = Color.Yellow bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Timer_Inactivity_Reset_Disable("frmValidator") Exit Sub End If If Application.OpenForms().OfType(Of frmAdministration).Any Then bsiMessage.Caption = "Administration Active - no Inactivity-Logout" bsiMessage.ItemAppearance.Normal.BackColor = Color.Yellow bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Timer_Inactivity_Reset_Disable("frmAdministration") Exit Sub End If If Application.OpenForms().OfType(Of frmAdmin2).Any Then bsiMessage.Caption = "Administration2 Active - no Inactivity-Logout" bsiMessage.ItemAppearance.Normal.BackColor = Color.Yellow bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Timer_Inactivity_Reset_Disable("frmAdmin2") Exit Sub End If If Application.OpenForms().OfType(Of frmMonitor).Any Then bsiMessage.Caption = "Monitoring open - no Inactivity-Logout" bsiMessage.ItemAppearance.Normal.BackColor = Color.Yellow bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Timer_Inactivity_Reset_Disable("frmMonitor") Exit Sub End If If GHOSTMODE_ACTIVE And USER_GHOST_MODE_ACTIVE Then bsiMessage.Caption = "GhostMode Active - no Inactivity-Logout" bsiMessage.ItemAppearance.Normal.BackColor = Color.Yellow bsiMessage.ItemAppearance.Normal.ForeColor = Color.Black Timer_Inactivity_Reset_Disable("USER_GHOST_MODE_ACTIVE") Exit Sub End If INACTIVITYRecognized = True 'Dim omsg As String = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("INACTIVITYRecognized") Dim omsg As String = S.Sie_wurden_aufgrund_von_Inaktivität_automatisch_abgemeldet_ Timer5Mins.Stop() TimerRefresh.Stop() TimerReminder.Stop() LOGGER.Info("Inactivity recognized. Automatic Logout In process!") Hide() ClassAllgemeineFunktionen.LoginOut("LOGOUT") TimerInactivity.Stop() MsgBox(omsg, MsgBoxStyle.Information, ADDITIONAL_TITLE) Application.Exit() Catch ex As Exception LOGGER.Error(ex.Message) End Try End Sub Private Sub BarButtonItem3_ItemClick_1(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles SearchItem1.ItemClick Try Dim oTag = SearchItem1.Tag Dim _SPLIT As String() _SPLIT = oTag.Split("%") Dim oPath = LTrim(RTrim(_SPLIT(0).ToString)) Dim MyProcess As New Process() MyProcess.StartInfo.FileName = oPath MyProcess.StartInfo.Arguments = LTrim(RTrim(_SPLIT(1).ToString)) MyProcess.Start() 'Startet den Prozess Catch ex As Exception LOGGER.Error(ex.Message) End Try End Sub Private Sub bbtniCW_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtniCW.ItemClick Try If File.Exists(bbtniCW.Tag) Then Dim MyProcess As New Process() MyProcess.StartInfo.FileName = bbtniCW.Tag MyProcess.Start() Else LOGGER.Warn($"easyFLOW-Exe Not found [{bbtniCW.Tag}]") FormHelper.ShowInfoMessage("Clipboard Watcher could Not be started!", omsgTitleWarning) End If Catch ex As Exception LOGGER.Error(ex.Message) End Try End Sub Private Sub GridViewWorkflows_ColumnPositionChanged(sender As Object, e As EventArgs) Handles GridViewWorkflows.ColumnPositionChanged GridLayout_Changed("ColumnPositionChanged") End Sub Private Sub GridLayout_Changed(oEvent As String) If FormShown = False Or Ev_Filter_Panel_Closed Then Exit Sub End If If FRONTEND_ACTION <> FA_NONE Then Exit Sub End If SaveGridLayout() End Sub Private Sub GridViewWorkflows_EndGrouping(sender As Object, e As EventArgs) Handles GridViewWorkflows.EndGrouping GridLayout_Changed("EndGrouping") End Sub Private Sub bsilastsync_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bsilastsync.ItemClick End Sub Private Sub GridViewWorkflows_KeyDown(sender As Object, e As KeyEventArgs) Handles GridViewWorkflows.KeyDown Dim view As GridView = CType(sender, GridView) If e.Control AndAlso e.KeyCode = Keys.C Then If view.GetRowCellValue(view.FocusedRowHandle, view.FocusedColumn) IsNot Nothing AndAlso view.GetRowCellValue(view.FocusedRowHandle, view.FocusedColumn).ToString() <> [String].Empty Then Clipboard.SetText(view.GetRowCellValue(view.FocusedRowHandle, view.FocusedColumn).ToString()) End If e.Handled = True End If End Sub Private Sub BarCheckItem1_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarCheckItemAutofilter.CheckedChanged If GridIsLoaded = True Then GridViewWorkflows.OptionsView.ShowAutoFilterRow = BarCheckItemAutofilter.Checked End If End Sub Private Sub BarCheckItem1_CheckedChanged_1(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarCheckItemShowSearch.CheckedChanged If GridIsLoaded = True Then GridViewWorkflows.OptionsFind.AlwaysVisible = BarCheckItemShowSearch.Checked End If End Sub Private Sub BarButtonItem4_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem4.ItemClick Grid_Layout_Save() End Sub Sub Grid_Layout_Save() FRONTEND_ACTION = "SAVE GRID LAYOUT" GridViewWorkflows.OptionsView.ShowViewCaption = False GridLayout_Changed("Grid_Layout_Save") FRONTEND_ACTION = FA_NONE End Sub Private Sub BarButtonItem5_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemExportExcel.ItemClick Grid_Export() End Sub Private Sub BarButtonItem6_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem6.ItemClick Grid_Reset_Filter() End Sub Private Sub BarButtonItem7_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem7.ItemClick GridViewWorkflows.ShowCustomization() End Sub Private Async Sub BarButtonItem8_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemWFSingle.ItemClick Me.Cursor = Cursors.WaitCursor Await Item_Scope("CMROW") Me.Cursor = Cursors.Default End Sub Private Async Sub BarButtonItemWFGroup_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemWFGroup.ItemClick Me.Cursor = Cursors.WaitCursor Await Item_Scope("CMGROUP") Me.Cursor = Cursors.Default End Sub Private Sub BarButtonItemFileLink_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemFileLink.ItemClick Dim oReceipiant = "" Dim oFocusedDocGUID = GridViewWorkflows.GetFocusedRowCellValue(GridViewWorkflows.Columns("GUID")) Dim oSQL = $"Select [dbo].[FNPM_GET_FILEPATH] ({oFocusedDocGUID}, 1)" Dim oFilePath = DatabaseFallback.GetScalarValueECM(oSQL) If File.Exists(oFilePath) Then Dim oLink = "
" Dim oLink2 = "Link zur Datei" If Not IsNothing(oFilePath) Then Process.Start($"mailto:{oReceipiant}?subject=Link aus taskFLOW Manager&body={oLink}") End If End If End Sub Private Async Sub BarButtonItemMassValidation_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemMassValidation.ItemClick Try Dim oSelectedRows As Integer() = GridViewWorkflows.GetSelectedRows() Dim oHitInfo As GridHitInfo = GridViewWorkflows.CalcHitInfo(GridCursorLocation) Dim oSelectedRowHandle As Integer = oHitInfo.RowHandle Dim oWorkedFiles As Integer = 0 Dim oProfileId = 0 If oSelectedRows.Count = 0 Then 'Dim omsg = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("MASS_NO_WF_SELECTED") Dim omsg = S.Bitte_wählen_Sie_ein_Profil_aus_ FormHelper.ShowInfoMessage(omsg, omsgTitleWarning) Exit Sub End If oProfileId = GridViewWorkflows.GetRowCellValue(oSelectedRows.Last(), GridViewWorkflows.Columns("PROFILE_ID")) If oProfileId = 0 Then FormHelper.ShowInfoMessage("Could not select a profile!", omsgTitleWarning) Exit Sub End If If SOURCE_INIT = True Then CURRENT_ProfilGUID = oProfileId Dim oSQL = $"select * from TBPM_PROFILE_FINAL_INDEXING WITH (NOLOCK) where PROFIL_ID = {CURRENT_ProfilGUID} ORDER BY [SEQUENCE]" 'CURRENT_DT_FINAL_INDEXING = DataASorDB.GetDatatable("DD_ECM", oSQL, "TBPM_PROFILE_FINAL_INDEXING", $"PROFIL_ID = {CURRENT_ProfilGUID}", "SEQUENCE") CURRENT_DT_FINAL_INDEXING = DatabaseFallback.GetDatatable("TBPM_PROFILE_FINAL_INDEXING", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}", .SortByColumn = "SEQUENCE" }) CURRENT_DT_PROFILE = Nothing '.Clear CURRENT_DT_PROFILE = CURRENT_DT_PROFILES.Clone Dim oExpression = $"GUID = {CURRENT_ProfilGUID}" CURRENT_DT_PROFILES.Select(oExpression).CopyToDataTable(CURRENT_DT_PROFILE, LoadOption.PreserveChanges) If CURRENT_DT_PROFILE.Rows.Count = 1 Then CURRENT_ProfilName = CURRENT_DT_PROFILE.Rows(0).Item("NAME") PROFILE_SHOW_DOCUMENT = CURRENT_DT_PROFILE.Rows(0).Item("SHOW_DOCUMENT") PROFILE_NOT_RESP_COMMENT = CURRENT_DT_PROFILE.Rows(0).Item("NOT_RESP_COMMENT") ActiveWorkflowType = 1 Else Exit Sub End If CURRENT_PROFILE_LOG_INDEX = CURRENT_DT_PROFILE.Rows(0).Item("PM_VEKTOR_INDEX") If CURRENT_PROFILE_LOG_INDEX = "" Then CURRENT_PROFILE_LOG_INDEX = CURRENT_DT_PROFILE.Rows(0).Item("LOG_INDEX") End If Dim NewDatatable As New DataTable NewDatatable.Columns.Add("DocID") NewDatatable.Columns.Add("DOC_GUID") NewDatatable.Columns.Add("FULL_PATH") For Each oRowHandle As Integer In oSelectedRows Dim oDocID = GridViewWorkflows.GetRowCellValue(oRowHandle, "DocID") If IsNothing(oDocID) Then Continue For End If Dim R As DataRow = NewDatatable.NewRow CURRENT_DOC_ID = oDocID Dim DOC_PATH = GridViewWorkflows.GetRowCellValue(oRowHandle, FullFilepatColName) ' CURRENT_DOC_PATH = DOC_PATH CURRENT_DOC_GUID = GridViewWorkflows.GetRowCellValue(oRowHandle, "GUID") R("DocID") = CURRENT_DOC_ID R("FULL_PATH") = DOC_PATH R("DOC_GUID") = GridViewWorkflows.GetRowCellValue(oRowHandle, "GUID") NewDatatable.Rows.Add(R) Next CURRENT_DT_MASS_CHANGE_DOCS = Nothing CURRENT_DT_MASS_CHANGE_DOCS = NewDatatable TimerRefresh.Enabled = False frmMassValidator.ShowDialog() LoadNavBar() Await Decide_Load(False) Else 'Dim oMSG = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("MASS_ERROR_WINDREAM") Dim oMSG = S.Massenabschluss_konnte_nicht_ausgeführt_werden__weil_windream_nicht_initialisiert_werden_konnte_ MsgBox(oMSG, MsgBoxStyle.Critical, "Unexpected Error Massvalidation") End If Catch ex As Exception LOGGER.Error(ex) MsgBox("Unhandled Error in tsmiMarkedFilesFinish_Click: " & ex.Message) End Try End Sub Private Sub RibbonControl1_SelectedPageChanged(sender As Object, e As EventArgs) Handles RibbonControl1.SelectedPageChanged Dim ribbon As RibbonControl = TryCast(sender, RibbonControl) Timer_Inactivity_Reset_Disable("RibbonControl1_SelectedPageChanged") If ribbon.SelectedPage Is RibbonPageAktionen Then If USER_GHOST_MODE_ACTIVE = True And USER_GHOST_MODE_USRNAME <> String.Empty Then LOGGER.Debug("Ghostmode is active...") bbtnitmLanguage_Change.Enabled = False Else bbtnitmLanguage_Change.Enabled = True End If Select Case GridViewItem_Clicked Case "GROUP" If SHOW_MASS_VALIDATOR = True Then BarButtonItemMassValidation.Visibility = DevExpress.XtraBars.BarItemVisibility.Always End If Case "ROW" ' If selectedRows.Count > 1 Then ' CMFileStart.Enabled = False ' Else ' CMFileStart.Enabled = True ' End If ' If CURRENT_CLICKED_PROFILE_ID > 0 Then ' CMGroupStart.Enabled = True ' End If End Select End If End Sub Private Sub barItemGridFontSize_EditValueChanged(sender As Object, e As EventArgs) Handles barItemGridFontSize.EditValueChanged Try CONFIG.Config.GridFontSizeDelta = DirectCast(barItemGridFontSize.EditValue, FontSetting).Value CONFIG.Save() GridBuilder.WithFontSizeDelta(CONFIG.Config.GridFontSizeDelta) Catch ex As Exception End Try End Sub Private Sub GridViewWFItems_SelectionChanged(sender As Object, e As DevExpress.Data.SelectionChangedEventArgs) Handles GridViewWorkflows.SelectionChanged Timer_Inactivity_Reset_Disable("GridViewWFItems_SelectionChanged") End Sub Private Sub GridViewWFItems_Click(sender As Object, e As MouseEventArgs) Handles GridViewWorkflows.Click Try If e.Button = Windows.Forms.MouseButtons.Right Then RibbonControl1.SelectedPage = RibbonPageTabelle Else RibbonControl1.SelectedPage = RibbonPageStart End If Catch ex As Exception LOGGER.Error(ex) End Try End Sub Private Sub frmMain_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed Try 'System.Diagnostics.Process.GetCurrentProcess().Kill() Catch ex As Exception End Try End Sub Private Sub GridViewWFItems_SubstituteFilter(sender As Object, e As DevExpress.Data.SubstituteFilterEventArgs) Handles GridViewWorkflows.SubstituteFilter GridLayout_Changed("GridViewWFItems_SubstituteFilter") End Sub Private Sub BbtnitmAHWF1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BbtnitmAHWF1.ItemClick, BbtnitmAHWF2.ItemClick, BbtnitmAHWF3.ItemClick, BbtnitmAHWF4.ItemClick Dim obutton As DevExpress.XtraBars.BarButtonItem = TryCast(e.Item, DevExpress.XtraBars.BarButtonItem) AdHocWorkflow_BlindFile(obutton.Tag) End Sub Private Sub AdHocWorkflow_BlindFile(pProfileID As Int16) Try If Not Application.OpenForms().OfType(Of frmValidator).Any Then Dim oExpression = $"GUID = {pProfileID}" LOGGER.Debug($"Starting AHWFNoFile for ProfileID: {pProfileID}...") CURRENT_DT_PROFILE = Nothing CURRENT_DT_PROFILE = CURRENT_DT_PROFILES.Clone CURRENT_DT_PROFILES.Select(oExpression).CopyToDataTable(CURRENT_DT_PROFILE, LoadOption.PreserveChanges) If CURRENT_DT_PROFILE.Rows.Count = 1 Then CURRENT_ProfilGUID = pProfileID Dim sGUID As String sGUID = System.Guid.NewGuid.ToString() Dim oTargetPath = CURRENT_DT_PROFILE.Rows(0).Item("TARGET_PATH_BLIND_FILE") Dim oSourcePath = CURRENT_DT_PROFILE.Rows(0).Item("WD_SEARCH") Dim oWMObjecttype = CURRENT_DT_PROFILE.Rows(0).Item("WD_OBJECTTYPE") LOGGER.Debug($"oTargetPath: {oTargetPath}") LOGGER.Debug($"oSourcePath: {oSourcePath}") If oTargetPath = String.Empty Or oSourcePath = String.Empty Then LOGGER.Warn($"oTargetPath is nothing - PRofile can not be startet . Check TARGET_PATH_BLIND_FILE Column in Profile") Exit Sub End If oTargetPath = $"{oTargetPath}\{Now.Year}\{Now.Month}\{Now.Day}" oTargetPath = oTargetPath & "\" & sGUID & ".pdf" LOGGER.Debug($"oTargetPath with NowParams: {oTargetPath}") Dim oResult = WINDREAM_MOD.NewFileStream(oSourcePath, oTargetPath, oWMObjecttype) If oResult = True Then WM_AHWF_docPath = oTargetPath Dim oDocID = WINDREAM_MOD.NewDocumentID CURRENT_CLICKED_PROFILE_ID = pProfileID PROFILE_SHOW_DOCUMENT = CURRENT_DT_PROFILE.Rows(0).Item("SHOW_DOCUMENT") CURRENT_CLICKED_PROFILE_TITLE = CURRENT_DT_PROFILE.Rows(0).Item("TITLE") CURRENT_WMObjecttype = CURRENT_DT_PROFILE.Rows(0).Item("WD_OBJECTTYPE") CURRENT_DOC_ID = oDocID CURRENT_DOC_GUID = 99123456789 ActiveWorkflowType = ConstAHWorkflow_BlindFile CURRENT_JUMP_DOC_GUID = CURRENT_DOC_GUID DT_FILTERED_PROFILE_SEARCHES_DOC = Nothing DT_FILTERED_PROFILE_SEARCHES_DOC = BASEDATA_DT_PROFILES_SEARCHES_DOC.Copy DT_FILTERED_PROFILE_SEARCHES_DOC.Clear() oExpression = $"PROFILE_ID = {CURRENT_ProfilGUID}" BASEDATA_DT_PROFILES_SEARCHES_DOC.Select(oExpression, "TAB_INDEX").CopyToDataTable(DT_FILTERED_PROFILE_SEARCHES_DOC, LoadOption.PreserveChanges) DT_FILTERED_PROFILE_SEARCHES_DATA = Nothing DT_FILTERED_PROFILE_SEARCHES_DATA = BASEDATA_DT_PROFILES_SEARCHES_DATA.Copy DT_FILTERED_PROFILE_SEARCHES_DATA.Clear() BASEDATA_DT_PROFILES_SEARCHES_DATA.Select(oExpression, "TAB_INDEX").CopyToDataTable(DT_FILTERED_PROFILE_SEARCHES_DATA, LoadOption.PreserveChanges) Try Dim oEnvironment = GetEnvironment() _FormValidator = New frmValidator(oEnvironment) AddHandler _FormValidator.FormClosed, AddressOf ValidatorClosed _FormValidator.Show() Catch ex As Exception LOGGER.Warn($"Error opening Form frmValidator [{ex.Message}]") LOGGER.Warn($"ex.InnerException.Message [{ex.InnerException.Message}]") LOGGER.Warn($"ex.InnerException.Source [{ex.InnerException.Source}]") LOGGER.Error(ex.InnerException) MsgBox(ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE) End Try End If Else LOGGER.Info("Attention: CURRENT_DT_PROFILE.Rows.Count <> 1") End If Else FormHelper.ShowInfoMessage(S.Bitte_schließen_Sie_den_offenen_Workflow_, omsgTitleWarning) Exit Sub End If Catch ex As Exception LOGGER.Error(ex) End Try End Sub Private Sub bbtnitmLanguage_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitmLanguage_Change.ItemClick Dim oNForm As New frmLanguage_Select(LOGCONFIG, CONNECTION_STRING_ECM, USER_USERNAME, BASEDATA_DT_LANGUAGE, "TF") oNForm.ShowDialog() If oNForm.pChanged = True Then MsgBox("For the changes to take effect, the program must now be closed. Restart it afterwards.", MsgBoxStyle.Exclamation, "Restart:") Me.Close() End If End Sub Private Sub BBtnItmNotfications_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BBtnItmNotfications.ItemClick Open_Notifications_Form() End Sub Private Sub GridViewWFItems_Click(sender As Object, e As EventArgs) Handles GridViewWorkflows.Click End Sub Private Async Sub BarButtonItem3_ItemClick_2(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemResetLayout.ItemClick LOGGER.Info("User clicked reset layout") Await GridLayout_Reset(True) End Sub Private Sub barbtnitmsaveLogfiles_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles barbtnitmsaveLogfiles.ItemClick ClassAllgemeineFunktionen.Save_Logfiles() End Sub End Class