MS Anpassung Speicherung IDBData

This commit is contained in:
Developer01
2026-03-02 16:29:14 +01:00
parent a0d3a487d8
commit a192267d96
2 changed files with 49 additions and 72 deletions

View File

@@ -210,7 +210,7 @@
oID_IS_FOREIGN = 1 oID_IS_FOREIGN = 1
End If 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}") LOGGER.Debug($"Delete_Term_Object_From_Metadata: {oDELSQL}")
'DatabaseFallback.ExecuteNonQueryIDB(oDELSQL) 'DatabaseFallback.ExecuteNonQueryIDB(oDELSQL)
Return ExecuteOrQueue(oDELSQL) Return ExecuteOrQueue(oDELSQL)
@@ -222,7 +222,7 @@
End Function End Function
Public Function Delete_AttributeData(pIDB_OBJID As Int64, pAttributeName As String) As Object Public Function Delete_AttributeData(pIDB_OBJID As Int64, pAttributeName As String) As Object
Try 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}") LOGGER.Debug($"Delete_Attribute_Data: {oDELSQL}")
' DatabaseFallback.ExecuteNonQueryIDB(oDELSQL) ' DatabaseFallback.ExecuteNonQueryIDB(oDELSQL)
Return ExecuteOrQueue(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) Public Function SetVariableValue(oAttributeName As String, oNewValue As Object, Optional CheckDeleted As Boolean = False, Optional oIDBTyp As Integer = 0)
Try Try
Dim omsg = $"IDBData - SetVariableValue - Attribute: [{oAttributeName}] - NewValue: [{oNewValue}] - CheckDeleted: [{CheckDeleted.ToString}] - oIDBTyp: [{oIDBTyp}]"
LOGGER.Debug(omsg)
Dim omytype = oNewValue.GetType.ToString Dim omytype = oNewValue.GetType.ToString
If omytype = "System.Data.DataTable" Then If omytype = "System.Data.DataTable" Then
Dim oDTMyNewValues As DataTable = oNewValue Dim oDTMyNewValues As DataTable = oNewValue
Dim oAttributeResultFromDB Dim oAttributeResultFromDB
Dim oTypeOldResult 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) oAttributeResultFromDB = GetVariableValue(oAttributeName, oIDBTyp)
oTypeOldResult = oAttributeResultFromDB.GetType.ToString oTypeOldResult = oAttributeResultFromDB.GetType.ToString
If TypeOf oAttributeResultFromDB Is DataTable Then If TypeOf oAttributeResultFromDB Is DataTable Then
@@ -306,7 +311,7 @@
'Dim oSuccess As Boolean = False 'Dim oSuccess As Boolean = False
Dim oVALUE = oNewValueRow.Item(1).ToString Dim oVALUE = oNewValueRow.Item(1).ToString
oVALUE = oVALUE.Replace("'", "''") 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) LOGGER.Debug(oPRSQL)
'oSuccess = DatabaseFallback.ExecuteNonQueryIDB(oPRSQL) 'oSuccess = DatabaseFallback.ExecuteNonQueryIDB(oPRSQL)
If Not ExecuteOrQueue(oPRSQL) Then Return False If Not ExecuteOrQueue(oPRSQL) Then Return False
@@ -317,7 +322,7 @@
Return True Return True
Else Else
'oNewValue = oNewValue.Replace("'", "' + NCHAR(39) + '") '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) LOGGER.Debug(oPRIDB_NEW_OBJ_DATA)
' Return DatabaseFallback.ExecuteNonQueryIDB(oPRIDB_NEW_OBJ_DATA) ' Return DatabaseFallback.ExecuteNonQueryIDB(oPRIDB_NEW_OBJ_DATA)
Return ExecuteOrQueue(oPRIDB_NEW_OBJ_DATA) Return ExecuteOrQueue(oPRIDB_NEW_OBJ_DATA)

View File

@@ -716,8 +716,8 @@ Public Class frmValidator
Try Try
Dim oSQL As String Dim oSQL As String
If CURRENT_DOC_GUID <> 0 Then 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) 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 oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" & vbCrLf & oPRoc
Else Else
oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};"
End If End If
@@ -999,83 +999,55 @@ Public Class frmValidator
MyValidationLogger.Debug($" DataSource-Typ: {lookup.Properties.DataSource?.GetType()}") MyValidationLogger.Debug($" DataSource-Typ: {lookup.Properties.DataSource?.GetType()}")
MyValidationLogger.Debug($" ValueMember: [{lookup.Properties.ValueMember}]") MyValidationLogger.Debug($" ValueMember: [{lookup.Properties.ValueMember}]")
MyValidationLogger.Debug($" DisplayMember: [{lookup.Properties.DisplayMember}]") MyValidationLogger.Debug($" DisplayMember: [{lookup.Properties.DisplayMember}]")
Dim ds = TryCast(lookup.Properties.DataSource, DataTable) Dim originalValueMember = lookup.Properties.ValueMember
If ds IsNot Nothing Then Dim originalDisplayMember = lookup.Properties.DisplayMember
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
' 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 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) previousSelectedValues = New List(Of String)(lookup.Properties.SelectedValues)
MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Alte SelectedValues gesichert: [{String.Join(",", previousSelectedValues)}]") MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Alte SelectedValues gesichert: [{String.Join(",", previousSelectedValues)}]")
End If End If
' DataSource MIT NEUEM DataTable ÜBERSCHREIBEN (das ist der "Fehler") lookup.Properties.BeginUpdate()
lookup.Properties.DataSource = oDTContent Try
lookup.Properties.ValueMember = oDTContent.Columns.Item(0).ColumnName lookup.Properties.DataSource = oDTContent
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}]")
ds = TryCast(lookup.Properties.DataSource, DataTable) Dim valueMember As String = originalValueMember
If ds IsNot Nothing Then If String.IsNullOrWhiteSpace(valueMember) OrElse Not oDTContent.Columns.Contains(valueMember) Then
MyValidationLogger.Debug($" DataSource hat {ds.Rows.Count} Zeilen, {ds.Columns.Count} Spalten") valueMember = oDTContent.Columns(0).ColumnName
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
End If 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 displayMember As String = originalDisplayMember
Dim newDataSource As DataTable = lookup.Properties.DataSource If String.IsNullOrWhiteSpace(displayMember) OrElse Not oDTContent.Columns.Contains(displayMember) Then
Dim validValues As New List(Of String) displayMember = valueMember
End If
For Each oldValue As String In previousSelectedValues lookup.Properties.ValueMember = valueMember
' Prüfe ob oldValue im neuen DataSource existiert lookup.Properties.DisplayMember = displayMember
Dim exists = newDataSource.AsEnumerable().
Any(Function(r) r.Item(0).ToString = oldValue)
If exists Then If previousSelectedValues IsNot Nothing AndAlso previousSelectedValues.Count > 0 Then
validValues.Add(oldValue) Dim validValues As New List(Of String)
MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Wert [{oldValue}] existiert im neuen DataSource ✓")
Else For Each oldValue As String In previousSelectedValues
MyValidationLogger.Warn($"⚠️ [LoadSQLData BUGFIX] Wert [{oldValue}] existiert NICHT im neuen DataSource ✗") 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
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!")
End If End If
End If Finally
lookup.Properties.EndUpdate()
End Try
Catch ex As Exception Catch ex As Exception
MyValidationLogger.Warn("⚠️ Error in LookUpLoadSQLData: " & ex.Message) MyValidationLogger.Warn("⚠️ Error in LookUpLoadSQLData: " & ex.Message)
@@ -6985,7 +6957,7 @@ Public Class frmValidator
Try Try
MyValidationLogger.Debug("Skipping document....(Datei_ueberspringen)") 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 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};" $"EXECUTE PRPM_FILES_NOT_INDEXED '{USER_USERNAME}',{CURRENT_ProfilGUID},'{WMDocPathWindows}',{CURRENT_DOC_GUID};"
If LOG_HOTSPOTS Then If LOG_HOTSPOTS Then
' ========== DIAGNOSE: Vor DB-Execute ========== ' ========== DIAGNOSE: Vor DB-Execute ==========