From a192267d968024ae4085b72817c2f3fdab319cb2 Mon Sep 17 00:00:00 2001 From: Developer01 Date: Mon, 2 Mar 2026 16:29:14 +0100 Subject: [PATCH] MS Anpassung Speicherung IDBData --- app/TaskFlow/ClassIDBData.vb | 15 +++-- app/TaskFlow/frmValidator.vb | 112 +++++++++++++---------------------- 2 files changed, 52 insertions(+), 75 deletions(-) diff --git a/app/TaskFlow/ClassIDBData.vb b/app/TaskFlow/ClassIDBData.vb index afe38ab..ca0542c 100644 --- a/app/TaskFlow/ClassIDBData.vb +++ b/app/TaskFlow/ClassIDBData.vb @@ -210,7 +210,7 @@ oID_IS_FOREIGN = 1 End If - Dim oDELSQL = $"EXEC PRIDB_DELETE_TERM_OBJECT_METADATA {CURRENT_DOC_ID},'{oAttributeName}','{oTerm2Delete}','{USER_USERNAME}','{USER_LANGUAGE}',{oID_IS_FOREIGN}" + Dim oDELSQL = $"EXEC PRIDB_DELETE_TERM_OBJECT_METADATA {CURRENT_DOC_ID},'{oAttributeName}','{oTerm2Delete}','{USER_USERNAME}','{USER_LANGUAGE}',{oID_IS_FOREIGN};" LOGGER.Debug($"Delete_Term_Object_From_Metadata: {oDELSQL}") 'DatabaseFallback.ExecuteNonQueryIDB(oDELSQL) Return ExecuteOrQueue(oDELSQL) @@ -222,7 +222,7 @@ End Function Public Function Delete_AttributeData(pIDB_OBJID As Int64, pAttributeName As String) As Object Try - Dim oDELSQL = $"EXEC PRIDB_DELETE_ATTRIBUTE_DATA {pIDB_OBJID},'{pAttributeName}','{USER_USERNAME}'" + Dim oDELSQL = $"EXEC PRIDB_DELETE_ATTRIBUTE_DATA {pIDB_OBJID},'{pAttributeName}','{USER_USERNAME}';" LOGGER.Debug($"Delete_Attribute_Data: {oDELSQL}") ' DatabaseFallback.ExecuteNonQueryIDB(oDELSQL) Return ExecuteOrQueue(oDELSQL) @@ -235,13 +235,18 @@ Public Function SetVariableValue(oAttributeName As String, oNewValue As Object, Optional CheckDeleted As Boolean = False, Optional oIDBTyp As Integer = 0) Try + Dim omsg = $"IDBData - SetVariableValue - Attribute: [{oAttributeName}] - NewValue: [{oNewValue}] - CheckDeleted: [{CheckDeleted.ToString}] - oIDBTyp: [{oIDBTyp}]" + LOGGER.Debug(omsg) Dim omytype = oNewValue.GetType.ToString If omytype = "System.Data.DataTable" Then Dim oDTMyNewValues As DataTable = oNewValue Dim oAttributeResultFromDB Dim oTypeOldResult + ' Für DataTable (Mehrfachauswahl/Vektor) IMMER auf gelöschte Werte prüfen, + ' unabhängig vom übergebenen CheckDeleted-Parameter. + Dim oEffectiveCheckDeleted As Boolean = True - If CheckDeleted = True Then + If oEffectiveCheckDeleted = True Then oAttributeResultFromDB = GetVariableValue(oAttributeName, oIDBTyp) oTypeOldResult = oAttributeResultFromDB.GetType.ToString If TypeOf oAttributeResultFromDB Is DataTable Then @@ -306,7 +311,7 @@ 'Dim oSuccess As Boolean = False Dim oVALUE = oNewValueRow.Item(1).ToString oVALUE = oVALUE.Replace("'", "''") - Dim oPRSQL = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oVALUE}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT" + Dim oPRSQL = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oVALUE}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT;" LOGGER.Debug(oPRSQL) 'oSuccess = DatabaseFallback.ExecuteNonQueryIDB(oPRSQL) If Not ExecuteOrQueue(oPRSQL) Then Return False @@ -317,7 +322,7 @@ Return True Else 'oNewValue = oNewValue.Replace("'", "' + NCHAR(39) + '") - Dim oPRIDB_NEW_OBJ_DATA = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oNewValue}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT" + Dim oPRIDB_NEW_OBJ_DATA = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oNewValue}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT;" LOGGER.Debug(oPRIDB_NEW_OBJ_DATA) ' Return DatabaseFallback.ExecuteNonQueryIDB(oPRIDB_NEW_OBJ_DATA) Return ExecuteOrQueue(oPRIDB_NEW_OBJ_DATA) diff --git a/app/TaskFlow/frmValidator.vb b/app/TaskFlow/frmValidator.vb index f9136c5..88c4a1c 100644 --- a/app/TaskFlow/frmValidator.vb +++ b/app/TaskFlow/frmValidator.vb @@ -716,8 +716,8 @@ Public Class frmValidator Try Dim oSQL As String If CURRENT_DOC_GUID <> 0 Then - Dim oPRoc = String.Format("EXEC PRTF_PROFILE_FILES_WORK {0},{1},{2},'FreeFile'", CURRENT_DOC_ID, CURRENT_ProfilGUID, USER_ID) - oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" & vbNewLine & oPRoc + Dim oPRoc = String.Format("EXEC PRTF_PROFILE_FILES_WORK {0},{1},{2},'FreeFile';", CURRENT_DOC_ID, CURRENT_ProfilGUID, USER_ID) + oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" & vbCrLf & oPRoc Else oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" End If @@ -999,83 +999,55 @@ Public Class frmValidator MyValidationLogger.Debug($" DataSource-Typ: {lookup.Properties.DataSource?.GetType()}") MyValidationLogger.Debug($" ValueMember: [{lookup.Properties.ValueMember}]") MyValidationLogger.Debug($" DisplayMember: [{lookup.Properties.DisplayMember}]") - Dim ds = TryCast(lookup.Properties.DataSource, DataTable) - If ds IsNot Nothing Then - MyValidationLogger.Debug($" DataSource hat {ds.Rows.Count} Zeilen, {ds.Columns.Count} Spalten") - If ds.Rows.Count > 0 Then - MyValidationLogger.Debug($" Erster Wert: [{ds.Rows(0)(lookup.Properties.ValueMember)}]") - MyValidationLogger.Debug($" Spalten: {String.Join(", ", ds.Columns.Cast(Of DataColumn)().Select(Function(c) c.ColumnName))}") - End If - Else - MyValidationLogger.Warn($"⚠️ DataSource ist NICHT vom Typ DataTable!") - End If - ' ========== BUGFIX: Wert SICHERN bevor DataSource überschrieben wird ========== - Dim previousSelectedValues As List(Of String) = Nothing + Dim originalValueMember = lookup.Properties.ValueMember + Dim originalDisplayMember = lookup.Properties.DisplayMember - ' Aber ACHTUNG: Nur sichern, wenn bereits Werte gesetzt sind! + Dim previousSelectedValues As List(Of String) = Nothing If lookup.Properties.SelectedValues IsNot Nothing AndAlso lookup.Properties.SelectedValues.Count > 0 Then - ' Hier KÖNNEN Werte drin sein (z.B. "4711" aus FillIndexValues) previousSelectedValues = New List(Of String)(lookup.Properties.SelectedValues) MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Alte SelectedValues gesichert: [{String.Join(",", previousSelectedValues)}]") End If - ' DataSource MIT NEUEM DataTable ÜBERSCHREIBEN (das ist der "Fehler") - lookup.Properties.DataSource = oDTContent - lookup.Properties.ValueMember = oDTContent.Columns.Item(0).ColumnName - lookup.Properties.DisplayMember = oDTContent.Columns.Item(0).ColumnName - ' *** DEBUG-CODE HIER EINFÜGEN *** - MyValidationLogger.Debug($"[LoadSQLData DEBUG] Lookup [{name}] konfiguriert:") - MyValidationLogger.Debug($" DataSource-Typ: {lookup.Properties.DataSource?.GetType()}") - MyValidationLogger.Debug($" ValueMember: [{lookup.Properties.ValueMember}]") - MyValidationLogger.Debug($" DisplayMember: [{lookup.Properties.DisplayMember}]") + lookup.Properties.BeginUpdate() + Try + lookup.Properties.DataSource = oDTContent - ds = TryCast(lookup.Properties.DataSource, DataTable) - If ds IsNot Nothing Then - MyValidationLogger.Debug($" DataSource hat {ds.Rows.Count} Zeilen, {ds.Columns.Count} Spalten") - If ds.Rows.Count > 0 Then - Try - MyValidationLogger.Debug($" Erster Wert: [{ds.Rows(0)(lookup.Properties.ValueMember)}]") - MyValidationLogger.Debug($" Spalten: {String.Join(", ", ds.Columns.Cast(Of DataColumn)().Select(Function(c) c.ColumnName))}") - Catch ex As Exception - MyValidationLogger.Warn($"⚠️ Error in LookUpLoadSQLData: {ex.Message}") - End Try + Dim valueMember As String = originalValueMember + If String.IsNullOrWhiteSpace(valueMember) OrElse Not oDTContent.Columns.Contains(valueMember) Then + valueMember = oDTContent.Columns(0).ColumnName End If - Else - MyValidationLogger.Warn($"⚠️ DataSource ist NICHT vom Typ DataTable!") - End If - ' *** ENDE DEBUG-CODE *** - ' ========== CRITICAL: Nach DataSource-Zuweisung sind SelectedValues GELÖSCHT! ========== - ' Daher müssen wir sie WIEDERHERSTELLEN: - If previousSelectedValues IsNot Nothing AndAlso previousSelectedValues.Count > 0 Then - ' Nur wiederherstellen wenn: - ' 1. Wir vorher Werte gesichert haben UND - ' 2. Die Werte im NEUEN DataSource existieren - - ' Optional: Validierung dass Werte noch im neuen DataSource vorhanden sind - Dim newDataSource As DataTable = lookup.Properties.DataSource - Dim validValues As New List(Of String) - - For Each oldValue As String In previousSelectedValues - ' Prüfe ob oldValue im neuen DataSource existiert - Dim exists = newDataSource.AsEnumerable(). - Any(Function(r) r.Item(0).ToString = oldValue) - - If exists Then - validValues.Add(oldValue) - MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Wert [{oldValue}] existiert im neuen DataSource ✓") - Else - MyValidationLogger.Warn($"⚠️ [LoadSQLData BUGFIX] Wert [{oldValue}] existiert NICHT im neuen DataSource ✗") - End If - Next - ' Nur wenn noch gültige Werte übrig sind - If validValues.Count > 0 Then - lookup.Properties.SelectedValues = validValues - MyValidationLogger.Debug($"[LoadSQLData BUGFIX] SelectedValues wiederhergestellt: [{String.Join(",", validValues)}]") - Else - MyValidationLogger.Warn($"⚠️ [LoadSQLData BUGFIX] Keine Werte zum Wiederherstellen vorhanden!") + Dim displayMember As String = originalDisplayMember + If String.IsNullOrWhiteSpace(displayMember) OrElse Not oDTContent.Columns.Contains(displayMember) Then + displayMember = valueMember End If - End If + + lookup.Properties.ValueMember = valueMember + lookup.Properties.DisplayMember = displayMember + + If previousSelectedValues IsNot Nothing AndAlso previousSelectedValues.Count > 0 Then + Dim validValues As New List(Of String) + + For Each oldValue As String In previousSelectedValues + Dim exists = oDTContent.AsEnumerable(). + Any(Function(r) r.Item(valueMember).ToString = oldValue) + + If exists Then + validValues.Add(oldValue) + MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Wert [{oldValue}] existiert im neuen DataSource ✓") + Else + MyValidationLogger.Warn($"⚠️ [LoadSQLData BUGFIX] Wert [{oldValue}] existiert NICHT im neuen DataSource ✗") + End If + Next + + If validValues.Count > 0 Then + lookup.Properties.SelectedValues = validValues + MyValidationLogger.Debug($"[LoadSQLData BUGFIX] SelectedValues wiederhergestellt: [{String.Join(",", validValues)}]") + End If + End If + Finally + lookup.Properties.EndUpdate() + End Try Catch ex As Exception MyValidationLogger.Warn("⚠️ Error in LookUpLoadSQLData: " & ex.Message) @@ -6985,7 +6957,7 @@ Public Class frmValidator Try MyValidationLogger.Debug("Skipping document....(Datei_ueberspringen)") Dim oPRoc = String.Format("EXEC PRTF_PROFILE_FILES_WORK {0},{1},{2},{3}", CURRENT_DOC_ID, CURRENT_ProfilGUID, USER_ID, "FreeFile") - Dim oSQL = oPRoc & vbNewLine & + Dim oSQL = oPRoc & vbCrLf & $"EXECUTE PRPM_FILES_NOT_INDEXED '{USER_USERNAME}',{CURRENT_ProfilGUID},'{WMDocPathWindows}',{CURRENT_DOC_GUID};" If LOG_HOTSPOTS Then ' ========== DIAGNOSE: Vor DB-Execute ==========