Zu testen bei ewa

This commit is contained in:
Developer01
2026-03-18 15:31:59 +01:00
parent a50e7e3c55
commit 1469063ad7
7 changed files with 591 additions and 266 deletions

View File

@@ -274,11 +274,20 @@ Public Class ClassDocGrid
End If
End If
End Sub
Public Shared Sub FillColumns(pDocGridView As GridView,
DT_RESULT As DataTable, DT_WINDREAM_RESULTLIST As DataTable, DT_DOCRESULT_DROPDOWN_ITEMS As DataTable,
DropdownValueChangedHandler As EventHandler, DatepickerValueChangedHandler As EventHandler, TextValueChangedHandler As EventHandler, CheckValueChangedHandler As EventHandler,
SearchType As String, RECORD_ID As Integer)
DT_RESULT As DataTable, DT_WINDREAM_RESULTLIST As DataTable, DT_DOCRESULT_DROPDOWN_ITEMS As DataTable,
DropdownValueChangedHandler As EventHandler, DatepickerValueChangedHandler As EventHandler, TextValueChangedHandler As EventHandler, CheckValueChangedHandler As EventHandler,
SearchType As String, RECORD_ID As Integer)
' ── 1. KRITISCH: Event-Handler ENTFERNEN vor Neuregistrierung ───────────
RemoveHandler pDocGridView.MasterRowExpanded, AddressOf gridView_MasterRowExpanded
RemoveHandler pDocGridView.CustomColumnDisplayText, AddressOf gridView_CustomColumnDisplayText
RemoveHandler pDocGridView.FocusedRowChanged, AddressOf GVDoc_Values_FocusedRowChanged
' ── 2. DATE_COLUMNS Listen leeren (verhindert Duplikate) ────────────────
DATE_COLUMNS.Clear()
DATE_COLUMNS_CONFIG.Clear()
' Handler speichern
_dropdownValueChangedHandler = DropdownValueChangedHandler
_datepickerValueChangedHandler = DatepickerValueChangedHandler
@@ -299,7 +308,6 @@ Public Class ClassDocGrid
Dim columnTitle As String = row.Item("HEADER_CAPTION")
Dim type As Integer = row.Item("TYPE_ID")
If type = 3 And isConfig = False Then
DATE_COLUMNS.Add(columnTitle)
ElseIf type = 3 And isConfig = True Then
@@ -329,13 +337,13 @@ Public Class ClassDocGrid
DT_DETAIL_VALUES = ClassDataCache.GetOrLoad(cacheKey, Function()
Dim sql = String.Format(
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
"FROM TBPMO_DOC_VALUES T " &
"INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP ON T.RECORD_ID = TTEMP.RECORD_ID " &
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1",
CURRENT_ENTITY_ID, USER_LANGUAGE)
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
"FROM TBPMO_DOC_VALUES T " &
"INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP ON T.RECORD_ID = TTEMP.RECORD_ID " &
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1",
CURRENT_ENTITY_ID, USER_LANGUAGE)
Return MYDB_ECM.GetDatatable(sql)
End Function, TimeSpan.FromMinutes(2))
@@ -344,12 +352,12 @@ Public Class ClassDocGrid
DT_DETAIL_VALUES = ClassDataCache.GetOrLoad(cacheKey, Function()
Dim sql = String.Format(
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
"FROM TBPMO_DOC_VALUES T " &
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1 AND T.RECORD_ID = {2}",
CURRENT_ENTITY_ID, USER_LANGUAGE, RECORD_ID)
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
"FROM TBPMO_DOC_VALUES T " &
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1 AND T.RECORD_ID = {2}",
CURRENT_ENTITY_ID, USER_LANGUAGE, RECORD_ID)
Return MYDB_ECM.GetDatatable(sql)
End Function, TimeSpan.FromMinutes(2))
End Select
@@ -374,9 +382,6 @@ Public Class ClassDocGrid
If oFlteredRows.Length > 0 Then
value = oFlteredRows(0)("VALUE").ToString()
End If
'value = MYDB_ECM.GetScalarValue(String.Format("SELECT VALUE FROM TBPMO_DOC_VALUES WHERE CONFIG_ID = {0} AND DocID = {1} AND RECORD_ID = {2}", oConfigID, oDocID, RECORD_ID))
Catch ex As Exception
LOGGER.Warn(String.Format("Attention: Could not get Value from TBPMO_DOC_VALUES for ConfigId[{0}], DocId[{1}]: ", oConfigID, oDocID) & ex.Message)
End Try
@@ -389,6 +394,7 @@ Public Class ClassDocGrid
LOGGER.Warn($"Attention: Could not load values from TBPMO_DOC_VALUES: " & ex.Message & vbNewLine & $"SELECT VALUE FROM TBPMO_DOC_VALUES WHERE CONFIG_ID = {oConfigID} AND DocID = {oDocID} AND RECORD_ID = {RECORD_ID}")
End Try
LOGGER.Debug("Values loaded...")
Try
' Tabellen zum DataSet hinzufügen
ds.Tables.Add(DT_RESULT)
@@ -422,24 +428,26 @@ Public Class ClassDocGrid
Dim gridControl As GridControl = pDocGridView.GridControl
' ── Performance-optimiertes DataSource-Setzen ─────────────────────────
' ── 3. KRITISCH: Performance-optimiertes DataSource-Setzen ───────────
_isGridRefreshing = True ' Flag setzen VOR DataSource-Änderung
Try
pDocGridView.BeginDataUpdate() ' Events unterdrücken
pDocGridView.BeginUpdate() ' UI-Updates unterdrücken
' Datasource auf Master-Tabelle setzen
gridControl.DataSource = ds.Tables(0)
gridControl.ForceInitialize()
pDocGridView.EndDataUpdate() ' Events reaktivieren
pDocGridView.EndUpdate() ' UI-Updates reaktivieren
pDocGridView.EndDataUpdate() ' Events reaktivieren
Catch ex As Exception
LOGGER.Error($"Error setting DataSource: {ex.Message}")
Finally
_isGridRefreshing = False ' Flag zurücksetzen
' Flag NICHT hier zurücksetzen - erst NACH allen Grid-Operationen!
End Try
' Detail View anlegen und der Relation `docIdDetails` zuweisen
Dim GVDoc_Values As New GridView(gridControl)
'grvwDetail.OptionsBehavior.Editable = False
GVDoc_Values.OptionsView.ShowGroupPanel = False
GVDoc_Values.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Style3D
GVDoc_Values.OptionsView.EnableAppearanceEvenRow = True
@@ -447,18 +455,17 @@ Public Class ClassDocGrid
GVDoc_Values.Appearance.HeaderPanel.BackColor = Color.Orange
GVDoc_Values.Appearance.HeaderPanel.Options.UseBackColor = True
gridControl.LevelTree.Nodes.Add("docIdDetails", GVDoc_Values)
Catch ex As Exception
MsgBox("Error in FillColumns: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
LOGGER.Warn("Attention: Could not load converted datatable DocSearch: " & ex.Message)
End Try
' ── 4. KRITISCH: Handler NACH DataSource-Setzen registrieren ─────────────
AddHandler pDocGridView.MasterRowExpanded, AddressOf gridView_MasterRowExpanded
AddHandler pDocGridView.CustomColumnDisplayText, AddressOf gridView_CustomColumnDisplayText
AddHandler pDocGridView.FocusedRowChanged, AddressOf GVDoc_Values_FocusedRowChanged
For Each row As DataRow In DT_WINDREAM_RESULTLIST.Rows
Dim col As GridColumn = pDocGridView.Columns(row.Item("HEADER_CAPTION"))
Dim colCaption = row.Item("HEADER_CAPTION")
@@ -501,18 +508,22 @@ Public Class ClassDocGrid
oChangedColumn.DisplayFormat.FormatString = CURRENT_DATE_FORMAT & " HH:MM:ss"
End If
' ── 5. BestFitColumns mit gesetztem Flag ──────────────────────────────────
If GridDocResult_BestFitColumns Then
_isGridRefreshing = True ' Auch hier Events unterdrücken
' _isGridRefreshing ist bereits True
Try
pDocGridView.BeginUpdate()
pDocGridView.OptionsView.BestFitMaxRowCount = -1
pDocGridView.BestFitColumns(True)
pDocGridView.EndUpdate()
Finally
_isGridRefreshing = False
Catch ex As Exception
LOGGER.Error($"Error in BestFitColumns: {ex.Message}")
End Try
End If
' ── 6. KRITISCH: Flag ERST JETZT zurücksetzen! ────────────────────────────
_isGridRefreshing = False
' Alle Spalten aus ReadOnly setzen, danach werden alle passenden auf nicht ReadOnly gesetzt
For Each column As GridColumn In pDocGridView.Columns
column.OptionsColumn.AllowEdit = False
@@ -623,69 +634,54 @@ Public Class ClassDocGrid
End If
Dim fieldName As String = e.Column.FieldName
Dim valueString As String = e.Value.ToString()
' ── WICHTIG: Verhindere rekursive Aufrufe ────────────────────────────
' Wenn DisplayText bereits korrekt ist, nichts ändern
If e.DisplayText = valueString Then Return
Dim parsedDate As DateTime
' ── Datumskonvertierung für Standard-Datumsspalten ───────────────────
If DATE_COLUMNS IsNot Nothing AndAlso DATE_COLUMNS.Contains(fieldName) Then
' Nur bei Verbose-Logging loggen
If EnableVerboseGridLogging Then
LOGGER.Debug($"gridView_CustomColumnDisplayText [Standard] [{fieldName}]")
End If
Try
' Versuche direktes Parsen
If DateTime.TryParse(e.Value.ToString(), parsedDate) Then
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT & " HH:mm:ss")
Else
' Fallback: ParseExact
parsedDate = DateTime.ParseExact(e.Value.ToString(),
CURRENT_DATE_FORMAT & " HH:mm:ss",
System.Globalization.DateTimeFormatInfo.InvariantInfo)
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT & " HH:mm:ss")
If DateTime.TryParse(valueString, parsedDate) Then
Dim formattedDate As String = parsedDate.ToString(CURRENT_DATE_FORMAT & " HH:mm:ss")
' Nur setzen wenn unterschiedlich
If e.DisplayText <> formattedDate Then
e.DisplayText = formattedDate
End If
End If
Catch ex As FormatException
' Bei Parsing-Fehler Original-Wert anzeigen
e.DisplayText = e.Value.ToString()
' Bei Fehler Original-Wert belassen (NICHT setzen!)
If EnableVerboseGridLogging Then
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {e.Value}")
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {valueString}")
End If
End Try
Return ' Früher Exit - keine weitere Prüfung nötig
Return
End If
' ── Datumskonvertierung für Config-Datumsspalten ──────────────────────
If DATE_COLUMNS_CONFIG IsNot Nothing AndAlso DATE_COLUMNS_CONFIG.Contains(fieldName) Then
' Nur bei Verbose-Logging loggen
If EnableVerboseGridLogging Then
LOGGER.Debug($"gridView_CustomColumnDisplayText [Config] [{fieldName}]")
End If
Try
' Versuche direktes Parsen
If DateTime.TryParse(e.Value.ToString(), parsedDate) Then
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT)
Else
' Fallback: ParseExact
parsedDate = DateTime.ParseExact(e.Value.ToString(),
CURRENT_DATE_FORMAT,
System.Globalization.DateTimeFormatInfo.InvariantInfo)
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT)
If DateTime.TryParse(valueString, parsedDate) Then
Dim formattedDate As String = parsedDate.ToString(CURRENT_DATE_FORMAT)
' Nur setzen wenn unterschiedlich
If e.DisplayText <> formattedDate Then
e.DisplayText = formattedDate
End If
End If
Catch ex As FormatException
' Bei Parsing-Fehler Original-Wert anzeigen
e.DisplayText = e.Value.ToString()
' Bei Fehler Original-Wert belassen
If EnableVerboseGridLogging Then
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {e.Value}")
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {valueString}")
End If
End Try
End If
Catch ex As Exception
' Fehler IMMER loggen (aber nicht Debug)
LOGGER.Error($"gridView_CustomColumnDisplayText Error [{e.Column?.FieldName}]: {ex.Message}")
End Try
End Sub
Public Shared Sub GVDoc_Values_FocusedRowChanged(sender As GridView, e As DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs)
Try

View File

@@ -301,68 +301,7 @@ Public Class ClassHelper
End Try
End Try
End Sub
'Private Shared Sub BWFileHandler_DoWork()
' Try
' Dim oOverrideRunPath As String = ""
' Dim oExtension = Path.GetExtension(BW_DocPath).ToLower
' For Each oROW As DataRow In CURRENT_TBFILE_EXTENSION_OVERRIDE.Rows
' If oExtension.Replace(".", "") = oROW.Item("FILE_EXTENSION") Then
' LOGGER.Debug($"Specific fileextension override for extension [{oExtension}] found! ")
' oOverrideRunPath = oROW.Item("PROCESS")
' End If
' Next
' Dim oMyProcess = New Process()
' Dim oSql
' Try
' '######
' Dim startInfo As New ProcessStartInfo()
' If oOverrideRunPath <> "" Then
' startInfo.FileName = oOverrideRunPath
' startInfo.Arguments = """" & BW_DocPath & """"
' startInfo.UseShellExecute = True
' startInfo.RedirectStandardOutput = False
' Else
' startInfo.FileName = BW_DocPath
' startInfo.UseShellExecute = True
' startInfo.RedirectStandardOutput = False
' End If
' '#####
' oMyProcess.Start(startInfo)
' Dim myViewerProcessID = oMyProcess.Id
' oMyProcess.WaitForExit()
' oExtension = Path.GetExtension(BW_DocPath).ToLower
' LOGGER.Debug($"Checking oExtension [{oExtension}]...")
' If FILE_FORMATS_CHANGE_DURING_EDIT.Contains(oExtension) Then
' oSql = $"SELECT * FROM VWOF_DOCID_HANDLE WHERE dwParentID = {BW_ParentID} and [Filename] = '{BW_Filename}'"
' Dim oDTNEWDoc As DataTable = MYDB_ECM.GetDatatable(oSql)
' If Not IsNothing(oDTNEWDoc) Then
' If oDTNEWDoc.Rows.Count = 1 Then
' Dim oInsert = $"INSERT INTO TBPMO_DOC_ID_CHANGED (USER_ID,PROCESS_ID,VERSION_ID,OLD_DOC_ID,NEW_DOC_ID, DOC_PATH) VALUES (
' {USER_GUID},'{myViewerProcessID.ToString}',{oDTNEWDoc.Rows(0).Item("dwVersionID")},{BW_DocID},{oDTNEWDoc.Rows(0).Item("NewDocID")}, '{BW_DocPath}')"
' MYDB_ECM.ExecuteNonQuery(oInsert)
' End If
' End If
' End If
' Catch ex As Exception
' LOGGER.Warn("Error in Process1.Start(): " & ex.Message & vBCrlf & " - Path: " & BW_DocPath & " - DocID: " & BW_DocID)
' MsgBox("Error in OpenFile: " & ex.Message & vBCrlf & " - Path: " & BW_DocPath & " - DocID: " & BW_DocID, MsgBoxStyle.Exclamation)
' Exit Sub
' End Try
' Catch ex As Exception
' LOGGER.Warn("Error in Process.Start(): " & ex.Message & vBCrlf & " - Path: " & BW_DocPath & " - DocID: " & BW_DocID)
' Try
' Process.Start(BW_DocPath)
' Catch ex1 As Exception
' LOGGER.Warn("Error in Process.Start(1): " & ex1.Message & vBCrlf & " - Path: " & BW_DocPath & " - DocID: " & BW_DocID)
' End Try
' End Try
'End Sub
Private Shared Sub FOLDER_OPEN(PATH As Object, DocID As String)
Try
If PATH <> Nothing Then
@@ -461,12 +400,35 @@ Public Class ClassHelper
End Function
Public Shared Sub REMOVE_OLD_DROP_FILES()
Try
' ✅ NEU: Pre-Check - welche Dateien sind betroffen?
Dim preCheckSQL = $"SELECT GUID, FILENAME_ONLY, ADDED_WHEN, DATEDIFF(MINUTE, ADDED_WHEN, GETDATE()) AS AGE_MINUTES " &
$"FROM TBPMO_FILES_USER " &
$"WHERE ADDED_WHEN < DATEADD(MINUTE, -15, GETDATE()) " &
$"AND WORKED = 0 AND USER_WORK = '{USER_USERNAME}'"
Dim preCheckDT = MYDB_ECM.GetDatatable(preCheckSQL)
If preCheckDT IsNot Nothing AndAlso preCheckDT.Rows.Count > 0 Then
LOGGER.Warn($"REMOVE_OLD_DROP_FILES: {preCheckDT.Rows.Count} Dateien werden als TIMEOUT markiert:")
For Each row As DataRow In preCheckDT.Rows
LOGGER.Warn($" - GUID={row("GUID")}, Datei={row("FILENAME_ONLY")}, Alter={row("AGE_MINUTES")} Minuten")
Next
Else
LOGGER.Debug($"REMOVE_OLD_DROP_FILES: Keine Dateien älter als 15 Minuten (User: {USER_USERNAME})")
End If
' ✅ Dann UPDATE
Dim oDEL = String.Format("UPDATE [DD_ECM].[dbo].[TBPMO_FILES_USER]
SET [USER_WORK] = [USER_WORK] + '_TIMEOUT',
WORKED = 1
WHERE ADDED_WHEN < DATEADD(MINUTE, -5, GETDATE())
AND WORKED = 0 AND USER_WORK = '{0}' ;", USER_USERNAME)
MYDB_ECM.ExecuteNonQuery(oDEL)
SET [USER_WORK] = [USER_WORK] + '_TIMEOUT',
WORKED = 1
WHERE ADDED_WHEN < DATEADD(MINUTE, -15, GETDATE())
AND WORKED = 0 AND USER_WORK = '{0}' ;", USER_USERNAME)
Dim rowsAffected = MYDB_ECM.ExecuteNonQuery(oDEL)
If rowsAffected > 0 Then
LOGGER.Warn($"REMOVE_OLD_DROP_FILES: {rowsAffected} Dateien wurden als TIMEOUT markiert")
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error while REMOVE_OLD_DROP_FILES")
End Try
@@ -475,7 +437,19 @@ Public Class ClassHelper
Try
Dim sql = String.Format("SELECT *, CONVERT(BIT,0) AS DELETE_FILE FROM TBPMO_FILES_USER WHERE (USER_WORK = '{0}') AND WORKED = 0", USER_USERNAME)
CURRENT_TBPMO_FILES_USER = MYDB_ECM.GetDatatable(sql)
' ✅ NEU: Logging
If CURRENT_TBPMO_FILES_USER Is Nothing Then
LOGGER.Warn($"Create_USER_FILE_TABLE: GetDatatable gab Nothing zurück (User: {USER_USERNAME})")
Else
LOGGER.Debug($"Create_USER_FILE_TABLE: {CURRENT_TBPMO_FILES_USER.Rows.Count} Dateien geladen (User: {USER_USERNAME})")
' ✅ DEBUG: Zeige GUIDs der geladenen Dateien
For Each row As DataRow In CURRENT_TBPMO_FILES_USER.Rows
LOGGER.Debug($" - GUID={row("GUID")}, WORKED={row("WORKED")}, Datei={row("FILENAME2WORK")}")
Next
End If
Catch ex As Exception
LOGGER.Error($"Create_USER_FILE_TABLE Exception: {ex.Message}")
MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error while creating User_File_Table")
End Try
End Sub
@@ -551,9 +525,11 @@ Public Class ClassHelper
Else
LOGGER.Warn($"File does not exist: [{pFilename}] - Cannot compute hash.")
End If
Dim oSQL = $"SELECT Filename, ADDED_WHO, FORMAT(ADDED_WHEN, 'dd-MM-yyyy HH:mm') AS ADDED_WHEN_STRING FROM TBPMO_DOCRESULT_LIST WHERE FILE_HASH = '{CURRENT_FILE_HASH}' ORDER BY ADDED_WHEN DESC"
LOGGER.Debug($"Inserting File - hash is [{CURRENT_FILE_HASH}]")
Dim oDTCHECK As DataTable = MYDB_ECM.GetDatatable(oSQL)
If Not IsNothing(oDTCHECK) Then
If oDTCHECK.Rows.Count >= 1 Then
LOGGER.Info($"We got a file with the same hash [{CURRENT_FILE_HASH}]")
@@ -561,34 +537,74 @@ Public Class ClassHelper
Dim oUSER = oDTCHECK.Rows(0).Item(1)
Dim oADDED_WHEN = oDTCHECK.Rows(0).Item(2)
Dim oMSG As String
If USER_LANGUAGE <> "de-DE" Then
oMSG = $"This file has already been imported into orgFLOW!" & vbCrLf &
$"File: [{oFilename}]" & vbCrLf &
$"Imported on: {oADDED_WHEN}" & vbCrLf &
$"Imported by: {oUSER}" & vbCrLf &
$"Total imports with identical content: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf &
"Do you want to import this file again?" & vbCrLf &
"NO → Teh complete Import will be cancelled."
$"File: [{oFilename}]" & vbCrLf &
$"Imported on: {oADDED_WHEN}" & vbCrLf &
$"Imported by: {oUSER}" & vbCrLf &
$"Total imports with identical content: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf &
"Do you want to import this file again?" & vbCrLf &
"NO → Teh complete Import will be cancelled."
Else
oMSG = $"Diese Datei wurde bereits in orgFLOW importiert!" & vbCrLf &
$"Datei: [{oFilename}]" & vbCrLf &
$"Importiert am: {oADDED_WHEN}" & vbCrLf &
$"Importiert von: {oUSER}" & vbCrLf &
$"Anzahl Importe mit identischem Inhalt: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf &
"Möchten Sie die Datei dennoch erneut importieren?" & vbCrLf &
"NEIN → Der gesamte Import (alle folgenden) wird abgebrochen."
$"Datei: [{oFilename}]" & vbCrLf &
$"Importiert am: {oADDED_WHEN}" & vbCrLf &
$"Importiert von: {oUSER}" & vbCrLf &
$"Anzahl Importe mit identischem Inhalt: {oDTCHECK.Rows.Count}" & vbCrLf & vbCrLf &
"Möchten Sie die Datei dennoch erneut importieren?" & vbCrLf &
"NEIN → Der gesamte Import (alle folgenden) wird abgebrochen."
End If
Dim result As MsgBoxResult
result = MessageBox.Show(oMSG, CAPTION_CONFIRMATION, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If result = MsgBoxResult.No Then
LOGGER.Info($"User wählte NEIN bei Hash-Duplikat-Check für [{filename_only}] - Import abgebrochen")
Return False
Else
LOGGER.Info($"User wählte JA bei Hash-Duplikat-Check für [{filename_only}] - fahre fort")
End If
End If
End If
Dim ins As String = String.Format("INSERT INTO TBPMO_FILES_USER (FILENAME2WORK, USER_WORK,HANDLE_TYPE,FILENAME_ONLY,FILE_HASH) VALUES ('{0}','{1}','{2}','{3}','{4}')", pFilename, USER_USERNAME, handleType, filename_only, CURRENT_FILE_HASH)
Return MYDB_ECM.ExecuteNonQuery(ins)
' ✅ NEU: Pre-Check - gibt es bereits einen Eintrag mit diesem Hash?
Dim preCheckSQL = $"SELECT GUID, USER_WORK, WORKED FROM TBPMO_FILES_USER WHERE FILE_HASH = '{CURRENT_FILE_HASH}' AND USER_WORK = '{USER_USERNAME}'"
Dim preCheckDT = MYDB_ECM.GetDatatable(preCheckSQL)
If preCheckDT IsNot Nothing AndAlso preCheckDT.Rows.Count > 0 Then
LOGGER.Warn($"WARNUNG: Datei mit Hash [{CURRENT_FILE_HASH}] bereits in TBPMO_FILES_USER vorhanden:")
For Each row As DataRow In preCheckDT.Rows
LOGGER.Warn($" - GUID={row("GUID")}, USER_WORK={row("USER_WORK")}, WORKED={row("WORKED")}")
Next
End If
' ✅ INSERT mit explizitem Logging
Dim ins As String = String.Format("INSERT INTO TBPMO_FILES_USER (FILENAME2WORK, USER_WORK, HANDLE_TYPE, FILENAME_ONLY, FILE_HASH) VALUES ('{0}','{1}','{2}','{3}','{4}')", pFilename, USER_USERNAME, handleType, filename_only, CURRENT_FILE_HASH)
LOGGER.Debug($"Führe INSERT aus: [{ins}]")
Dim insertResult = MYDB_ECM.ExecuteNonQuery(ins)
If insertResult Then
' ✅ VERIFY - wurde wirklich eingefügt?
Dim verifySQL = $"SELECT TOP 1 GUID, ADDED_WHEN FROM TBPMO_FILES_USER WHERE FILE_HASH = '{CURRENT_FILE_HASH}' AND USER_WORK = '{USER_USERNAME}' ORDER BY GUID DESC"
Dim verifyDT = MYDB_ECM.GetDatatable(verifySQL)
If verifyDT IsNot Nothing AndAlso verifyDT.Rows.Count > 0 Then
Dim insertedGUID = verifyDT.Rows(0)("GUID")
Dim insertedADDED_WHEN = verifyDT.Rows(0)("ADDED_WHEN")
LOGGER.Info($"INSERT ERFOLGREICH: GUID={insertedGUID}, ADDED_WHEN={insertedADDED_WHEN}, Datei=[{filename_only}]")
Else
LOGGER.Error($"INSERT fehlgeschlagen (VERIFY)! Datei=[{filename_only}], Hash=[{CURRENT_FILE_HASH}]")
End If
Else
LOGGER.Error($"INSERT fehlgeschlagen (ExecuteNonQuery)! Datei=[{filename_only}]")
End If
Return insertResult
Catch ex As Exception
LOGGER.Error($"Insert_USER_File Exception: {ex.Message}")
MsgBox("Unexpected Error in Insert file for user (TBPMO_FILES_USER): " & ex.Message, MsgBoxStyle.Critical)
Return False
End Try