MS 2.8.2 Fehlerhandling und Column-Formel Test bei Henning

This commit is contained in:
Developer01
2026-02-25 13:16:12 +01:00
parent 25dcfb2061
commit 743ef3fe22
16 changed files with 2392 additions and 1160 deletions

View File

@@ -21,6 +21,7 @@ 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
@@ -36,7 +37,7 @@ Public Class frmMain
Private YellowDocuments As Integer = 0
Private GreenDocuments As Integer = 0
Private GridViewItem_Clicked = Nothing
Private GridCursorLocation As Point
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
@@ -454,7 +455,7 @@ Public Class frmMain
Timer_Inactivity_Reset_Disable("FormLoad")
'Restore_Form_Position()
Dim oSavedPosition As Point = My.Settings.frmMainPosition
Dim oSavedPosition As System.Drawing.Point = My.Settings.frmMainPosition
' Prüfen, ob die Position sichtbar ist
If IsPositionVisible(oSavedPosition) Then
@@ -539,10 +540,10 @@ Public Class frmMain
FormOpenClose = False
End Sub
Private Function IsPositionVisible(position As Point) As Boolean
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 sichtbar
Return True ' Punkt ist auf diesem Bildschirm sichtbar
End If
Next
Return False ' Punkt ist außerhalb aller sichtbaren Bereiche
@@ -1430,7 +1431,6 @@ Public Class frmMain
' ========== 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...")
@@ -1441,6 +1441,8 @@ Public Class frmMain
Exit Function
End If
Await Task.Yield()
' Daten laden
loadSuccess = Await LoadOverviewData(pIsFormLoad, ForceReload)
@@ -1454,6 +1456,8 @@ Public Class frmMain
Exit Function
End If
Await Task.Yield()
' Daten laden
loadSuccess = Await LoadProfileData(ForceReload)
End If
@@ -1518,9 +1522,17 @@ Public Class frmMain
' 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
@@ -1541,8 +1553,22 @@ Public Class frmMain
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")
@@ -1557,9 +1583,25 @@ Public Class frmMain
' 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
@@ -1580,7 +1622,21 @@ Public Class frmMain
End If
' ========== ICON-SPALTE VORBEREITEN ==========
PrepareIconColumn()
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
@@ -1589,9 +1645,32 @@ Public Class frmMain
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
@@ -1609,9 +1688,17 @@ Public Class frmMain
' LoadingPanel verstecken (NUR HIER!)
GridViewWorkflows.HideLoadingPanel()
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
' ========================================
@@ -1657,7 +1744,7 @@ Public Class frmMain
End If
' ========== BASIC VIEW ERSTELLEN ==========
CreateBasicViewForProfile()
Await CreateBasicViewForProfile()
Return True
@@ -1793,7 +1880,7 @@ Public Class frmMain
End Try
End Sub
Private Sub CreateBasicViewForProfile()
Private Async Function CreateBasicViewForProfile() As Task
GridControlWorkflows.DataSource = Nothing
Try
GridViewWorkflows.Columns.Clear()
@@ -1802,7 +1889,7 @@ Public Class frmMain
LOGGER.Warn("⚠️ Could not clear GridViewWorkflows.Columns")
End Try
PrepareIconColumn()
Await Task.Run(Sub() PrepareIconColumn())
bindsourcegrid.DataSource = DT_CURR_WF_ITEMS
GridControlWorkflows.DataSource = bindsourcegrid
@@ -1820,7 +1907,7 @@ Public Class frmMain
Catch ex As Exception
End Try
End If
End Sub
End Function
Private Sub ApplyPostLoadSettings()
If SHOW_MASS_VALIDATOR = False Then
@@ -2099,45 +2186,100 @@ Public Class frmMain
CURRENT_CLICKED_PROFILE_ID = oHitProfilID
End If
End If
' ========== GRUPPE VERARBEITEN (OPTIMIERT) ==========
' ========== GRUPPE VERARBEITEN (MIT KORREKTER GRUPPEN-ERMITTLUNG) ==========
If startedFrom = "CMGROUP" Then
LOGGER.Debug("Loading Child DocIds..")
LOGGER.Debug("Loading Child DocIds from focused expanded group..")
Dim oIds As New List(Of Integer)
Dim oGroupRowHandle = hitInfo.RowHandle
Dim oChildRowCount = GridViewWorkflows.GetChildRowCount(oGroupRowHandle)
Dim oGroupRowHandle As Integer
' OPTIMIERUNG: Kapazität vorbelegen
oIds.Capacity = oChildRowCount
' OPTIMIERUNG: Direkte Schleife statt verschachtelter Logik
If oChildRowCount > 0 Then
For index = 0 To oChildRowCount - 1
Dim oChildRowHandle = GridViewWorkflows.GetChildRowHandle(oGroupRowHandle, index)
Dim oRow = GridViewWorkflows.GetRow(oChildRowHandle)
If oRow IsNot Nothing Then
Dim oDocId = oRow.Item("DocId")
If oDocId IsNot Nothing Then
oIds.Add(oDocId)
End If
End If
Next
' 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
' Fallback nur bei Bedarf
For index = 0 To GridViewWorkflows.RowCount - 1
Dim oRow = GridViewWorkflows.GetRow(index)
If oRow Is Nothing Then Continue For
' 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}")
Dim oProfileId = oRow.row.item("PROFILE_ID")
If oProfileId Is Nothing Then Continue For
If CInt(oProfileId) = CURRENT_CLICKED_PROFILE_ID Then
oIds.Add(oRow.item("DocId"))
End If
Next
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
LOGGER.Debug("[{0}] DocIds loaded", oIds.Count)
' 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)
@@ -2145,14 +2287,13 @@ Public Class frmMain
Exit Function
End If
' ========== DB-OPERATIONEN OPTIMIERT ==========
' ========== 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)
LOGGER.Debug("Adding {0} queued DocIds..", oIds.Count)
' OPTIMIERUNG: Batch-Insert statt einzelner Inserts
Dim oInsertBatch As New System.Text.StringBuilder()
oInsertBatch.AppendLine("INSERT INTO TBPM_VALIDATION_PROFILE_GROUP_USER ([PROFIL_ID],[DocID],[UserID],[ADDED_WHO]) VALUES")
@@ -2161,6 +2302,9 @@ Public Class frmMain
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
@@ -2999,7 +3143,7 @@ Public Class frmMain
})
End Sub
Sub LoadVWPM_CONTROL_INDEX()
Dim oSQL = $"SELECT * FROM VWPM_CONTROL_INDEX WITH (NOLOCK) ORDER BY PROFIL_ID,Y_LOC, X_LOC"
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
@@ -3014,7 +3158,7 @@ Public Class frmMain
If pMode = "bwBasicData" Then bwBasicData.ReportProgress(10)
If pMode <> "Load" Then
ClassParamRefresh.Refresh_Params(DT_CHECKUSER_MODULE)
ClassParamRefresh.Refresh_Params(DT_CHECKUSER_MODULE, pMode)
End If
If pMode = "bwBasicData" Then bwBasicData.ReportProgress(20)
@@ -3023,7 +3167,7 @@ Public Class frmMain
LOGGER.Debug($"VWPM_PROFILE_ACTIVE-SELECT used from DD-SQL-Config..")
Else
oSQL = $"SELECT [dbo].[FNDD_LANGUAGE_PHRASE] ('PROFILE_TITLE' + CONVERT(VARCHAR(4),T.GUID),'{USER_LANGUAGE}','PM') as GROUP_TEXT_LANG, T.*
FROM VWPM_PROFILE_ACTIVE T WITH (NOLOCK) WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_GET_ACTIVE_PROFILES_USER] ({USER_ID}))"
FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_GET_ACTIVE_PROFILES_USER] ({USER_ID}))"
End If
@@ -3350,7 +3494,7 @@ FROM VWPM_PROFILE_ACTIVE T WITH (NOLOCK) WHERE T.GUID IN (SELECT PROFILE_ID FROM
End Sub
Private Sub OutOfRangePMFixierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OutOfRangePMFixierenToolStripMenuItem.Click
Dim myPoint As Point = New Point(50, 50)
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