Imports System.IO Imports System.Security.AccessControl Imports System.Security.Principal Imports System.Data.SqlClient Imports Oracle.ManagedDataAccess.Client Imports DigitalData.Modules.Windream Imports System.ComponentModel Public Class frmWM_IndexFile Dim droptype As String Dim aktFiledropped As String Dim MULTIFILES As Integer = 0 Dim formloaded As Boolean = False Dim DTVWPMO_DOKUMENTTYPES As DataTable Dim FILE_WORKED As Boolean = False Dim FILE_HASH As String = "" Public Class SW Public label As String Public stopwatch As Stopwatch Public Sub New(label As String) Me.label = label stopwatch = New Stopwatch() stopwatch.Start() End Sub Public Function Done() As Long stopwatch.Stop() Dim message = String.Format("{0, 5}ms || {1}", stopwatch.ElapsedMilliseconds, label) Console.WriteLine(message) LOGGER.Debug(message) Return stopwatch.ElapsedMilliseconds End Function End Class Private _multiIndexDecisionMade As Boolean = False Private _multiIndexOverwriteExisting As Boolean = False Private _processedFileIds As New List(Of Integer) Function WORK_FILE(ImportFilePath As String, VerzeichnisZiel As String, vDokart_ID As Integer, vDokart As String, multiindex As Boolean) 'Dim swWORK_FILE As New SW("WORK_FILE: " & DOCTYPE_IDTextBox.Text) Try LOGGER.Debug($" WORK_FILE aufgerufen: CURRENT_FILEID={CURRENT_FILEID}, Datei={Me.txtFilepath.Text}") LOGGER.Debug($"=== WORK_FILE START: multiindex={multiindex} ===") LOGGER.Debug($" Datei: {ImportFilePath}") LOGGER.Debug($" Flags: _multiIndexDecisionMade={_multiIndexDecisionMade}, _multiIndexOverwriteExisting={_multiIndexOverwriteExisting}") CURRENT_DOC_ID = Nothing Dim odeleteRights As Boolean = True If CURRENT_FILEID = 0 OrElse CURRENT_FILEID = Nothing Then LOGGER.Error("WORK_FILE: CURRENT_FILEID ist ungültig (0 oder Nothing)!") Return False End If CURRENT_DOKARTSTRING = vDokart Dim err As Boolean = False '################################################################# 'Name und ZielPfad generieren '################################################################# Dim sw As New SW("GetUse Nameconvention ID: " & DOCTYPE_IDTextBox.Text) If ClassImport_Windream.Name_Generieren(DOCTYPE_IDTextBox.Text) = False Then 'swWORK_FILE.Done() Return False End If sw.Done() sw = New SW("CheckFileExists") If WMMOD.TestFileExists(CURRENT_NEWFILENAME) = True Then ' ── Multi-Index-Logik: Entscheidung nur einmal fragen ───────── Dim shouldOverwrite As Boolean If multiindex = True Then If _multiIndexDecisionMade = False Then LOGGER.Debug(" ZEIGE DIALOG für Multi-Index-Entscheidung") ' Erste Kollision → Benutzer fragen Dim msg As String If USER_LANGUAGE <> "de-DE" Then msg = "A file with the same name already exists!" & vbCrLf & "This decision will apply to ALL remaining files in Multi-Indexing." & vbCrLf & vbCrLf & "YES → Replace existing files (all former versions will be deleted)" & vbCrLf & "NO → Keep both files (files will be versioned automatically)" Else msg = "Eine Datei mit identischem Namen existiert bereits!" & vbCrLf & "Diese Entscheidung gilt für ALLE weiteren Dateien im Multi-Indexing." & vbCrLf & vbCrLf & "JA → Bestehende Dateien ersetzen (alle vorherigen Versionen werden dabei gelöscht)" & vbCrLf & "NEIN → Dateien versionieren (beide Dateien werden behalten)" End If Dim result As MsgBoxResult = MessageBox.Show(msg, "File already exists (Multi-Indexing):", MessageBoxButtons.YesNo, MessageBoxIcon.Question) _multiIndexOverwriteExisting = (result = MsgBoxResult.Yes) _multiIndexDecisionMade = True LOGGER.Debug($" Benutzer-Entscheidung: {If(_multiIndexOverwriteExisting, "OVERWRITE", "VERSION")}") LOGGER.Debug($" Flags NACH Dialog: _multiIndexDecisionMade={_multiIndexDecisionMade}, _multiIndexOverwriteExisting={_multiIndexOverwriteExisting}") Else LOGGER.Debug($" Verwende GESPEICHERTE Entscheidung: {If(_multiIndexOverwriteExisting, "OVERWRITE", "VERSION")}") End If shouldOverwrite = _multiIndexOverwriteExisting Else ' Einzeldatei → wie bisher LOGGER.Debug(" Einzeldatei: Zeige Dialog") Dim msg As String If USER_LANGUAGE <> "de-DE" Then msg = "A file with the same name already exists!" & vbCrLf & "YES → Replace the existing file (all former versions will be deleted)" & vbCrLf & "NO → Keep both files (your file will be versioned automatically)" Else msg = "Eine Datei mit identischem Namen existiert bereits!" & vbCrLf & "JA → Bestehende Datei ersetzen (alle vorherigen Versionen werden dabei gelöscht)" & vbCrLf & "NEIN → Beide Dateien behalten (Ihre Datei wird automatisch versioniert)" End If Dim result As MsgBoxResult = MessageBox.Show(msg, "File already exists:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) shouldOverwrite = (result = MsgBoxResult.Yes) LOGGER.Debug($" Einzeldatei-Entscheidung: {If(shouldOverwrite, "OVERWRITE", "VERSION")}") End If ' ── Entscheidung ausführen ──────────────────────────────────── If shouldOverwrite Then LOGGER.Debug(" Führe OVERWRITE aus") If WMMOD.RemoveFile(CURRENT_NEWFILENAME) = False Then Return False Else Dim oNormPath = WMMOD.GetNormalizedPath(CURRENT_NEWFILENAME, 0) Dim oGetDoc = String.Format( "SELECT DOC_ID,RECORD_ID FROM TBPMO_DOC_RECORD_LINK RL " & "INNER JOIN TBPMO_DOCRESULT_LIST DRL WITH (NOLOCK) ON RL.DOC_ID = DRL.DocID " & "WHERE FULL_FILENAME = '{0}'", oNormPath) Dim oDT As DataTable = MYDB_ECM.GetDatatable(oGetDoc) For Each oRow As DataRow In oDT.Rows Dim oDoc = New With { .DocId = oRow("DOC_ID"), .RecordId = oRow("RECORD_ID") } ClassFileResult.Delete_ResultFile(oDoc.DocId, oDoc.RecordId, 1) Next End If Else LOGGER.Debug(" Führe VERSIONIERUNG aus") CURRENT_NEWFILENAME = ClassHelper.Versionierung_Datei(CURRENT_NEWFILENAME) LOGGER.Debug($" Neuer Dateiname: {CURRENT_NEWFILENAME}") End If Else LOGGER.Debug(" Datei existiert NICHT, kein Konflikt") End If sw.Done() '################################################################# 'Stream File to windream '################################################################# sw = New SW("File Stream") Dim streamresult = WMMOD.NewFileStream(ImportFilePath, CURRENT_NEWFILENAME, OBJECT_TYPETextBox.Text) sw.Done() '################################################################# If streamresult = True Then sw = New SW("File Indexing") CURRENT_FILEIN_WD = CURRENT_NEWFILENAME Dim DOCID DOCID = WMMOD.GetIndexValue(CURRENT_FILEIN_WD, "Dokument-ID") If Not IsNothing(DOCID) Then CURRENT_DOC_ID = DOCID(0) Else DOCID = WMMOD.GetIndexValue(CURRENT_FILEIN_WD, "Document-ID") If Not IsNothing(DOCID) Then CURRENT_DOC_ID = DOCID(0) End If End If Dim sql = "SELECT * FROM TBDD_INDEX_AUTOM WHERE ACTIVE = 1 AND UPPER(INDEXNAME) NOT LIKE UPPER('%ONLY %') AND SQL_ACTIVE = 0 AND LEN(INDEXNAME) > 1 AND DOCTYPE_ID = " & vDokart_ID Dim DT_AUTO_INDEXE As DataTable = MYDB_ECM.GetDatatable(sql) Try sql = "SELECT * FROM VWCUST_DOCTYPE_CONFIG WHERE DOCTYPE_ID = " & vDokart_ID Dim DTVWCUST_DOCTYPE_CONFIG As DataTable = MYDB_ECM.GetDatatable(sql) If Not IsNothing(DTVWCUST_DOCTYPE_CONFIG) Then If DTVWCUST_DOCTYPE_CONFIG.Rows.Count = 1 Then odeleteRights = CBool(DTVWCUST_DOCTYPE_CONFIG.Rows(0).Item("DELETE_RIGHTS")) End If End If Catch ex As Exception LOGGER.Warn($"Unexpected error in VWCUST_DOCTYPE_CONFIG Area: {ex.Message}") End Try Dim indexierung_erfolgreich As Boolean = True LOGGER.Debug("Doctype: " & vDokart.ToString) indexierung_erfolgreich = WMMOD.SetFileIndex(CURRENT_FILEIN_WD, WMINDEX_DOCTYPE, vDokart, WMOBJECTTYPE) If indexierung_erfolgreich = False Then err = True ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error: ", "Unexpected Error in WorkFile-indexing Doctype '" & WMINDEX_DOCTYPE & "') - Check logfile!") sw.Done() 'swWORK_FILE.Done() Return False End If indexierung_erfolgreich = WMMOD.SetFileIndex(CURRENT_FILEIN_WD, WMINDEX_RELATION, "ADDI-RELATION", WMOBJECTTYPE) If indexierung_erfolgreich = False Then err = True ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error: ", "Unexpected Error in WorkFile-indexing AddiRelation '" & WMINDEX_RELATION & "') - Check logfile!") sw.Done() 'swWORK_FILE.Done() Return False End If sw.Done() If DT_AUTO_INDEXE Is Nothing = False Then 'CHECK DD If DT_AUTO_INDEXE.Rows.Count > 0 Then Dim Count As Integer = 0 For Each row As DataRow In DT_AUTO_INDEXE.Rows Dim oAutoIndexname = row.Item("INDEXNAME").ToString Dim oAutoIndexValue = row.Item("VALUE") If oAutoIndexValue.ToString.StartsWith("@") Then Select Case oAutoIndexValue.ToString.ToUpper Case "@RECORD-ID" oAutoIndexValue = oAutoIndexValue.ToString.Replace("@Record-ID", CURRENT_RECORD_ID) Case "@DOKART" oAutoIndexValue = oAutoIndexValue.ToString.Replace("@Dokart", vDokart) End Select Else 'Es wird nicht über einen @PAttern indexiert ' Regulären Ausdruck zum Auslesen der Indexe definieren Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}" ' einen Regulären Ausdruck laden Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg) ' die Vorkommen im SQL-String auslesen Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(oAutoIndexValue) '#### ' alle Vorkommen innerhalbd er Namenkonvention durchlaufen For Each element As System.Text.RegularExpressions.Match In elemente LOGGER.Debug("element in RegeX: " & element.Value) Select Case element.Value.Substring(2, 1).ToUpper 'Nur automatische Indizes auswerten Case "A" Dim APattern = element.Value.Substring(3, element.Value.Length - 4) If APattern.Contains("#") Then LOGGER.Debug("element filled with Record-Data.......: ") Dim split() As String = APattern.Split("#") If split.Length = 2 Then Dim CONTROL_ID = split(1) LOGGER.Debug("CONTROL_ID: " & CONTROL_ID) If IsNumeric(CONTROL_ID) Then Dim CONTROLVALUE = ClassControlValues.Get_Control_Value_for_ID(CONTROL_ID, CURRENT_RECORD_ID) If IsNothing(CONTROLVALUE) Then LOGGER.Warn("Index should be filled with value of Control-ID '" & CONTROL_ID & "', but result was nothing.") LOGGER.Warn("SQL-Command: " & CURRENT_LAST_SQL) oAutoIndexValue = "" Else If IsDBNull(CONTROLVALUE) Then LOGGER.Warn("Index should be filled with value of Control-ID '" & CONTROL_ID & "', but result was DBNULL.") LOGGER.Warn("SQL-Command: " & CURRENT_LAST_SQL) oAutoIndexValue = "" Else oAutoIndexValue = CONTROLVALUE End If End If Else End If End If End If End Select Next End If LOGGER.Debug($"Autovalue used for Indexing: '" & oAutoIndexValue.ToString & "'") Count += 1 indexierung_erfolgreich = WMMOD.SetFileIndex(CURRENT_FILEIN_WD, oAutoIndexname, oAutoIndexValue, WMOBJECTTYPE) If indexierung_erfolgreich = False Then MsgBox("Unexpected Error in indexing file - See log", MsgBoxStyle.Critical) err = True Exit For End If _processedFileIds.Add(CURRENT_FILEID) Next If err = True Then 'swWORK_FILE.Done() Return False End If Else 'MsgBox("Attention in Work-File:" & vBCrlf & "No indices were defined (1)!", MsgBoxStyle.Critical) 'Return False End If Else 'swWORK_FILE.Done() MsgBox("Attention in Work-File:" & vbCrLf & "No indices were defined (0)!", MsgBoxStyle.Critical) Return False End If 'Nun alles aufrüumen und die neue DocID holen If indexierung_erfolgreich = True Then LOGGER.Info("File was correctly imported and indexed: " & CURRENT_FILEIN_WD) Dim oReldocpath = ClassHelper.GetRelPath(CURRENT_FILEIN_WD) LOGGER.Info("oReldocpath: " & oReldocpath) CURRENT_WM_OBJECT = WMMOD.GetFileByPath(oReldocpath) If IsNothing(CURRENT_WM_OBJECT) Then MsgBox("Attention in Work-File:" & vbCrLf & "Could not create final windream-object!", MsgBoxStyle.Critical) Return False End If LOGGER.Info("...CURRENT_WM_OBJECT created: " & oReldocpath) Dim stg As String = "Datei erfolgreich nach windream übertragen" Dim stg1 As String = "Erfolgsmeldung" If USER_LANGUAGE <> "de-DE" Then stg = "File was successfully transfered to windream" stg1 = "Success:" End If If multiindex = False Then CURRENT_NOTIFICATION_MSG = stg ' Neu - NUR wenn NICHT im Multi-Index-Modus: If multiindex = False Then MYDB_ECM.ExecuteNonQuery("UPDATE TBPMO_FILES_USER SET WORKED = 1 WHERE GUID = " & CURRENT_FILEID) LOGGER.Debug($" Einzeldatei als WORKED markiert: GUID={CURRENT_FILEID}") ' ✅ DEBUG: Was steht JETZT in der DB? Dim debugSQL = $"SELECT GUID, WORKED, FILENAME_ONLY FROM TBPMO_FILES_USER WHERE USER_WORK = '{USER_USERNAME}' ORDER BY GUID DESC" Dim debugDT = MYDB_ECM.GetDatatable(debugSQL) LOGGER.Debug($" ═══ DEBUG NACH UPDATE ═══") LOGGER.Debug($" Anzahl Dateien in DB: {debugDT.Rows.Count}") For Each row As DataRow In debugDT.Rows LOGGER.Debug($" - GUID={row("GUID")}, WORKED={row("WORKED")}, Datei={row("FILENAME_ONLY")}") Next LOGGER.Debug($" ═══════════════════════") End If If IsNothing(CURRENT_DOC_ID) Then sw = New SW("GettingDocID") sql = String.Format("SELECT DocID FROM VWPMO_DOC_SYNC WHERE FULL_FILENAME = '{0}' AND CONVERT(DATE,Change_DateTime) = CONVERT(DATE,GETDATE())", CURRENT_FILEIN_WD) CURRENT_DOC_ID = MYDB_ECM.GetScalarValue(sql) sw.Done() End If If Not IsNothing(CURRENT_DOC_ID) Then ClassHelper.InsertEssential_Log(CURRENT_DOC_ID, "DOC_ID", "File was imported and indexed!") LOGGER.Info(String.Format("File-Import was finished - DocID: {0} ", CURRENT_DOC_ID)) Dim delete = False 'Die Originaldatei löschen If droptype = "dragdrop file" And indexierung_erfolgreich = True Then If chkdelete_origin.Checked = True Then 'Die temporäre Datei löschen File.Delete(aktFiledropped) End If ElseIf (droptype = "@ATTMNTEXTRACTED@" Or droptype = "SCAN") And indexierung_erfolgreich = True Then 'Die temporäre Datei löschen delete = True ElseIf droptype = "dragdrop message" And indexierung_erfolgreich = True Then 'Die temporäre Datei löschen delete = True End If If delete = True Then For Each row As DataRow In CURRENT_TBPMO_FILES_USER.Rows If row.Item("GUID") = CURRENT_FILEID Then row.Item("DELETE_FILE") = True End If Next End If If WMMOD.SessionLoggedin = False Then MsgBox("Could not create a windream-session!", MsgBoxStyle.Critical) Else FAU_AD_USER = "" ClassFileResult.DocID = CURRENT_DOC_ID ClassFileResult.SET_DOCID_INDICES() If ClassDOC_SEARCH.PROF_DOC_CREATE_UPDATE(CURRENT_DOC_ID, CURRENT_RECORD_ID, FILE_HASH) = False Then stg = "Unerwarteter Fehler: Der Record-Link konnte nicht erzeugt werden! Überprüfen Sie das Log." If USER_LANGUAGE <> "de-DE" Then stg = "Unexpected Error: Could not create the recordlink! Please check the log." End If MsgBox(stg, MsgBoxStyle.Critical, stg1) Else sw = New SW("Setting_Rights") If ClassDOC_SEARCH.SET_WD_RIGHTS(CURRENT_WM_OBJECT, CURRENT_DOC_ID, CURRENT_FILEIN_WD, odeleteRights) = False Then MsgBox("The rights for the new file could not be created! Please check the logfile!" & vbCrLf & "orgFLOW will try to give You at least reading rights!", MsgBoxStyle.Exclamation) DD_Rights.ClassRights.SetRightExplicit(CURRENT_DOC_ID, CURRENT_FILEIN_WD, USER_USERNAME, 1) ClassHelper.InsertEssential_Log(CURRENT_DOC_ID, "DOC-ID", "NEW FILE INDEXING - RIGHTS COULD NOT BE SET!!") End If sw.Done() End If End If Else stg = "Unerwarteter Fehler: Es konnte keine DocID für die übertragene Datei erzeugt werden!" If USER_LANGUAGE <> "de-DE" Then stg = "Unexpected Error: Could not get a docId for transmitted file!" End If LOGGER.Warn(stg) MsgBox(stg, MsgBoxStyle.Critical, stg1) End If Else MsgBox("An unexpected error occured while indexing file. Please check the log!", MsgBoxStyle.Exclamation) ' swWORK_FILE.Done() Return False End If 'swWORK_FILE.Done() Return True Else 'swWORK_FILE.Done() Return False End If Catch ex As Exception MsgBox("Unexpected error in Work-File:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) 'swWORK_FILE.Done() Return False End Try End Function Private Sub btnindex_Click(sender As Object, e As EventArgs) Handles btnindex.Click Try If CURRENT_RECORD_ID = 0 Then MsgBox("No Record chosen or the documenttype was not chosen!", MsgBoxStyle.Information) Exit Sub End If 'If lvwIndices.Items.Count = 0 Then ' MsgBox("Please choose a documenttxpe!", MsgBoxStyle.Information) ' Exit Sub 'End If If Not IsNothing(CURRENT_TBPMO_INDEX_MAN) Then If CURRENT_TBPMO_INDEX_MAN.Rows.Count > 0 Then If ClassFileResult.CheckWrite_IndexeMan(grbxControls) = False Then Exit Sub End If End If End If If cmbDokumentart.SelectedIndex <> -1 Then My.Settings.WD_INDEXDOKART_SAVE = cmbDokumentart.Text My.Settings.Save() If WMMOD.SessionLoggedin = True Then Handle_File(cmbDokumentart.SelectedValue) Else MsgBox("Could not create a windream-session! Please contact Your admin!", MsgBoxStyle.Critical) End If End If Catch ex As Exception MsgBox("Unexpected Error in Prepare indexing: " & ex.Message, MsgBoxStyle.Critical) End Try End Sub Private Function Handle_File(doctype_id As Integer) As Boolean Try Me.Cursor = Cursors.WaitCursor SaveMySettingsValue("WD_IndexDeleteDocs", WD_IndexDeleteDocs, "ConfigMain") LOGGER.Debug("=== HANDLE_FILE START ===") LOGGER.Debug($" Flags VOR Reset: _multiIndexDecisionMade={_multiIndexDecisionMade}, _multiIndexOverwriteExisting={_multiIndexOverwriteExisting}") _multiIndexDecisionMade = False _multiIndexOverwriteExisting = False LOGGER.Debug($" Flags NACH Reset: _multiIndexDecisionMade={_multiIndexDecisionMade}, _multiIndexOverwriteExisting={_multiIndexOverwriteExisting}") LOGGER.Debug($" chkMultiIndexer: Visible={chkMultiIndexer.Visible}, Checked={chkMultiIndexer.Checked}") If chkMultiIndexer.Visible = True And chkMultiIndexer.Checked = True Then LOGGER.Debug("=== MULTI-INDEXING MODUS AKTIV ===") ' ── Erste Datei: FILE_HASH und CURRENT_FILEID sicherstellen ─── Dim firstFileId As Integer = CURRENT_FILEID Dim firstFileName As String = CURRENT_FILENAME For Each oRow As DataRow In CURRENT_TBPMO_FILES_USER.Rows If oRow.Item("GUID") = CURRENT_FILEID Then FILE_HASH = oRow.Item("FILE_HASH") firstFileName = oRow.Item("FILENAME2WORK") Exit For End If Next LOGGER.Debug($" Verarbeite erste Datei (CURRENT_FILEID={firstFileId}): {firstFileName}") If WORK_FILE(firstFileName, Me.PATHTextBox.Text, doctype_id, My.Settings.WD_INDEXDOKART_SAVE, True) = False Then Me.Cursor = Cursors.Default LOGGER.Warn(" Erste Datei fehlgeschlagen!") Return False End If LOGGER.Debug(" Erste Datei erfolgreich verarbeitet") ' ── WICHTIG: Erste Datei als WORKED markieren UND DataTable neu laden ── LOGGER.Debug($" Markiere erste Datei als WORKED: GUID={firstFileId}") MYDB_ECM.ExecuteNonQuery($"UPDATE TBPMO_FILES_USER SET WORKED = 1 WHERE GUID = {firstFileId}") LOGGER.Debug(" Lade aktualisierte Dateiliste aus Datenbank...") ' ✅ SCHRITT 1: Prüfe mit COUNT(*), wie viele Dateien in der DB sind Dim countSQL = $"SELECT COUNT(*) FROM TBPMO_FILES_USER WHERE USER_WORK = '{USER_USERNAME}' AND WORKED = 0" Dim remainingCount = CInt(MYDB_ECM.GetScalarValue(countSQL)) LOGGER.Debug($" SQL COUNT ergab: {remainingCount} verbleibende Dateien") ' ✅ SCHRITT 2: Nur wenn COUNT > 0, dann DataTable laden If remainingCount > 0 Then CURRENT_TBPMO_FILES_USER = MYDB_ECM.GetDatatable("SELECT *, CONVERT(BIT,0) AS DELETE_FILE FROM TBPMO_FILES_USER " & "WHERE USER_WORK = '" & USER_USERNAME & "' AND WORKED = 0") If CURRENT_TBPMO_FILES_USER Is Nothing Then LOGGER.Error(" WARNUNG: GetDatatable gab Nothing zurück, obwohl COUNT > 0!") CURRENT_TBPMO_FILES_USER = New DataTable() Else LOGGER.Debug($" DataTable geladen: {CURRENT_TBPMO_FILES_USER.Rows.Count} Zeilen") End If Else LOGGER.Info(" SQL COUNT ergab 0 Dateien") CURRENT_TBPMO_FILES_USER = New DataTable() End If ' ── Folgedateien aus aktualierter DataTable verarbeiten ── If CURRENT_TBPMO_FILES_USER Is Nothing OrElse CURRENT_TBPMO_FILES_USER.Rows.Count = 0 Then LOGGER.Info(" Keine weiteren Dateien vorhanden") NEW_FILES_ADDED = True FILE_WORKED = True Me.Cursor = Cursors.Default Me.Close() Return True End If LOGGER.Debug($" Weitere Dateien gefunden: {CURRENT_TBPMO_FILES_USER.Rows.Count}") LOGGER.Debug($" Flags VOR Schleife: _multiIndexDecisionMade={_multiIndexDecisionMade}, _multiIndexOverwriteExisting={_multiIndexOverwriteExisting}") Dim err As Boolean = False Dim fileCount As Integer = 0 For Each filerow As DataRow In CURRENT_TBPMO_FILES_USER.Rows fileCount += 1 Dim currentFileId As Integer = filerow.Item("GUID") Dim currentFileName As String = filerow.Item("FILENAME2WORK") Dim currentFileHash As String = filerow.Item("FILE_HASH") CURRENT_FILEID = currentFileId CURRENT_FILENAME = currentFileName FILE_HASH = currentFileHash aktFiledropped = currentFileName LOGGER.Debug($" [{fileCount}/{CURRENT_TBPMO_FILES_USER.Rows.Count}] Verarbeite Datei: {currentFileName}, FILEID={currentFileId}") LOGGER.Debug($" Flags: _multiIndexDecisionMade={_multiIndexDecisionMade}, _multiIndexOverwriteExisting={_multiIndexOverwriteExisting}") Dim handleType As String = filerow.Item("HANDLE_TYPE") Select Case handleType Case "@DROPFROMFSYSTEM@" droptype = "dragdrop file" Case "@OUTLOOK_ATTMNT@" droptype = "dragdrop attachment" Case "@OUTLOOKMESSAGE@" droptype = "dragdrop message" Case Else droptype = handleType End Select If WORK_FILE(currentFileName, Me.PATHTextBox.Text, doctype_id, My.Settings.WD_INDEXDOKART_SAVE, True) = False Then err = True LOGGER.Warn($" Datei fehlgeschlagen!") Exit For End If LOGGER.Debug($" Datei erfolgreich verarbeitet") LOGGER.Debug($" Markiere Datei als WORKED: GUID={currentFileId}") MYDB_ECM.ExecuteNonQuery($"UPDATE TBPMO_FILES_USER SET WORKED = 1 WHERE GUID = {currentFileId}") Next Me.Cursor = Cursors.Default If err = False Then NEW_FILES_ADDED = True FILE_WORKED = True Dim stg As String = "Alle Dateien wurden mit Multiindexing erfolgreich nach windream übertragen!" Dim stg1 As String = "Erfolgsmeldung" If USER_LANGUAGE <> "de-DE" Then stg = "All files were transferred via Multiindexing to windream" stg1 = "Success:" End If LOGGER.Info("=== MULTI-INDEXING ERFOLGREICH ABGESCHLOSSEN ===") MsgBox(stg, MsgBoxStyle.Information, stg1) Me.Close() Return True End If Return False Else ' ✅ EINZELDATEI MODUS LOGGER.Debug("=== EINZELDATEI MODUS ===") ' ✅ WICHTIG: CURRENT_FILEID VOR WORK_FILE setzen! For Each oRow As DataRow In CURRENT_TBPMO_FILES_USER.Rows If oRow.Item("FILENAME2WORK") = Me.txtFilepath.Text Then CURRENT_FILEID = CInt(oRow("GUID")) FILE_HASH = oRow("FILE_HASH").ToString() LOGGER.Debug($" Datei gefunden in CURRENT_TBPMO_FILES_USER: FILEID={CURRENT_FILEID}") Exit For End If Next ' ✅ Validierung NACH Schleife If CURRENT_FILEID = 0 Then LOGGER.Error($" Datei nicht gefunden in CURRENT_TBPMO_FILES_USER: {Me.txtFilepath.Text}") Me.Cursor = Cursors.Default MessageBox.Show("Die Datei konnte nicht in der Verarbeitungsliste gefunden werden!", "Fehler:", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End If If WORK_FILE(Me.txtFilepath.Text, Me.PATHTextBox.Text, doctype_id, My.Settings.WD_INDEXDOKART_SAVE, False) = False Then Me.Cursor = Cursors.Default MessageBox.Show("Import to windream was not successful." & vbCrLf & "Check the log for further information!", "Unexpected Error in windream-Stream:", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End If ' ── Datei erfolgreich verarbeitet ── NEW_FILES_ADDED = True FILE_WORKED = True LOGGER.Debug(" Einzeldatei erfolgreich verarbeitet") ' ✅ Prüfen, ob weitere Dateien vorhanden sind LOGGER.Debug(" Lade aktualisierte Dateiliste für Einzeldatei-Check...") ' ✅ SCHRITT 1: Prüfe mit COUNT(*), wie viele Dateien in der DB sind Dim countSQL = $"SELECT COUNT(*) FROM TBPMO_FILES_USER WHERE USER_WORK = '{USER_USERNAME}' AND WORKED = 0" Dim remainingCount = CInt(MYDB_ECM.GetScalarValue(countSQL)) LOGGER.Debug($" ═══ SQL COUNT NACH WORK_FILE ═══") LOGGER.Debug($" COUNT(*) ergab: {remainingCount} verbleibende Dateien") ' ✅ SCHRITT 2: Dateiliste laden UND vergleichen ClassHelper.Create_USER_FILE_TABLE() If CURRENT_TBPMO_FILES_USER Is Nothing Then LOGGER.Error($" ❌ KRITISCHER FEHLER: Create_USER_FILE_TABLE gab Nothing zurück!") ElseIf CURRENT_TBPMO_FILES_USER.Rows.Count <> remainingCount Then LOGGER.Error($" ❌ KRITISCHER FEHLER: COUNT ergab {remainingCount}, aber DataTable hat {CURRENT_TBPMO_FILES_USER.Rows.Count} Zeilen!") LOGGER.Error($" ❌ VERDACHT: Race-Condition oder Transaction-Problem!") Else LOGGER.Debug($" ✅ OK: COUNT und DataTable stimmen überein ({remainingCount} Dateien)") End If LOGGER.Debug($" ═══════════════════════════════") If CURRENT_TBPMO_FILES_USER IsNot Nothing AndAlso CURRENT_TBPMO_FILES_USER.Rows.Count > 0 Then LOGGER.Info($" Einzeldatei-Modus: Weitere {CURRENT_TBPMO_FILES_USER.Rows.Count} Dateien vorhanden - aktualisiere Formular") ' ── Lade ERSTE Datei aus der NEUEN Liste ── Dim nextFile = CURRENT_TBPMO_FILES_USER.Rows(0) CURRENT_FILEID = CInt(nextFile("GUID")) CURRENT_FILENAME = nextFile("FILENAME2WORK").ToString() FILE_HASH = nextFile("FILE_HASH").ToString() aktFiledropped = CURRENT_FILENAME txtFilepath.Text = CURRENT_FILENAME LOGGER.Debug($" Nächste Datei geladen: FILEID={CURRENT_FILEID}, Datei={CURRENT_FILENAME}") ' ── Update MULTIFILES-Anzeige ── MULTIFILES = CURRENT_TBPMO_FILES_USER.Rows.Count - 1 If MULTIFILES > 0 Then chkMultiIndexer.Text = "Multi-Indexing - Alle nachfolgenden Dateien (" & MULTIFILES & ") identisch indexieren" chkMultiIndexer.Visible = True chkMultiIndexer.Checked = False Else chkMultiIndexer.Visible = False End If ' ── Handle-Type setzen ── Dim handleType As String = nextFile("HANDLE_TYPE").ToString() Select Case handleType Case "@DROPFROMFSYSTEM@" droptype = "dragdrop file" chkdelete_origin.Visible = True Case "@OUTLOOK_ATTMNT@" droptype = "dragdrop attachment" chkdelete_origin.Visible = True Case "@OUTLOOKMESSAGE@" droptype = "dragdrop message" chkdelete_origin.Visible = True Case "SCAN" droptype = "scan" chkdelete_origin.Visible = False Case Else droptype = handleType chkdelete_origin.Visible = False End Select Me.Cursor = Cursors.Default LOGGER.Debug(" Formular bleibt offen für nächste Datei") Return True ' ← Formular bleibt offen! Else ' ✅ Keine weiteren Dateien → Formular schließen LOGGER.Info(" Einzeldatei-Modus: Keine weiteren Dateien - schließe Formular") Me.Cursor = Cursors.Default Me.Close() Return True End If End If Catch ex As Exception MsgBox("Error in Indexing_File:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) LOGGER.Error($"Handle_File Exception: {ex.Message}{vbCrLf}{ex.StackTrace}") Return False Finally Me.Cursor = Cursors.Default End Try End Function Private Sub cmbDokumentart_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbDokumentart.SelectedIndexChanged Try CURRENT_DOKARTID = 0 If cmbDokumentart.SelectedIndex <> -1 Then CURRENT_DOKARTID = cmbDokumentart.SelectedValue CURRENT_DOKARTSTRING = cmbDokumentart.Text Refresh_indices() Refresh_Indices_Manual() Check_Subfolder() End If Catch ex As Exception MsgBox("Error in cmbDokumentart SelectedIndex:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) End Try End Sub Sub Refresh_Indices_Manual() Try ClassFileResult.GET_DATATABLE_INDICES_PMO() If CURRENT_TBPMO_INDEX_MAN.Rows.Count > 0 Then 'Der Tabelle eine Splate für den idnexwert hinzufügen Dim MAN_VALUE As DataColumn = CURRENT_TBPMO_INDEX_MAN.Columns.Add("MAN_VALUE", Type.GetType("System.String")) grbxControls.Visible = True grbxControls.Controls.Clear() Me.Size = New Size(605, 700) Dim anz As Integer = 1 Dim ylbl As Integer = 20 Dim y As Integer = 38 For Each DR As DataRow In CURRENT_TBPMO_INDEX_MAN.Rows Dim type = DR.Item("DATATYPE") If type <> "BOOLEAN" Then addLabel(DR.Item("GUID"), DR.Item("NAME"), DR.Item("COMMENT").ToString, ylbl) End If Dim DefaultValue = DR.Item("DEFAULT_VALUE") Select Case type Case "BOOLEAN" Dim VORBELGUNG As Integer = DefaultValue 'nur eine Textbox Dim chk As CheckBox = ClassControls_Manual.AddCheckBox(DR.Item("GUID"), DR.Item("NAME"), y, VORBELGUNG, DR.Item("COMMENT").ToString) If Not IsNothing(chk) Then grbxControls.Controls.Add(chk) End If Case "INTEGER" If DR.Item("SUGGESTION") = True And DR.Item("SQL_RESULT").ToString.Length > 0 Then AddVorschlag_ComboBox(DR.Item("GUID"), DR.Item("NAME"), y, DR.Item("CONNECTION_ID"), DR.Item("SQL_RESULT"), DefaultValue) 'AddAutoSuggest_Textbox(DR.Item("NAME"), y, DR.Item("CONNECTION_ID"), DR.Item("SQL_RESULT"), DefaultValue) Else Dim VORBELGUNG As Integer = DefaultValue 'nur eine Textbox AddTextBox(DR.Item("GUID"), DR.Item("NAME"), y, VORBELGUNG) End If Case "FOLDERSELECT" AddFOLDERSELECTBUTTON(DR.Item("GUID"), DR.Item("NAME"), y) Case "VARCHAR" If DR.Item("SUGGESTION") = True And DR.Item("SQL_RESULT").ToString.Length > 0 Then AddVorschlag_ComboBox(DR.Item("GUID"), DR.Item("NAME"), y, DR.Item("CONNECTION_ID"), DR.Item("SQL_RESULT"), DefaultValue) 'AddAutoSuggest_Textbox(DR.Item("NAME"), y, DR.Item("CONNECTION_ID"), DR.Item("SQL_RESULT"), DefaultValue) Else If DR.Item("NAME").ToString.ToLower = "dateiname" Then 'Übergibt den Dateinamen um diesen Vorzuschlagen AddTextBox(DR.Item("GUID"), DR.Item("NAME"), y, System.IO.Path.GetFileNameWithoutExtension(txtFilepath.Text)) Else Dim VORBELGUNG As String = DefaultValue 'nur eine Textbox AddTextBox(DR.Item("GUID"), DR.Item("NAME"), y, VORBELGUNG) End If End If Case "DATE" AddDateTimePicker(DR.Item("GUID"), DR.Item("NAME"), y) Case Else MsgBox($"Please check the datatype of manual index ({ DR.Item("NAME")} - {type} - Refresh_Indices_Manual (frmWMIndexFile)", MsgBoxStyle.Critical, "Achtung:") LOGGER.Warn(" - Datentyp nicht hinterlegt - LoadIndexe_Man") End Select anz += 1 ylbl += 60 y += 60 Next SendKeys.Send("{TAB}") Else grbxControls.Visible = False Me.Size = New Size(605, 430) End If Catch ex As Exception MsgBox("Error in Refresh_Indices_Manual:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) End Try End Sub Sub Check_Subfolder() Try Dim sel If CURRENT_REDUNDANT_FORM_ID <> 0 Then sel = "select MANUAL_SUBFOLDER FROM TBPMO_WD_FORMVIEW_DOKTYPES WHERE FORMVIEW_ID = (SELECT GUID FROM TBPMO_FORM_VIEW WHERE FORM_ID = " & CURRENT_REDUNDANT_FORM_ID & " and SCREEN_ID = " & CURRENT_SCREEN_ID & ")" Else sel = "select MANUAL_SUBFOLDER FROM TBPMO_WD_FORMVIEW_DOKTYPES WHERE FORMVIEW_ID = (SELECT GUID FROM TBPMO_FORM_VIEW WHERE FORM_ID = " & CURRENT_ENTITY_ID & " and SCREEN_ID = " & CURRENT_SCREEN_ID & ")" End If Dim chk = MYDB_ECM.GetScalarValue(sel) If Not IsNothing(chk) Then If CBool(chk) = True Then lblSubfolder.Visible = True txtSubfolder.Visible = True CURRENT_CHECK_SUBFOLDER = True CURRENT_SUBFOLDER = "" Else lblSubfolder.Visible = False txtSubfolder.Visible = False CURRENT_CHECK_SUBFOLDER = False End If End If Catch ex As Exception MsgBox("Error in Check_Subfolder:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) lblSubfolder.Visible = False txtSubfolder.Visible = False CURRENT_CHECK_SUBFOLDER = False End Try End Sub Sub addLabel(ID As Integer, indexname As String, hinweis As String, ylbl As Integer) Dim lbl As New Label lbl.Name = "lbl" & indexname lbl.Size = New Size(CInt(hinweis.Length * 15), 18) 'CInt(hinweis.Length * 9) lbl.Text = hinweis lbl.Tag = ID grbxControls.Controls.Add(lbl) lbl.Location = New Point(11, ylbl) End Sub Sub AddComboBoxValue(cmbName As ComboBox, Value As String) cmbName.Items.Add(Value) End Sub ' _ Function addCombobox(ID As Integer, indexname As String, y As Integer) Dim cmb As New ComboBox cmb.Name = "cmb" & indexname cmb.AutoSize = True cmb.Size = New Size(300, 27) cmb.Tag = ID grbxControls.Controls.Add(cmb) cmb.Location = New Point(11, y) 'cmb.AutoCompleteMode = AutoCompleteMode.SuggestAppend 'cmb.AutoCompleteSource = AutoCompleteSource.ListItems 'AddHandler cmb.KeyUp, AddressOf AutoCompleteCombo_KeyUp AddHandler cmb.SelectedIndexChanged, AddressOf OncmbSIndexChanged AddHandler cmb.GotFocus, AddressOf OncmbGotFocus AddHandler cmb.LostFocus, AddressOf OncmbLostFocus Return cmb End Function Public Sub OncmbGotFocus(sender As System.Object, e As System.EventArgs) Dim cmb As ComboBox = sender cmb.BackColor = Color.Lime End Sub ' _ Public Sub OncmbLostFocus(sender As System.Object, e As System.EventArgs) Dim cmb As ComboBox = sender cmb.BackColor = Color.White End Sub Function AddFOLDERSELECTBUTTON(ID As Integer, indexname As String, y As Integer) Dim btn As New Button btn.Name = "btn" & indexname If USER_LANGUAGE <> "de-DE" Then btn.Text = "Select the folder" Else btn.Text = "Wählen Sie einen Ordner" End If btn.Size = New Size(260, 27) btn.Tag = ID grbxControls.Controls.Add(btn) btn.Location = New Point(11, y) AddHandler btn.Click, AddressOf OnbtnClick Return btn End Function Public Sub OnbtnClick(sender As System.Object, e As System.EventArgs) Dim btn As Button = sender Dim folderBrowserDialog1 As New FolderBrowserDialog If USER_LANGUAGE <> "de-DE" Then folderBrowserDialog1.Description = "Select the directory:" Else folderBrowserDialog1.Description = "Wählen Sie einen Ordner:" End If ' Do not allow the user to create New files via the FolderBrowserDialog. folderBrowserDialog1.ShowNewFolderButton = True Try folderBrowserDialog1.RootFolder = PATHTextBox.Text Catch ex As Exception End Try Try folderBrowserDialog1.SelectedPath = PATHTextBox.Text Catch ex As Exception End Try Dim result As DialogResult = folderBrowserDialog1.ShowDialog() If (result = DialogResult.OK) Then ClassFileResult.SET_CURRENT_TBPMO_INDEX_MAN_VALUE(btn.Tag, folderBrowserDialog1.SelectedPath) PATHTextBox.Text = folderBrowserDialog1.SelectedPath txtSubfolder.Text = folderBrowserDialog1.SelectedPath End If End Sub Function AddTextBox(ID As Integer, indexname As String, y As Integer, text As String) Dim txt As New TextBox txt.Name = "txt" & indexname txt.Size = New Size(260, 27) 'txt.AutoSize = True txt.Tag = ID grbxControls.Controls.Add(txt) txt.Location = New Point(11, y) If text <> "" Then txt.Text = text txt.Size = New Size(CInt(text.Length * 15), 27) txt.SelectAll() End If AddHandler txt.GotFocus, AddressOf OnTextBoxFocus AddHandler txt.LostFocus, AddressOf OnTextBoxLostFocus AddHandler txt.KeyUp, AddressOf OnTextBoxKeyUp AddHandler txt.TextChanged, AddressOf OnTextBoxTextChanged Return txt End Function Public Sub OnTextBoxFocus(sender As System.Object, e As System.EventArgs) Dim box As TextBox = sender box.BackColor = Color.Lime box.SelectAll() End Sub Public Sub OnTextBoxTextChanged(sender As System.Object, e As System.EventArgs) Dim box As TextBox = sender 'If box.Text.Length > 15 Then Dim g As Graphics = box.CreateGraphics box.Width = g.MeasureString(box.Text, box.Font).Width + 15 g.Dispose() ' End If End Sub Public Sub OnTextBoxLostFocus(sender As System.Object, e As System.EventArgs) Dim box As TextBox = sender box.BackColor = Color.White End Sub Public Sub OnTextBoxKeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Dim box As TextBox = sender If (e.KeyCode = Keys.Return) Then SendKeys.Send("{TAB}") End If End Sub Sub AddDateTimePicker(ID As Integer, indexname As String, y As Integer) Dim dtp As New DateTimePicker dtp.Name = "dtp" & indexname dtp.Format = DateTimePickerFormat.Short dtp.Size = New Size(133, 27) dtp.Tag = ID dtp.Location = New Point(11, y) grbxControls.Controls.Add(dtp) AddHandler dtp.ValueChanged, AddressOf OndtpChanged End Sub Sub OndtpChanged() 'offen was hier zu tun ist End Sub Public Sub OncmbSIndexChanged(sender As System.Object, e As System.EventArgs) If formloaded = False Then Exit Sub End If Dim cmb As ComboBox = sender If cmb.SelectedIndex <> -1 Then If cmb.Text.Length > 15 Then Dim g As Graphics = cmb.CreateGraphics cmb.Width = g.MeasureString(cmb.Text, cmb.Font).Width + 30 g.Dispose() End If Get_NextComboBoxResults(cmb) SendKeys.Send("{TAB}") End If End Sub Sub Get_NextComboBoxResults(cmb As ComboBox) Try Dim indexname = cmb.Name.Replace("cmb", "") Dim sql = "SELECT GUID,NAME,SQL_RESULT FROM TBPMO_INDEX_MAN where ACTIVE = 1 AND SUGGESTION = 1 AND SQL_RESULT like '%@" & indexname & "%' and DOCTYPE_ID = " & CURRENT_DOKARTID & " ORDER BY SEQUENCE" Dim DT As DataTable = MYDB_ECM.GetDatatable(sql) If Not IsNothing(DT) Then If DT.Rows.Count > 0 Then Dim cmbname = "cmb" & DT.Rows(0).Item("NAME") Renew_ComboboxResults(DT.Rows(0).Item("GUID"), indexname, cmb.Text) End If End If Catch ex As Exception MsgBox("Error in Get_NextComboBoxResults:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) End Try End Sub Private Sub Renew_ComboboxResults(INDEX_GUID As Integer, SearchString As String, Resultvalue As String) Try Dim connectionString As String Dim sqlCnn As SqlConnection Dim sqlCmd As SqlCommand Dim adapter As New SqlDataAdapter Dim oracleConn As OracleConnection Dim oracleCmd As OracleCommand Dim oracleadapter As New OracleDataAdapter Dim NewDataset As New DataSet Dim i As Integer Dim conid = ClassMoreMetadata.Return_CURRENT_TBPMO_INDEX_MAN_VALUE(INDEX_GUID, "CONNECTION_ID") Dim sql_result = ClassMoreMetadata.Return_CURRENT_TBPMO_INDEX_MAN_VALUE(INDEX_GUID, "SQL_RESULT") Dim NAME = ClassMoreMetadata.Return_CURRENT_TBPMO_INDEX_MAN_VALUE(INDEX_GUID, "NAME") If Not IsNothing(conid) And Not IsNothing(sql_result) And Not IsNothing(NAME) Then For Each ctrl As Control In Me.grbxControls.Controls If ctrl.Name = "cmb" & NAME.ToString Then Dim cmb As ComboBox = ctrl Dim sql As String = sql_result.ToString.ToUpper.Replace("@" & SearchString.ToUpper, Resultvalue) connectionString = MYDB_ECM.CurrentConnectionString If connectionString Is Nothing = False Then 'SQL Befehl füllt die Auswahlliste If connectionString.Contains("Server=") And connectionString.Contains("Database=") Then sqlCnn = New SqlConnection(connectionString) sqlCnn.Open() sqlCmd = New SqlCommand(sql, sqlCnn) adapter.SelectCommand = sqlCmd adapter.Fill(NewDataset) ElseIf connectionString.StartsWith("Data Source=") And connectionString.Contains("SERVICE_NAME") Then oracleConn = New OracleConnection(connectionString) oracleConn.Open() oracleCmd = New OracleCommand(sql, oracleConn) oracleadapter.SelectCommand = oracleCmd oracleadapter.Fill(NewDataset) End If If NewDataset.Tables(0).Rows.Count > 0 Then cmb.Items.Clear() 'Die Standargrösse definieren Dim newWidth As Integer = 300 For i = 0 To NewDataset.Tables(0).Rows.Count - 1 'MsgBox(NewDataset.Tables(0).Rows(i).Item(0)) AddComboBoxValue(cmb, NewDataset.Tables(0).Rows(i).Item(0)) Try Dim text As String = NewDataset.Tables(0).Rows(i).Item(0) If text.Length > 15 Then Dim g As Graphics = cmb.CreateGraphics If g.MeasureString(text, cmb.Font).Width + 30 > newWidth Then newWidth = g.MeasureString(text, cmb.Font).Width + 30 End If g.Dispose() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error in Anpassung Breite ComboBox:") End Try Next cmb.Size = New Size(newWidth, 27) cmb.AutoCompleteSource = AutoCompleteSource.ListItems cmb.AutoCompleteMode = AutoCompleteMode.Suggest End If If connectionString.Contains("Server=") And connectionString.Contains("Database=") Then Try adapter.Dispose() sqlCmd.Dispose() sqlCnn.Close() Catch ex As Exception End Try Else Try oracleadapter.Dispose() oracleCmd.Dispose() oracleConn.Close() Catch ex As Exception End Try End If End If End If Next End If Catch ex As Exception LOGGER.Warn(" - Unvorhergesehener Unexpected error in Renew_ComboboxResults - Fehler: " & vbCrLf & ex.Message) MsgBox(ex.Message, MsgBoxStyle.Critical, "Unvorhergesehener Unexpected error in Renew_ComboboxResults:") End Try End Sub Private Sub AddVorschlag_ComboBox(ID As Integer, indexname As String, y As Integer, conid As Integer, sql_Vorschlag As String, Optional Vorgabe As String = "") Try Dim connectionString As String Dim sqlCnn As SqlConnection Dim sqlCmd As SqlCommand Dim adapter As New SqlDataAdapter Dim oracleConn As OracleConnection Dim oracleCmd As OracleCommand Dim oracleadapter As New OracleDataAdapter Dim NewDataset As New DataSet Dim i As Integer Dim sql As String Dim runinLZ As Boolean = False connectionString = MYDB_ECM.CurrentConnectionString ' ClassDatabase.GetConnectionString(conid) If connectionString Is Nothing = False Then 'SQL Befehl füllt die Auswahlliste sql = sql_Vorschlag If Not sql.Contains("@") Then If connectionString.Contains("Server=") And connectionString.Contains("Database=") Then sqlCnn = New SqlConnection(connectionString) sqlCnn.Open() sqlCmd = New SqlCommand(sql, sqlCnn) adapter.SelectCommand = sqlCmd adapter.Fill(NewDataset) ElseIf connectionString.StartsWith("Data Source=") And connectionString.Contains("SERVICE_NAME") Then oracleConn = New OracleConnection(connectionString) oracleConn.Open() oracleCmd = New OracleCommand(sql_Vorschlag, oracleConn) oracleadapter.SelectCommand = oracleCmd oracleadapter.Fill(NewDataset) End If Else runinLZ = True LOGGER.Debug(" >>sql enthält Platzhalter und wird erst während der Laufzeit gefüllt!") End If Dim newCMB As ComboBox If runinLZ = True Then 'Die Standardcombobox anlegen newCMB = addCombobox(ID, indexname, y) newCMB.Size = New Size(300, 27) Else If NewDataset.Tables(0).Rows.Count > 0 Then 'Die Standardcombobox anlegen newCMB = addCombobox(ID, indexname, y) 'Die Standargrösse definieren Dim newWidth As Integer = 300 For i = 0 To NewDataset.Tables(0).Rows.Count - 1 'MsgBox(NewDataset.Tables(0).Rows(i).Item(0)) AddComboBoxValue(newCMB, NewDataset.Tables(0).Rows(i).Item(0)) Try Dim text As String = NewDataset.Tables(0).Rows(i).Item(0) If text.Length > 15 Then Dim g As Graphics = newCMB.CreateGraphics If g.MeasureString(text, newCMB.Font).Width + 30 > newWidth Then newWidth = g.MeasureString(text, newCMB.Font).Width + 30 End If g.Dispose() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error in Anpassung Breite ComboBox:") End Try Next newCMB.Size = New Size(newWidth, 27) newCMB.AutoCompleteSource = AutoCompleteSource.ListItems newCMB.AutoCompleteMode = AutoCompleteMode.Suggest newCMB.DropDownHeight = (newCMB.ItemHeight + 0.2) * 25 If Vorgabe <> "" Then newCMB.SelectedIndex = newCMB.FindStringExact(Vorgabe) newCMB.Text = Vorgabe Get_NextComboBoxResults(newCMB) End If Else End If If connectionString.Contains("Server=") And connectionString.Contains("Database=") Then Try adapter.Dispose() sqlCmd.Dispose() sqlCnn.Close() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical) End Try Else Try oracleadapter.Dispose() oracleCmd.Dispose() oracleConn.Close() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical) End Try End If End If End If Catch ex As Exception LOGGER.Warn(" - Unvorhergesehener Unexpected error in AddVorschlag_ComboBox - Indexname: " & indexname & " - Fehler: " & vbCrLf & ex.Message) MsgBox(ex.Message, MsgBoxStyle.Critical, "Unvorhergesehener Unexpected error in AddVorschlag_ComboBox:") End Try End Sub Sub Refresh_indices() Try If CURRENT_DOKARTID > 0 Then Dim sql = "SELECT * FROM TBDD_DOKUMENTART WHERE GUID = " & CURRENT_DOKARTID Dim DTDOKART As DataTable = MYDB_ECM.GetDatatable(sql) If DTDOKART.Rows.Count = 1 Then OBJECT_TYPETextBox.Text = DTDOKART.Rows(0).Item("OBJEKTTYP") DOCTYPE_IDTextBox.Text = CURRENT_DOKARTID PATHTextBox.Text = DTDOKART.Rows(0).Item("ZIEL_PFAD") Dim dt As DataTable 'sql = "SELECT * FROM TBDD_INDEX_AUTOM WHERE DOCTYPE_ID = " & CURRENT_DOKARTID 'Dim dt As DataTable = MYDB_ECM.GetDatatable(sql) 'Dim Count As Integer = 0 'lvwIndices.Items.Clear() 'If dt.Rows.Count > 0 Then ' For Each row As DataRow In dt.Rows ' lvwIndices.Items.Add(row.Item("INDEXNAME").ToString) ' Dim Value As String ' Dim _case = row.Item("VALUE").ToString.ToUpper ' Select Case row.Item("VALUE").ToString.ToUpper ' Case "@DOKART" ' Value = CURRENT_DOKARTSTRING ' Case "@RECORD-ID" ' Value = CURRENT_RECORD_ID ' End Select ' lvwIndices.Items(Count).SubItems.Add(Value) ' Count += 1 ' Next 'End If 'den Entity-Key auslesen sql = "Select Top 1 * from TBPMO_WD_OBJECTTYPE where Upper(object_type) = Upper('" & OBJECT_TYPETextBox.Text & "')" dt = MYDB_ECM.GetDatatable(sql) If Not dt Is Nothing Then If dt.Rows.Count = 1 Then 'lvwIndices.Items.Add(dt.Rows(0).Item("IDXNAME_ENTITYID").ToString) 'lvwIndices.Items(Count).SubItems.Add(CURRENT_ENTITY_ID) 'Count = Count + 1 'lvwIndices.Items.Add(dt.Rows(0).Item("IDXNAME_PARENTID").ToString) 'If CURRENT_REDUNDANT_FORM_ID <> 0 Then ' sql = "SELECT TOP 1 PARENT_ID FROM TBPMO_FORM WHERE GUID = " & CURRENT_REDUNDANT_FORM_ID 'Else ' sql = "SELECT TOP 1 PARENT_ID FROM TBPMO_FORM WHERE GUID = " & CURRENT_ENTITY_ID 'End If 'Dim ParentID = MYDB_ECM.GetScalarValue(sql) 'Try ' If IsNumeric(ParentID) And ParentID > 0 Then ' lvwIndices.Items(Count).SubItems.Add(ParentID) ' End If 'Catch ex As Exception ' MsgBox("Unexpected Error in Setting Parent-ID" & vBCrlf & ex.Message, MsgBoxStyle.Critical) 'End Try 'Count = Count + 1 ''den Record-Key auslesen 'lvwIndices.Items.Add(dt.Rows(0).Item("IDXNAME_RECORDID").ToString) 'lvwIndices.Items(Count).SubItems.Add(CURRENT_RECORD_ID) 'Count = Count + 1 'lvwIndices.Items.Add(dt.Rows(0).Item("IDXNAME_DOCTYPE").ToString) 'lvwIndices.Items(Count).SubItems.Add(CURRENT_DOKARTSTRING) End If End If End If End If Catch ex As Exception MsgBox("Error in Refresh Indices for Indexing:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) End Try End Sub Private Sub frmWD_Index_Dokart_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing My.Settings.Save() End Sub Private Sub frmWD_Index_Dokart_Load(sender As Object, e As EventArgs) Handles Me.Load Try CURRENT_FILENAME = "" Me.VWDDINDEX_AUTOMTableAdapter.Connection.ConnectionString = MYDB_ECM.CurrentConnectionString chkMultiIndexer.Checked = False ' ── Multi-Indexing-Flags beim Formular-Load zurücksetzen ── LOGGER.Debug("=== FORM LOAD: Flags zurücksetzen ===") LOGGER.Debug($" VOR Reset: _multiIndexDecisionMade = {_multiIndexDecisionMade}, _multiIndexOverwriteExisting = {_multiIndexOverwriteExisting}") _multiIndexDecisionMade = False _multiIndexOverwriteExisting = False _processedFileIds.Clear() LOGGER.Debug($" NACH Reset: _multiIndexDecisionMade = {_multiIndexDecisionMade}, _multiIndexOverwriteExisting = {_multiIndexOverwriteExisting}") LOGGER.Debug($" ProcessedFileIds Count: {_processedFileIds.Count}") LOGGER.Debug("frmWD_Index_Dokart_Load") chkdelete_origin.Checked = False chkdelete_origin.Visible = False Dim oReconnect = WMMOD.SessionReconnect ' ── WICHTIG: Prüfen, ob überhaupt Dateien vorhanden sind ── If CURRENT_TBPMO_FILES_USER Is Nothing OrElse CURRENT_TBPMO_FILES_USER.Rows.Count = 0 Then LOGGER.Info("frmWD_Index_Dokart_Load: Keine Dateien vorhanden - Formular wird geschlossen") Me.Close() Exit Sub End If Dim oHandleType As String For Each oRow As DataRow In CURRENT_TBPMO_FILES_USER.Rows If oRow.Item("GUID") = CURRENT_FILEID Then CURRENT_FILENAME = oRow.Item("FILENAME2WORK") oHandleType = oRow.Item("HANDLE_TYPE") FILE_HASH = oRow.Item("FILE_HASH") Exit For ' ← Hinzugefügt: Schleife verlassen, wenn gefunden End If Next If CURRENT_FILENAME = "" Then LOGGER.Warn("Check the Temp Files Table, as it seems to be empty or CURRENT_FILEID not found!") MsgBox("Check the Temp Files Table, as it seems to be empty!", MsgBoxStyle.Exclamation) Me.Close() ' ← Formular schließen statt Exit Sub Exit Sub End If ' ── KORREKTUR: Zähle alle Dateien außer der aktuellen ── MULTIFILES = CURRENT_TBPMO_FILES_USER.Rows.Count - 1 LOGGER.Debug($" MULTIFILES berechnet: Gesamt={CURRENT_TBPMO_FILES_USER.Rows.Count}, MULTIFILES={MULTIFILES}") If MULTIFILES > 0 Then chkMultiIndexer.Text = "Multi-Indexing - Alle nachfolgenden Dateien (" & MULTIFILES & ") identisch indexieren" chkMultiIndexer.Visible = True LOGGER.Debug($" chkMultiIndexer: Visible=True, Text={chkMultiIndexer.Text}") Else chkMultiIndexer.Visible = False LOGGER.Debug(" chkMultiIndexer: Visible=False (keine weiteren Dateien)") End If aktFiledropped = CURRENT_FILENAME txtFilepath.Text = aktFiledropped If oHandleType = "@DROPFROMFSYSTEM@" Then droptype = "dragdrop file" chkdelete_origin.Visible = True chkdelete_origin.Checked = WD_IndexDeleteDocs ElseIf oHandleType = "@OUTLOOK_ATTMNT@" Then droptype = "dragdrop attachment" chkdelete_origin.Visible = True chkdelete_origin.Checked = WD_IndexDeleteDocs ElseIf oHandleType = "@OUTLOOKMESSAGE@" Then droptype = "dragdrop message" chkdelete_origin.Visible = True chkdelete_origin.Checked = WD_IndexDeleteDocs ElseIf oHandleType = "SCAM" Then droptype = "scan" End If Dim sql = String.Format("SELECT FORMVIEW_ID, FORM_ID, FORM_TITLE, DOKUMENTTYPE_ID, DOKUMENTTYPE, PATH, SHORTNAME, OBJECT_TYPE, FW_DOCTYPE_ID FROM VWPMO_DOKUMENTTYPES WHERE (FORMVIEW_ID = {0}) " & "ORDER BY SEQUENCE, DOKUMENTTYPE", CURRENT_FORMVIEW_ID) DTVWPMO_DOKUMENTTYPES = MYDB_ECM.GetDatatable(sql) CURRENT_REDUNDANT_FORM_ID = 0 CURRENT_REDUNDANT_FORMVIEW_ID = 0 If DTVWPMO_DOKUMENTTYPES.Rows.Count = 0 Then If CURRENT_ENTITY_REDUNDANT_ID <> 0 Then Dim FVID = MYDB_ECM.GetScalarValue(String.Format("SELECT GUID FROM TBPMO_FORM_VIEW WHERE FORM_ID = {0} and SCREEN_ID = 1", CURRENT_ENTITY_REDUNDANT_ID), True) If DTVWPMO_DOKUMENTTYPES.Rows.Count = 0 Then MsgBox("No documenttypes for the redundant entity configured either! Indexing is not possible!" & vbCrLf & "Please check the configuration!", MsgBoxStyle.Exclamation) Me.Close() Exit Sub Else LOGGER.Debug("Redundant EntityID: " & CURRENT_ENTITY_REDUNDANT_ID) CURRENT_REDUNDANT_FORM_ID = CURRENT_ENTITY_REDUNDANT_ID CURRENT_REDUNDANT_FORMVIEW_ID = FVID CURRENT_ENTITY_ID = CURRENT_ENTITY_REDUNDANT_ID CURRENT_FORMVIEW_ID = FVID End If Else MsgBox("No documenttypes for this entity configured! Indexing is not possible!" & vbCrLf & "Please check the configuration!", MsgBoxStyle.Exclamation) Me.Close() Exit Sub End If End If Catch ex As Exception LOGGER.Error($"Error in frmWD_Index_Dokart_Load: {ex.Message}") MsgBox("Error in frmWD_Index_Dokart_Load:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) Me.Close() End Try End Sub Private Sub chkdelete_origin_CheckedChanged(sender As Object, e As EventArgs) Handles chkdelete_origin.CheckedChanged WD_IndexDeleteDocs = chkdelete_origin.Checked SaveMySettingsValue("WD_IndexDeleteDocs", WD_IndexDeleteDocs, "ConfigMain") End Sub Private Sub frmWD_Index_Dokart_Shown(sender As Object, e As EventArgs) Handles Me.Shown Try If My.Settings.WD_INDEXDOKART_SAVE <> String.Empty Then Me.cmbDokumentart.SelectedItem = Me.cmbDokumentart.Items.IndexOf(My.Settings.WD_INDEXDOKART_SAVE) ' cmbDokumentart.SelectedIndex = cmbDokumentart.FindStringExact(My.Settings.WD_INDEXDOKART_SAVE) End If If DTVWPMO_DOKUMENTTYPES.Rows.Count >= 1 Then cmbDokumentart.DataSource = DTVWPMO_DOKUMENTTYPES cmbDokumentart.DisplayMember = DTVWPMO_DOKUMENTTYPES.Columns(4).ColumnName cmbDokumentart.ValueMember = DTVWPMO_DOKUMENTTYPES.Columns(3).ColumnName If DTVWPMO_DOKUMENTTYPES.Rows.Count = 1 Then cmbDokumentart.SelectedIndex = 0 CURRENT_DOKARTID = cmbDokumentart.SelectedValue CURRENT_DOKARTSTRING = cmbDokumentart.Text Refresh_indices() End If End If Me.Hide() Me.Visible = True Me.Activate() Me.BringToFront() If CURRENT_CONTROL_DOCTYPE_MATCH <> "" Then 'Me.cmbDokumentart.SelectedItem = Me.cmbDokumentart.Items.IndexOf(CURRENT_CONTROL_DOCTYPE_MATCH) cmbDokumentart.SelectedIndex = cmbDokumentart.FindStringExact(CURRENT_CONTROL_DOCTYPE_MATCH) If cmbDokumentart.SelectedIndex = 0 And CURRENT_CONTROL_DOCTYPE_MATCH = cmbDokumentart.Text Then CURRENT_DOKARTID = cmbDokumentart.SelectedValue CURRENT_DOKARTSTRING = cmbDokumentart.Text Refresh_indices() End If End If Catch ex As Exception MsgBox("Error in Form Shown:" & vbCrLf & ex.Message, MsgBoxStyle.Critical) End Try formloaded = True End Sub Private Sub txtSubfolder_TextChanged(sender As Object, e As EventArgs) Handles txtSubfolder.TextChanged CURRENT_SUBFOLDER = txtSubfolder.Text End Sub Private Sub frmWM_IndexFile_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing Try ' ── Multi-Indexing-Flags zurücksetzen ── _multiIndexDecisionMade = False _multiIndexOverwriteExisting = False ' ✅ WICHTIG: Liste NEU LADEN, bevor wir zählen! LOGGER.Debug("=== CLOSING: Lade aktuelle Dateiliste ===") ClassHelper.Create_USER_FILE_TABLE() ' ← Lädt CURRENT_TBPMO_FILES_USER NEU! ' ── Prüfen, ob noch Dateien zu verarbeiten sind ── If CURRENT_TBPMO_FILES_USER IsNot Nothing AndAlso CURRENT_TBPMO_FILES_USER.Rows.Count > 0 Then ' Es gibt noch nicht verarbeitete Dateien → Benutzer fragen LOGGER.Debug($"TBPMO_FILES_USER: Formular wird geschlossen, aber {CURRENT_TBPMO_FILES_USER.Rows.Count} Dateien sind noch vorhanden.") Dim msg As String Dim title As String If USER_LANGUAGE <> "de-DE" Then msg = $"There are still {CURRENT_TBPMO_FILES_USER.Rows.Count} unprocessed file(s)!" & vbCrLf & vbCrLf & "Do you really want to cancel the import?" & vbCrLf & vbCrLf & "YES → Cancel import and delete all pending files" & vbCrLf & "NO → Continue indexing" title = "Cancel Import?" Else msg = $"Es sind noch {CURRENT_TBPMO_FILES_USER.Rows.Count} nicht verarbeitete Datei(en) vorhanden!" & vbCrLf & vbCrLf & "Möchten Sie den Import wirklich abbrechen?" & vbCrLf & vbCrLf & "JA → Import abbrechen und alle ausstehenden Dateien löschen" & vbCrLf & "NEIN → Indexierung fortsetzen" title = "Import abbrechen?" End If Dim result As MsgBoxResult = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Warning) If result = MsgBoxResult.No Then ' Benutzer will NICHT abbrechen → Formular-Schließen verhindern LOGGER.Info("Benutzer hat Abbruch verhindert - Formular bleibt offen") e.Cancel = True Exit Sub Else ' Benutzer will abbrechen → Alle Dateien löschen LOGGER.Info("Benutzer hat Abbruch bestätigt - Lösche alle ausstehenden Dateien") Dim oDelete = $"DELETE FROM TBPMO_FILES_USER WHERE USER_WORK = '{USER_USERNAME}' AND WORKED = 0" MYDB_ECM.ExecuteNonQuery(oDelete) LOGGER.Info($"TBPMO_FILES_USER: {CURRENT_TBPMO_FILES_USER.Rows.Count} nicht-verarbeitete Einträge wurden gelöscht (User: {USER_USERNAME})") ' ── WICHTIG: DataTable leeren, damit Load-Event korrekt reagiert ── CURRENT_TBPMO_FILES_USER.Clear() LOGGER.Debug("CURRENT_TBPMO_FILES_USER wurde geleert") End If Else ' Keine Dateien mehr vorhanden → Normal schließen, aufräumen LOGGER.Debug("Keine ausstehenden Dateien mehr vorhanden ") End If Catch ex As Exception LOGGER.Warn($"Fehler beim Bereinigen von TBPMO_FILES_USER (Closing): {ex.Message}") End Try End Sub Private Sub frmWM_IndexFile_Closed(sender As Object, e As EventArgs) Handles Me.Closed Try Cursor = Cursors.Default Catch ex As Exception End Try End Sub Private Sub chkMultiIndexer_CheckedChanged(sender As Object, e As EventArgs) Handles chkMultiIndexer.CheckedChanged LOGGER.Debug($"chkMultiIndexer.CheckedChanged: {chkMultiIndexer.Checked}") End Sub End Class