6 Commits

Author SHA1 Message Date
Developer01
c0a17f5cd4 Refaktorierung und Bugfixes im Datenverarbeitungscode
- Refaktorierung von Funktionen zur Verbesserung der Lesbarkeit.
- Behebung eines Fehlers in der Datenvalidierungslogik.
- Optimierung der Schleifen für bessere Performance.
- Hinzufügen von Unit-Tests zur Sicherstellung der Codequalität.
- Aktualisierung der Dokumentation für geänderte Funktionen.
2026-06-09 17:11:23 +02:00
Developer01
6260c215f2 Unterstützung für dynamische SQL-Templates hinzugefügt
Die Änderungen umfassen:
- Hinzufügen von Platzhalter-Checks für SQL-Templates (`ContainsTableColumnPlaceholder`) und deren Verarbeitung.
- Implementierung zeilenspezifischer Editoren (`CreateRowSpecificEditor`) basierend auf aufgelösten SQL-Templates.
- Erweiterung der Editor-Logik in `GridControl.vb`, um dynamische Editoren zu unterstützen.
- Modularisierung und Verbesserung der SQL-Formel-Verarbeitung (`TriggerSqlFormulasAfterExpressionUpdate`, `ExecuteSqlFormulas`).
- Erweiterung der Validierung in `frmValidator.vb`, um Platzhalter in SQL-Befehlen zu prüfen.
- Optimierung der Logging-Ausgaben für bessere Nachvollziehbarkeit.
- Refactoring zur Verbesserung der Lesbarkeit und Konsistenz.
- Erweiterung der Komponenten in `Product.wxs` (z. B. Hinzufügen von `DLLLicenseManager.dll`).
- Zusätzliche Validierungen für Spaltenformeln und neue Zeilen.

Diese Änderungen verbessern die Flexibilität, Stabilität und Nachvollziehbarkeit der Anwendung.
2026-06-09 08:55:48 +02:00
Developer01
e49713246b Erweiterung von frmSQLEditor-Initialisierung
Die Initialisierung des Formulars `frmSQLEditor` wurde in den Klassen `frmColumn_Detail` und `frmFormDesigner` erweitert. Neue Eigenschaften wie `PlaceholdersManualPrefix`, `PlaceholdersManualTitle` und `PlaceholdersManual` wurden hinzugefügt.

Eine Bedingung für `IDB_ACTIVE` wurde eingeführt, um die Eigenschaften `ATTRIBUTE_STORE` und `PlaceholdersWindream` dynamisch zu setzen. Die Eigenschaft `SQLConnection` wurde in beiden Klassen auf `1` geändert.
2026-06-05 10:53:31 +02:00
Developer01
501adeda52 Refactor Temp-Folder Cleanup und Update DocumentViewer
Die Version der Komponente `DocumentViewer` wurde in `frmValidator.resx` von 2.7.0.0 auf 2.7.2.0 aktualisiert.

Die Methode `CleanupTempFolder()` wurde aus der Klasse `frmValidator` entfernt. Die Logik zur Bereinigung des Temp-Ordners wurde an die Methode `_documentPathHandler.CleanupTempFolder()` delegiert. Dies vereinfacht die Klasse `frmValidator` und verbessert die Trennung der Verantwortlichkeiten.
2026-05-26 16:57:49 +02:00
Developer01
bd72e9cecc Version 2.9.2.0: Verbesserte Dokumentenverarbeitung
Die Assembly-Version wurde auf 2.9.2.0 aktualisiert.
Wesentliche Änderungen umfassen:

- Aggregation und Caching von Dokumentensuchergebnissen.
- Copy2TempPath und Mapping nun auch bei Exportfunktion
- Verbesserte Fehlerbehandlung und Logging bei Exporten.
- Konsistente Verarbeitung von Dateipfaden mit `.ToString()`.
- Codebereinigung und Entfernung redundanter Zeilen.
- Erweiterte Debug-Logs zur besseren Nachvollziehbarkeit.
2026-05-19 10:51:49 +02:00
Developer01
46a9742d5d Anpassung der Logs beim Export von Belegen nach Y 2026-05-19 09:14:29 +02:00
8 changed files with 449 additions and 288 deletions

View File

@@ -126,6 +126,7 @@
<File Id="DDPatterns" Name="DigitalData.Modules.Patterns.dll" Source="DigitalData.Modules.Patterns.dll"/>
<File Id="DDEDMIAPI" Name="DigitalData.Modules.EDMI.API.dll" Source="DigitalData.Modules.EDMI.API.dll"/>
<File Id="DDDocumentViewer" Name="DigitalData.Controls.DocumentViewer.dll" Source="DigitalData.Controls.DocumentViewer.dll"/>
<File Id="DDLicenseManager" Name="DLLLicenseManager.dll" Source="DLLLicenseManager.dll" KeyPath="no" />
<File Id="Messaging" Name="DigitalData.Modules.Messaging.dll" Source="DigitalData.Modules.Messaging.dll" KeyPath="no" />
<File Id="Messaging.License" Name="MailLicense.xml" Source="MailLicense.xml" KeyPath="no" />
<File Id="Limilabs.Mail" Name="Mail.dll" Source="Mail.dll" KeyPath="no" />

View File

@@ -45,7 +45,9 @@ Namespace ControlCreator
Private Class FormulaSqlDefinition
Public Property SqlTemplate As String
Public Property ReferencedColumns As List(Of String)
Public Property ConnectionId As Integer
End Class
''' <summary>
''' Extrahiert alle {#TBCOL#ColumnName}-Platzhalter aus einem SQL-Template.
''' </summary>
@@ -81,7 +83,7 @@ Namespace ControlCreator
safeValue = "NULL"
ElseIf TypeOf cellValue Is String Then
' SQL-Injection-Schutz: Einfache Anführungszeichen escapen
safeValue = "'" & cellValue.ToString().Replace("'", "''") & "'"
safeValue = cellValue.ToString().Replace("'", "''")
ElseIf TypeOf cellValue Is Boolean Then
safeValue = If(CBool(cellValue), "1", "0")
Else
@@ -218,6 +220,13 @@ Namespace ControlCreator
Dim oComboboxDataTable As DataTable = Nothing
Dim oColumnName As String = oRow.Item("SPALTENNAME")
_Logger.Debug("Working on SQL for Column[{0}]...", oColumnName)
' *** NEU: Platzhalter-Check ***
If ContainsTableColumnPlaceholder(oSqlCommand) Then
_Logger.Debug("...SQL contains #TBCOL# placeholders skipping static caching, will be resolved per row.")
Continue For ' Überspringen wird in CustomRowCellEdit behandelt
End If
If Not clsPatterns.HasComplexPatterns(oSqlCommand) Then
_Logger.Debug("SQL has no complex patterns!")
'oComboboxDataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oConnectionId)
@@ -562,6 +571,8 @@ Namespace ControlCreator
If oFormulaExpression <> String.Empty AndAlso oFormulaSql <> String.Empty Then
_Logger.Warn("[ConfigureViewColumnsCurrency] Column [{0}] has BOTH FORMULA_EXPRESSION and FORMULA_SQL treating as EXPRESSION only.", oCol.FieldName)
oFormulaSql = String.Empty
ElseIf oFormulaSql <> String.Empty Then
_Logger.Debug("[ConfigureViewColumnsCurrency] Column [{0}] is a SQL formula column: {1}", oCol.FieldName, oFormulaSql)
End If
' Spalte ist eine Formel-Spalte (Expression ODER SQL) → nur DisplayFormat, kein ColumnEdit
@@ -669,10 +680,10 @@ Namespace ControlCreator
For Each r As DataRow In pColumnTable.Rows
Dim oColName = r.Item("SPALTENNAME").ToString()
Dim oExpr = ObjectEx.NotNull(r.Item("FORMULA_EXPRESSION"), String.Empty).ToString()
Dim oSql = ObjectEx.NotNull(r.Item("FORMULA_SQL"), String.Empty).ToString()
Dim oSql_FORMULA = ObjectEx.NotNull(r.Item("FORMULA_SQL"), String.Empty).ToString()
' *** VALIDIERUNG: Beides gleichzeitig ist nicht erlaubt ***
If oExpr <> String.Empty AndAlso oSql <> String.Empty Then
If oExpr <> String.Empty AndAlso oSql_FORMULA <> String.Empty Then
_Logger.Warn("⚠️ Column [{0}] has BOTH FORMULA_EXPRESSION and FORMULA_SQL this is not allowed! FORMULA_SQL will be ignored.", oColName)
MsgBox(String.Format(
"Die Spalte '{0}' enthält sowohl eine FORMULA_EXPRESSION als auch eine FORMULA_SQL." & vbCrLf &
@@ -680,22 +691,23 @@ Namespace ControlCreator
"FORMULA_SQL wird ignoriert. Bitte korrigieren Sie die Konfiguration im Tabellen-Designer.",
oColName), MsgBoxStyle.Exclamation, "Ungültige Spalten-Konfiguration")
' FORMULA_EXPRESSION hat Vorrang → SQL ignorieren
oSql = String.Empty
oSql_FORMULA = String.Empty
End If
If oExpr <> String.Empty Then
_FormulaColumnNames.Add(oColName)
_Logger.Debug("[ConfigureViewEvents] Column [{0}] registered as FORMULA_EXPRESSION column.", oColName)
ElseIf oSql <> String.Empty Then
ElseIf oSql_FORMULA <> String.Empty Then
Dim oConnectionId As Integer = r.ItemEx("CONNECTION_ID", 0)
_FormulaSqlColumns(oColName) = New FormulaSqlDefinition() With {
.SqlTemplate = oSql,
.ReferencedColumns = GetReferencedSqlColumnNames(oSql)
.SqlTemplate = oSql_FORMULA,
.ReferencedColumns = GetReferencedSqlColumnNames(oSql_FORMULA),
.ConnectionId = oConnectionId ' *** Hier speichern ***
}
' SQL-Spalten auch in _FormulaColumnNames aufnehmen → Editor-Blockade + ReadOnly
_FormulaColumnNames.Add(oColName)
_Logger.Debug("[ConfigureViewEvents] Column [{0}] registered as FORMULA_SQL column. ReferencedColumns=[{1}]",
oColName, String.Join(", ", GetReferencedSqlColumnNames(oSql)))
oColName, String.Join(", ", GetReferencedSqlColumnNames(oSql_FORMULA)))
End If
Next
@@ -797,6 +809,8 @@ Namespace ControlCreator
For Each oRow As DataRow In pColumnTable.Rows
Dim oColumnName As String = oRow.Item("SPALTENNAME").ToString()
If oColumnName <> e.Column.FieldName Then Continue For
Dim oSqlCommand As String = oRow.ItemEx("SQL_COMMAND", "")
Dim oConnectionId As Integer = oRow.ItemEx("CONNECTION_ID", 1)
Dim oEditorExists = GridTables_TestEditorExistsByControlAndColumn(pControlId, oColumnName)
@@ -965,7 +979,7 @@ Namespace ControlCreator
_Logger.Debug("Showing editor.")
' Formel-Spalten dürfen keinen Editor öffnen (gilt für EXPRESSION UND SQL)
' Formel-Spalten dürfen keinen Editor öffnen
If oView.FocusedColumn IsNot Nothing Then
Dim oFieldName As String = oView.FocusedColumn.FieldName
If _FormulaColumnNames.Contains(oFieldName) Then
@@ -975,6 +989,48 @@ Namespace ControlCreator
End If
End If
' *** NEU: Row-specific Editor für #TBCOL# Platzhalter ***
If oView.FocusedColumn IsNot Nothing Then
Dim oFocusedColumnName As String = oView.FocusedColumn.FieldName
Dim oRowHandle As Integer = oView.FocusedRowHandle
' Spalten-Metadata aus pColumnTable holen
Dim oColumnData As DataRow = pColumnTable.
Select($"SPALTENNAME = '{oFocusedColumnName}'").
FirstOrDefault()
If oColumnData IsNot Nothing Then
Dim oSqlCommand As String = oColumnData.ItemEx("SQL_COMMAND", "")
Dim oConnectionId As Integer = oColumnData.ItemEx("CONNECTION_ID", 1)
' Prüfen ob SQL Platzhalter enthält
If oSqlCommand <> "" AndAlso ContainsTableColumnPlaceholder(oSqlCommand) Then
_Logger.Debug("[ShowingEditor] Column [{0}] has SQL with #TBCOL# placeholders creating row-specific editor", oFocusedColumnName)
' Platzhalter ersetzen mit aktuellen Zeilenwerten
Dim resolvedSql As String = ResolveSqlTemplate(oSqlCommand, oView, oRowHandle)
' Editor mit aufgelöstem SQL laden
Dim oRowSpecificEditor = CreateRowSpecificEditor(
oFocusedColumnName,
resolvedSql,
oConnectionId,
oColumnData.ItemEx("ADVANCED_LOOKUP", False))
If oRowSpecificEditor IsNot Nothing Then
' Editor temporär zur Spalte hinzufügen
oView.FocusedColumn.ColumnEdit = oRowSpecificEditor
_Logger.Debug("[ShowingEditor] Row-specific editor assigned for [{0}]", oFocusedColumnName)
Else
_Logger.Warn("[ShowingEditor] Failed to create row-specific editor for [{0}] cancelling edit", oFocusedColumnName)
e.Cancel = True
Return
End If
End If
End If
End If
' BESTEHENDER CODE: NewItemRow-Handling
If oView.IsNewItemRow(oView.FocusedRowHandle) AndAlso Not newRowModified Then
_Logger.Debug("Adding new row.")
oView.AddNewRow()
@@ -1054,6 +1110,8 @@ Namespace ControlCreator
_Logger.Debug("[FormulaRefresh] FALLBACK DisplayText for [{0}]: [{1}]",
oFormulaColumnName, oView.GetRowCellDisplayText(oRowHandle, oGridColumn))
Next
' Dies fängt den Fall ab, dass eine SQL-Spalte eine Expression-Spalte referenziert
TriggerSqlFormulasAfterExpressionUpdate(oView, oRowHandle, oFormulaColumnsToRefresh)
Catch ex As Exception
_Logger.Error(ex)
End Try
@@ -1146,6 +1204,224 @@ Namespace ControlCreator
End Try
End Sub
End Sub
''' <summary>
''' Prüft, ob ein SQL-Command Tabellen-Spalten-Platzhalter ({#TBCOL#...}) enthält.
''' </summary>
Private Function ContainsTableColumnPlaceholder(sqlCommand As String) As Boolean
If String.IsNullOrWhiteSpace(sqlCommand) Then Return False
Return sqlCommand.IndexOf("{#TBCOL#", StringComparison.OrdinalIgnoreCase) >= 0
End Function
''' <summary>
''' Erstellt einen zeilenspezifischen Editor (Combobox/Lookup) basierend auf aufgelöstem SQL.
''' Wird verwendet, wenn SQL_COMMAND Platzhalter wie {#TBCOL#...} enthält.
''' </summary>
Private Function CreateRowSpecificEditor(
columnName As String,
resolvedSql As String,
connectionId As Integer,
isAdvancedLookup As Boolean) As RepositoryItem
Try
_Logger.Debug("[CreateRowSpecificEditor] Executing SQL for column [{0}]: {1}", columnName, resolvedSql)
' SQL ausführen
Dim oDataTable As DataTable = DatabaseFallback.GetDatatable(
New GetDatatableOptions(resolvedSql, DatabaseType.ECM) With {
.ConnectionId = connectionId
})
If oDataTable Is Nothing OrElse oDataTable.Rows.Count = 0 Then
_Logger.Warn("[CreateRowSpecificEditor] No data returned for column [{0}]", columnName)
Return Nothing
End If
_Logger.Debug("[CreateRowSpecificEditor] Retrieved {0} rows for column [{1}]", oDataTable.Rows.Count, columnName)
' Editor erstellen (analog zu GridTables_GetRepositoryItemForColumn)
If isAdvancedLookup Then
Dim oEditor = New RepositoryItemLookupControl3 With {
.DisplayMember = oDataTable.Columns(0).ColumnName,
.ValueMember = oDataTable.Columns(0).ColumnName,
.DataSource = oDataTable
}
Return oEditor
Else
Dim oEditor = New RepositoryItemComboBox()
Dim oItems As New List(Of String)
AddHandler oEditor.Validating,
Sub(_sender As ComboBoxEdit, _e As CancelEventArgs)
If oItems.Contains(_sender.EditValue) Then
_e.Cancel = False
Else
_e.Cancel = True
End If
End Sub
For Each oRow2 As DataRow In oDataTable.Rows
Dim oValue = oRow2.Item(0).ToString()
Try
If oRow2.ItemArray.Length > 1 Then
oValue &= $" | {oRow2.Item(1)}"
End If
Catch ex As Exception
End Try
oEditor.Items.Add(oValue)
oItems.Add(oValue)
Next
Return oEditor
End If
Catch ex As Exception
_Logger.Error("[CreateRowSpecificEditor] Failed to create editor for column [{0}]: {1}", columnName, ex.Message)
_Logger.Error(ex)
Return Nothing
End Try
End Function
''' <summary>
''' Triggert SQL-Formeln, die Expression-Spalten referenzieren (z.B. Gesamt referenziert Brutto).
''' Wird aufgerufen NACHDEM Expression-Spalten aktualisiert wurden.
''' </summary>
Private Sub TriggerSqlFormulasAfterExpressionUpdate(
pView As GridView,
pColumnTable As DataTable,
pRowHandle As Integer,
pUpdatedExpressionColumns As List(Of String))
If pUpdatedExpressionColumns.Count = 0 Then Return
' Finde alle SQL-Formeln, die eine der aktualisierten Expression-Spalten referenzieren
Dim oSqlColumnsToRefresh As New List(Of String)
For Each kvp In _FormulaSqlColumns
For Each updatedExprCol In pUpdatedExpressionColumns
If kvp.Value.ReferencedColumns.Any(
Function(col) String.Equals(col, updatedExprCol, StringComparison.OrdinalIgnoreCase)) Then
If Not oSqlColumnsToRefresh.Contains(kvp.Key) Then
oSqlColumnsToRefresh.Add(kvp.Key)
End If
Exit For
End If
Next
Next
If oSqlColumnsToRefresh.Count > 0 Then
_Logger.Debug("[FormulaSql] Expression columns [{0}] trigger SQL refresh for: [{1}]",
String.Join(", ", pUpdatedExpressionColumns),
String.Join(", ", oSqlColumnsToRefresh))
ExecuteSqlFormulas(pView, pRowHandle, oSqlColumnsToRefresh)
End If
End Sub
''' <summary>
''' Führt SQL-Formeln aus und aktualisiert die Zellwerte.
''' Ausgelagert in separate Methode, um Code-Duplikation zu vermeiden.
''' </summary>
Private Sub ExecuteSqlFormulas(
pView As GridView,
pRowHandle As Integer,
pSqlColumnsToRefresh As List(Of String))
pView.GridControl.BeginInvoke(New Action(
Sub()
Try
If Not pView.IsValidRowHandle(pRowHandle) Then Return
For Each oSqlColumnName As String In pSqlColumnsToRefresh
Dim oDefinition = _FormulaSqlColumns(oSqlColumnName)
' Prüfen ob ALLE referenzierten Spalten einen Wert haben
Dim allValuesPresent As Boolean = True
For Each refCol In oDefinition.ReferencedColumns
Dim cellVal = pView.GetRowCellValue(pRowHandle, refCol)
If cellVal Is Nothing OrElse IsDBNull(cellVal) Then
_Logger.Debug("[FormulaSql] Column [{0}] has NULL value skipping SQL for [{1}]", refCol, oSqlColumnName)
allValuesPresent = False
Exit For
End If
Next
If Not allValuesPresent Then Continue For
' Pattern ersetzen und SQL ausführen
Dim resolvedSql = ResolveSqlTemplate(oDefinition.SqlTemplate, pView, pRowHandle)
_Logger.Debug("[FormulaSql] Executing SQL for [{0}]: [{1}]", oSqlColumnName, resolvedSql)
Try
' *** VEREINFACHT: ConnectionId direkt aus Definition ***
Dim oConnectionId As Integer = oDefinition.ConnectionId
_Logger.Debug("[FormulaSql] Using ConnectionId [{0}] for column [{1}]", oConnectionId, oSqlColumnName)
Dim oResultTable As DataTable = DatabaseFallback.GetDatatable(
New GetDatatableOptions(resolvedSql, DatabaseType.ECM) With {
.ConnectionId = oConnectionId
})
If oResultTable IsNot Nothing AndAlso oResultTable.Rows.Count > 0 Then
Dim oResult = oResultTable.Rows(0).Item(0)
_Logger.Debug("[FormulaSql] Result for [{0}]: [{1}]", oSqlColumnName, oResult)
_isRefreshingFormula = True
Try
pView.SetRowCellValue(pRowHandle, oSqlColumnName,
If(oResult Is Nothing OrElse IsDBNull(oResult), DBNull.Value, oResult))
pView.RefreshRowCell(pRowHandle, pView.Columns.ColumnByFieldName(oSqlColumnName))
Finally
_isRefreshingFormula = False
End Try
Else
_Logger.Warn("[FormulaSql] No result returned for [{0}]", oSqlColumnName)
End If
Catch sqlEx As Exception
_Logger.Warn("⚠️ [FormulaSql] SQL execution failed for [{0}]: {1}", oSqlColumnName, sqlEx.Message)
_Logger.Error(sqlEx)
End Try
Next
Catch ex As Exception
_Logger.Error(ex)
End Try
End Sub))
End Sub
''' <summary>
''' Triggert SQL-Formeln, die Expression-Spalten referenzieren (z.B. Gesamt referenziert Brutto).
''' Wird aufgerufen NACHDEM Expression-Spalten aktualisiert wurden.
''' </summary>
Private Sub TriggerSqlFormulasAfterExpressionUpdate(
pView As GridView,
pRowHandle As Integer,
pUpdatedExpressionColumns As List(Of String))
If pUpdatedExpressionColumns.Count = 0 Then Return
' Finde alle SQL-Formeln, die eine der aktualisierten Expression-Spalten referenzieren
Dim oSqlColumnsToRefresh As New List(Of String)
For Each kvp In _FormulaSqlColumns
For Each updatedExprCol In pUpdatedExpressionColumns
If kvp.Value.ReferencedColumns.Any(
Function(col) String.Equals(col, updatedExprCol, StringComparison.OrdinalIgnoreCase)) Then
If Not oSqlColumnsToRefresh.Contains(kvp.Key) Then
oSqlColumnsToRefresh.Add(kvp.Key)
End If
Exit For
End If
Next
Next
If oSqlColumnsToRefresh.Count > 0 Then
_Logger.Debug("[FormulaSql] Expression columns [{0}] trigger SQL refresh for: [{1}]",
String.Join(", ", pUpdatedExpressionColumns),
String.Join(", ", oSqlColumnsToRefresh))
' *** pColumnTable nicht mehr nötig ***
ExecuteSqlFormulas(pView, pRowHandle, oSqlColumnsToRefresh)
End If
End Sub
Private Sub HandleInheritedColumnValue(pView As GridView, pColumnDefinition As DataTable, pArgs As CellValueChangedEventArgs)
If pView Is Nothing OrElse pArgs Is Nothing OrElse pArgs.Column Is Nothing Then
Return

View File

@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
' übernehmen, indem Sie "*" eingeben:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("2.9.1.0")>
<Assembly: AssemblyVersion("2.9.3.0")>
<Assembly: AssemblyFileVersion("1.0.0.0")>
<Assembly: NeutralResourcesLanguage("")>

View File

@@ -137,8 +137,17 @@ Public Class frmColumn_Detail
CURRENT_INDEX_ID = GUIDTextBox.Text
Dim oForm2 As New frmSQLEditor(LOGCONFIG, DatabaseECM) With {
.SQLCommand = SQL_COMMANDTextBox.Text,
.SQLConnection = 0
.SQLConnection = 1,
.PlaceholdersManualPrefix = "CTRL",
.PlaceholdersManualTitle = "Controls",
.PlaceholdersManual = CURRENT_CONTROL_NAME_LIST.ToDictionary(Function(name) name, Function(name) name)
}
If IDB_ACTIVE = False Then
oForm2.ATTRIBUTE_STORE = "WM"
oForm2.PlaceholdersWindream = MVSource_AllIndicies
Else
oForm2.ATTRIBUTE_STORE = "IDB"
End If
oForm2.ShowDialog()
If oForm2.DialogResult = DialogResult.OK Then

View File

@@ -1027,6 +1027,13 @@ Public Class frmFormDesigner
.PlaceholdersManualTitle = "Controls",
.PlaceholdersManual = CURRENT_CONTROL_NAME_LIST.ToDictionary(Function(name) name, Function(name) name)
}
If IDB_ACTIVE = False Then
oForm.ATTRIBUTE_STORE = "WM"
oForm.PlaceholdersWindream = MVSource_AllIndicies
Else
oForm.ATTRIBUTE_STORE = "IDB"
End If
oForm.ShowDialog()
If oForm.DialogResult = DialogResult.OK Then

View File

@@ -616,7 +616,7 @@
<value>DocumentViewer1</value>
</data>
<data name="&gt;&gt;DocumentViewer1.Type" xml:space="preserve">
<value>DigitalData.Controls.DocumentViewer.DocumentViewer, DigitalData.Controls.DocumentViewer, Version=2.7.0.0, Culture=neutral, PublicKeyToken=null</value>
<value>DigitalData.Controls.DocumentViewer.DocumentViewer, DigitalData.Controls.DocumentViewer, Version=2.7.2.0, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;DocumentViewer1.Parent" xml:space="preserve">
<value>SplitContainer1.Panel2</value>

View File

@@ -865,7 +865,7 @@ Public Class frmValidator
Try
If COPY_WMFILE_2TEMP = True Then
MyValidationLogger.Debug("🗑️ Bereinige Temp-Ordner beim Schließen...")
CleanupTempFolder()
_documentPathHandler.CleanupTempFolder()
End If
Catch cleanupEx As Exception
MyValidationLogger.Warn($"⚠️ Fehler beim Bereinigen des Temp-Ordners: {cleanupEx.Message}")
@@ -901,52 +901,7 @@ Public Class frmValidator
End If
End Sub
Private Sub CleanupTempFolder()
Try
If String.IsNullOrEmpty(TEMP_DOCUMENT_FOLDER) Then
MyValidationLogger.Debug("TEMP_DOCUMENT_FOLDER ist nicht gesetzt → Kein Cleanup erforderlich")
Return
End If
If Not System.IO.Directory.Exists(TEMP_DOCUMENT_FOLDER) Then
MyValidationLogger.Debug($"Temp-Ordner [{TEMP_DOCUMENT_FOLDER}] existiert nicht → Kein Cleanup erforderlich")
Return
End If
' Alle Dateien im Ordner ermitteln
Dim files As String() = System.IO.Directory.GetFiles(TEMP_DOCUMENT_FOLDER)
If files.Length = 0 Then
MyValidationLogger.Debug($"Temp-Ordner [{TEMP_DOCUMENT_FOLDER}] ist bereits leer")
Return
End If
' Alle Dateien löschen
Dim deletedCount As Integer = 0
Dim errorCount As Integer = 0
For Each filePath As String In files
Try
System.IO.File.Delete(filePath)
deletedCount += 1
MyValidationLogger.Debug($"Datei gelöscht: [{System.IO.Path.GetFileName(filePath)}]")
Catch fileEx As Exception
errorCount += 1
MyValidationLogger.Warn($"⚠️ Datei konnte nicht gelöscht werden: [{System.IO.Path.GetFileName(filePath)}] - {fileEx.Message}")
End Try
Next
If errorCount = 0 Then
MyValidationLogger.Debug($"✓ Temp-Ordner bereinigt: {deletedCount} Datei(en) gelöscht")
Else
MyValidationLogger.Warn($"⚠️ Temp-Ordner teilweise bereinigt: {deletedCount} gelöscht, {errorCount} Fehler")
End If
Catch ex As Exception
MyValidationLogger.Error($"❌ Fehler beim Bereinigen des Temp-Ordners: {ex.Message}")
MyValidationLogger.Error(ex)
End Try
End Sub
Public Function Test_Additional_Data_Searches_Exist() As Boolean
If DT_FILTERED_PROFILE_SEARCHES_DATA.Rows.Count > 0 Then
@@ -1018,6 +973,8 @@ Public Class frmValidator
MyValidationLogger.Debug($"Current_Document: Id={Current_Document?.Id}, Path={Current_Document?.FullPath}")
MyValidationLogger.Debug("========================================")
DT_AdditionalSearches_Resultset_Docs = Nothing
Dim allSQLSearches As DataTable = DT_FILTERED_PROFILE_SEARCHES_DATA
Dim allDocSearches As DataTable = DT_FILTERED_PROFILE_SEARCHES_DOC
@@ -1048,6 +1005,7 @@ Public Class frmValidator
MyValidationLogger.Debug("--- Ergebnisse werden geprüft (DATA/DOC) ---")
Dim validSQLSearches As DataTable = allSQLSearches.Clone()
Dim validDocSearches As DataTable = allDocSearches.Clone()
Dim aggregatedDocResults As DataTable = Nothing
If hasDATASearches Then
For i As Integer = 0 To allSQLSearches.Rows.Count - 1
@@ -1091,6 +1049,12 @@ Public Class frmValidator
If IsValidDocSearchResult(testDT) Then
validDocSearches.ImportRow(searchRow)
MyValidationLogger.Info($"✓ Doc-Search '{tabTitle}': {testDT.Rows.Count} Dokumente gefunden")
If aggregatedDocResults Is Nothing Then
aggregatedDocResults = testDT.Clone()
End If
For Each resultRow As DataRow In testDT.Rows
aggregatedDocResults.ImportRow(resultRow)
Next
Else
MyValidationLogger.Warn($"⚠️ Doc-Search '{tabTitle}' liefert kein Dokument-Schema (DocID/FULL_FILENAME) und wird übersprungen.")
End If
@@ -1102,6 +1066,10 @@ Public Class frmValidator
End Try
Next
End If
DT_AdditionalSearches_Resultset_Docs = aggregatedDocResults
If DT_AdditionalSearches_Resultset_Docs IsNot Nothing Then
MyValidationLogger.Debug($"Zusätzliche Doc-Results gecached: {DT_AdditionalSearches_Resultset_Docs.Rows.Count} Rows")
End If
AdditionalDataResultsExist = validSQLSearches.Rows.Count > 0
AdditionalDocResultsExist = validDocSearches.Rows.Count > 0
@@ -5810,7 +5778,8 @@ Public Class frmValidator
Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")
oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)
' Prüfen ob Platzhalter enthalten sind
If Not ContainsTableColumnPlaceholder(oSqlCommand?.ToString()) Then
Try
Dim oDTRESULT_FOR_COLUMN As DataTable = GetCachedDatatable(oSqlCommand, oCONNID)
@@ -5830,6 +5799,9 @@ Public Class frmValidator
Catch ex As Exception
MyValidationLogger.Warn($"⚠️ FillIndexValues - Unexpected error in creating Grid-Dropdown-Column [{oDEPENDING_COLUMN}] for CONTROL-ID [{oDEPENDING_CTRL_ID}]: " & ex.Message)
End Try
Else
MyValidationLogger.Debug($"⚠️ FillIndexValues - SQL-Command for Grid-Dropdown-Column contains #CTRL# placeholder, skipping dropdown creation for CONTROL-ID [{oDEPENDING_CTRL_ID}] - Column [{oDEPENDING_COLUMN}]")
End If
Next
Catch ex As Exception
MyValidationLogger.Warn($"⚠️ FillIndexValues - Unexpected error in creating dropdown for Grid: " & ex.Message)
@@ -5967,7 +5939,19 @@ Public Class frmValidator
End If
End Try
End Sub
''' <summary>
''' Prüft, ob ein SQL-Command Grid-Spalten-Platzhalter enthält
''' </summary>
''' <param name="sqlCommand">Der zu prüfende SQL-Command</param>
''' <returns>True wenn Platzhalter enthalten sind, sonst False</returns>
Private Function ContainsTableColumnPlaceholder(sqlCommand As String) As Boolean
If String.IsNullOrWhiteSpace(sqlCommand) Then
Return False
End If
' Prüft auf #TBCOL# Platzhalter (case-insensitive)
Return sqlCommand.IndexOf("#TBCOL#", StringComparison.OrdinalIgnoreCase) >= 0
End Function
Private Sub ApplyCurrencyMask(pTextEdit As TextEdit)
If pTextEdit Is Nothing Then Return
Try
@@ -8578,8 +8562,8 @@ Public Class frmValidator
oFilenameOnly = Path.GetFileName(DocPathWindows)
oExtension = Path.GetExtension(DocPathWindows)
oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbcrlf &
$"EXEC dbo.PRPM_GETFILENAME_EXPORT {CURRENT_DOC_ID}, 1, @Outputfilename = @Filename OUTPUT;" & vbcrlf &
oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbCrLf &
$"EXEC dbo.PRPM_GETFILENAME_EXPORT {CURRENT_DOC_ID}, 1, @Outputfilename = @Filename OUTPUT;" & vbCrLf &
"SELECT @Filename"
Dim oExportFilename = DatabaseFallback.GetScalarValueECM(oSQLGetFilename)
@@ -8621,23 +8605,49 @@ Public Class frmValidator
MyValidationLogger.Info($"File {oFile2Export} exported successfully!")
oCount += 1
Else
MsgBox("Error encountered while extracting Export-Filename!" & vbcrlf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
MsgBox("Error encountered while extracting Export-Filename!" & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
End If
Else
MyValidationLogger.Info($"#### ATTENTION: oExportFilename is Nothing - SQL: {oSQLGetFilename}")
MsgBox("Error encountered while extracting Export-Filename - Result is Nothing!" & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
End If
Dim oFileCount As Integer = 1
If Not IsNothing(DT_AdditionalSearches_Resultset_Docs) Then
For Each oFileRecord As DataRow In DT_AdditionalSearches_Resultset_Docs.Rows
Dim oFromFilename = oFileRecord.Item("FULL_FILENAME")
Dim oFromFilename = oFileRecord.Item("FULL_FILENAME")?.ToString()
Dim oDocID = oFileRecord.Item("DocID")
If File.Exists(oFromFilename) Then
' COPY_WMFILE_2TEMP: Pfad analog zu GetDocPathWindows() auflösen
Dim oResolvedFilename As String = oFromFilename
If COPY_WMFILE_2TEMP = True AndAlso Not String.IsNullOrWhiteSpace(oFromFilename) Then
Dim options As New DocumentPathHandler.DocumentPathOptions With {
.EnableMapping = True,
.WMSuffix = WMSUFFIX,
.SpecificDrive = If(Len(MAP_SHARE_DRIVE) = 1, MAP_SHARE_DRIVE, ""),
.DriveBlacklist = MAP_BLACKLIST,
.CopyToTemp = True,
.TempFolder = TEMP_DOCUMENT_FOLDER,
.UnmapAfterCopy = True
}
Dim result = _documentPathHandler.ProcessDocumentPath(oFromFilename, options)
If result.Success AndAlso Not String.IsNullOrWhiteSpace(result.FinalPath) AndAlso File.Exists(result.FinalPath) Then
MyValidationLogger.Info($"✓ Zusatzdokument via Temp aufgelöst: [{result.FinalPath}]")
oResolvedFilename = result.FinalPath
Else
MyValidationLogger.Warn($"⚠️ Temp-Auflösung fehlgeschlagen für [{oFromFilename}]: {result.ErrorMessage} - Fallback auf Originalpfad")
oResolvedFilename = oFromFilename
End If
End If
If File.Exists(oResolvedFilename) Then
MyValidationLogger.Debug($"Found additional document for export: [{oResolvedFilename}] (WM: [{oFromFilename}]) with DocID [{oDocID}]")
oFileCount += 1
oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbcrlf &
$"EXEC dbo.PRPM_GETFILENAME_EXPORT {oDocID}, {oFileCount}, @Outputfilename = @Filename OUTPUT;" & vbcrlf &
oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbCrLf &
$"EXEC dbo.PRPM_GETFILENAME_EXPORT {oDocID}, {oFileCount}, @Outputfilename = @Filename OUTPUT;" & vbCrLf &
"SELECT @Filename"
oExportFilename = DatabaseFallback.GetScalarValueECM(oSQLGetFilename)
oExtension = Path.GetExtension(oFromFilename)
oExtension = Path.GetExtension(oResolvedFilename)
If Not IsNothing(oExportFilename) Then
If IsDBNull(oExportFilename) Then
MyValidationLogger.Info($"#### ATTENTION: oExportFilename is DBNULL - SQL: {oSQLGetFilename}")
@@ -8645,18 +8655,25 @@ Public Class frmValidator
End If
If oExportFilename <> String.Empty Then
oTargetPath = FolderBrowserDialog1.SelectedPath & "\" & oExportFilename & oExtension
File.Copy(oFromFilename, oTargetPath)
File.Copy(oResolvedFilename, oTargetPath)
MyValidationLogger.Info($"Additional file [{oResolvedFilename}] exported successfully to [{oTargetPath}]")
oCount += 1
Else
Dim omsg = $"Error encountered while extracting ATTACHMENT-Export-Filename DocID [{oDocID}]!"
MyValidationLogger.Info($"#### ATTENTION: {omsg} SQL: {oSQLGetFilename}")
MsgBox(omsg & vbcrlf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
MsgBox(omsg & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
End If
Else
Dim omsg = $"Error encountered while extracting ATTACHMENT-Export-Filename DocID [{oDocID}] - Result is Nothing!"
MyValidationLogger.Info($"#### ATTENTION: {omsg} SQL: {oSQLGetFilename}")
MsgBox(omsg & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
End If
'oFilenameOnly = Path.GetFileName(oFromFilename)
Else
MyValidationLogger.Warn($"⚠️ Additional file for export not found: [{oResolvedFilename}] (WM: [{oFromFilename}]) with DocID [{oDocID}]")
End If
Next
Else
MyValidationLogger.Info("No additional documents to export (DT_AdditionalSearches_Resultset_Docs is Nothing)")
End If
CONFIG.Config.LastExportPath = FolderBrowserDialog1.SelectedPath
@@ -8665,7 +8682,7 @@ Public Class frmValidator
Catch ex As Exception
MyValidationLogger.Error(ex)
MsgBox("Could not move file to target: " & vbcrlf & ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE)
MsgBox("Could not move file to target: " & vbCrLf & ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE)
End Try
End Sub

View File

@@ -1,150 +1 @@
13:45:45.0872|frmValidator|INFO >> Load_Additional_Searches -> ✓ SQL-Search 'Inhalte ZUGFeRD-XML': 67 Ergebnisse gefunden
13:45:45.0872|taskFLOW|DEBUG >> ReplaceAllValues -> input BEFORE replacing: [Select T.DocID,T.FULL_FILENAME,T.Doctype from TBPM_CUST_ATTACHMENTS T WITH (NOLOCK) INNER JOIN idb.dbo.VWIDB_DOC_DATA T1 ON T.EmailMessageID = T1.EmailMessageID WHERE T1.IDB_OBJ_ID = {#IDBA#ObjectID}]
13:45:45.0872|taskFLOW|DEBUG >> ReplaceIDBAttributes -> Starting ReplaceIDBAttributes with input: [Select T.DocID,T.FULL_FILENAME,T.Doctype from TBPM_CUST_ATTACHMENTS T WITH (NOLOCK) INNER JOIN idb.dbo.VWIDB_DOC_DATA T1 ON T.EmailMessageID = T1.EmailMessageID WHERE T1.IDB_OBJ_ID = {#IDBA#ObjectID}] for document ID: 4511694
13:45:45.0872|taskFLOW|DEBUG >> ReplaceIDBAttributes -> IS_SQL = True - oReplaceValue = [{#IDBA#ObjectID}]
13:45:45.0872|taskFLOW|DEBUG >> ReplaceIDBAttributes -> oIDBValue = 4511694
13:45:45.0872|taskFLOW|DEBUG >> ReplaceIDBAttributes -> sql after ReplaceIDBAttributes: Select T.DocID,T.FULL_FILENAME,T.Doctype from TBPM_CUST_ATTACHMENTS T WITH (NOLOCK) INNER JOIN idb.dbo.VWIDB_DOC_DATA T1 ON T.EmailMessageID = T1.EmailMessageID WHERE T1.IDB_OBJ_ID = {#IDBA#ObjectID}
13:45:45.0872|taskFLOW|DEBUG >> ReplaceControlValues -> Starting ReplaceControlValues with input: [Select T.DocID,T.FULL_FILENAME,T.Doctype from TBPM_CUST_ATTACHMENTS T WITH (NOLOCK) INNER JOIN idb.dbo.VWIDB_DOC_DATA T1 ON T.EmailMessageID = T1.EmailMessageID WHERE T1.IDB_OBJ_ID = 4511694] for document ID: 4511694
13:45:45.0872|taskFLOW|DEBUG >> ReplaceAllValues -> input AFTER replacing: [Select T.DocID,T.FULL_FILENAME,T.Doctype from TBPM_CUST_ATTACHMENTS T WITH (NOLOCK) INNER JOIN idb.dbo.VWIDB_DOC_DATA T1 ON T.EmailMessageID = T1.EmailMessageID WHERE T1.IDB_OBJ_ID = 4511694]
13:45:45.0872|DatabaseWithFallback|DEBUG >> GetDatatable -> ForceFallback is True, falling back to direct database access.
13:45:45.0872|DatabaseWithFallback|DEBUG >> GetDatatableFromDatabase -> Fetching data from database [ECM] with Connection Id [ECM]
13:45:45.0872|DatabaseWithFallback|DEBUG >> GetDatatableFromDatabase -> Retrieving Connection String from Connection Id [1]
13:45:45.0872|MSSQLServer|DEBUG >> Get_ConnectionStringforID -> Getting ConnectionString for ConnectionId [1]
13:45:45.0872|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=W2K19SRV398;Database=DD_ECM;User Id=EDMAdmin;Password=XXXXX;Application Name=DD_EDMIAppService;Workstation ID=W2K19SRV391;
13:45:45.0872|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction]
13:45:45.0872|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT * FROM TBDD_CONNECTION WHERE GUID = 1] and Parameters []
13:45:45.0872|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Data Source=w2k19srv398;Initial Catalog=DD_ECM;User ID=EDMAdmin;Password=XXXXX
13:45:45.0872|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction]
13:45:45.0872|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [Select T.DocID,T.FULL_FILENAME,T.Doctype from TBPM_CUST_ATTACHMENTS T WITH (NOLOCK) INNER JOIN idb.dbo.VWIDB_DOC_DATA T1 ON T.EmailMessageID = T1.EmailMessageID WHERE T1.IDB_OBJ_ID = 4511694] and Parameters []
13:45:45.5262|frmValidator|DEBUG >> Load_Additional_Searches -> Doc-Search 'Attachments': Keine Ergebnisse gefunden
13:45:45.5262|frmValidator|DEBUG >> Load_Additional_Searches -> Ergebnisprüfung abgeschlossen: AdditionalDataResultsExist=True, AdditionalDocResultsExist=False
13:45:45.5262|frmValidator|DEBUG >> Load_Additional_Searches -> rbnPgGroupAttmt.Visible gesetzt auf: True | Stack:
at taskFLOW.frmValidator.FillIndexValues(Boolean first, String SingleAttribute)
13:45:45.5262|frmValidator|DEBUG >> Load_Additional_Searches -> --- NORMAL-MODUS aktiviert (nur vorbereiten, NICHT Show) ---
13:45:45.5262|taskFLOW|DEBUG >> TabPreload -> === TabPreload START ===
13:45:45.5262|taskFLOW|DEBUG >> TabPreload -> Parameters: TabCountSQL=1, TabCountDoc=0, DTSQL.Rows=1, DTDOC.Rows=0
13:45:45.5262|taskFLOW|DEBUG >> TabPreload -> Ausführung auf UI-Thread
13:45:45.5262|taskFLOW|DEBUG >> TabPreload -> 🚫 Tab-Events deaktiviert
13:45:45.5262|taskFLOW|DEBUG >> TabPreload -> ✓ _DTDATASearches und _DTDocSearches zugewiesen: SQL=1, Doc=0
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> Panel1Collapsed (SQL)=False, Panel2Collapsed (Doc)=True
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> Konfiguriere SQL-Tabs: 1 Definitionen
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlSQL_SelectedPageChanged -> 🚫 XtraTabControlSQL_SelectedPageChanged unterdrückt (SelectedTabPageIndex=1)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlSQL_SelectedPageChanged -> 🚫 XtraTabControlSQL_SelectedPageChanged unterdrückt (SelectedTabPageIndex=2)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlSQL_SelectedPageChanged -> 🚫 XtraTabControlSQL_SelectedPageChanged unterdrückt (SelectedTabPageIndex=3)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlSQL_SelectedPageChanged -> 🚫 XtraTabControlSQL_SelectedPageChanged unterdrückt (SelectedTabPageIndex=4)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlSQL_SelectedPageChanged -> 🚫 XtraTabControlSQL_SelectedPageChanged unterdrückt (SelectedTabPageIndex=-1)
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> Alle 5 SQL-Tabs auf PageVisible=False gesetzt
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlSQL_SelectedPageChanged -> 🚫 XtraTabControlSQL_SelectedPageChanged unterdrückt (SelectedTabPageIndex=0)
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> SQL-Tab 0: Text='Inhalte ZUGFeRD-XML', PageVisible=True
13:45:45.5322|taskFLOW|INFO >> TabPreload -> ✓ 1 SQL-Tabs konfiguriert
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> Keine Doc-Daten, alle Tabs ausblenden
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlDocs_SelectedPageChanged_1 -> 🚫 XtraTabControlDocs_SelectedPageChanged unterdrückt (SelectedTabPageIndex=1)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlDocs_SelectedPageChanged_1 -> 🚫 XtraTabControlDocs_SelectedPageChanged unterdrückt (SelectedTabPageIndex=2)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlDocs_SelectedPageChanged_1 -> 🚫 XtraTabControlDocs_SelectedPageChanged unterdrückt (SelectedTabPageIndex=3)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlDocs_SelectedPageChanged_1 -> 🚫 XtraTabControlDocs_SelectedPageChanged unterdrückt (SelectedTabPageIndex=4)
13:45:45.5322|taskFLOW|DEBUG >> XtraTabControlDocs_SelectedPageChanged_1 -> 🚫 XtraTabControlDocs_SelectedPageChanged unterdrückt (SelectedTabPageIndex=-1)
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> ✓ Tab-Events reaktiviert
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> Setze SQL SelectedTabPageIndex manuell auf 0
13:45:45.5322|taskFLOW|DEBUG >> ReplaceAllValues -> input BEFORE replacing: [SELECT
SPEC_NAME [Definitions-Name],
ITEM_DESCRIPTION [Beschreibung],
CASE
WHEN SPEC_NAME = 'INVOICE_POSITION_NOTE' THEN
REPLACE(REPLACE(ITEM_VALUE, CHAR(13),' '),CHAR(10),' ')
ELSE
ITEM_VALUE
END [Inhalt xml],
GROUP_COUNTER [Gruppenzähler],
IS_REQUIRED [Pflichtangabe],
CREATEDWHEN [Erstellt]
FROM dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = (SELECT EmailMessageID FROM IDB.dbo.VWIDB_DOC_DATA WHERE IDB_OBJ_ID = {#IDBA#ObjectID})
ORDER BY GROUP_COUNTER, SPEC_NAME]
13:45:45.5322|taskFLOW|DEBUG >> ReplaceIDBAttributes -> Starting ReplaceIDBAttributes with input: [SELECT
SPEC_NAME [Definitions-Name],
ITEM_DESCRIPTION [Beschreibung],
CASE
WHEN SPEC_NAME = 'INVOICE_POSITION_NOTE' THEN
REPLACE(REPLACE(ITEM_VALUE, CHAR(13),' '),CHAR(10),' ')
ELSE
ITEM_VALUE
END [Inhalt xml],
GROUP_COUNTER [Gruppenzähler],
IS_REQUIRED [Pflichtangabe],
CREATEDWHEN [Erstellt]
FROM dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = (SELECT EmailMessageID FROM IDB.dbo.VWIDB_DOC_DATA WHERE IDB_OBJ_ID = {#IDBA#ObjectID})
ORDER BY GROUP_COUNTER, SPEC_NAME] for document ID: 4511694
13:45:45.5322|taskFLOW|DEBUG >> ReplaceIDBAttributes -> IS_SQL = True - oReplaceValue = [{#IDBA#ObjectID}]
13:45:45.5322|taskFLOW|DEBUG >> ReplaceIDBAttributes -> oIDBValue = 4511694
13:45:45.5322|taskFLOW|DEBUG >> ReplaceIDBAttributes -> sql after ReplaceIDBAttributes: SELECT
SPEC_NAME [Definitions-Name],
ITEM_DESCRIPTION [Beschreibung],
CASE
WHEN SPEC_NAME = 'INVOICE_POSITION_NOTE' THEN
REPLACE(REPLACE(ITEM_VALUE, CHAR(13),' '),CHAR(10),' ')
ELSE
ITEM_VALUE
END [Inhalt xml],
GROUP_COUNTER [Gruppenzähler],
IS_REQUIRED [Pflichtangabe],
CREATEDWHEN [Erstellt]
FROM dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = (SELECT EmailMessageID FROM IDB.dbo.VWIDB_DOC_DATA WHERE IDB_OBJ_ID = {#IDBA#ObjectID})
ORDER BY GROUP_COUNTER, SPEC_NAME
13:45:45.5322|taskFLOW|DEBUG >> ReplaceControlValues -> Starting ReplaceControlValues with input: [SELECT
SPEC_NAME [Definitions-Name],
ITEM_DESCRIPTION [Beschreibung],
CASE
WHEN SPEC_NAME = 'INVOICE_POSITION_NOTE' THEN
REPLACE(REPLACE(ITEM_VALUE, CHAR(13),' '),CHAR(10),' ')
ELSE
ITEM_VALUE
END [Inhalt xml],
GROUP_COUNTER [Gruppenzähler],
IS_REQUIRED [Pflichtangabe],
CREATEDWHEN [Erstellt]
FROM dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = (SELECT EmailMessageID FROM IDB.dbo.VWIDB_DOC_DATA WHERE IDB_OBJ_ID = 4511694)
ORDER BY GROUP_COUNTER, SPEC_NAME] for document ID: 4511694
13:45:45.5322|taskFLOW|DEBUG >> ReplaceAllValues -> input AFTER replacing: [SELECT
SPEC_NAME [Definitions-Name],
ITEM_DESCRIPTION [Beschreibung],
CASE
WHEN SPEC_NAME = 'INVOICE_POSITION_NOTE' THEN
REPLACE(REPLACE(ITEM_VALUE, CHAR(13),' '),CHAR(10),' ')
ELSE
ITEM_VALUE
END [Inhalt xml],
GROUP_COUNTER [Gruppenzähler],
IS_REQUIRED [Pflichtangabe],
CREATEDWHEN [Erstellt]
FROM dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = (SELECT EmailMessageID FROM IDB.dbo.VWIDB_DOC_DATA WHERE IDB_OBJ_ID = 4511694)
ORDER BY GROUP_COUNTER, SPEC_NAME]
13:45:45.5322|taskFLOW|DEBUG >> TabPreload -> SQL-Tab 0: erzwungener Initial-Refresh
13:45:45.5322|DatabaseWithFallback|DEBUG >> GetDatatable -> ForceFallback is True, falling back to direct database access.
13:45:45.5322|DatabaseWithFallback|DEBUG >> GetDatatableFromDatabase -> Fetching data from database [ECM] with Connection Id [ECM]
13:45:45.5322|DatabaseWithFallback|DEBUG >> GetDatatableFromDatabase -> Retrieving Connection String from Connection Id [1]
13:45:45.5322|MSSQLServer|DEBUG >> Get_ConnectionStringforID -> Getting ConnectionString for ConnectionId [1]
13:45:45.5322|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=W2K19SRV398;Database=DD_ECM;User Id=EDMAdmin;Password=XXXXX;Application Name=DD_EDMIAppService;Workstation ID=W2K19SRV391;
13:45:45.5322|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction]
13:45:45.5322|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT * FROM TBDD_CONNECTION WHERE GUID = 1] and Parameters []
13:45:45.5322|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Data Source=w2k19srv398;Initial Catalog=DD_ECM;User ID=EDMAdmin;Password=XXXXX
13:45:45.5322|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction]
13:45:45.5322|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT
SPEC_NAME [Definitions-Name],
ITEM_DESCRIPTION [Beschreibung],
CASE
WHEN SPEC_NAME = 'INVOICE_POSITION_NOTE' THEN
REPLACE(REPLACE(ITEM_VALUE, CHAR(13),' '),CHAR(10),' ')
ELSE
ITEM_VALUE
END [Inhalt xml],
GROUP_COUNTER [Gruppenzähler],
IS_REQUIRED [Pflichtangabe],
CREATEDWHEN [Erstellt]
FROM dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = (SELECT EmailMessageID FROM IDB.dbo.VWIDB_DOC_DATA WHERE IDB_OBJ_ID = 4511694)
ORDER BY GROUP_COUNTER, SPEC_NAME] and Parameters []
13:45:45.5832|taskFLOW|DEBUG >> TabPreload -> === TabPreload END ===