Compare commits
8 Commits
743ef3fe22
...
Release-Sp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb51396952 | ||
|
|
c464f24681 | ||
|
|
969e07eb17 | ||
|
|
7629d54fe1 | ||
|
|
41e46f9dbb | ||
|
|
a192267d96 | ||
|
|
a0d3a487d8 | ||
|
|
54744a0531 |
@@ -68,6 +68,18 @@ Public Class ClassControlCreator
|
||||
''' </summary>
|
||||
Public Property GridTables As New Dictionary(Of Integer, Dictionary(Of String, RepositoryItem))
|
||||
Public Property GridColumns As New Dictionary(Of Integer, DataTable)
|
||||
Private _globalLookupEventGuard As Boolean = False
|
||||
|
||||
Public Property GlobalLookupEventGuard As Boolean
|
||||
Get
|
||||
Return _globalLookupEventGuard
|
||||
End Get
|
||||
Set(value As Boolean)
|
||||
_globalLookupEventGuard = value
|
||||
Logger.Debug($"GlobalLookupEventGuard -> gesetzt auf [{value}]")
|
||||
End Set
|
||||
End Property
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Standard Eigenschaften für alle Controls
|
||||
@@ -533,12 +545,11 @@ Public Class ClassControlCreator
|
||||
End Function
|
||||
|
||||
Public Function CreateExistingGridControl(row As DataRow, DT_MY_COLUMNS As DataTable, designMode As Boolean, pcurrencySymbol As String) As GridControl
|
||||
Dim oGridControlCreator = New ControlCreator.GridControl(LogConfig, GridTables)
|
||||
Dim oGridControlCreator = New ControlCreator.GridControl(LogConfig, GridTables, pcurrencySymbol)
|
||||
Dim oControl As GridControl = CreateBaseControl(New GridControl(), row, designMode)
|
||||
Dim oControlId = DirectCast(oControl.Tag, ControlMetadata).Guid
|
||||
Dim oView As GridView
|
||||
Dim oControlName = oControl.Name
|
||||
|
||||
oControl.ForceInitialize()
|
||||
|
||||
oView = oControl.MainView
|
||||
@@ -635,9 +646,13 @@ Public Class ClassControlCreator
|
||||
End Try
|
||||
End If
|
||||
|
||||
oGridControlCreator.ConfigureViewColumns(DT_MY_COLUMNS, oView, oControl, pcurrencySymbol)
|
||||
' *** KORRIGIERT: ConfigureViewColumns OHNE currencySymbol-Parameter ***
|
||||
oGridControlCreator.ConfigureViewColumns(DT_MY_COLUMNS, oView, oControl)
|
||||
|
||||
' *** NEU: ConfigureViewColumnsCurrency() für editierbare Währungsspalten ***
|
||||
oGridControlCreator.ConfigureViewColumnsCurrency(DT_MY_COLUMNS, oView, oControl)
|
||||
|
||||
oGridControlCreator.ConfigureViewEvents(DT_MY_COLUMNS, oView, oControl, oControlId)
|
||||
' 08.11.2021: Fix editor being empty on first open
|
||||
oView.FocusInvalidRow()
|
||||
|
||||
Return oControl
|
||||
@@ -848,44 +863,239 @@ Public Class ClassControlCreator
|
||||
End Function
|
||||
|
||||
Public Sub GridTables_HandleControlValueChange(pControlPanel As XtraScrollableControl, pColumnsWithSqlAndControlPlaceholders As DataTable)
|
||||
If Not IsNothing(pColumnsWithSqlAndControlPlaceholders) AndAlso pColumnsWithSqlAndControlPlaceholders.Rows.Count > 0 Then
|
||||
For Each oRow As DataRow In pColumnsWithSqlAndControlPlaceholders.Rows
|
||||
If pColumnsWithSqlAndControlPlaceholders Is Nothing OrElse pColumnsWithSqlAndControlPlaceholders.Rows.Count = 0 Then
|
||||
Logger.Debug("No depending controls with SQL statements defined, skipping handling control value change.")
|
||||
Return
|
||||
End If
|
||||
|
||||
' ============================================================================
|
||||
' Schritt 1 - Sichere ALLE Lookup-Werte VOR SQL-Reload
|
||||
' ============================================================================
|
||||
Dim lookupBackups As New Dictionary(Of String, Object)
|
||||
|
||||
For Each oControl As Control In pControlPanel.Controls
|
||||
If TypeOf oControl Is LookupControl3 Then
|
||||
Try
|
||||
Dim oSqlStatement = oRow.ItemEx("SQL_COMMAND", String.Empty)
|
||||
Dim oConnectionId = oRow.ItemEx("CONNECTION_ID", -1)
|
||||
Dim oControlId = oRow.Item("CONTROL_ID")
|
||||
Dim oColumnName = oRow.Item("SPALTENNAME")
|
||||
Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")
|
||||
|
||||
If oSqlStatement <> String.Empty And oConnectionId > -1 Then
|
||||
oSqlStatement = clsPatterns.ReplaceAllValues(oSqlStatement, pControlPanel, True)
|
||||
|
||||
GridTables_CacheDatatableForColumn(oControlId, oColumnName, oSqlStatement, oConnectionId, oAdvancedLookup)
|
||||
|
||||
|
||||
' === Block to force setting the editor for GridColumns
|
||||
Logger.Debug("Force-setting Editor for all Gridcells..")
|
||||
For Each oControl As Control In pControlPanel.Controls
|
||||
Try
|
||||
Dim oMeta = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata)
|
||||
If oMeta.Guid = oControlId AndAlso TypeOf oControl Is GridControl Then
|
||||
Dim oGrid As GridControl = DirectCast(oControl, GridControl)
|
||||
DirectCast(oGrid.FocusedView, GridView).FocusInvalidRow()
|
||||
Logger.Debug("Force-setting Editor for Grid [{0}]", oGrid.Name)
|
||||
Exit For
|
||||
End If
|
||||
Catch ex As Exception
|
||||
Logger.Error(ex)
|
||||
End Try
|
||||
Next
|
||||
' === End
|
||||
|
||||
Dim lookup = DirectCast(oControl, LookupControl3)
|
||||
' Speichere den aktuellen EditValue (kann einzelner Wert oder Liste sein)
|
||||
If lookup.EditValue IsNot Nothing Then
|
||||
Dim controlName As String = lookup.Name
|
||||
lookupBackups(controlName) = lookup.EditValue
|
||||
Logger.Debug($"GridTables_HandleControlValueChange -> Backup für Lookup [{controlName}]: [{lookup.EditValue}]")
|
||||
End If
|
||||
Catch ex As Exception
|
||||
Logger.Error(ex)
|
||||
Logger.Info("Unexpected Error in Display SQL result for grid column: " & oRow.Item("CONTROL_ID") & " - ERROR: " & ex.Message)
|
||||
Logger.Error($"GridTables_HandleControlValueChange -> Fehler beim Backup von Lookup: {ex.Message}")
|
||||
End Try
|
||||
End If
|
||||
Next
|
||||
|
||||
' ============================================================================
|
||||
' Schritt 2 - Verarbeite Grid-Columns mit SQL-Abhängigkeiten
|
||||
' ============================================================================
|
||||
For Each oRow As DataRow In pColumnsWithSqlAndControlPlaceholders.Rows
|
||||
Try
|
||||
Dim oSqlStatement = oRow.ItemEx("SQL_COMMAND", String.Empty)
|
||||
Dim oConnectionId = oRow.ItemEx("CONNECTION_ID", -1)
|
||||
Dim oControlId = oRow.Item("CONTROL_ID")
|
||||
Dim oColumnName = oRow.Item("SPALTENNAME")
|
||||
Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")
|
||||
|
||||
If oSqlStatement <> String.Empty AndAlso oConnectionId > -1 Then
|
||||
oSqlStatement = clsPatterns.ReplaceAllValues(oSqlStatement, pControlPanel, True)
|
||||
GridTables_CacheDatatableForColumn(oControlId, oColumnName, oSqlStatement, oConnectionId, oAdvancedLookup)
|
||||
|
||||
' Force-setting Editor for GridColumns
|
||||
Logger.Debug("Force-setting Editor for all Gridcells..")
|
||||
For Each oControl As Control In pControlPanel.Controls
|
||||
Try
|
||||
If oControl.Tag IsNot Nothing AndAlso TypeOf oControl.Tag Is ControlMetadata Then
|
||||
Dim oMeta = DirectCast(oControl.Tag, ControlMetadata)
|
||||
If oMeta.Guid = oControlId AndAlso TypeOf oControl Is GridControl Then
|
||||
Dim oGrid As GridControl = DirectCast(oControl, GridControl)
|
||||
If oGrid.FocusedView IsNot Nothing AndAlso TypeOf oGrid.FocusedView Is GridView Then
|
||||
DirectCast(oGrid.FocusedView, GridView).FocusInvalidRow()
|
||||
Logger.Debug($"Force-setting Editor for Grid [{oGrid.Name}]")
|
||||
End If
|
||||
Exit For
|
||||
End If
|
||||
End If
|
||||
Catch ex As Exception
|
||||
Logger.Error($"GridTables_HandleControlValueChange -> Fehler beim Force-setting Editor: {ex.Message}")
|
||||
End Try
|
||||
Next
|
||||
End If
|
||||
Catch ex As Exception
|
||||
Logger.Error(ex)
|
||||
Logger.Info($"Unexpected Error in Display SQL result for grid column: {oRow.Item("CONTROL_ID")} - ERROR: {ex.Message}")
|
||||
End Try
|
||||
Next
|
||||
|
||||
' ============================================================================
|
||||
' Schritt 3 - Prüfe und restauriere Lookup-Werte mit SQL-Abhängigkeiten
|
||||
' ============================================================================
|
||||
If lookupBackups.Count > 0 Then
|
||||
Logger.Debug($"GridTables_HandleControlValueChange -> Prüfe {lookupBackups.Count} Lookups auf Wiederherstellung...")
|
||||
|
||||
For Each oControl As Control In pControlPanel.Controls
|
||||
If TypeOf oControl Is LookupControl3 Then
|
||||
Try
|
||||
Dim lookup = DirectCast(oControl, LookupControl3)
|
||||
Dim controlName As String = lookup.Name
|
||||
|
||||
' Wenn wir einen Backup für dieses Lookup haben
|
||||
If lookupBackups.ContainsKey(controlName) Then
|
||||
Dim oldValue = lookupBackups(controlName)
|
||||
|
||||
' Prüfe ob Lookup ein DataSource hat (könnte durch SQL neu geladen worden sein)
|
||||
If lookup.Properties.DataSource IsNot Nothing AndAlso TypeOf lookup.Properties.DataSource Is DataTable Then
|
||||
Dim currentDataSource = DirectCast(lookup.Properties.DataSource, DataTable)
|
||||
|
||||
' Wenn DataSource Rows hat, versuche Werte wiederherzustellen
|
||||
If currentDataSource.Rows.Count > 0 Then
|
||||
RestoreLookupValues(lookup, oldValue, currentDataSource, controlName)
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
|
||||
Catch ex As Exception
|
||||
Logger.Error($"GridTables_HandleControlValueChange -> Fehler beim Prüfen von Lookup: {ex.Message}")
|
||||
Logger.Error(ex)
|
||||
End Try
|
||||
End If
|
||||
Next
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub RestoreLookupValues(lookup As LookupControl3, oldValue As Object,
|
||||
newDataSource As DataTable, controlName As String)
|
||||
If lookup Is Nothing OrElse oldValue Is Nothing OrElse newDataSource Is Nothing Then
|
||||
Logger.Warn($"RestoreLookupValues -> [{controlName}] Ungültige Parameter")
|
||||
Return
|
||||
End If
|
||||
|
||||
Try
|
||||
' Bestimme ValueColumn
|
||||
Dim valueColumn As String = String.Empty
|
||||
If String.IsNullOrEmpty(lookup.Properties.ValueMember) AndAlso newDataSource.Columns.Count > 0 Then
|
||||
valueColumn = newDataSource.Columns(0).ColumnName
|
||||
ElseIf Not String.IsNullOrEmpty(lookup.Properties.ValueMember) Then
|
||||
valueColumn = lookup.Properties.ValueMember
|
||||
Else
|
||||
Logger.Warn($"RestoreLookupValues -> [{controlName}] Keine ValueColumn verfügbar")
|
||||
Return
|
||||
End If
|
||||
|
||||
' Build HashSet für effiziente Suche
|
||||
Dim availableValues As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
|
||||
For Each row As DataRow In newDataSource.Rows
|
||||
If Not IsDBNull(row(valueColumn)) Then
|
||||
availableValues.Add(row(valueColumn).ToString())
|
||||
End If
|
||||
Next
|
||||
|
||||
' Prüfe ob der alte Wert noch in der neuen DataSource existiert
|
||||
Dim validValue As Object = Nothing
|
||||
|
||||
' Behandle verschiedene Datentypen (String, List, Array, etc.)
|
||||
If TypeOf oldValue Is String Then
|
||||
Dim valueStr As String = oldValue.ToString()
|
||||
If availableValues.Contains(valueStr) Then
|
||||
validValue = oldValue
|
||||
Logger.Debug($"RestoreLookupValues -> [{controlName}] Wert [{valueStr}] ✓ gefunden")
|
||||
Else
|
||||
Logger.Warn($"RestoreLookupValues -> [{controlName}] Wert [{valueStr}] ✗ nicht mehr vorhanden")
|
||||
End If
|
||||
ElseIf TypeOf oldValue Is IEnumerable Then
|
||||
' Behandle Listen/Arrays
|
||||
Dim validValues As New List(Of Object)
|
||||
For Each item As Object In DirectCast(oldValue, IEnumerable)
|
||||
If item IsNot Nothing Then
|
||||
Dim itemStr As String = item.ToString()
|
||||
If availableValues.Contains(itemStr) Then
|
||||
validValues.Add(item)
|
||||
Logger.Debug($"RestoreLookupValues -> [{controlName}] Wert [{itemStr}] ✓ gefunden")
|
||||
Else
|
||||
Logger.Warn($"RestoreLookupValues -> [{controlName}] Wert [{itemStr}] ✗ nicht mehr vorhanden")
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
|
||||
If validValues.Count > 0 Then
|
||||
validValue = validValues
|
||||
End If
|
||||
Else
|
||||
' Fallback für andere Typen
|
||||
Dim valueStr As String = oldValue.ToString()
|
||||
If availableValues.Contains(valueStr) Then
|
||||
validValue = oldValue
|
||||
Logger.Debug($"RestoreLookupValues -> [{controlName}] Wert [{valueStr}] ✓ gefunden")
|
||||
Else
|
||||
Logger.Warn($"RestoreLookupValues -> [{controlName}] Wert [{valueStr}] ✗ nicht mehr vorhanden")
|
||||
End If
|
||||
End If
|
||||
|
||||
' Gültige Werte wiederherstellen
|
||||
If validValue IsNot Nothing Then
|
||||
' Event-Guard temporär aktivieren um Endlosschleifen zu vermeiden
|
||||
Dim oldGuard As Boolean = GlobalLookupEventGuard
|
||||
GlobalLookupEventGuard = True
|
||||
|
||||
Try
|
||||
' Prüfe ob bereits korrekt gesetzt
|
||||
Dim currentValue = lookup.EditValue
|
||||
If currentValue IsNot Nothing AndAlso currentValue.Equals(validValue) Then
|
||||
Logger.Debug($"RestoreLookupValues -> [{controlName}] Wert bereits korrekt gesetzt")
|
||||
Return
|
||||
End If
|
||||
|
||||
' Setze den Wert neu
|
||||
lookup.EditValue = Nothing
|
||||
Application.DoEvents()
|
||||
|
||||
lookup.EditValue = validValue
|
||||
lookup.Refresh()
|
||||
Application.DoEvents()
|
||||
|
||||
' Validierung
|
||||
Dim newValue = lookup.EditValue
|
||||
If newValue IsNot Nothing AndAlso newValue.Equals(validValue) Then
|
||||
Logger.Debug($"RestoreLookupValues -> [{controlName}] ✓ erfolgreich wiederhergestellt: [{validValue}]")
|
||||
Else
|
||||
Logger.Error($"RestoreLookupValues -> [{controlName}] ✗ Fehler beim Wiederherstellen! Erwartet: [{validValue}], Ist: [{If(newValue, "NULL")}]")
|
||||
|
||||
' Retry mit BeginUpdate/EndUpdate
|
||||
Logger.Debug($"RestoreLookupValues -> [{controlName}] Versuche alternative Methode mit BeginUpdate...")
|
||||
lookup.Properties.BeginUpdate()
|
||||
Try
|
||||
lookup.EditValue = Nothing
|
||||
Application.DoEvents()
|
||||
lookup.EditValue = validValue
|
||||
Finally
|
||||
lookup.Properties.EndUpdate()
|
||||
End Try
|
||||
|
||||
lookup.Refresh()
|
||||
Application.DoEvents()
|
||||
|
||||
Dim retryValue = lookup.EditValue
|
||||
If retryValue IsNot Nothing AndAlso retryValue.Equals(validValue) Then
|
||||
Logger.Debug($"RestoreLookupValues -> [{controlName}] ✓ Alternative Methode erfolgreich")
|
||||
Else
|
||||
Logger.Error($"RestoreLookupValues -> [{controlName}] ✗ Auch alternative Methode fehlgeschlagen!")
|
||||
End If
|
||||
End If
|
||||
|
||||
Finally
|
||||
' Event-Guard wiederherstellen
|
||||
GlobalLookupEventGuard = oldGuard
|
||||
End Try
|
||||
Else
|
||||
Logger.Info($"RestoreLookupValues -> [{controlName}] Keine gültigen Werte zum Wiederherstellen")
|
||||
End If
|
||||
|
||||
Catch ex As Exception
|
||||
Logger.Error($"RestoreLookupValues -> Fehler bei [{controlName}]: {ex.Message}")
|
||||
Logger.Error(ex)
|
||||
End Try
|
||||
End Sub
|
||||
End Class
|
||||
|
||||
@@ -28,6 +28,99 @@ Public Class ClassFormat
|
||||
|
||||
End Select
|
||||
End Function
|
||||
''' <summary>
|
||||
''' Normalisiert einen numerischen String für die invariante Kultur-Konvertierung.
|
||||
''' Entfernt Tausendertrennzeichen und ersetzt Dezimaltrennzeichen durch Punkt.
|
||||
''' </summary>
|
||||
Private Shared Function NormalizeNumericString(pValue As String) As String
|
||||
If String.IsNullOrWhiteSpace(pValue) Then
|
||||
Return pValue
|
||||
End If
|
||||
|
||||
Dim normalized As String = pValue.Trim()
|
||||
|
||||
LOGGER.Debug($"[NormalizeNumericString] Input: [{pValue}]")
|
||||
|
||||
' Entferne Währungssymbole und Leerzeichen
|
||||
normalized = System.Text.RegularExpressions.Regex.Replace(normalized, "[€$£¥\s]", "")
|
||||
|
||||
Dim hasDot As Boolean = normalized.Contains(".")
|
||||
Dim hasComma As Boolean = normalized.Contains(",")
|
||||
|
||||
LOGGER.Debug($"[NormalizeNumericString] After cleanup: [{normalized}], HasDot={hasDot}, HasComma={hasComma}")
|
||||
|
||||
If hasDot AndAlso hasComma Then
|
||||
' Beide vorhanden: Das letzte ist der Dezimaltrenner
|
||||
Dim lastDotPos As Integer = normalized.LastIndexOf(".")
|
||||
Dim lastCommaPos As Integer = normalized.LastIndexOf(",")
|
||||
|
||||
LOGGER.Debug($"[NormalizeNumericString] Both separators found: LastDotPos={lastDotPos}, LastCommaPos={lastCommaPos}")
|
||||
|
||||
If lastDotPos > lastCommaPos Then
|
||||
normalized = normalized.Replace(",", "")
|
||||
Else
|
||||
normalized = normalized.Replace(".", "").Replace(",", ".")
|
||||
End If
|
||||
|
||||
ElseIf hasComma Then
|
||||
Dim commaCount As Integer = normalized.Count(Function(c) c = ","c)
|
||||
LOGGER.Debug($"[NormalizeNumericString] Only comma found: CommaCount={commaCount}")
|
||||
|
||||
If commaCount = 1 Then
|
||||
Dim lastCommaPos As Integer = normalized.LastIndexOf(",")
|
||||
Dim digitsAfterComma As Integer = normalized.Length - lastCommaPos - 1
|
||||
LOGGER.Debug($"[NormalizeNumericString] Single comma: DigitsAfterComma={digitsAfterComma}")
|
||||
|
||||
If digitsAfterComma <= 3 Then
|
||||
normalized = normalized.Replace(",", ".")
|
||||
Else
|
||||
normalized = normalized.Replace(",", "")
|
||||
End If
|
||||
Else
|
||||
normalized = normalized.Replace(",", "")
|
||||
End If
|
||||
|
||||
ElseIf hasDot Then
|
||||
Dim dotCount As Integer = normalized.Count(Function(c) c = "."c)
|
||||
LOGGER.Debug($"[NormalizeNumericString] Only dot found: DotCount={dotCount}")
|
||||
|
||||
If dotCount = 1 Then
|
||||
Dim lastDotPos As Integer = normalized.LastIndexOf(".")
|
||||
Dim digitsAfterDot As Integer = normalized.Length - lastDotPos - 1
|
||||
|
||||
LOGGER.Debug($"[NormalizeNumericString] Single dot: DigitsAfterDot={digitsAfterDot}")
|
||||
|
||||
' ✅ KRITISCHE ÄNDERUNG: Prüfe auch Stellen VOR dem Punkt
|
||||
Dim digitsBeforeDot As Integer = lastDotPos
|
||||
|
||||
' Heuristik: Wenn <= 3 Stellen nach Punkt UND >= 1 Stelle davor → Dezimaltrenner
|
||||
' Wenn > 3 Stellen davor UND <= 3 Stellen nach Punkt → unklar, vermutlich Dezimal
|
||||
' Wenn > 3 Stellen nach Punkt → definitiv KEIN Dezimaltrenner
|
||||
|
||||
If digitsAfterDot > 3 Then
|
||||
LOGGER.Warn($"⚠️ [NormalizeNumericString] Dot with {digitsAfterDot} digits after → treating as THOUSAND separator!")
|
||||
normalized = normalized.Replace(".", "")
|
||||
ElseIf digitsAfterDot >= 1 AndAlso digitsAfterDot <= 3 Then
|
||||
' Wahrscheinlich Dezimaltrenner (z.B. 5464.17 oder 120.5)
|
||||
LOGGER.Debug($"[NormalizeNumericString] Dot treated as decimal separator ({digitsBeforeDot} digits before, {digitsAfterDot} after)")
|
||||
Else
|
||||
' digitsAfterDot = 0 → Punkt am Ende, vermutlich Fehler
|
||||
LOGGER.Warn($"⚠️ [NormalizeNumericString] Dot at end of string → removing")
|
||||
normalized = normalized.Replace(".", "")
|
||||
End If
|
||||
Else
|
||||
' Mehrere Punkte → Tausendertrenner
|
||||
LOGGER.Debug($"[NormalizeNumericString] Multiple dots → removing all")
|
||||
normalized = normalized.Replace(".", "")
|
||||
End If
|
||||
Else
|
||||
LOGGER.Debug($"[NormalizeNumericString] No separators found → integer or already normalized")
|
||||
End If
|
||||
|
||||
LOGGER.Debug($"[NormalizeNumericString] Output: [{normalized}]")
|
||||
|
||||
Return normalized
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Converts a string according to the type information, using the invariant culture
|
||||
@@ -41,25 +134,40 @@ Public Class ClassFormat
|
||||
|
||||
Select Case pType
|
||||
Case ClassControlCreator.CONTROL_TYPE_DOUBLE
|
||||
If Double.TryParse(pValue, NumberStyles.Float, CultureInfo.InvariantCulture, oConvertedValue) Then
|
||||
Return oConvertedValue
|
||||
End If
|
||||
|
||||
Case ClassControlCreator.CONTROL_TYPE_CURRENCY
|
||||
Try
|
||||
LOGGER.Debug($"GetConvertedValue: Converting {pValue.ToString} to Currency ")
|
||||
If Double.TryParse(pValue, NumberStyles.Currency, CultureInfo.InvariantCulture, oConvertedValue) Then
|
||||
' ✅ IMMER normalisieren – auch für DB-Werte!
|
||||
Dim normalizedValue As String = NormalizeNumericString(pValue?.ToString())
|
||||
If Double.TryParse(normalizedValue, NumberStyles.Float, CultureInfo.InvariantCulture, oConvertedValue) Then
|
||||
Return oConvertedValue
|
||||
End If
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
End Try
|
||||
|
||||
Case ClassControlCreator.CONTROL_TYPE_CURRENCY
|
||||
Try
|
||||
' ✅ KRITISCH: Normalisierung VOR Konvertierung
|
||||
Dim normalizedValue As String = NormalizeNumericString(pValue?.ToString())
|
||||
LOGGER.Debug($"GetConvertedValue CURRENCY: Original=[{pValue}], Normalized=[{normalizedValue}]")
|
||||
|
||||
If Double.TryParse(normalizedValue, NumberStyles.Float, CultureInfo.InvariantCulture, oConvertedValue) Then
|
||||
Return oConvertedValue
|
||||
End If
|
||||
Catch ex As Exception
|
||||
LOGGER.Error($"Currency conversion failed for [{pValue}]: {ex.Message}")
|
||||
LOGGER.Error(ex)
|
||||
End Try
|
||||
|
||||
Case ClassControlCreator.CONTROL_TYPE_INTEGER
|
||||
If Integer.TryParse(pValue, NumberStyles.Integer, CultureInfo.InvariantCulture, oConvertedValue) Then
|
||||
Return oConvertedValue
|
||||
End If
|
||||
Try
|
||||
Dim normalizedValue As String = NormalizeNumericString(pValue?.ToString())
|
||||
If Integer.TryParse(normalizedValue, NumberStyles.Integer, CultureInfo.InvariantCulture, oConvertedValue) Then
|
||||
Return oConvertedValue
|
||||
End If
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
End Try
|
||||
|
||||
Case Else
|
||||
LOGGER.Debug($"GetConvertedValue - Case ELSE - pType is {pType}")
|
||||
Try
|
||||
@@ -68,7 +176,6 @@ Public Class ClassFormat
|
||||
LOGGER.Warn($"Error in GetConvertedValue: pType is {pType} - converting value to String")
|
||||
oConvertedValue = ""
|
||||
End Try
|
||||
|
||||
End Select
|
||||
|
||||
Return oConvertedValue
|
||||
@@ -76,26 +183,32 @@ Public Class ClassFormat
|
||||
|
||||
''' <summary>
|
||||
''' Converts values to their respective data type and then back to string
|
||||
''' according to the current culture
|
||||
''' using INVARIANT culture for consistency across systems.
|
||||
''' </summary>
|
||||
''' <param name="pValue"></param>
|
||||
''' <returns></returns>
|
||||
Public Shared Function GetStringValue(pValue As Object) As String
|
||||
' ✅ FIX: Immer InvariantCulture verwenden für DB-Speicherung
|
||||
Select Case pValue.GetType
|
||||
Case GetType(Single)
|
||||
Return DirectCast(pValue, Single).ToString(CultureInfo.CurrentCulture)
|
||||
' ✅ NEU: InvariantCulture statt CurrentCulture
|
||||
Return DirectCast(pValue, Single).ToString(CultureInfo.InvariantCulture)
|
||||
|
||||
Case GetType(Double)
|
||||
Return DirectCast(pValue, Double).ToString(CultureInfo.CurrentCulture)
|
||||
' ✅ NEU: InvariantCulture statt CurrentCulture
|
||||
Return DirectCast(pValue, Double).ToString(CultureInfo.InvariantCulture)
|
||||
|
||||
Case GetType(Decimal)
|
||||
Return DirectCast(pValue, Decimal).ToString(CultureInfo.CurrentCulture)
|
||||
' ✅ NEU: InvariantCulture statt CurrentCulture
|
||||
Return DirectCast(pValue, Decimal).ToString(CultureInfo.InvariantCulture)
|
||||
|
||||
Case GetType(Date)
|
||||
Return DirectCast(pValue, Date).ToString(CultureInfo.CurrentCulture)
|
||||
' Datum: ISO 8601 Format für Culture-Unabhängigkeit
|
||||
Return DirectCast(pValue, Date).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)
|
||||
|
||||
Case GetType(DateTime)
|
||||
Return DirectCast(pValue, DateTime).ToString(CultureInfo.CurrentCulture)
|
||||
' DateTime: ISO 8601 Format
|
||||
Return DirectCast(pValue, DateTime).ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)
|
||||
|
||||
Case Else
|
||||
Return pValue.ToString
|
||||
|
||||
@@ -1,5 +1,75 @@
|
||||
Public Class ClassIDBData
|
||||
Public DTVWIDB_BE_ATTRIBUTE As DataTable
|
||||
Public IDBSystemIndices As List(Of String)
|
||||
''' <summary>
|
||||
''' Wenn True, werden SQL-Statements nicht sofort ausgeführt,
|
||||
''' sondern in <see cref="_sqlBatch"/> gesammelt.
|
||||
''' </summary>
|
||||
Public Property BatchMode As Boolean = False
|
||||
Private _sqlBatch As New List(Of String)
|
||||
|
||||
''' <summary>
|
||||
''' Startet den Batch-Sammelmodus.
|
||||
''' </summary>
|
||||
Public Sub BeginBatch()
|
||||
_sqlBatch.Clear()
|
||||
BatchMode = True
|
||||
End Sub
|
||||
''' <summary>
|
||||
''' Führt alle gesammelten SQL-Statements als einen einzigen String
|
||||
''' an ExecuteNonQueryIDB weiter. Jeder Block wird in BEGIN...END
|
||||
''' gekapselt, damit DECLARE-Variablen nicht kollidieren.
|
||||
''' </summary>
|
||||
''' <returns>True wenn erfolgreich</returns>
|
||||
Public Function CommitBatch() As Boolean
|
||||
BatchMode = False
|
||||
If _sqlBatch.Count = 0 Then Return True
|
||||
Try
|
||||
Dim oStatements = _sqlBatch.
|
||||
Where(Function(s) Not String.IsNullOrWhiteSpace(s)).
|
||||
ToList()
|
||||
|
||||
' @NEW_OBJ_MD_ID pro Statement eindeutig umbenennen → kein Namenskonflikt im Batch
|
||||
Dim oNumberedStatements As New List(Of String)
|
||||
Dim oIndex As Integer = 0
|
||||
For Each oStatement As String In oStatements
|
||||
Dim oNumbered = oStatement.Replace("@NEW_OBJ_MD_ID", $"@NEW_OBJ_MD_ID_{oIndex}")
|
||||
oNumberedStatements.Add(oNumbered)
|
||||
oIndex += 1
|
||||
Next
|
||||
|
||||
Dim oBatchSQL = String.Join(vbNewLine, oNumberedStatements)
|
||||
LOGGER.Debug($"⚡ CommitBatch - Executing {oStatements.Count} statements as one batch:{vbNewLine}{oBatchSQL}")
|
||||
Dim oResult = DatabaseFallback.ExecuteNonQueryIDB(oBatchSQL)
|
||||
_sqlBatch.Clear()
|
||||
Return oResult
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
_sqlBatch.Clear()
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Verwirft alle gesammelten Statements ohne Ausführung.
|
||||
''' </summary>
|
||||
Public Sub RollbackBatch()
|
||||
_sqlBatch.Clear()
|
||||
BatchMode = False
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Führt ein SQL-Statement aus – sofort oder gesammelt je nach BatchMode.
|
||||
''' </summary>
|
||||
Private Function ExecuteOrQueue(oSQL As String) As Boolean
|
||||
If BatchMode Then
|
||||
_sqlBatch.Add(oSQL)
|
||||
LOGGER.Debug($"BatchMode - Queued statement: {oSQL}")
|
||||
Return True
|
||||
Else
|
||||
Return DatabaseFallback.ExecuteNonQueryIDB(oSQL)
|
||||
End If
|
||||
End Function
|
||||
''' <summary>
|
||||
''' Gets all indices by BusinessEntity.
|
||||
''' </summary>
|
||||
@@ -7,15 +77,16 @@
|
||||
''' <returns>Array with all Indices</returns>
|
||||
''' <remarks></remarks>
|
||||
'''
|
||||
Public Function Init()
|
||||
Public Function Init() As Boolean
|
||||
Dim oSQL = $"SELECT DISTINCT ATTR_TITLE, TYP_ID, TYP_ID as [TYPE_ID] FROM VWIDB_BE_ATTRIBUTE WHERE SYS_ATTRIBUTE = 0 ORDER BY ATTR_TITLE"
|
||||
DTVWIDB_BE_ATTRIBUTE = DatabaseFallback.GetDatatableIDB(oSQL)
|
||||
If IsNothing(DTVWIDB_BE_ATTRIBUTE) Then
|
||||
oSQL = $"SELECT DISTINCT ATTR_TITLE, TYP_ID, TYP_ID as [TYPE_ID] FROM VWIDB_BE_ATTRIBUTE ORDER BY ATTR_TITLE "
|
||||
DTVWIDB_BE_ATTRIBUTE = DatabaseFallback.GetDatatableIDB(oSQL)
|
||||
End If
|
||||
Return True
|
||||
End Function
|
||||
Public IDBSystemIndices As List(Of String)
|
||||
|
||||
Public Function GetIndicesByBE(ByVal BusinessEntity As String) As String()
|
||||
Try
|
||||
Dim aNames(4) As String
|
||||
@@ -118,7 +189,7 @@
|
||||
LOGGER.Debug($"oAttributeValue for Attribute [{oAttributeName}] is so far nothing..Now trying FNIDB_PM_GET_VARIABLE_VALUE ")
|
||||
End If
|
||||
Dim oFNSQL = $"SELECT * FROM [dbo].[FNIDB_PM_GET_VARIABLE_VALUE] ({CURRENT_DOC_ID},'{oAttributeName}','{USER_LANGUAGE}',CONVERT(BIT,'{IDB_USES_WMFILESTORE}'))"
|
||||
LOGGER.Debug($"GetVariableValue: {oFNSQL}")
|
||||
LOGGER.Debug($": {oFNSQL}")
|
||||
oAttributeValue = DatabaseFallback.GetDatatableIDB(oFNSQL)
|
||||
Dim odt As DataTable = oAttributeValue
|
||||
If odt.Rows.Count = 1 Then
|
||||
@@ -138,10 +209,11 @@
|
||||
If IDB_USES_WMFILESTORE Then
|
||||
oID_IS_FOREIGN = 1
|
||||
End If
|
||||
|
||||
Dim oDELSQL = $"EXEC PRIDB_DELETE_TERM_OBJECT_METADATA {CURRENT_DOC_ID},'{oAttributeName}','{oTerm2Delete}','{USER_USERNAME}','{USER_LANGUAGE}',{oID_IS_FOREIGN}"
|
||||
DatabaseFallback.ExecuteNonQueryIDB(oDELSQL)
|
||||
|
||||
oTerm2Delete = oTerm2Delete.Replace("'", "''")
|
||||
Dim oDELSQL = $"EXEC PRIDB_DELETE_TERM_OBJECT_METADATA {CURRENT_DOC_ID},'{oAttributeName}','{oTerm2Delete}','{USER_USERNAME}','{USER_LANGUAGE}',{oID_IS_FOREIGN};"
|
||||
LOGGER.Debug($"Delete_Term_Object_From_Metadata: {oDELSQL}")
|
||||
'DatabaseFallback.ExecuteNonQueryIDB(oDELSQL)
|
||||
Return ExecuteOrQueue(oDELSQL)
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
Return Nothing
|
||||
@@ -150,9 +222,10 @@
|
||||
End Function
|
||||
Public Function Delete_AttributeData(pIDB_OBJID As Int64, pAttributeName As String) As Object
|
||||
Try
|
||||
Dim oDELSQL = $"EXEC PRIDB_DELETE_ATTRIBUTE_DATA {pIDB_OBJID},'{pAttributeName}','{USER_USERNAME}'"
|
||||
DatabaseFallback.ExecuteNonQueryIDB(oDELSQL)
|
||||
|
||||
Dim oDELSQL = $"EXEC PRIDB_DELETE_ATTRIBUTE_DATA {pIDB_OBJID},'{pAttributeName}','{USER_USERNAME}';"
|
||||
LOGGER.Debug($"Delete_Attribute_Data: {oDELSQL}")
|
||||
' DatabaseFallback.ExecuteNonQueryIDB(oDELSQL)
|
||||
Return ExecuteOrQueue(oDELSQL)
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
Return Nothing
|
||||
@@ -162,18 +235,23 @@
|
||||
|
||||
Public Function SetVariableValue(oAttributeName As String, oNewValue As Object, Optional CheckDeleted As Boolean = False, Optional oIDBTyp As Integer = 0)
|
||||
Try
|
||||
Dim omsg = $"IDBData - SetVariableValue - Attribute: [{oAttributeName}] - NewValue: [{oNewValue}] - CheckDeleted: [{CheckDeleted.ToString}] - oIDBTyp: [{oIDBTyp}]"
|
||||
LOGGER.Debug(omsg)
|
||||
Dim omytype = oNewValue.GetType.ToString
|
||||
If omytype = "System.Data.DataTable" Then
|
||||
Dim oDTMyNewValues As DataTable = oNewValue
|
||||
Dim oOldAttributeResult
|
||||
Dim oAttributeResultFromDB
|
||||
Dim oTypeOldResult
|
||||
' Für DataTable (Mehrfachauswahl/Vektor) IMMER auf gelöschte Werte prüfen,
|
||||
' unabhängig vom übergebenen CheckDeleted-Parameter.
|
||||
Dim oEffectiveCheckDeleted As Boolean = True
|
||||
|
||||
If CheckDeleted = True Then
|
||||
oOldAttributeResult = GetVariableValue(oAttributeName, oIDBTyp)
|
||||
oTypeOldResult = oOldAttributeResult.GetType.ToString
|
||||
If oTypeOldResult = "System.Data.DataTable" Then
|
||||
Dim myOldValues As DataTable = oOldAttributeResult
|
||||
If myOldValues.Rows.Count > 1 Then
|
||||
If oEffectiveCheckDeleted = True Then
|
||||
oAttributeResultFromDB = GetVariableValue(oAttributeName, oIDBTyp)
|
||||
oTypeOldResult = oAttributeResultFromDB.GetType.ToString
|
||||
If TypeOf oAttributeResultFromDB Is DataTable Then
|
||||
Dim myOldValues As DataTable = oAttributeResultFromDB
|
||||
If myOldValues.Rows.Count >= 1 Then
|
||||
|
||||
'now Checking whether the old row still remains in Vector? If not it will be deleted as it cannot be replaced in multivalues
|
||||
For Each oOldValueRow As DataRow In myOldValues.Rows
|
||||
@@ -199,27 +277,26 @@
|
||||
'### Old Value is a single value ###
|
||||
If oDTMyNewValues.Rows.Count > 1 Then
|
||||
'### there is more than one new value ###
|
||||
Dim oExists As Boolean
|
||||
Dim oExists As Boolean = False
|
||||
For Each oNewValueRow As DataRow In oDTMyNewValues.Rows
|
||||
oExists = False
|
||||
Dim oInfo1 = $"Checking oldValue[{oOldAttributeResult}] vs NewValue [{oNewValueRow.Item(1)}]"
|
||||
If oNewValueRow.Item(1).ToString.ToUpper = oOldAttributeResult.ToString.ToUpper Then
|
||||
LOGGER.Debug($"Checking oldValue[{oAttributeResultFromDB}] vs NewValue [{oNewValueRow.Item(1)}]")
|
||||
If oNewValueRow.Item(1).ToString.ToUpper = oAttributeResultFromDB.ToString.ToUpper Then
|
||||
oExists = True
|
||||
Exit For ' ← sobald gefunden, abbrechen
|
||||
End If
|
||||
Next
|
||||
If oExists = False Then
|
||||
Dim oInfo2 = $"Value [{oOldAttributeResult}] no longer existing in Vector-Attribute [{oAttributeName}] - will be deleted!"
|
||||
LOGGER.Debug(oInfo2)
|
||||
LOGGER.Debug($"Value [{oAttributeResultFromDB}] no longer existing in Attribute [{oAttributeName}] - will be deleted!")
|
||||
'SetVariableValue(CURRENT_PROFILE_LOG_INDEX, oInfo2)
|
||||
Delete_Term_Object_From_Metadata(oAttributeName, oOldAttributeResult)
|
||||
Delete_Term_Object_From_Metadata(oAttributeName, oAttributeResultFromDB)
|
||||
End If
|
||||
Else
|
||||
'### there is only ONE new value ###
|
||||
If oDTMyNewValues.Rows(0).Item(1) <> oOldAttributeResult Then
|
||||
Dim oInfo = $"Value [{oOldAttributeResult}] of Attribute [{oAttributeName}] obviously was updated during runtime - will be deleted!"
|
||||
If oDTMyNewValues.Rows(0).Item(1) <> oAttributeResultFromDB Then
|
||||
Dim oInfo = $"Value [{oAttributeResultFromDB}] of Attribute [{oAttributeName}] obviously was updated during runtime - will be deleted!"
|
||||
LOGGER.Debug(oInfo)
|
||||
SetVariableValue(CURRENT_PROFILE_LOG_INDEX, oInfo)
|
||||
Delete_Term_Object_From_Metadata(oAttributeName, oOldAttributeResult)
|
||||
Delete_Term_Object_From_Metadata(oAttributeName, oAttributeResultFromDB)
|
||||
Else
|
||||
LOGGER.Debug($"Attributvalue of [{oAttributeName}] did not change!")
|
||||
End If
|
||||
@@ -231,22 +308,25 @@
|
||||
End If
|
||||
|
||||
For Each oNewValueRow As DataRow In oDTMyNewValues.Rows
|
||||
Dim oSuccess As Boolean = False
|
||||
'Dim oSuccess As Boolean = False
|
||||
Dim oVALUE = oNewValueRow.Item(1).ToString
|
||||
oVALUE = oVALUE.Replace("'", "''")
|
||||
Dim oPRSQL = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oVALUE}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT"
|
||||
Dim oPRSQL = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oVALUE}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT;"
|
||||
LOGGER.Debug(oPRSQL)
|
||||
oSuccess = DatabaseFallback.ExecuteNonQueryIDB(oPRSQL)
|
||||
If oSuccess = False Then
|
||||
Return False
|
||||
End If
|
||||
'oSuccess = DatabaseFallback.ExecuteNonQueryIDB(oPRSQL)
|
||||
If Not ExecuteOrQueue(oPRSQL) Then Return False
|
||||
'If oSuccess = False Then
|
||||
' Return False
|
||||
'End If
|
||||
Next
|
||||
Return True
|
||||
Else
|
||||
'oNewValue = oNewValue.Replace("'", "' + NCHAR(39) + '")
|
||||
Dim oFNSQL = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oNewValue}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT"
|
||||
LOGGER.Debug(oFNSQL)
|
||||
Return DatabaseFallback.ExecuteNonQueryIDB(oFNSQL)
|
||||
oNewValue = oNewValue.Replace("'", "''")
|
||||
Dim oPRIDB_NEW_OBJ_DATA = $"DECLARE @NEW_OBJ_MD_ID BIGINT " & vbNewLine & $"EXEC PRIDB_NEW_OBJ_DATA {CURRENT_DOC_ID},'{oAttributeName}','{USER_USERNAME}','{oNewValue}','{USER_LANGUAGE}',0,@OMD_ID = @NEW_OBJ_MD_ID OUTPUT;"
|
||||
LOGGER.Debug(oPRIDB_NEW_OBJ_DATA)
|
||||
' Return DatabaseFallback.ExecuteNonQueryIDB(oPRIDB_NEW_OBJ_DATA)
|
||||
Return ExecuteOrQueue(oPRIDB_NEW_OBJ_DATA)
|
||||
End If
|
||||
|
||||
Catch ex As Exception
|
||||
|
||||
@@ -25,13 +25,93 @@ Namespace ControlCreator
|
||||
|
||||
Private newRowModified As Boolean
|
||||
Private isApplyingInheritedValue As Boolean
|
||||
Private _FormulaColumnNames As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
|
||||
Private _FormulaSqlColumns As New Dictionary(Of String, FormulaSqlDefinition)(StringComparer.OrdinalIgnoreCase)
|
||||
|
||||
Public Sub New(pLogConfig As LogConfig, pGridTables As Dictionary(Of Integer, Dictionary(Of String, RepositoryItem)))
|
||||
Private _isRefreshingFormula As Boolean = False ' *** NEU: Flag für Formel-Refresh ***
|
||||
Private _currencySymbol As String = "€"
|
||||
''' <summary>
|
||||
''' SHARED Dictionary: Speichert das aktuelle Währungssymbol PRO GridView (via Name).
|
||||
''' Dies ist notwendig, weil UpdateCurrencyFormat auf einer NEUEN GridControl-Instanz
|
||||
''' aufgerufen wird, der CustomColumnDisplayText-Handler aber auf der URSPRÜNGLICHEN
|
||||
''' Instanz registriert wurde. Durch das Shared Dictionary können alle Instanzen
|
||||
''' auf das aktuelle Symbol zugreifen.
|
||||
''' </summary>
|
||||
Private Shared _CurrencySymbolByGridName As New Dictionary(Of String, String)(StringComparer.OrdinalIgnoreCase)
|
||||
|
||||
''' <summary>
|
||||
''' Definiert eine SQL-basierte Formelspalte mit allen nötigen Metadaten.
|
||||
''' </summary>
|
||||
Private Class FormulaSqlDefinition
|
||||
Public Property SqlTemplate As String
|
||||
Public Property ReferencedColumns As List(Of String)
|
||||
End Class
|
||||
''' <summary>
|
||||
''' Extrahiert alle {#TBCOL#ColumnName}-Platzhalter aus einem SQL-Template.
|
||||
''' </summary>
|
||||
Private Function GetReferencedSqlColumnNames(sqlTemplate As String) As List(Of String)
|
||||
Dim columnNames As New List(Of String)
|
||||
Dim pattern As String = "\{#TBCOL#([^}]+)\}"
|
||||
Dim matches = Regex.Matches(sqlTemplate, pattern)
|
||||
|
||||
For Each match As Match In matches
|
||||
Dim colName = match.Groups(1).Value
|
||||
If Not columnNames.Contains(colName, StringComparer.OrdinalIgnoreCase) Then
|
||||
columnNames.Add(colName)
|
||||
End If
|
||||
Next
|
||||
|
||||
Return columnNames
|
||||
End Function
|
||||
''' <summary>
|
||||
''' Ersetzt alle {#TBCOL#ColumnName}-Platzhalter durch die aktuellen Zeilenwerte.
|
||||
''' Gibt den ausführbaren SQL-String zurück.
|
||||
''' </summary>
|
||||
Private Function ResolveSqlTemplate(sqlTemplate As String, pView As GridView, rowHandle As Integer) As String
|
||||
Dim resolvedSql As String = sqlTemplate
|
||||
Dim pattern As String = "\{#TBCOL#([^}]+)\}"
|
||||
Dim matches = Regex.Matches(sqlTemplate, pattern)
|
||||
|
||||
For Each match As Match In matches
|
||||
Dim colName = match.Groups(1).Value
|
||||
Dim cellValue = pView.GetRowCellValue(rowHandle, colName)
|
||||
Dim safeValue As String
|
||||
|
||||
If cellValue Is Nothing OrElse IsDBNull(cellValue) Then
|
||||
safeValue = "NULL"
|
||||
ElseIf TypeOf cellValue Is String Then
|
||||
' SQL-Injection-Schutz: Einfache Anführungszeichen escapen
|
||||
safeValue = "'" & cellValue.ToString().Replace("'", "''") & "'"
|
||||
ElseIf TypeOf cellValue Is Boolean Then
|
||||
safeValue = If(CBool(cellValue), "1", "0")
|
||||
Else
|
||||
' Numerische Werte: Invariant-Format (Punkt als Dezimaltrenner)
|
||||
safeValue = Convert.ToString(cellValue, CultureInfo.InvariantCulture)
|
||||
End If
|
||||
|
||||
resolvedSql = resolvedSql.Replace(match.Value, safeValue)
|
||||
_Logger.Debug("Resolved SQL placeholder [{0}] with value [{1}] → {2}", match.Value, cellValue, safeValue)
|
||||
Next
|
||||
_Logger.Debug("Final resolved SQL: {0}", resolvedSql)
|
||||
Return resolvedSql
|
||||
End Function
|
||||
Public Sub New(pLogConfig As LogConfig, pGridTables As Dictionary(Of Integer, Dictionary(Of String, RepositoryItem)), pCurrencySymbol As String)
|
||||
_LogConfig = pLogConfig
|
||||
_Logger = pLogConfig.GetLogger()
|
||||
_GridTables = pGridTables
|
||||
_currencySymbol = pCurrencySymbol
|
||||
End Sub
|
||||
''' <summary>
|
||||
''' Setzt den Shared Currency-Cache zurück. Muss beim Laden eines neuen Dokuments
|
||||
''' aufgerufen werden, bevor UpdateCurrencyFormat die neuen Werte schreibt.
|
||||
''' Verhindert, dass ein veraltetes Währungssymbol aus einem vorherigen Dokument
|
||||
''' durch den CustomColumnDisplayText-Handler verwendet wird.
|
||||
''' </summary>
|
||||
Public Shared Sub ResetCurrencySymbolCache()
|
||||
SyncLock _CurrencySymbolByGridName
|
||||
_CurrencySymbolByGridName.Clear()
|
||||
End SyncLock
|
||||
End Sub
|
||||
|
||||
Public Function CreateGridColumns(pColumnTable As DataTable) As DataTable
|
||||
Dim oDataTable As New DataTable
|
||||
Dim columnsWithExpressions As New List(Of Tuple(Of DataColumn, String))
|
||||
@@ -60,9 +140,19 @@ Namespace ControlCreator
|
||||
End Select
|
||||
|
||||
Dim oFormulaExpression = ObjectEx.NotNull(oRow.Item("FORMULA_EXPRESSION"), String.Empty)
|
||||
Dim oFormulaSql = ObjectEx.NotNull(oRow.Item("FORMULA_SQL"), String.Empty)
|
||||
|
||||
' *** VALIDIERUNG: Beides gleichzeitig ist nicht erlaubt ***
|
||||
If oFormulaExpression <> String.Empty AndAlso oFormulaSql <> String.Empty Then
|
||||
_Logger.Warn("⚠️ [CreateGridColumns] Column [{0}] has BOTH FORMULA_EXPRESSION and FORMULA_SQL – FORMULA_SQL will be ignored.", oColumn.ColumnName)
|
||||
' FORMULA_EXPRESSION hat Vorrang → nur Expression wird als DataTable.Expression gesetzt
|
||||
End If
|
||||
|
||||
If oFormulaExpression <> String.Empty Then
|
||||
' Expression merken, aber erst später setzen
|
||||
' FORMULA_EXPRESSION: Expression merken, aber erst später setzen (DataTable.Expression)
|
||||
columnsWithExpressions.Add(New Tuple(Of DataColumn, String)(oColumn, oFormulaExpression))
|
||||
' HINWEIS: FORMULA_SQL-Spalten bekommen KEINE DataTable.Expression,
|
||||
' da deren Werte programmatisch via SetRowCellValue gesetzt werden.
|
||||
End If
|
||||
|
||||
Try
|
||||
@@ -199,16 +289,136 @@ Namespace ControlCreator
|
||||
Return oEditor
|
||||
End If
|
||||
End Function
|
||||
''' <summary>
|
||||
''' Setzt das Währungssymbol für ein bestimmtes Grid im Shared Cache.
|
||||
''' Muss bei JEDEM Dokumentwechsel aufgerufen werden (auch bei EUR),
|
||||
''' damit der CustomColumnDisplayText-Handler sofort den korrekten Wert hat.
|
||||
''' </summary>
|
||||
Public Shared Sub SetCurrencySymbolForGrid(gridName As String, currencySymbol As String)
|
||||
SyncLock _CurrencySymbolByGridName
|
||||
_CurrencySymbolByGridName(gridName) = currencySymbol
|
||||
End SyncLock
|
||||
End Sub
|
||||
' Hilfsroutine: passt NUR das Summary-Item an (ohne FormatInfo)
|
||||
Private Sub ApplyCurrencySummaryFormat(oCol As GridColumn, currencySymbol As String)
|
||||
Private Sub ApplyCurrencySummaryFormat(oCol As GridColumn)
|
||||
oCol.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum
|
||||
' Variante A: Standard-Währungsformat aus aktueller Kultur
|
||||
' oCol.SummaryItem.DisplayFormat = "SUM: {0:C2}"
|
||||
_Logger.Debug("Applying currency summary format for column [{0}] with symbol [{1}]", oCol.FieldName, _currencySymbol)
|
||||
|
||||
' Variante B: Kulturunabhängig, Symbol explizit anhängen
|
||||
oCol.SummaryItem.DisplayFormat = $"SUM: {{0:N2}} {currencySymbol}"
|
||||
oCol.SummaryItem.DisplayFormat = $"{{0:N2}} {_currencySymbol}"
|
||||
End Sub
|
||||
Public Sub ConfigureViewColumns(pColumnTable As DataTable, pGridView As GridView, pGrid As DevExpress.XtraGrid.GridControl, pcurrencySymbol As String)
|
||||
''' <summary>
|
||||
''' Aktualisiert die Währungsformatierung für alle CURRENCY-Spalten mit neuem Währungssymbol.
|
||||
''' Betrifft DisplayFormat, ColumnEdit (für editierbare Spalten) und Summary-Footer.
|
||||
''' </summary>
|
||||
''' <summary>
|
||||
'''
|
||||
Public Sub UpdateCurrencyFormat(pColumnTable As DataTable, pGridView As GridView, pGrid As DevExpress.XtraGrid.GridControl, pNewCurrencySymbol As String)
|
||||
Try
|
||||
_Logger.Info("[UpdateCurrencyFormat] *** START *** [{0}] → [{1}] für [{2}]", _currencySymbol, pNewCurrencySymbol, pGrid.Name)
|
||||
|
||||
' *** KERN-FIX: Speichere Symbol im SHARED Dictionary ***
|
||||
Dim gridName As String = pGrid.Name
|
||||
SyncLock _CurrencySymbolByGridName
|
||||
If _CurrencySymbolByGridName.ContainsKey(gridName) Then
|
||||
_CurrencySymbolByGridName(gridName) = pNewCurrencySymbol
|
||||
Else
|
||||
_CurrencySymbolByGridName.Add(gridName, pNewCurrencySymbol)
|
||||
End If
|
||||
End SyncLock
|
||||
_Logger.Debug("[UpdateCurrencyFormat] Shared Dictionary updated: [{0}] = [{1}]", gridName, pNewCurrencySymbol)
|
||||
|
||||
_currencySymbol = pNewCurrencySymbol
|
||||
|
||||
Dim oCultureInfo As CultureInfo = New CultureInfo("de-DE")
|
||||
oCultureInfo.NumberFormat.CurrencySymbol = _currencySymbol
|
||||
|
||||
Dim riTextEdit As New RepositoryItemTextEdit()
|
||||
riTextEdit.MaskSettings.Configure(Of MaskSettings.Numeric)(
|
||||
Sub(settings)
|
||||
settings.MaskExpression = "c"
|
||||
settings.Culture = oCultureInfo
|
||||
End Sub)
|
||||
riTextEdit.UseMaskAsDisplayFormat = False
|
||||
riTextEdit.DisplayFormat.FormatType = FormatType.Custom
|
||||
riTextEdit.DisplayFormat.FormatString = $"#,##0.00 {_currencySymbol}"
|
||||
_Logger.Debug("[UpdateCurrencyFormat] riTextEdit: DisplayFormat=[{0}]",
|
||||
riTextEdit.DisplayFormat.FormatString)
|
||||
|
||||
pGridView.BeginUpdate()
|
||||
Try
|
||||
' Schritt 1: Altes RepositoryItem entfernen (ohne vorher ColumnEdit=Nothing)
|
||||
Dim oldItems = pGrid.RepositoryItems.OfType(Of RepositoryItemTextEdit)().
|
||||
Where(Function(item) item.MaskSettings.MaskExpression = "c").ToList()
|
||||
For Each oldItem In oldItems
|
||||
_Logger.Debug("[UpdateCurrencyFormat] Removing old riTextEdit: DisplayFormat=[{0}]",
|
||||
oldItem.DisplayFormat.FormatString)
|
||||
pGrid.RepositoryItems.Remove(oldItem)
|
||||
Next
|
||||
|
||||
' Schritt 2: CURRENCY-Spalten konfigurieren
|
||||
For Each oCol As GridColumn In pGridView.Columns
|
||||
Dim oColumnData As DataRow = pColumnTable.
|
||||
Select($"SPALTENNAME = '{oCol.FieldName}'").
|
||||
FirstOrDefault()
|
||||
If oColumnData Is Nothing Then Continue For
|
||||
|
||||
If ObjectEx.NotNull(oColumnData.Item("TYPE_COLUMN"), String.Empty).ToString() <> "CURRENCY" Then Continue For
|
||||
|
||||
Dim oIsFormulaExpression As Boolean =
|
||||
ObjectEx.NotNull(oColumnData.Item("FORMULA_EXPRESSION"), String.Empty) <> String.Empty
|
||||
Dim oIsFormulaSql As Boolean =
|
||||
ObjectEx.NotNull(oColumnData.Item("FORMULA_SQL"), String.Empty) <> String.Empty
|
||||
|
||||
' Entweder/Oder: Beide gleichzeitig → Expression gewinnt, SQL ignoriert
|
||||
If oIsFormulaExpression AndAlso oIsFormulaSql Then
|
||||
_Logger.Warn("[UpdateCurrencyFormat] Column [{0}] has BOTH FORMULA_EXPRESSION and FORMULA_SQL – treating as EXPRESSION only.", oCol.FieldName)
|
||||
oIsFormulaSql = False
|
||||
End If
|
||||
|
||||
' Spalte ist eine Formel-Spalte (Expression ODER SQL) → ReadOnly, kein ColumnEdit
|
||||
Dim oIsAnyFormula As Boolean = oIsFormulaExpression OrElse oIsFormulaSql
|
||||
|
||||
' DisplayFormat immer aktualisieren
|
||||
oCol.DisplayFormat.FormatType = FormatType.Custom
|
||||
oCol.DisplayFormat.FormatString = $"#,##0.00 {_currencySymbol}"
|
||||
|
||||
If Not oIsAnyFormula AndAlso oCol.OptionsColumn.AllowEdit Then
|
||||
' Nur editierbare Nicht-Formel-Spalten bekommen ein ColumnEdit
|
||||
oCol.ColumnEdit = riTextEdit
|
||||
_Logger.Debug("[UpdateCurrencyFormat] ColumnEdit=[{0}] für [{1}]",
|
||||
DirectCast(oCol.ColumnEdit, RepositoryItemTextEdit).DisplayFormat.FormatString,
|
||||
oCol.FieldName)
|
||||
Else
|
||||
_Logger.Debug("[UpdateCurrencyFormat] [{0}]: ReadOnly/Formula – nur DisplayFormat aktualisiert (IsExpression=[{1}], IsSql=[{2}])",
|
||||
oCol.FieldName, oIsFormulaExpression, oIsFormulaSql)
|
||||
End If
|
||||
|
||||
If ObjectEx.NotNull(oColumnData.Item("SUMMARY_FUNCTION"), String.Empty) =
|
||||
Constants.AGGREGATE_TOTAL_CURRENCY Then
|
||||
oCol.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum
|
||||
oCol.SummaryItem.DisplayFormat = $"{{0:N2}} {_currencySymbol}"
|
||||
End If
|
||||
Next
|
||||
Finally
|
||||
pGridView.EndUpdate()
|
||||
End Try
|
||||
|
||||
pGridView.LayoutChanged()
|
||||
For i As Integer = 0 To pGridView.DataRowCount - 1
|
||||
pGridView.InvalidateRow(i)
|
||||
Next
|
||||
pGridView.UpdateTotalSummary()
|
||||
|
||||
_Logger.Info("[UpdateCurrencyFormat] *** END *** _currencySymbol=[{0}]", _currencySymbol)
|
||||
|
||||
Catch ex As Exception
|
||||
_Logger.Error("[UpdateCurrencyFormat] Fehler: {0}", ex.Message)
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
Public Sub ConfigureViewColumns(pColumnTable As DataTable, pGridView As GridView, pGrid As DevExpress.XtraGrid.GridControl)
|
||||
Dim oShouldDisplayFooter As Boolean = False
|
||||
For Each oCol As GridColumn In pGridView.Columns
|
||||
Dim oColumnData As DataRow = pColumnTable.
|
||||
@@ -237,7 +447,10 @@ Namespace ControlCreator
|
||||
If oFormulaExpression <> String.Empty Then
|
||||
oIsReadOnly = True
|
||||
End If
|
||||
|
||||
Dim oSQLExpression = ObjectEx.NotNull(oColumnData.Item("FORMULA_SQL"), String.Empty)
|
||||
If oSQLExpression <> String.Empty Then
|
||||
oIsReadOnly = True
|
||||
End If
|
||||
|
||||
oCol.OptionsColumn.AllowEdit = Not oIsReadOnly
|
||||
|
||||
@@ -253,8 +466,14 @@ Namespace ControlCreator
|
||||
oCol.DisplayFormat.FormatString = "N2"
|
||||
|
||||
Case "CURRENCY"
|
||||
oCol.DisplayFormat.FormatType = FormatType.Custom
|
||||
oCol.DisplayFormat.FormatString = "C2"
|
||||
' *** DisplayFormat wird NICHT hier gesetzt ***
|
||||
' ConfigureViewColumnsCurrency übernimmt die CURRENCY-Formatierung
|
||||
' mit dem korrekten _currencySymbol. Dieses Standardformat würde
|
||||
' später von UpdateCurrencyFormat überschrieben werden müssen –
|
||||
' für Formel-Spalten (kein ColumnEdit) greift aber nur DisplayFormat,
|
||||
' weshalb ein falscher Initialwert hier persistent bleibt.
|
||||
_Logger.Debug("CURRENCY column [{0}]: DisplayFormat wird von ConfigureViewColumnsCurrency gesetzt", oCol.FieldName)
|
||||
|
||||
End Select
|
||||
|
||||
Dim oSummaryFunction As String = oColumnData.Item("SUMMARY_FUNCTION")
|
||||
@@ -262,16 +481,17 @@ Namespace ControlCreator
|
||||
Select Case oSummaryFunction
|
||||
Case Constants.AGGREGATE_TOTAL_INTEGER
|
||||
oCol.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum
|
||||
oCol.SummaryItem.DisplayFormat = "SUM: {0:N0}"
|
||||
oCol.SummaryItem.DisplayFormat = "{0:N0}"
|
||||
oShouldDisplayFooter = True
|
||||
|
||||
Case Constants.AGGREGATE_TOTAL_FLOAT
|
||||
oCol.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum
|
||||
oCol.SummaryItem.DisplayFormat = "SUM: {0:N2}"
|
||||
oCol.SummaryItem.DisplayFormat = "{0:N2}"
|
||||
oShouldDisplayFooter = True
|
||||
|
||||
Case Constants.AGGREGATE_TOTAL_CURRENCY
|
||||
ApplyCurrencySummaryFormat(oCol, pcurrencySymbol)
|
||||
_Logger.Debug(Of String)("Applying currency summary format for column [{0}]", oCol.FieldName)
|
||||
ApplyCurrencySummaryFormat(oCol)
|
||||
oShouldDisplayFooter = True
|
||||
|
||||
Case Constants.AGGREGATE_TOTAL_AVG
|
||||
@@ -306,37 +526,179 @@ Namespace ControlCreator
|
||||
End With
|
||||
End If
|
||||
End Sub
|
||||
Public Sub ConfigureViewColumnsCurrency(pColumnTable As DataTable, pGridView As GridView, pGrid As DevExpress.XtraGrid.GridControl, pCurrency As String)
|
||||
|
||||
Public Sub ConfigureViewColumnsCurrency(pColumnTable As DataTable, pGridView As GridView, pGrid As DevExpress.XtraGrid.GridControl)
|
||||
Dim oCultureInfo As CultureInfo = New CultureInfo("de-DE")
|
||||
oCultureInfo.NumberFormat.CurrencySymbol = pCurrency
|
||||
oCultureInfo.NumberFormat.CurrencySymbol = _currencySymbol
|
||||
|
||||
Dim riTextEdit As RepositoryItemTextEdit = New RepositoryItemTextEdit()
|
||||
riTextEdit.MaskSettings.Configure(Of MaskSettings.Numeric)(Sub(settings)
|
||||
settings.MaskExpression = "c"
|
||||
settings.Culture = oCultureInfo
|
||||
End Sub)
|
||||
riTextEdit.UseMaskAsDisplayFormat = True 'Optional
|
||||
pGrid.RepositoryItems.Add(riTextEdit)
|
||||
riTextEdit.MaskSettings.Configure(Of MaskSettings.Numeric)(
|
||||
Sub(settings)
|
||||
settings.MaskExpression = "c"
|
||||
settings.Culture = oCultureInfo
|
||||
End Sub)
|
||||
riTextEdit.UseMaskAsDisplayFormat = False
|
||||
riTextEdit.DisplayFormat.FormatType = FormatType.Custom
|
||||
riTextEdit.DisplayFormat.FormatString = $"#,##0.00 {_currencySymbol}"
|
||||
|
||||
_Logger.Debug("[ConfigureViewColumnsCurrency] riTextEdit erstellt: DisplayFormat=[{0}], HashCode=[{1}]",
|
||||
riTextEdit.DisplayFormat.FormatString, riTextEdit.GetHashCode())
|
||||
_Logger.Debug("[ConfigureViewColumnsCurrency] pGrid.RepositoryItems.Count VOR Schleife=[{0}]",
|
||||
pGrid.RepositoryItems.Count)
|
||||
|
||||
For Each oCol As GridColumn In pGridView.Columns
|
||||
Dim oColumnData As DataRow = pColumnTable.
|
||||
Select($"SPALTENNAME = '{oCol.FieldName}'").
|
||||
FirstOrDefault()
|
||||
If oColumnData Is Nothing Then Continue For
|
||||
|
||||
If oColumnData Is Nothing Then
|
||||
Continue For
|
||||
Dim oColumnType As String = ObjectEx.NotNull(oColumnData.Item("TYPE_COLUMN"), String.Empty).ToString()
|
||||
If oColumnType <> "CURRENCY" Then Continue For
|
||||
|
||||
Dim oFormulaExpression = ObjectEx.NotNull(oColumnData.Item("FORMULA_EXPRESSION"), String.Empty)
|
||||
Dim oFormulaSql = ObjectEx.NotNull(oColumnData.Item("FORMULA_SQL"), String.Empty)
|
||||
|
||||
' Entweder/Oder: Beide gleichzeitig → Expression gewinnt, SQL ignoriert
|
||||
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
|
||||
End If
|
||||
|
||||
Dim oColumnType As String = oColumnData.Item("TYPE_COLUMN")
|
||||
' Spalte ist eine Formel-Spalte (Expression ODER SQL) → nur DisplayFormat, kein ColumnEdit
|
||||
Dim oIsAnyFormula As Boolean = oFormulaExpression <> String.Empty OrElse oFormulaSql <> String.Empty
|
||||
|
||||
Select Case oColumnType
|
||||
Case "CURRENCY"
|
||||
oCol.DisplayFormat.FormatType = FormatType.Custom
|
||||
oCol.ColumnEdit = riTextEdit
|
||||
End Select
|
||||
If oIsAnyFormula Then
|
||||
' Formel-Spalten (Expression oder SQL): nur DisplayFormat setzen
|
||||
oCol.DisplayFormat.FormatType = FormatType.Custom
|
||||
oCol.DisplayFormat.FormatString = $"#,##0.00 {_currencySymbol}"
|
||||
_Logger.Debug("[ConfigureViewColumnsCurrency] Formel-Spalte [{0}] (IsExpression=[{1}], IsSql=[{2}]): DisplayFormat=[{3}], RepositoryItems.Count=[{4}]",
|
||||
oCol.FieldName,
|
||||
oFormulaExpression <> String.Empty,
|
||||
oFormulaSql <> String.Empty,
|
||||
oCol.DisplayFormat.FormatString,
|
||||
pGrid.RepositoryItems.Count)
|
||||
|
||||
ElseIf oCol.OptionsColumn.AllowEdit Then
|
||||
_Logger.Debug("[ConfigureViewColumnsCurrency] [{0}] VOR ColumnEdit: RepositoryItems.Count=[{1}]",
|
||||
oCol.FieldName, pGrid.RepositoryItems.Count)
|
||||
|
||||
oCol.ColumnEdit = riTextEdit
|
||||
|
||||
_Logger.Debug("[ConfigureViewColumnsCurrency] [{0}] NACH ColumnEdit: RepositoryItems.Count=[{1}]",
|
||||
oCol.FieldName, pGrid.RepositoryItems.Count)
|
||||
|
||||
Dim assignedEdit = TryCast(oCol.ColumnEdit, RepositoryItemTextEdit)
|
||||
_Logger.Debug("[ConfigureViewColumnsCurrency] [{0}]: IsSameObject=[{1}], ColumnEdit.DisplayFormat=[{2}], ColumnEdit.HashCode=[{3}]",
|
||||
oCol.FieldName,
|
||||
Object.ReferenceEquals(assignedEdit, riTextEdit),
|
||||
If(assignedEdit IsNot Nothing, assignedEdit.DisplayFormat.FormatString, "N/A"),
|
||||
If(assignedEdit IsNot Nothing, assignedEdit.GetHashCode(), -1))
|
||||
|
||||
For i As Integer = 0 To pGrid.RepositoryItems.Count - 1
|
||||
_Logger.Debug("[ConfigureViewColumnsCurrency] RepositoryItems[{0}]: Type=[{1}], HashCode=[{2}]",
|
||||
i, pGrid.RepositoryItems(i).GetType().Name, pGrid.RepositoryItems(i).GetHashCode())
|
||||
Next
|
||||
End If
|
||||
Next
|
||||
|
||||
Dim oTestFired As Boolean = False
|
||||
AddHandler pGridView.CustomColumnDisplayText,
|
||||
Sub(sender As Object, e As CustomColumnDisplayTextEventArgs)
|
||||
If e.Column Is Nothing OrElse e.Value Is Nothing OrElse IsDBNull(e.Value) Then
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim oColumnData As DataRow = pColumnTable.
|
||||
Select($"SPALTENNAME = '{e.Column.FieldName}'").
|
||||
FirstOrDefault()
|
||||
|
||||
If oColumnData IsNot Nothing AndAlso
|
||||
oColumnData.Item("TYPE_COLUMN").ToString() = "CURRENCY" Then
|
||||
|
||||
Try
|
||||
Dim currentSymbol As String = _currencySymbol
|
||||
Dim gridName As String = pGrid.Name
|
||||
SyncLock _CurrencySymbolByGridName
|
||||
If _CurrencySymbolByGridName.ContainsKey(gridName) Then
|
||||
currentSymbol = _CurrencySymbolByGridName(gridName)
|
||||
End If
|
||||
End SyncLock
|
||||
|
||||
Dim oValue As Double
|
||||
If TypeOf e.Value Is Double OrElse TypeOf e.Value Is Decimal Then
|
||||
oValue = Convert.ToDouble(e.Value)
|
||||
ElseIf TypeOf e.Value Is String Then
|
||||
Dim oStringValue As String = e.Value.ToString().Trim()
|
||||
|
||||
Dim oDeCulture As CultureInfo = New CultureInfo("de-DE")
|
||||
If Double.TryParse(oStringValue, NumberStyles.Currency Or NumberStyles.Number, oDeCulture, oValue) Then
|
||||
ElseIf Double.TryParse(oStringValue, NumberStyles.Currency Or NumberStyles.Number, CultureInfo.InvariantCulture, oValue) Then
|
||||
Else
|
||||
oValue = Convert.ToDouble(oStringValue, CultureInfo.CurrentCulture)
|
||||
End If
|
||||
Else
|
||||
oValue = Convert.ToDouble(e.Value)
|
||||
End If
|
||||
|
||||
Dim oDeCultureInfo As CultureInfo = New CultureInfo("de-DE")
|
||||
e.DisplayText = oValue.ToString("N2", oDeCultureInfo) & " " & currentSymbol
|
||||
|
||||
_Logger.Debug("[CustomColumnDisplayText] CURRENCY [{0}]: DisplayText=[{1}], Symbol=[{2}] (from Shared Dict in ConfigureViewColumnsCurrency)",
|
||||
e.Column.FieldName, e.DisplayText, currentSymbol)
|
||||
|
||||
Catch ex As Exception
|
||||
_Logger.Warn("⚠️ Could not format currency value [{0}] for column [{1}]: {2}",
|
||||
e.Value, e.Column.FieldName, ex.Message)
|
||||
Dim fallbackSymbol As String = _currencySymbol
|
||||
SyncLock _CurrencySymbolByGridName
|
||||
If _CurrencySymbolByGridName.ContainsKey(pGrid.Name) Then
|
||||
fallbackSymbol = _CurrencySymbolByGridName(pGrid.Name)
|
||||
End If
|
||||
End SyncLock
|
||||
e.DisplayText = e.Value.ToString() & " " & fallbackSymbol
|
||||
End Try
|
||||
End If
|
||||
End Sub
|
||||
End Sub
|
||||
|
||||
Public Sub ConfigureViewEvents(pColumnTable As DataTable, pGridView As GridView, pControl As Windows.Forms.Control, pControlId As Integer)
|
||||
' *** Formel-Spalten einmalig cachen + Validierung: Entweder EXPRESSION oder SQL, nie beides ***
|
||||
_FormulaColumnNames.Clear()
|
||||
_FormulaSqlColumns.Clear()
|
||||
|
||||
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()
|
||||
|
||||
' *** VALIDIERUNG: Beides gleichzeitig ist nicht erlaubt ***
|
||||
If oExpr <> String.Empty AndAlso oSql <> 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 &
|
||||
"Es darf nur eine der beiden Formeln gesetzt sein." & vbCrLf &
|
||||
"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
|
||||
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
|
||||
Dim oConnectionId As Integer = r.ItemEx("CONNECTION_ID", 0)
|
||||
_FormulaSqlColumns(oColName) = New FormulaSqlDefinition() With {
|
||||
.SqlTemplate = oSql,
|
||||
.ReferencedColumns = GetReferencedSqlColumnNames(oSql)
|
||||
}
|
||||
' 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)))
|
||||
End If
|
||||
Next
|
||||
|
||||
AddHandler pGridView.InitNewRow, Sub(sender As Object, e As InitNewRowEventArgs)
|
||||
Try
|
||||
_Logger.Debug("Initialzing new row")
|
||||
@@ -362,23 +724,100 @@ Namespace ControlCreator
|
||||
newRowModified = False
|
||||
End Try
|
||||
End Sub
|
||||
' *** NEU: CustomColumnDisplayText für robuste CURRENCY-Formatierung ***
|
||||
AddHandler pGridView.CustomColumnDisplayText,
|
||||
Sub(sender As Object, e As CustomColumnDisplayTextEventArgs)
|
||||
If e.Column Is Nothing OrElse e.Value Is Nothing OrElse IsDBNull(e.Value) Then
|
||||
Return
|
||||
End If
|
||||
|
||||
' Prüfe ob Spalte vom Typ CURRENCY ist
|
||||
Dim oColumnData As DataRow = pColumnTable.
|
||||
Select($"SPALTENNAME = '{e.Column.FieldName}'").
|
||||
FirstOrDefault()
|
||||
|
||||
If oColumnData IsNot Nothing AndAlso
|
||||
oColumnData.Item("TYPE_COLUMN").ToString() = "CURRENCY" Then
|
||||
|
||||
Try
|
||||
' *** KERN-FIX: Hole Symbol aus SHARED Dictionary statt Instanz-Feld ***
|
||||
Dim currentSymbol As String = _currencySymbol ' Fallback
|
||||
Dim gridName As String = pControl.Name
|
||||
SyncLock _CurrencySymbolByGridName
|
||||
If _CurrencySymbolByGridName.ContainsKey(gridName) Then
|
||||
currentSymbol = _CurrencySymbolByGridName(gridName)
|
||||
End If
|
||||
End SyncLock
|
||||
|
||||
Dim oValue As Double
|
||||
' *** KRITISCH: Robustes Parsing unabhängig vom Dezimaltrenner ***
|
||||
If TypeOf e.Value Is Double OrElse TypeOf e.Value Is Decimal Then
|
||||
oValue = Convert.ToDouble(e.Value)
|
||||
ElseIf TypeOf e.Value Is String Then
|
||||
Dim oStringValue As String = e.Value.ToString().Trim()
|
||||
|
||||
' Versuche zuerst deutsches Format (1.234,56)
|
||||
Dim oDeCulture As CultureInfo = New CultureInfo("de-DE")
|
||||
If Double.TryParse(oStringValue, NumberStyles.Currency Or NumberStyles.Number, oDeCulture, oValue) Then
|
||||
' Erfolgreich mit deutschem Format geparst
|
||||
ElseIf Double.TryParse(oStringValue, NumberStyles.Currency Or NumberStyles.Number, CultureInfo.InvariantCulture, oValue) Then
|
||||
' Erfolgreich mit invariantem Format (Punkt als Dezimaltrenner)
|
||||
Else
|
||||
' Fallback: Systemkultur
|
||||
oValue = Convert.ToDouble(oStringValue, CultureInfo.CurrentCulture)
|
||||
End If
|
||||
Else
|
||||
oValue = Convert.ToDouble(e.Value)
|
||||
End If
|
||||
|
||||
' Formatierung IMMER mit deutscher Kultur (Komma als Dezimaltrenner)
|
||||
Dim oDeCultureInfo As CultureInfo = New CultureInfo("de-DE")
|
||||
e.DisplayText = oValue.ToString("N2", oDeCultureInfo) & " " & currentSymbol
|
||||
|
||||
_Logger.Debug("[CustomColumnDisplayText] CURRENCY [{0}]: DisplayText=[{1}], Symbol=[{2}] (from Shared Dict in ConfigureViewEvents)",
|
||||
e.Column.FieldName, e.DisplayText, currentSymbol)
|
||||
|
||||
Catch ex As Exception
|
||||
_Logger.Warn("⚠️ Could not format currency value [{0}] for column [{1}]: {2}",
|
||||
e.Value, e.Column.FieldName, ex.Message)
|
||||
' Fallback: Original-Wert + Symbol
|
||||
Dim fallbackSymbol As String = _currencySymbol
|
||||
SyncLock _CurrencySymbolByGridName
|
||||
If _CurrencySymbolByGridName.ContainsKey(pControl.Name) Then
|
||||
fallbackSymbol = _CurrencySymbolByGridName(pControl.Name)
|
||||
End If
|
||||
End SyncLock
|
||||
e.DisplayText = e.Value.ToString() & " " & fallbackSymbol
|
||||
End Try
|
||||
End If
|
||||
End Sub
|
||||
|
||||
AddHandler pGridView.CustomRowCellEdit, Sub(sender As Object, e As CustomRowCellEditEventArgs)
|
||||
Try
|
||||
For Each oRow As DataRow In pColumnTable.Rows
|
||||
Dim oColumnName = oRow.Item("SPALTENNAME")
|
||||
Dim oColumnName As String = oRow.Item("SPALTENNAME").ToString()
|
||||
If oColumnName <> e.Column.FieldName Then Continue For
|
||||
|
||||
Dim oEditorExists = GridTables_TestEditorExistsByControlAndColumn(pControlId, oColumnName)
|
||||
If oColumnName <> e.Column.FieldName Then
|
||||
Continue For
|
||||
End If
|
||||
|
||||
If oEditorExists Then
|
||||
' Combobox/Lookup-Editor aus GridTables: immer zuweisen
|
||||
Dim oEditor = _GridTables.Item(pControlId).Item(oColumnName)
|
||||
_Logger.Debug("Assigning Editor to Column [{0}]", oColumnName)
|
||||
e.RepositoryItem = oEditor
|
||||
Else
|
||||
_Logger.Debug("Editor for Column [{0}] does not exist", oColumnName)
|
||||
Dim oColumnType As String = ObjectEx.NotNull(oRow.Item("TYPE_COLUMN"), String.Empty).ToString()
|
||||
If oColumnType = "CURRENCY" Then
|
||||
If _FormulaColumnNames.Contains(oColumnName) Then
|
||||
_Logger.Debug("CURRENCY column [{0}] is formula/readonly – CustomColumnDisplayText handles display", oColumnName)
|
||||
Else
|
||||
_Logger.Debug("CURRENCY column [{0}] – NO e.RepositoryItem set. Display via CustomColumnDisplayText, Edit via GridColumn.ColumnEdit", oColumnName)
|
||||
End If
|
||||
Else
|
||||
_Logger.Debug("Editor for Column [{0}] does not exist", oColumnName)
|
||||
End If
|
||||
End If
|
||||
Exit For
|
||||
Next
|
||||
Catch ex As Exception
|
||||
_Logger.Warn("⚠️ Error in CustomRowCellEdit for [{0}]", e.CellValue)
|
||||
@@ -394,30 +833,328 @@ Namespace ControlCreator
|
||||
End Sub
|
||||
|
||||
AddHandler pGridView.PopupMenuShowing, AddressOf View_PopupMenuShowing
|
||||
|
||||
AddHandler pGridView.InvalidRowException, AddressOf View_InvalidRowException
|
||||
AddHandler pGridView.ValidatingEditor, AddressOf View_ValidatingEditor
|
||||
' AddHandler pGridView.CustomColumnDisplayText, AddressOf View_CustomColumnDisplayText
|
||||
AddHandler pGridView.ShownEditor,
|
||||
Sub(sender As Object, e As EventArgs)
|
||||
Dim view As GridView = TryCast(sender, GridView)
|
||||
If view.IsNewItemRow(view.FocusedRowHandle) Then
|
||||
_Logger.Debug("Attaching Modified Handler.")
|
||||
AddHandler view.ActiveEditor.Modified, Sub()
|
||||
_Logger.Debug("Row was modified.")
|
||||
newRowModified = True
|
||||
End Sub
|
||||
End If
|
||||
|
||||
' *** LIVE-REFRESH bei JEDER Eingabe (nur für FORMULA_EXPRESSION!) ***
|
||||
' FORMULA_SQL wird NICHT hier behandelt – SQL-Refresh erfolgt nur über CellValueChanged
|
||||
If view.FocusedColumn IsNot Nothing AndAlso view.ActiveEditor IsNot Nothing Then
|
||||
Dim oFocusedColumnName As String = view.FocusedColumn.FieldName
|
||||
|
||||
' Prüfen ob diese Spalte von FORMULA_EXPRESSION-Spalten referenziert wird
|
||||
Dim oFormulaColumnsToRefresh As New List(Of String)
|
||||
For Each oColumnData As DataRow In pColumnTable.Rows
|
||||
Dim oColName = oColumnData.Item("SPALTENNAME").ToString()
|
||||
Dim oExpr = ObjectEx.NotNull(oColumnData.Item("FORMULA_EXPRESSION"), String.Empty).ToString()
|
||||
|
||||
' Nur FORMULA_EXPRESSION – FORMULA_SQL wird über CellValueChanged behandelt
|
||||
If oExpr = String.Empty Then
|
||||
Continue For
|
||||
End If
|
||||
|
||||
' Spalte darf keine FORMULA_SQL haben (wurde oben validiert, Sicherheitsprüfung)
|
||||
Dim oSqlExpr = ObjectEx.NotNull(oColumnData.Item("FORMULA_SQL"), String.Empty).ToString()
|
||||
If oSqlExpr <> String.Empty Then
|
||||
_Logger.Debug("[FormulaRefresh] Column [{0}] has both FORMULA_EXPRESSION and FORMULA_SQL – skipping live refresh.", oColName)
|
||||
Continue For
|
||||
End If
|
||||
|
||||
Dim referencedColumns = GetReferencedColumnNames(oExpr)
|
||||
If referencedColumns.Any(Function(col) String.Equals(col, oFocusedColumnName, StringComparison.OrdinalIgnoreCase)) Then
|
||||
oFormulaColumnsToRefresh.Add(oColName)
|
||||
End If
|
||||
Next
|
||||
|
||||
If oFormulaColumnsToRefresh.Count > 0 Then
|
||||
_Logger.Debug("[FormulaRefresh] Attaching EditValueChanged handler for LIVE formula updates on column [{0}].", oFocusedColumnName)
|
||||
|
||||
' Handler für LIVE Aktualisierung während JEDER Eingabe
|
||||
AddHandler view.ActiveEditor.EditValueChanged,
|
||||
Sub(editorSender As Object, editorArgs As EventArgs)
|
||||
Try
|
||||
Dim oRowHandle As Integer = view.FocusedRowHandle
|
||||
If Not view.IsValidRowHandle(oRowHandle) Then Return
|
||||
|
||||
Dim oEditor As DevExpress.XtraEditors.BaseEdit = TryCast(editorSender, DevExpress.XtraEditors.BaseEdit)
|
||||
If oEditor Is Nothing Then Return
|
||||
|
||||
Dim isNewItemRow As Boolean = view.IsNewItemRow(oRowHandle)
|
||||
|
||||
Try
|
||||
Dim oValue As Object = oEditor.EditValue
|
||||
|
||||
If TypeOf oEditor Is DevExpress.XtraEditors.TextEdit Then
|
||||
Dim oTextEdit As DevExpress.XtraEditors.TextEdit = DirectCast(oEditor, DevExpress.XtraEditors.TextEdit)
|
||||
If oTextEdit.Properties.MaskSettings IsNot Nothing Then
|
||||
oValue = oEditor.EditValue
|
||||
End If
|
||||
End If
|
||||
|
||||
If isNewItemRow Then
|
||||
_Logger.Debug("[FormulaRefresh] EditValueChanged (NewItemRow) – setting value for [{0}] = [{1}].", oFocusedColumnName, oValue)
|
||||
|
||||
_isRefreshingFormula = True
|
||||
Try
|
||||
' Wert setzen
|
||||
view.SetRowCellValue(oRowHandle, oFocusedColumnName, If(oValue Is Nothing, DBNull.Value, oValue))
|
||||
|
||||
' *** KRITISCH: DoEvents() damit SetRowCellValue processed wird ***
|
||||
view.UpdateCurrentRow()
|
||||
|
||||
' Formel-Spalten SOFORT refreshen
|
||||
For Each oFormulaColumnName As String In oFormulaColumnsToRefresh
|
||||
Dim oGridColumn As GridColumn = view.Columns.ColumnByFieldName(oFormulaColumnName)
|
||||
If oGridColumn IsNot Nothing Then
|
||||
view.RefreshRowCell(oRowHandle, oGridColumn)
|
||||
_Logger.Debug("[FormulaRefresh] (NewItemRow) Refreshed [{0}], current value: [{1}]",
|
||||
oFormulaColumnName, view.GetRowCellValue(oRowHandle, oGridColumn))
|
||||
End If
|
||||
Next
|
||||
Finally
|
||||
_isRefreshingFormula = False
|
||||
End Try
|
||||
|
||||
Else
|
||||
' Bestehende Row
|
||||
Dim oDataRow As DataRow = view.GetDataRow(oRowHandle)
|
||||
If oDataRow IsNot Nothing Then
|
||||
_Logger.Debug("[FormulaRefresh] EditValueChanged – setting value for [{0}] in DataTable.", oFocusedColumnName)
|
||||
oDataRow.Item(oFocusedColumnName) = If(oValue Is Nothing, DBNull.Value, oValue)
|
||||
|
||||
For Each oFormulaColumnName As String In oFormulaColumnsToRefresh
|
||||
Dim oGridColumn As GridColumn = view.Columns.ColumnByFieldName(oFormulaColumnName)
|
||||
If oGridColumn IsNot Nothing Then
|
||||
view.RefreshRowCell(oRowHandle, oGridColumn)
|
||||
Dim currentValue = view.GetRowCellValue(oRowHandle, oGridColumn)
|
||||
_Logger.Debug("[FormulaRefresh] Current value for [{0}]: [{1}]", oFormulaColumnName, currentValue)
|
||||
End If
|
||||
Next
|
||||
End If
|
||||
End If
|
||||
|
||||
Catch parseEx As Exception
|
||||
_Logger.Debug("[FormulaRefresh] Parse error during EditValueChanged: {0}", parseEx.Message)
|
||||
End Try
|
||||
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
End Sub
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
' These handlers are all used for the custom DefaultValue functionality, additionally some code in the 'InitNewRow' event.
|
||||
' https://supportcenter.devexpress.com/ticket/details/t1035580/how-to-default-a-value-in-a-column-when-add-new-row-in-data-grid
|
||||
AddHandler pGridView.ShowingEditor, AddressOf View_ShowingEditor
|
||||
AddHandler pGridView.ShownEditor, AddressOf View_ShownEditor
|
||||
AddHandler pGridView.ValidateRow, AddressOf View_ValidateRow
|
||||
AddHandler pControl.LostFocus, AddressOf Control_LostFocus
|
||||
|
||||
AddHandler pGridView.ShowingEditor,
|
||||
Sub(sender As Object, e As CancelEventArgs)
|
||||
Try
|
||||
Dim oView As GridView = TryCast(sender, GridView)
|
||||
If oView Is Nothing Then Return
|
||||
|
||||
_Logger.Debug("Showing editor.")
|
||||
|
||||
' Formel-Spalten dürfen keinen Editor öffnen (gilt für EXPRESSION UND SQL)
|
||||
If oView.FocusedColumn IsNot Nothing Then
|
||||
Dim oFieldName As String = oView.FocusedColumn.FieldName
|
||||
If _FormulaColumnNames.Contains(oFieldName) Then
|
||||
_Logger.Debug("Cancelling editor – column [{0}] is a formula column (Expression or SQL).", oFieldName)
|
||||
e.Cancel = True
|
||||
Return
|
||||
End If
|
||||
End If
|
||||
|
||||
If oView.IsNewItemRow(oView.FocusedRowHandle) AndAlso Not newRowModified Then
|
||||
_Logger.Debug("Adding new row.")
|
||||
oView.AddNewRow()
|
||||
End If
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
AddHandler pGridView.FocusedColumnChanged,
|
||||
Sub(sender As Object, e As FocusedColumnChangedEventArgs)
|
||||
Try
|
||||
Dim oView As GridView = TryCast(sender, GridView)
|
||||
If oView Is Nothing Then Return
|
||||
|
||||
Dim oRowHandle As Integer = oView.FocusedRowHandle
|
||||
If oView.IsNewItemRow(oRowHandle) Then Return
|
||||
If Not oView.IsValidRowHandle(oRowHandle) Then Return
|
||||
|
||||
If oView.FocusedColumn IsNot Nothing AndAlso
|
||||
_FormulaColumnNames.Contains(oView.FocusedColumn.FieldName) Then
|
||||
_Logger.Debug("[FormulaRefresh] FocusedColumnChanged – closing editor on formula column [{0}].", oView.FocusedColumn.FieldName)
|
||||
oView.CloseEditor()
|
||||
End If
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
AddHandler pGridView.CellValueChanged,
|
||||
Sub(sender As Object, e As CellValueChangedEventArgs)
|
||||
' *** HandleInheritedColumnValue MUSS zuerst aufgerufen werden ***
|
||||
Try
|
||||
HandleInheritedColumnValue(TryCast(sender, GridView), pColumnTable, e)
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
|
||||
' *** FORMULA_EXPRESSION-Refresh via CellValueChanged (FALLBACK) ***
|
||||
' (EditValueChanged macht das normalerweise schon LIVE)
|
||||
Try
|
||||
Dim oView As GridView = TryCast(sender, GridView)
|
||||
If oView Is Nothing OrElse e.Column Is Nothing Then Return
|
||||
|
||||
Dim oFormulaColumnsToRefresh As New List(Of String)
|
||||
|
||||
For Each oColumnData As DataRow In pColumnTable.Rows
|
||||
Dim oExpr = ObjectEx.NotNull(oColumnData.Item("FORMULA_EXPRESSION"), String.Empty).ToString()
|
||||
If oExpr = String.Empty Then Continue For
|
||||
|
||||
' Nur FORMULA_EXPRESSION – kein SQL
|
||||
Dim oSqlExpr = ObjectEx.NotNull(oColumnData.Item("FORMULA_SQL"), String.Empty).ToString()
|
||||
If oSqlExpr <> String.Empty Then Continue For
|
||||
|
||||
Dim referencedColumns = GetReferencedColumnNames(oExpr)
|
||||
If referencedColumns.Any(Function(col) String.Equals(col, e.Column.FieldName, StringComparison.OrdinalIgnoreCase)) Then
|
||||
oFormulaColumnsToRefresh.Add(oColumnData.Item("SPALTENNAME").ToString())
|
||||
End If
|
||||
Next
|
||||
|
||||
If oFormulaColumnsToRefresh.Count = 0 Then
|
||||
' Kein FORMULA_EXPRESSION-Refresh nötig – weiter zu FORMULA_SQL
|
||||
Else
|
||||
Dim oRowHandle As Integer = e.RowHandle
|
||||
_Logger.Debug("[FormulaRefresh] CellValueChanged FALLBACK – refreshing EXPRESSION columns for row [{0}] after column [{1}] changed.", oRowHandle, e.Column.FieldName)
|
||||
|
||||
oView.GridControl.BeginInvoke(New Action(
|
||||
Sub()
|
||||
Try
|
||||
If Not oView.IsValidRowHandle(oRowHandle) Then Return
|
||||
|
||||
For Each oFormulaColumnName As String In oFormulaColumnsToRefresh
|
||||
Dim oGridColumn As GridColumn = oView.Columns.ColumnByFieldName(oFormulaColumnName)
|
||||
If oGridColumn Is Nothing Then Continue For
|
||||
|
||||
oView.RefreshRowCell(oRowHandle, oGridColumn)
|
||||
_Logger.Debug("[FormulaRefresh] FALLBACK DisplayText for [{0}]: [{1}]",
|
||||
oFormulaColumnName, oView.GetRowCellDisplayText(oRowHandle, oGridColumn))
|
||||
Next
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
End Sub))
|
||||
End If
|
||||
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
|
||||
' *** FORMULA_SQL-Refresh via CellValueChanged ***
|
||||
' SQL wird NUR hier ausgeführt (nicht in EditValueChanged) um DB-Roundtrips zu minimieren
|
||||
Try
|
||||
Dim oView As GridView = TryCast(sender, GridView)
|
||||
If oView Is Nothing OrElse e.Column Is Nothing Then Return
|
||||
|
||||
' Finde alle SQL-Formelspalten, die die geänderte Spalte referenzieren
|
||||
Dim oSqlColumnsToRefresh As New List(Of String)
|
||||
For Each kvp In _FormulaSqlColumns
|
||||
If kvp.Value.ReferencedColumns.Any(
|
||||
Function(col) String.Equals(col, e.Column.FieldName, StringComparison.OrdinalIgnoreCase)) Then
|
||||
oSqlColumnsToRefresh.Add(kvp.Key)
|
||||
End If
|
||||
Next
|
||||
|
||||
If oSqlColumnsToRefresh.Count = 0 Then Return
|
||||
|
||||
Dim oRowHandle As Integer = e.RowHandle
|
||||
_Logger.Debug("[FormulaSql] CellValueChanged – column [{0}] triggers SQL refresh for: [{1}]",
|
||||
e.Column.FieldName, String.Join(", ", oSqlColumnsToRefresh))
|
||||
|
||||
' BeginInvoke: UI nicht blockieren, GridView in stabilem Zustand
|
||||
oView.GridControl.BeginInvoke(New Action(
|
||||
Sub()
|
||||
Try
|
||||
If Not oView.IsValidRowHandle(oRowHandle) Then Return
|
||||
|
||||
For Each oSqlColumnName As String In oSqlColumnsToRefresh
|
||||
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 = oView.GetRowCellValue(oRowHandle, 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, oView, oRowHandle)
|
||||
_Logger.Debug("[FormulaSql] Executing SQL for [{0}]: [{1}]", oSqlColumnName, resolvedSql)
|
||||
|
||||
Try
|
||||
Dim oResultTable As DataTable = DatabaseFallback.GetDatatable(
|
||||
New GetDatatableOptions(resolvedSql, DatabaseType.ECM))
|
||||
|
||||
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
|
||||
oView.SetRowCellValue(oRowHandle, oSqlColumnName,
|
||||
If(oResult Is Nothing OrElse IsDBNull(oResult), DBNull.Value, oResult))
|
||||
oView.RefreshRowCell(oRowHandle, oView.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))
|
||||
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
End Try
|
||||
End Sub
|
||||
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
|
||||
End If
|
||||
' *** NEU: Bei Formel-Refresh überspringen ***
|
||||
If _isRefreshingFormula Then
|
||||
_Logger.Debug("Skipping HandleInheritedColumnValue during formula refresh.")
|
||||
Return
|
||||
End If
|
||||
|
||||
If isApplyingInheritedValue OrElse pArgs.RowHandle = DevExpress.XtraGrid.GridControl.InvalidRowHandle Then
|
||||
Return
|
||||
@@ -579,16 +1316,7 @@ Namespace ControlCreator
|
||||
|
||||
Return entry
|
||||
End Function
|
||||
Private Sub View_CustomColumnDisplayText(ByVal eSender As Object, ByVal e As CustomColumnDisplayTextEventArgs)
|
||||
If IsNothing(e.Value) Then
|
||||
Exit Sub
|
||||
End If
|
||||
Dim view As GridView = eSender
|
||||
'Dim view As GridView = TryCast(GridView1, GridView)
|
||||
If e.Column.FieldName = "SpalteCurrency" Then
|
||||
' e.DisplayText = e.Value.ToString().Replace("€", "CHF")
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub View_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs)
|
||||
Dim view As GridView = TryCast(sender, GridView)
|
||||
Dim oFocusedColumn As GridColumn = view.FocusedColumn
|
||||
@@ -642,28 +1370,12 @@ Namespace ControlCreator
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub View_ShowingEditor(sender As Object, e As CancelEventArgs)
|
||||
Dim view As GridView = TryCast(sender, GridView)
|
||||
_Logger.Debug("Showing editor.")
|
||||
If view.IsNewItemRow(view.FocusedRowHandle) AndAlso Not newRowModified Then
|
||||
_Logger.Debug("Adding new row.")
|
||||
view.AddNewRow()
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub View_ShownEditor(sender As Object, e As EventArgs)
|
||||
Dim view As GridView = TryCast(sender, GridView)
|
||||
If view.IsNewItemRow(view.FocusedRowHandle) Then
|
||||
_Logger.Debug("Attaching Modified Handler.")
|
||||
AddHandler view.ActiveEditor.Modified, Sub()
|
||||
_Logger.Debug("Row was modified.")
|
||||
newRowModified = True
|
||||
End Sub
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub View_ValidateRow(sender As Object, e As ValidateRowEventArgs)
|
||||
Dim view As GridView = TryCast(sender, GridView)
|
||||
' RowHandle für RowUpdated merken, bevor er sich nach dem Commit ändert
|
||||
|
||||
If view.IsNewItemRow(e.RowHandle) AndAlso Not newRowModified Then
|
||||
_Logger.Debug("Deleting unused row")
|
||||
view.DeleteRow(e.RowHandle)
|
||||
|
||||
78
app/TaskFlow/DD_DMSLiteDataSet.Designer.vb
generated
78
app/TaskFlow/DD_DMSLiteDataSet.Designer.vb
generated
@@ -5466,6 +5466,8 @@ Partial Public Class DD_DMSLiteDataSet
|
||||
|
||||
Private columnFORMULA_EXPRESSION As Global.System.Data.DataColumn
|
||||
|
||||
Private columnFORMULA_SQL As Global.System.Data.DataColumn
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")> _
|
||||
Public Sub New()
|
||||
@@ -5709,6 +5711,14 @@ Partial Public Class DD_DMSLiteDataSet
|
||||
End Get
|
||||
End Property
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")> _
|
||||
Public ReadOnly Property FORMULA_SQLColumn() As Global.System.Data.DataColumn
|
||||
Get
|
||||
Return Me.columnFORMULA_SQL
|
||||
End Get
|
||||
End Property
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0"), _
|
||||
Global.System.ComponentModel.Browsable(false)> _
|
||||
@@ -5771,9 +5781,10 @@ Partial Public Class DD_DMSLiteDataSet
|
||||
ByVal TYPE_COLUMN As String, _
|
||||
ByVal LU_CAPTION As String, _
|
||||
ByVal INHERIT_VALUE As Boolean, _
|
||||
ByVal FORMULA_EXPRESSION As String) As TBPM_CONTROL_TABLERow
|
||||
ByVal FORMULA_EXPRESSION As String, _
|
||||
ByVal FORMULA_SQL As String) As TBPM_CONTROL_TABLERow
|
||||
Dim rowTBPM_CONTROL_TABLERow As TBPM_CONTROL_TABLERow = CType(Me.NewRow,TBPM_CONTROL_TABLERow)
|
||||
Dim columnValuesArray() As Object = New Object() {Nothing, Nothing, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION, CHOICE_LIST, CONNECTION_ID, SQL_COMMAND, READ_ONLY, LOAD_IDX_VALUE, ADDED_WHO, ADDED_WHEN, CHANGED_WHO, CHANGED_WHEN, REGEX_MATCH, REGEX_MESSAGE_EN, REGEX_MESSAGE_DE, SEQUENCE, DEFAULT_VALUE, ADVANCED_LOOKUP, SUMMARY_FUNCTION, TYPE_COLUMN, LU_CAPTION, INHERIT_VALUE, FORMULA_EXPRESSION}
|
||||
Dim columnValuesArray() As Object = New Object() {Nothing, Nothing, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION, CHOICE_LIST, CONNECTION_ID, SQL_COMMAND, READ_ONLY, LOAD_IDX_VALUE, ADDED_WHO, ADDED_WHEN, CHANGED_WHO, CHANGED_WHEN, REGEX_MATCH, REGEX_MESSAGE_EN, REGEX_MESSAGE_DE, SEQUENCE, DEFAULT_VALUE, ADVANCED_LOOKUP, SUMMARY_FUNCTION, TYPE_COLUMN, LU_CAPTION, INHERIT_VALUE, FORMULA_EXPRESSION, FORMULA_SQL}
|
||||
If (Not (parentTBPM_PROFILE_CONTROLSRowByFK_TBPM_CONTROL_TABLE_CONTROL1) Is Nothing) Then
|
||||
columnValuesArray(1) = parentTBPM_PROFILE_CONTROLSRowByFK_TBPM_CONTROL_TABLE_CONTROL1(0)
|
||||
End If
|
||||
@@ -5831,6 +5842,7 @@ Partial Public Class DD_DMSLiteDataSet
|
||||
Me.columnLU_CAPTION = MyBase.Columns("LU_CAPTION")
|
||||
Me.columnINHERIT_VALUE = MyBase.Columns("INHERIT_VALUE")
|
||||
Me.columnFORMULA_EXPRESSION = MyBase.Columns("FORMULA_EXPRESSION")
|
||||
Me.columnFORMULA_SQL = MyBase.Columns("FORMULA_SQL")
|
||||
End Sub
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
@@ -5888,6 +5900,8 @@ Partial Public Class DD_DMSLiteDataSet
|
||||
MyBase.Columns.Add(Me.columnINHERIT_VALUE)
|
||||
Me.columnFORMULA_EXPRESSION = New Global.System.Data.DataColumn("FORMULA_EXPRESSION", GetType(String), Nothing, Global.System.Data.MappingType.Element)
|
||||
MyBase.Columns.Add(Me.columnFORMULA_EXPRESSION)
|
||||
Me.columnFORMULA_SQL = New Global.System.Data.DataColumn("FORMULA_SQL", GetType(String), Nothing, Global.System.Data.MappingType.Element)
|
||||
MyBase.Columns.Add(Me.columnFORMULA_SQL)
|
||||
Me.Constraints.Add(New Global.System.Data.UniqueConstraint("Constraint1", New Global.System.Data.DataColumn() {Me.columnGUID}, true))
|
||||
Me.columnGUID.AutoIncrement = true
|
||||
Me.columnGUID.AllowDBNull = false
|
||||
@@ -5931,7 +5945,11 @@ Partial Public Class DD_DMSLiteDataSet
|
||||
Me.columnINHERIT_VALUE.AllowDBNull = false
|
||||
Me.columnINHERIT_VALUE.DefaultValue = CType(false,Boolean)
|
||||
Me.columnFORMULA_EXPRESSION.AllowDBNull = false
|
||||
Me.columnFORMULA_EXPRESSION.DefaultValue = CType("",String)
|
||||
Me.columnFORMULA_EXPRESSION.MaxLength = 1000
|
||||
Me.columnFORMULA_SQL.AllowDBNull = false
|
||||
Me.columnFORMULA_SQL.DefaultValue = CType("",String)
|
||||
Me.columnFORMULA_SQL.MaxLength = 3000
|
||||
End Sub
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
@@ -13227,6 +13245,17 @@ Partial Public Class DD_DMSLiteDataSet
|
||||
End Set
|
||||
End Property
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")> _
|
||||
Public Property FORMULA_SQL() As String
|
||||
Get
|
||||
Return CType(Me(Me.tableTBPM_CONTROL_TABLE.FORMULA_SQLColumn),String)
|
||||
End Get
|
||||
Set
|
||||
Me(Me.tableTBPM_CONTROL_TABLE.FORMULA_SQLColumn) = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")> _
|
||||
Public Property TBPM_PROFILE_CONTROLSRow() As TBPM_PROFILE_CONTROLSRow
|
||||
@@ -21535,6 +21564,7 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
tableMapping.ColumnMappings.Add("LU_CAPTION", "LU_CAPTION")
|
||||
tableMapping.ColumnMappings.Add("INHERIT_VALUE", "INHERIT_VALUE")
|
||||
tableMapping.ColumnMappings.Add("FORMULA_EXPRESSION", "FORMULA_EXPRESSION")
|
||||
tableMapping.ColumnMappings.Add("FORMULA_SQL", "FORMULA_SQL")
|
||||
Me._adapter.TableMappings.Add(tableMapping)
|
||||
Me._adapter.DeleteCommand = New Global.System.Data.SqlClient.SqlCommand()
|
||||
Me._adapter.DeleteCommand.Connection = Me.Connection
|
||||
@@ -21572,12 +21602,12 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
"ENCE = @SEQUENCE, DEFAULT_VALUE = @DEFAULT_VALUE, ADVANCED_LOOKUP = @ADVANCED_LO"& _
|
||||
"OKUP, SAVE_CHANGE_ON_ENABLED = @SAVE_CHANGE_ON_ENABLED, INHERIT_VALUE = @INHERIT"& _
|
||||
"_VALUE, "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" LU_CAPTION = @LU_CAPTION, FORMULA_EXPRESSION "& _
|
||||
"= @FORMULA_EXPRESSION"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHERE (GUID = @Original_GUID); "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"SELECT GUID, "& _
|
||||
"CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION, CHOICE_LIST,"& _
|
||||
" CONNECTION_ID, SQL_COMMAND, READ_ONLY, LOAD_IDX_VALUE, ADDED_WHO, ADDED_WHEN, C"& _
|
||||
"HANGED_WHO, CHANGED_WHEN, REGEX_MATCH, REGEX_MESSAGE_EN, REGEX_MESSAGE_DE, SEQUE"& _
|
||||
"NCE, DEFAULT_VALUE, ADVANCED_LOOKUP FROM TBPM_CONTROL_TABLE WHERE (GUID = @GUID)"& _
|
||||
""
|
||||
"= @FORMULA_EXPRESSION, FORMULA_SQL = @FORMULA_SQL"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHERE (GUID = @Origina"& _
|
||||
"l_GUID); "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"SELECT GUID, CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBRE"& _
|
||||
"ITE, VALIDATION, CHOICE_LIST, CONNECTION_ID, SQL_COMMAND, READ_ONLY, LOAD_IDX_VA"& _
|
||||
"LUE, ADDED_WHO, ADDED_WHEN, CHANGED_WHO, CHANGED_WHEN, REGEX_MATCH, REGEX_MESSAG"& _
|
||||
"E_EN, REGEX_MESSAGE_DE, SEQUENCE, DEFAULT_VALUE, ADVANCED_LOOKUP FROM TBPM_CONTR"& _
|
||||
"OL_TABLE WHERE (GUID = @GUID)"
|
||||
Me._adapter.UpdateCommand.CommandType = Global.System.Data.CommandType.Text
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@CONTROL_ID", Global.System.Data.SqlDbType.Int, 4, Global.System.Data.ParameterDirection.Input, 0, 0, "CONTROL_ID", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@SPALTENNAME", Global.System.Data.SqlDbType.VarChar, 100, Global.System.Data.ParameterDirection.Input, 0, 0, "SPALTENNAME", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
@@ -21603,6 +21633,7 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@INHERIT_VALUE", Global.System.Data.SqlDbType.Bit, 1, Global.System.Data.ParameterDirection.Input, 0, 0, "INHERIT_VALUE", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@LU_CAPTION", Global.System.Data.SqlDbType.VarChar, 150, Global.System.Data.ParameterDirection.Input, 0, 0, "LU_CAPTION", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@FORMULA_EXPRESSION", Global.System.Data.SqlDbType.NVarChar, 1000, Global.System.Data.ParameterDirection.Input, 0, 0, "FORMULA_EXPRESSION", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@FORMULA_SQL", Global.System.Data.SqlDbType.NVarChar, 3000, Global.System.Data.ParameterDirection.Input, 0, 0, "FORMULA_SQL", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@Original_GUID", Global.System.Data.SqlDbType.Int, 4, Global.System.Data.ParameterDirection.Input, 0, 0, "GUID", Global.System.Data.DataRowVersion.Original, false, Nothing, "", "", ""))
|
||||
Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@GUID", Global.System.Data.SqlDbType.Int, 4, Global.System.Data.ParameterDirection.Input, 0, 0, "GUID", Global.System.Data.DataRowVersion.Original, false, Nothing, "", "", ""))
|
||||
End Sub
|
||||
@@ -21625,8 +21656,8 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
"_WHO, ADDED_WHEN, CHANGED_WHO, "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" CHANGED_WHEN, REGEX_MA"& _
|
||||
"TCH, REGEX_MESSAGE_EN, REGEX_MESSAGE_DE, SEQUENCE, DEFAULT_VALUE, ADVANCED_LOOKU"& _
|
||||
"P, SUMMARY_FUNCTION, TYPE_COLUMN, LU_CAPTION, INHERIT_VALUE, "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "& _
|
||||
" FORMULA_EXPRESSION"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"FROM TBPM_CONTROL_TABLE"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHERE (CO"& _
|
||||
"NTROL_ID = @CONTROL_ID)"
|
||||
" FORMULA_EXPRESSION, FORMULA_SQL"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"FROM TBPM_CONTROL_TABLE"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHE"& _
|
||||
"RE (CONTROL_ID = @CONTROL_ID)"
|
||||
Me._commandCollection(0).CommandType = Global.System.Data.CommandType.Text
|
||||
Me._commandCollection(0).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@CONTROL_ID", Global.System.Data.SqlDbType.Int, 4, Global.System.Data.ParameterDirection.Input, 0, 0, "CONTROL_ID", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(1) = New Global.System.Data.SqlClient.SqlCommand()
|
||||
@@ -21639,8 +21670,8 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
"E = @DEFAULT_VALUE, "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" SEQUENCE = @SEQUENCE, ADVANCED_LO"& _
|
||||
"OKUP = @ADVANCED_LOOKUP, SUMMARY_FUNCTION = @SUMMARY_FUNCTION, TYPE_COLUMN = @TY"& _
|
||||
"PE_COLUMN, LU_CAPTION = @LU_CAPTION, "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" INHERIT_VALUE = "& _
|
||||
"@INHERIT_VALUE, FORMULA_EXPRESSION = @FORMULA_EXPRESSION"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHERE (GUID = @"& _
|
||||
"Original_GUID)"
|
||||
"@INHERIT_VALUE, FORMULA_EXPRESSION = @FORMULA_EXPRESSION, FORMULA_SQL = @FORMULA"& _
|
||||
"_SQL"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHERE (GUID = @Original_GUID)"
|
||||
Me._commandCollection(1).CommandType = Global.System.Data.CommandType.Text
|
||||
Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@SPALTENNAME", Global.System.Data.SqlDbType.VarChar, 100, Global.System.Data.ParameterDirection.Input, 0, 0, "SPALTENNAME", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@SPALTEN_HEADER", Global.System.Data.SqlDbType.VarChar, 100, Global.System.Data.ParameterDirection.Input, 0, 0, "SPALTEN_HEADER", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
@@ -21660,6 +21691,7 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@LU_CAPTION", Global.System.Data.SqlDbType.VarChar, 150, Global.System.Data.ParameterDirection.Input, 0, 0, "LU_CAPTION", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@INHERIT_VALUE", Global.System.Data.SqlDbType.Bit, 1, Global.System.Data.ParameterDirection.Input, 0, 0, "INHERIT_VALUE", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@FORMULA_EXPRESSION", Global.System.Data.SqlDbType.NVarChar, 1000, Global.System.Data.ParameterDirection.Input, 0, 0, "FORMULA_EXPRESSION", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@FORMULA_SQL", Global.System.Data.SqlDbType.NVarChar, 3000, Global.System.Data.ParameterDirection.Input, 0, 0, "FORMULA_SQL", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@Original_GUID", Global.System.Data.SqlDbType.Int, 4, Global.System.Data.ParameterDirection.Input, 0, 0, "GUID", Global.System.Data.DataRowVersion.Original, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(2) = New Global.System.Data.SqlClient.SqlCommand()
|
||||
Me._commandCollection(2).Connection = Me.Connection
|
||||
@@ -21682,8 +21714,8 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
"D_ONLY, REGEX_MATCH, "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" REGEX_MESSAGE_DE, REGEX_MESSAGE_"& _
|
||||
"EN, SEQUENCE, SPALTENBREITE, SPALTENNAME, SPALTEN_HEADER, SQL_COMMAND, VALIDATIO"& _
|
||||
"N, SUMMARY_FUNCTION, TYPE_COLUMN, LU_CAPTION, INHERIT_VALUE, "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "& _
|
||||
" FORMULA_EXPRESSION"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"FROM TBPM_CONTROL_TABLE"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHERE (GU"& _
|
||||
"ID = @GUID)"
|
||||
" FORMULA_EXPRESSION, FORMULA_SQL"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"FROM TBPM_CONTROL_TABLE"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"WHE"& _
|
||||
"RE (GUID = @GUID)"
|
||||
Me._commandCollection(4).CommandType = Global.System.Data.CommandType.Text
|
||||
Me._commandCollection(4).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@GUID", Global.System.Data.SqlDbType.Int, 4, Global.System.Data.ParameterDirection.Input, 0, 0, "GUID", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
|
||||
Me._commandCollection(5) = New Global.System.Data.SqlClient.SqlCommand()
|
||||
@@ -21892,6 +21924,7 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
ByVal INHERIT_VALUE As Boolean, _
|
||||
ByVal LU_CAPTION As String, _
|
||||
ByVal FORMULA_EXPRESSION As String, _
|
||||
ByVal FORMULA_SQL As String, _
|
||||
ByVal Original_GUID As Integer, _
|
||||
ByVal GUID As Integer) As Integer
|
||||
Me.Adapter.UpdateCommand.Parameters(0).Value = CType(CONTROL_ID,Integer)
|
||||
@@ -21978,8 +22011,13 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
Else
|
||||
Me.Adapter.UpdateCommand.Parameters(23).Value = CType(FORMULA_EXPRESSION,String)
|
||||
End If
|
||||
Me.Adapter.UpdateCommand.Parameters(24).Value = CType(Original_GUID,Integer)
|
||||
Me.Adapter.UpdateCommand.Parameters(25).Value = CType(GUID,Integer)
|
||||
If (FORMULA_SQL Is Nothing) Then
|
||||
Throw New Global.System.ArgumentNullException("FORMULA_SQL")
|
||||
Else
|
||||
Me.Adapter.UpdateCommand.Parameters(24).Value = CType(FORMULA_SQL,String)
|
||||
End If
|
||||
Me.Adapter.UpdateCommand.Parameters(25).Value = CType(Original_GUID,Integer)
|
||||
Me.Adapter.UpdateCommand.Parameters(26).Value = CType(GUID,Integer)
|
||||
Dim previousConnectionState As Global.System.Data.ConnectionState = Me.Adapter.UpdateCommand.Connection.State
|
||||
If ((Me.Adapter.UpdateCommand.Connection.State And Global.System.Data.ConnectionState.Open) _
|
||||
<> Global.System.Data.ConnectionState.Open) Then
|
||||
@@ -22017,6 +22055,7 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
ByVal LU_CAPTION As String, _
|
||||
ByVal INHERIT_VALUE As Boolean, _
|
||||
ByVal FORMULA_EXPRESSION As String, _
|
||||
ByVal FORMULA_SQL As String, _
|
||||
ByVal Original_GUID As Integer) As Object
|
||||
Dim command As Global.System.Data.SqlClient.SqlCommand = Me.CommandCollection(1)
|
||||
If (SPALTENNAME Is Nothing) Then
|
||||
@@ -22081,7 +22120,12 @@ Namespace DD_DMSLiteDataSetTableAdapters
|
||||
Else
|
||||
command.Parameters(17).Value = CType(FORMULA_EXPRESSION,String)
|
||||
End If
|
||||
command.Parameters(18).Value = CType(Original_GUID,Integer)
|
||||
If (FORMULA_SQL Is Nothing) Then
|
||||
Throw New Global.System.ArgumentNullException("FORMULA_SQL")
|
||||
Else
|
||||
command.Parameters(18).Value = CType(FORMULA_SQL,String)
|
||||
End If
|
||||
command.Parameters(19).Value = CType(Original_GUID,Integer)
|
||||
Dim previousConnectionState As Global.System.Data.ConnectionState = command.Connection.State
|
||||
If ((command.Connection.State And Global.System.Data.ConnectionState.Open) _
|
||||
<> Global.System.Data.ConnectionState.Open) Then
|
||||
|
||||
@@ -56,32 +56,24 @@
|
||||
<TableUISetting Name="TBPM_CONTROL_TABLE">
|
||||
<ColumnUISettings>
|
||||
<ColumnUISetting Name="ADDED_WHO">
|
||||
<ControlSettings>
|
||||
<ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form">
|
||||
<ControlSettings><ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
||||
<BindableControlInfo Name="TextBox" Type="System.Windows.Forms.TextBox" AssemblyName="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
</ControlSetting>
|
||||
</ControlSettings>
|
||||
</ControlSetting></ControlSettings>
|
||||
</ColumnUISetting>
|
||||
<ColumnUISetting Name="ADDED_WHEN">
|
||||
<ControlSettings>
|
||||
<ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form">
|
||||
<ControlSettings><ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
||||
<BindableControlInfo Name="TextBox" Type="System.Windows.Forms.TextBox" AssemblyName="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
</ControlSetting>
|
||||
</ControlSettings>
|
||||
</ControlSetting></ControlSettings>
|
||||
</ColumnUISetting>
|
||||
<ColumnUISetting Name="CHANGED_WHEN">
|
||||
<ControlSettings>
|
||||
<ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form">
|
||||
<ControlSettings><ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
||||
<BindableControlInfo Name="TextBox" Type="System.Windows.Forms.TextBox" AssemblyName="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
</ControlSetting>
|
||||
</ControlSettings>
|
||||
</ControlSetting></ControlSettings>
|
||||
</ColumnUISetting>
|
||||
<ColumnUISetting Name="TYPE_COLUMN">
|
||||
<ControlSettings>
|
||||
<ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form">
|
||||
<ControlSettings><ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
|
||||
<BindableControlInfo Name="ComboBox" Type="System.Windows.Forms.ComboBox" AssemblyName="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
</ControlSetting>
|
||||
</ControlSettings>
|
||||
</ControlSetting></ControlSettings>
|
||||
</ColumnUISetting>
|
||||
</ColumnUISettings>
|
||||
</TableUISetting>
|
||||
|
||||
@@ -1319,7 +1319,7 @@ SELECT GUID, CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION,
|
||||
<DbCommand CommandType="Text" ModifiedByUser="false">
|
||||
<CommandText>SELECT GUID, CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION, CHOICE_LIST, CONNECTION_ID, SQL_COMMAND, READ_ONLY, LOAD_IDX_VALUE, ADDED_WHO, ADDED_WHEN, CHANGED_WHO,
|
||||
CHANGED_WHEN, REGEX_MATCH, REGEX_MESSAGE_EN, REGEX_MESSAGE_DE, SEQUENCE, DEFAULT_VALUE, ADVANCED_LOOKUP, SUMMARY_FUNCTION, TYPE_COLUMN, LU_CAPTION, INHERIT_VALUE,
|
||||
FORMULA_EXPRESSION
|
||||
FORMULA_EXPRESSION, FORMULA_SQL
|
||||
FROM TBPM_CONTROL_TABLE
|
||||
WHERE (CONTROL_ID = @CONTROL_ID)</CommandText>
|
||||
<Parameters>
|
||||
@@ -1334,7 +1334,7 @@ SET CONTROL_ID = @CONTROL_ID, SPALTENNAME = @SPALTENNAME, SPALTEN
|
||||
CONNECTION_ID = @CONNECTION_ID, SQL_COMMAND = @SQL_COMMAND, READ_ONLY = @READ_ONLY, LOAD_IDX_VALUE = @LOAD_IDX_VALUE, ADDED_WHO = @ADDED_WHO, ADDED_WHEN = @ADDED_WHEN,
|
||||
CHANGED_WHO = @CHANGED_WHO, CHANGED_WHEN = @CHANGED_WHEN, REGEX_MATCH = @REGEX_MATCH, REGEX_MESSAGE_EN = @REGEX_MESSAGE_EN, REGEX_MESSAGE_DE = @REGEX_MESSAGE_DE,
|
||||
SEQUENCE = @SEQUENCE, DEFAULT_VALUE = @DEFAULT_VALUE, ADVANCED_LOOKUP = @ADVANCED_LOOKUP, SAVE_CHANGE_ON_ENABLED = @SAVE_CHANGE_ON_ENABLED, INHERIT_VALUE = @INHERIT_VALUE,
|
||||
LU_CAPTION = @LU_CAPTION, FORMULA_EXPRESSION = @FORMULA_EXPRESSION
|
||||
LU_CAPTION = @LU_CAPTION, FORMULA_EXPRESSION = @FORMULA_EXPRESSION, FORMULA_SQL = @FORMULA_SQL
|
||||
WHERE (GUID = @Original_GUID);
|
||||
SELECT GUID, CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION, CHOICE_LIST, CONNECTION_ID, SQL_COMMAND, READ_ONLY, LOAD_IDX_VALUE, ADDED_WHO, ADDED_WHEN, CHANGED_WHO, CHANGED_WHEN, REGEX_MATCH, REGEX_MESSAGE_EN, REGEX_MESSAGE_DE, SEQUENCE, DEFAULT_VALUE, ADVANCED_LOOKUP FROM TBPM_CONTROL_TABLE WHERE (GUID = @GUID)</CommandText>
|
||||
<Parameters>
|
||||
@@ -1362,6 +1362,7 @@ SELECT GUID, CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION,
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="INHERIT_VALUE" ColumnName="INHERIT_VALUE" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="bit" DbType="Boolean" Direction="Input" ParameterName="@INHERIT_VALUE" Precision="0" ProviderType="Bit" Scale="0" Size="1" SourceColumn="INHERIT_VALUE" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="LU_CAPTION" ColumnName="LU_CAPTION" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="varchar(150)" DbType="AnsiString" Direction="Input" ParameterName="@LU_CAPTION" Precision="0" ProviderType="VarChar" Scale="0" Size="150" SourceColumn="LU_CAPTION" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="FORMULA_EXPRESSION" ColumnName="FORMULA_EXPRESSION" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="nvarchar(1000)" DbType="String" Direction="Input" ParameterName="@FORMULA_EXPRESSION" Precision="0" ProviderType="NVarChar" Scale="0" Size="1000" SourceColumn="FORMULA_EXPRESSION" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="FORMULA_SQL" ColumnName="FORMULA_SQL" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="nvarchar(3000)" DbType="String" Direction="Input" ParameterName="@FORMULA_SQL" Precision="0" ProviderType="NVarChar" Scale="0" Size="3000" SourceColumn="FORMULA_SQL" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="Original_GUID" ColumnName="GUID" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@Original_GUID" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="GUID" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="GUID" ColumnName="GUID" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@GUID" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="GUID" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
</Parameters>
|
||||
@@ -1396,6 +1397,7 @@ SELECT GUID, CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION,
|
||||
<Mapping SourceColumn="LU_CAPTION" DataSetColumn="LU_CAPTION" />
|
||||
<Mapping SourceColumn="INHERIT_VALUE" DataSetColumn="INHERIT_VALUE" />
|
||||
<Mapping SourceColumn="FORMULA_EXPRESSION" DataSetColumn="FORMULA_EXPRESSION" />
|
||||
<Mapping SourceColumn="FORMULA_SQL" DataSetColumn="FORMULA_SQL" />
|
||||
</Mappings>
|
||||
<Sources>
|
||||
<DbSource ConnectionRef="ConnectionString (MySettings)" DbObjectName="DD_ECM_TEST.dbo.TBPM_CONTROL_TABLE" DbObjectType="Table" GenerateShortCommands="true" GeneratorSourceName="cmdUpdate" Modifier="Public" Name="cmdUpdate" QueryType="Scalar" ScalarCallRetval="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetDataBy" UserSourceName="cmdUpdate">
|
||||
@@ -1405,7 +1407,7 @@ SELECT GUID, CONTROL_ID, SPALTENNAME, SPALTEN_HEADER, SPALTENBREITE, VALIDATION,
|
||||
SET SPALTENNAME = @SPALTENNAME, SPALTEN_HEADER = @SPALTEN_HEADER, SPALTENBREITE = @SPALTENBREITE, VALIDATION = @VALIDATION, READ_ONLY = @READ_ONLY, LOAD_IDX_VALUE = @LOAD_IDX_VALUE,
|
||||
CHANGED_WHO = @CHANGED_WHO, REGEX_MATCH = @REGEX_MATCH, REGEX_MESSAGE_EN = @REGEX_MESSAGE_EN, REGEX_MESSAGE_DE = @REGEX_MESSAGE_DE, DEFAULT_VALUE = @DEFAULT_VALUE,
|
||||
SEQUENCE = @SEQUENCE, ADVANCED_LOOKUP = @ADVANCED_LOOKUP, SUMMARY_FUNCTION = @SUMMARY_FUNCTION, TYPE_COLUMN = @TYPE_COLUMN, LU_CAPTION = @LU_CAPTION,
|
||||
INHERIT_VALUE = @INHERIT_VALUE, FORMULA_EXPRESSION = @FORMULA_EXPRESSION
|
||||
INHERIT_VALUE = @INHERIT_VALUE, FORMULA_EXPRESSION = @FORMULA_EXPRESSION, FORMULA_SQL = @FORMULA_SQL
|
||||
WHERE (GUID = @Original_GUID)</CommandText>
|
||||
<Parameters>
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="SPALTENNAME" ColumnName="SPALTENNAME" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="varchar(100)" DbType="AnsiString" Direction="Input" ParameterName="@SPALTENNAME" Precision="0" ProviderType="VarChar" Scale="0" Size="100" SourceColumn="SPALTENNAME" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
@@ -1426,6 +1428,7 @@ WHERE (GUID = @Original_GUID)</CommandText>
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="LU_CAPTION" ColumnName="LU_CAPTION" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="varchar(150)" DbType="AnsiString" Direction="Input" ParameterName="@LU_CAPTION" Precision="0" ProviderType="VarChar" Scale="0" Size="150" SourceColumn="LU_CAPTION" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="INHERIT_VALUE" ColumnName="INHERIT_VALUE" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="bit" DbType="Boolean" Direction="Input" ParameterName="@INHERIT_VALUE" Precision="0" ProviderType="Bit" Scale="0" Size="1" SourceColumn="INHERIT_VALUE" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="FORMULA_EXPRESSION" ColumnName="FORMULA_EXPRESSION" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="nvarchar(1000)" DbType="String" Direction="Input" ParameterName="@FORMULA_EXPRESSION" Precision="0" ProviderType="NVarChar" Scale="0" Size="1000" SourceColumn="FORMULA_EXPRESSION" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="FORMULA_SQL" ColumnName="FORMULA_SQL" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="nvarchar(3000)" DbType="String" Direction="Input" ParameterName="@FORMULA_SQL" Precision="0" ProviderType="NVarChar" Scale="0" Size="3000" SourceColumn="FORMULA_SQL" SourceColumnNullMapping="false" SourceVersion="Current" />
|
||||
<Parameter AllowDbNull="false" AutogeneratedName="Original_GUID" ColumnName="GUID" DataSourceName="DD_ECM.dbo.TBPM_CONTROL_TABLE" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@Original_GUID" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="GUID" SourceColumnNullMapping="false" SourceVersion="Original" />
|
||||
</Parameters>
|
||||
</DbCommand>
|
||||
@@ -1458,7 +1461,7 @@ FROM TBPM_CONTROL_TABLE</CommandText>
|
||||
<DbCommand CommandType="Text" ModifiedByUser="true">
|
||||
<CommandText>SELECT ADDED_WHEN, ADDED_WHO, ADVANCED_LOOKUP, CHANGED_WHEN, CHANGED_WHO, CHOICE_LIST, CONNECTION_ID, CONTROL_ID, DEFAULT_VALUE, GUID, LOAD_IDX_VALUE, READ_ONLY, REGEX_MATCH,
|
||||
REGEX_MESSAGE_DE, REGEX_MESSAGE_EN, SEQUENCE, SPALTENBREITE, SPALTENNAME, SPALTEN_HEADER, SQL_COMMAND, VALIDATION, SUMMARY_FUNCTION, TYPE_COLUMN, LU_CAPTION, INHERIT_VALUE,
|
||||
FORMULA_EXPRESSION
|
||||
FORMULA_EXPRESSION, FORMULA_SQL
|
||||
FROM TBPM_CONTROL_TABLE
|
||||
WHERE (GUID = @GUID)</CommandText>
|
||||
<Parameters>
|
||||
@@ -2812,13 +2815,20 @@ SELECT GUID, NAME, TITLE, PRIORITY, DESCRIPTION, ACTIVE, WD_SEARCH, NO_OF_DOCUME
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="INHERIT_VALUE" msprop:Generator_ColumnPropNameInTable="INHERIT_VALUEColumn" msprop:Generator_ColumnPropNameInRow="INHERIT_VALUE" msprop:Generator_UserColumnName="INHERIT_VALUE" msprop:Generator_ColumnVarNameInTable="columnINHERIT_VALUE" type="xs:boolean" default="false" />
|
||||
<xs:element name="FORMULA_EXPRESSION" msprop:Generator_ColumnPropNameInTable="FORMULA_EXPRESSIONColumn" msprop:Generator_ColumnPropNameInRow="FORMULA_EXPRESSION" msprop:Generator_UserColumnName="FORMULA_EXPRESSION" msprop:Generator_ColumnVarNameInTable="columnFORMULA_EXPRESSION">
|
||||
<xs:element name="FORMULA_EXPRESSION" msprop:Generator_ColumnPropNameInTable="FORMULA_EXPRESSIONColumn" msprop:Generator_ColumnPropNameInRow="FORMULA_EXPRESSION" msprop:Generator_UserColumnName="FORMULA_EXPRESSION" msprop:Generator_ColumnVarNameInTable="columnFORMULA_EXPRESSION" default="">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="1000" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
<xs:element name="FORMULA_SQL" msprop:Generator_ColumnPropNameInRow="FORMULA_SQL" msprop:Generator_ColumnPropNameInTable="FORMULA_SQLColumn" msprop:Generator_ColumnVarNameInTable="columnFORMULA_SQL" msprop:Generator_UserColumnName="FORMULA_SQL" default="">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:maxLength value="3000" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
@@ -3405,9 +3415,9 @@ SELECT GUID, NAME, TITLE, PRIORITY, DESCRIPTION, ACTIVE, WD_SEARCH, NO_OF_DOCUME
|
||||
</xs:element>
|
||||
<xs:annotation>
|
||||
<xs:appinfo>
|
||||
<msdata:Relationship name="FK_TBPM_CONTROL_TABLE_CONTROL1" msdata:parent="TBPM_PROFILE_CONTROLS" msdata:child="TBPM_CONTROL_TABLE" msdata:parentkey="GUID" msdata:childkey="CONTROL_ID" msprop:Generator_UserParentTable="TBPM_PROFILE_CONTROLS" msprop:Generator_UserChildTable="TBPM_CONTROL_TABLE" msprop:Generator_RelationVarName="relationFK_TBPM_CONTROL_TABLE_CONTROL1" msprop:Generator_ChildPropName="GetTBPM_CONTROL_TABLERows" msprop:Generator_UserRelationName="FK_TBPM_CONTROL_TABLE_CONTROL1" msprop:Generator_ParentPropName="TBPM_PROFILE_CONTROLSRow" />
|
||||
<msdata:Relationship name="FK_TBPM_CONTROL_TABLE_CONTROL" msdata:parent="TBWH_CHECK_PROFILE_CONTROLS" msdata:child="TBPM_CONTROL_TABLE" msdata:parentkey="GUID" msdata:childkey="CONTROL_ID" msprop:Generator_UserParentTable="TBWH_CHECK_PROFILE_CONTROLS" msprop:Generator_UserChildTable="TBPM_CONTROL_TABLE" msprop:Generator_RelationVarName="relationFK_TBPM_CONTROL_TABLE_CONTROL" msprop:Generator_ChildPropName="GetTBPM_CONTROL_TABLERows" msprop:Generator_ParentPropName="TBWH_CHECK_PROFILE_CONTROLSRow" msprop:Generator_UserRelationName="FK_TBPM_CONTROL_TABLE_CONTROL" />
|
||||
<msdata:Relationship name="FK_TBPM_PROFILE_CONTROLS_PROFILE" msdata:parent="TBPM_PROFILE" msdata:child="TBPM_PROFILE_CONTROLS" msdata:parentkey="GUID" msdata:childkey="PROFIL_ID" msprop:Generator_UserParentTable="TBPM_PROFILE" msprop:Generator_UserChildTable="TBPM_PROFILE_CONTROLS" msprop:Generator_RelationVarName="relationFK_TBPM_PROFILE_CONTROLS_PROFILE" msprop:Generator_ChildPropName="GetTBPM_PROFILE_CONTROLSRows" msprop:Generator_ParentPropName="TBPM_PROFILERow" msprop:Generator_UserRelationName="FK_TBPM_PROFILE_CONTROLS_PROFILE" />
|
||||
<msdata:Relationship name="FK_TBPM_CONTROL_TABLE_CONTROL1" msdata:parent="TBPM_PROFILE_CONTROLS" msdata:child="TBPM_CONTROL_TABLE" msdata:parentkey="GUID" msdata:childkey="CONTROL_ID" msprop:Generator_UserParentTable="TBPM_PROFILE_CONTROLS" msprop:Generator_UserChildTable="TBPM_CONTROL_TABLE" msprop:Generator_RelationVarName="relationFK_TBPM_CONTROL_TABLE_CONTROL1" msprop:Generator_ChildPropName="GetTBPM_CONTROL_TABLERows" msprop:Generator_ParentPropName="TBPM_PROFILE_CONTROLSRow" msprop:Generator_UserRelationName="FK_TBPM_CONTROL_TABLE_CONTROL1" />
|
||||
<msdata:Relationship name="FK_TBPM_CONTROL_TABLE_CONTROL" msdata:parent="TBWH_CHECK_PROFILE_CONTROLS" msdata:child="TBPM_CONTROL_TABLE" msdata:parentkey="GUID" msdata:childkey="CONTROL_ID" msprop:Generator_UserParentTable="TBWH_CHECK_PROFILE_CONTROLS" msprop:Generator_UserChildTable="TBPM_CONTROL_TABLE" msprop:Generator_RelationVarName="relationFK_TBPM_CONTROL_TABLE_CONTROL" msprop:Generator_ChildPropName="GetTBPM_CONTROL_TABLERows" msprop:Generator_UserRelationName="FK_TBPM_CONTROL_TABLE_CONTROL" msprop:Generator_ParentPropName="TBWH_CHECK_PROFILE_CONTROLSRow" />
|
||||
<msdata:Relationship name="FK_TBPM_PROFILE_CONTROLS_PROFILE" msdata:parent="TBPM_PROFILE" msdata:child="TBPM_PROFILE_CONTROLS" msdata:parentkey="GUID" msdata:childkey="PROFIL_ID" msprop:Generator_UserParentTable="TBPM_PROFILE" msprop:Generator_UserChildTable="TBPM_PROFILE_CONTROLS" msprop:Generator_RelationVarName="relationFK_TBPM_PROFILE_CONTROLS_PROFILE" msprop:Generator_ChildPropName="GetTBPM_PROFILE_CONTROLSRows" msprop:Generator_UserRelationName="FK_TBPM_PROFILE_CONTROLS_PROFILE" msprop:Generator_ParentPropName="TBPM_PROFILERow" />
|
||||
</xs:appinfo>
|
||||
</xs:annotation>
|
||||
</xs:schema>
|
||||
@@ -4,7 +4,7 @@
|
||||
Changes to this file may cause incorrect behavior and will be lost if
|
||||
the code is regenerated.
|
||||
</autogenerated>-->
|
||||
<DiagramLayout xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ex:showrelationlabel="False" ViewPortX="472" ViewPortY="129" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<DiagramLayout xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ex:showrelationlabel="False" ViewPortX="472" ViewPortY="90" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
|
||||
<Shapes>
|
||||
<Shape ID="DesignTable:TBPM_PROFILE_FINAL_INDEXING" ZOrder="14" X="1688" Y="-74" Height="324" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="197" />
|
||||
<Shape ID="DesignTable:TBPM_KONFIGURATION" ZOrder="2" X="-17" Y="232" Height="262" Width="158" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="97" />
|
||||
|
||||
@@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices
|
||||
<Assembly: AssemblyDescription("")>
|
||||
<Assembly: AssemblyCompany("Digital Data")>
|
||||
<Assembly: AssemblyProduct("taskFLOW")>
|
||||
<Assembly: AssemblyCopyright("Copyright © Digital Data 2025")>
|
||||
<Assembly: AssemblyCopyright("Digital Data 2026")>
|
||||
<Assembly: AssemblyTrademark("")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
@@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices
|
||||
' übernehmen, indem Sie "*" eingeben:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("2.8.2.0")>
|
||||
<Assembly: AssemblyVersion("2.8.6.0")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.0")>
|
||||
<Assembly: NeutralResourcesLanguage("")>
|
||||
|
||||
@@ -1280,6 +1280,7 @@
|
||||
<None Include="Resources\PM_mit_slogan.JPG" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="taskFLOW-TEST-Debug.txt" />
|
||||
<None Include="Changelog.md" />
|
||||
<Content Include="DataColumnExpression.txt" />
|
||||
<Content Include="DD_Icons_ICO_PMANAGER_48px.ico" />
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
Imports System.Text.RegularExpressions
|
||||
Imports WINDREAMLib
|
||||
Imports DigitalData.Controls.LookupGrid
|
||||
Imports DevExpress.XtraGrid
|
||||
Imports DevExpress.XtraGrid.Views.Grid
|
||||
Imports DevExpress.XtraGrid.Columns
|
||||
Imports DevExpress.Xpo.Helpers.AssociatedCollectionCriteriaHelper
|
||||
Imports DevExpress.XtraEditors
|
||||
Imports DevExpress.XtraGrid
|
||||
Imports DevExpress.XtraGrid.Columns
|
||||
Imports DevExpress.XtraGrid.Views.Grid
|
||||
Imports DigitalData.Controls.LookupGrid
|
||||
Imports WINDREAMLib
|
||||
''' <summary>
|
||||
''' Defines common Functions for Checking for and replacing placeholders.
|
||||
''' This Class also includes a child class `Pattern` for passing around Patterns.
|
||||
@@ -75,7 +76,8 @@ Public Class clsPatterns
|
||||
''' Aktualisiert den Wert eines Controls im Cache
|
||||
''' </summary>
|
||||
Public Shared Sub UpdateControlInCache(controlName As String, newValue As Object)
|
||||
SyncLock _ControlLookupCache ' Thread-Safety
|
||||
' FIX: SyncLock auf Nothing ist illegal → GetType(clsPatterns) als stabilen Lock-Anker nutzen
|
||||
SyncLock GetType(clsPatterns)
|
||||
If _ControlLookupCache Is Nothing OrElse Not _ControlLookupCache.ContainsKey(controlName) Then
|
||||
LOGGER.Warn($"Control [{controlName}] not found in cache for update")
|
||||
Return
|
||||
@@ -98,8 +100,13 @@ Public Class clsPatterns
|
||||
lookup.Properties.SelectedValues = New List(Of String) From {newValue.ToString()}
|
||||
End If
|
||||
|
||||
Case GetType(Windows.Forms.ComboBox)
|
||||
DirectCast(ctrl, ComboBox).Text = newValue?.ToString()
|
||||
' ========== FIX START: Beide ComboBox-Typen unterstützen ==========
|
||||
Case GetType(System.Windows.Forms.ComboBox)
|
||||
DirectCast(ctrl, System.Windows.Forms.ComboBox).Text = newValue?.ToString()
|
||||
|
||||
Case GetType(DevExpress.XtraEditors.ComboBoxEdit)
|
||||
DirectCast(ctrl, DevExpress.XtraEditors.ComboBoxEdit).Text = newValue?.ToString()
|
||||
' ========== FIX END ==========
|
||||
|
||||
Case GetType(CheckBox)
|
||||
If TypeOf newValue Is Boolean Then
|
||||
@@ -130,12 +137,14 @@ Public Class clsPatterns
|
||||
Public Shared Sub UpdateMultipleControlsInCache(updates As Dictionary(Of String, Object))
|
||||
If updates Is Nothing OrElse updates.Count = 0 Then Return
|
||||
|
||||
SyncLock _ControlLookupCache
|
||||
For Each kvp In updates
|
||||
UpdateControlInCache(kvp.Key, kvp.Value)
|
||||
Next
|
||||
LOGGER.Debug($"Batch cache update completed for {updates.Count} controls")
|
||||
End SyncLock
|
||||
' FIX: Gleicher Lock-Anker wie UpdateControlInCache → kein Deadlock
|
||||
' Die eigentliche Aktualisierung läuft sequenziell über UpdateControlInCache,
|
||||
' da SyncLock in VB.NET re-entrant auf demselben Thread ist.
|
||||
For Each kvp In updates
|
||||
UpdateControlInCache(kvp.Key, kvp.Value)
|
||||
Next
|
||||
|
||||
LOGGER.Debug($"Batch cache update completed for {updates.Count} controls")
|
||||
End Sub
|
||||
''' <summary>
|
||||
''' Wraps a pattern-type and -value in the common format: {#type#value}
|
||||
@@ -145,34 +154,39 @@ Public Class clsPatterns
|
||||
End Function
|
||||
|
||||
Public Shared Function ReplaceAllValues(input As String, panel As DevExpress.XtraEditors.XtraScrollableControl, is_SQL As Boolean) As String
|
||||
Dim oResult = input
|
||||
Try
|
||||
Dim result = input
|
||||
|
||||
If Not HasAnyPatterns(result) Then
|
||||
Return result
|
||||
If Not HasAnyPatterns(oResult) Then
|
||||
Return oResult
|
||||
End If
|
||||
|
||||
LOGGER.Debug($"input BEFORE replacing: [{result}]")
|
||||
result = ReplaceInternalValues(result)
|
||||
LOGGER.Debug($"input BEFORE replacing: [{oResult}]")
|
||||
oResult = ReplaceInternalValues(oResult)
|
||||
|
||||
If Not IsNothing(CURRENT_WMFILE) Then
|
||||
result = ReplaceWindreamIndicies(result, CURRENT_WMFILE, is_SQL)
|
||||
oResult = ReplaceWindreamIndicies(oResult, CURRENT_WMFILE, is_SQL)
|
||||
End If
|
||||
If IDB_ACTIVE = True Then
|
||||
result = ReplaceIDBAttributes(result, is_SQL)
|
||||
oResult = ReplaceIDBAttributes(oResult, is_SQL)
|
||||
End If
|
||||
'vorher hinter result = ReplaceInternalValues(result)
|
||||
result = ReplaceControlValues(result, panel, is_SQL)
|
||||
oResult = ReplaceControlValues(oResult, panel, is_SQL)
|
||||
|
||||
If Not IsNothing(result) Then
|
||||
result = ReplaceUserValues(result)
|
||||
LOGGER.Debug($"input AFTER replacing: [{result}]")
|
||||
If Not IsNothing(oResult) Then
|
||||
oResult = ReplaceUserValues(oResult)
|
||||
LOGGER.Debug($"input AFTER replacing: [{oResult}]")
|
||||
End If
|
||||
|
||||
Return result
|
||||
Return oResult
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
LOGGER.Info("Error in ReplaceAllValues:" & ex.Message)
|
||||
LOGGER.Error($"❌ CRITICAL ERROR in ReplaceAllValues!")
|
||||
LOGGER.Error($" Input: [{input}]")
|
||||
LOGGER.Error($" Last successful result: [{oResult}]")
|
||||
LOGGER.Error($" Exception Type: [{ex.GetType().Name}]")
|
||||
LOGGER.Error($" Message: [{ex.Message}]")
|
||||
LOGGER.Error($" StackTrace: [{ex.StackTrace}]")
|
||||
Return input
|
||||
End Try
|
||||
End Function
|
||||
@@ -259,14 +273,23 @@ Public Class clsPatterns
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
LOGGER.Info("Error in ReplaceUserValues:" & ex.Message)
|
||||
Return input ' FIX: Originalwert zurückgeben statt implizit Nothing
|
||||
End Try
|
||||
End Function
|
||||
|
||||
Private Shared Sub RecursiveAddToCache(ctrl As Control, cache As Dictionary(Of String, Control))
|
||||
cache(ctrl.Name) = ctrl
|
||||
For Each child As Control In ctrl.Controls
|
||||
RecursiveAddToCache(child, cache)
|
||||
Next
|
||||
Private Shared Sub RecursiveAddToCache(rootCtrl As Control, cache As Dictionary(Of String, Control))
|
||||
Dim stack As New Stack(Of Control)()
|
||||
stack.Push(rootCtrl)
|
||||
|
||||
While stack.Count > 0
|
||||
Dim ctrl As Control = stack.Pop()
|
||||
If Not String.IsNullOrEmpty(ctrl.Name) Then
|
||||
cache(ctrl.Name) = ctrl
|
||||
End If
|
||||
For Each child As Control In ctrl.Controls
|
||||
stack.Push(child)
|
||||
Next
|
||||
End While
|
||||
End Sub
|
||||
Public Shared Function ReplaceControlValues(pInput As String, oPanel As DevExpress.XtraEditors.XtraScrollableControl, oIsSQL As Boolean) As String
|
||||
Dim oResult = pInput
|
||||
@@ -280,8 +303,9 @@ Public Class clsPatterns
|
||||
LOGGER.Debug($"Control cache initialized with {_ControlLookupCache.Count} controls")
|
||||
End If
|
||||
End SyncLock
|
||||
Try
|
||||
|
||||
Try
|
||||
LOGGER.Debug($"Starting ReplaceControlValues with input: [{oResult}] for document ID: {CURRENT_DOC_ID}")
|
||||
Dim oTryCounter = 0
|
||||
|
||||
While ContainsPattern(oResult, PATTERN_CTRL)
|
||||
@@ -349,12 +373,28 @@ Public Class clsPatterns
|
||||
Case GetType(LookupControl3)
|
||||
Dim oLookupControl3 As LookupControl3 = oControl
|
||||
|
||||
If oLookupControl3.Properties.SelectedValues.Count > 1 Then
|
||||
LOGGER.Debug($"LookupControl3 mit mehr als 1 Value")
|
||||
Dim oIndex As Integer = 0
|
||||
For Each oString As String In oLookupControl3.Properties.SelectedValues
|
||||
If oIndex = 0 Then
|
||||
|
||||
' ========== FIX START: NULL-Check ==========
|
||||
Dim selectedValues As List(Of String) = Nothing
|
||||
Try
|
||||
selectedValues = oLookupControl3.Properties.SelectedValues
|
||||
Catch ex As Exception
|
||||
LOGGER.Warn($"⚠️ LookupControl [{oControlName}] SelectedValues not accessible: {ex.Message}")
|
||||
selectedValues = Nothing
|
||||
End Try
|
||||
|
||||
If selectedValues Is Nothing Then
|
||||
LOGGER.Warn($"⚠️ LookupControl [{oControlName}] SelectedValues is Nothing! Using ERROR_REPLACE_VALUE")
|
||||
oReplaceValue = ERROR_REPLACE_VALUE
|
||||
ElseIf selectedValues.Count = 0 Then
|
||||
LOGGER.Warn($"⚠️ LookupControl [{oControlName}] SelectedValues is empty! Using ERROR_REPLACE_VALUE")
|
||||
oReplaceValue = ERROR_REPLACE_VALUE
|
||||
' ========== FIX END ==========
|
||||
ElseIf selectedValues.Count > 1 Then
|
||||
LOGGER.Debug($"LookupControl3 [{oControlName}] mit mehr als 1 Value")
|
||||
Dim oIndex As Integer = 0
|
||||
For Each oString As String In selectedValues
|
||||
If oIndex = 0 Then
|
||||
oReplaceValue = oString
|
||||
Else
|
||||
oReplaceValue += "', '" + oString
|
||||
@@ -362,13 +402,12 @@ Public Class clsPatterns
|
||||
oIndex += 1
|
||||
Next
|
||||
oIsSQL = False
|
||||
ElseIf oLookupControl3.Properties.SelectedValues.Count = 1 Then
|
||||
LOGGER.Debug($"LookupControl3 mit genau einem Value")
|
||||
oReplaceValue = oLookupControl3.Properties.SelectedValues(0)
|
||||
Else
|
||||
' LOGGER.Warn($"SelectedValues of LookUpControl scheint empty oder leer zu sein! Ersetzen mit ErrorReplaceValue!")
|
||||
oReplaceValue = ERROR_REPLACE_VALUE
|
||||
Else ' Count = 1
|
||||
LOGGER.Debug($"LookupControl3 [{oControlName}] mit genau einem Value")
|
||||
oReplaceValue = selectedValues(0)
|
||||
End If
|
||||
|
||||
LOGGER.Debug($"oReplaceValue nach Durchlaufen selectedValues: {oReplaceValue}")
|
||||
LOGGER.Debug($"oReplaceValue nach Durchlaufen selectedValues: {oReplaceValue}")
|
||||
|
||||
Case GetType(Windows.Forms.ComboBox)
|
||||
@@ -376,7 +415,7 @@ Public Class clsPatterns
|
||||
|
||||
Case GetType(CheckBox)
|
||||
Dim oCheckBox As CheckBox = oControl
|
||||
oReplaceValue = oCheckBox.Checked
|
||||
oReplaceValue = If(oCheckBox.Checked, "1", "0") ' Explizite String-Konvertierung
|
||||
|
||||
Case GetType(GridControl)
|
||||
Dim oGrid As GridControl = oControl
|
||||
@@ -401,10 +440,18 @@ Public Class clsPatterns
|
||||
Case Else
|
||||
oReplaceValue = ERROR_REPLACE_VALUE
|
||||
End Select
|
||||
LOGGER.Debug($"[SQL-ESCAPE CHECK] Control: [{oControlName}], oReplaceValue Type: [{If(oReplaceValue?.GetType()?.Name, "NULL")}], Value: [{oReplaceValue}], IsSQL: [{oIsSQL}]")
|
||||
If oReplaceValue Is Nothing Then
|
||||
LOGGER.Warn($"⚠️ oReplaceValue is Nothing for control [{oControlName}]! Setting to ERROR_REPLACE_VALUE")
|
||||
oReplaceValue = ERROR_REPLACE_VALUE
|
||||
End If
|
||||
|
||||
If Not TypeOf oReplaceValue Is String Then
|
||||
LOGGER.Warn($"⚠️ oReplaceValue is not a String for control [{oControlName}]! Type: [{oReplaceValue.GetType().Name}]. Converting to String.")
|
||||
oReplaceValue = oReplaceValue.ToString()
|
||||
End If
|
||||
If oIsSQL = True Then
|
||||
'LOGGER.Debug($"IS_SQL = True - oReplaceValue = {oReplaceValue}")
|
||||
'LOGGER.Debug($"oReplaceValue = {oReplaceValue}")
|
||||
oReplaceValue = oReplaceValue.Replace("'", "''")
|
||||
oReplaceValue = SafeSqlEscape(oReplaceValue)
|
||||
End If
|
||||
oResult = ReplacePattern(oResult, PATTERN_CTRL, oReplaceValue)
|
||||
Else
|
||||
@@ -420,19 +467,52 @@ Public Class clsPatterns
|
||||
Return oResult
|
||||
End Try
|
||||
End Function
|
||||
Private Shared Function SafeSqlEscape(value As Object) As String
|
||||
LOGGER.Debug($"[SafeSqlEscape] Input Type: [{If(value?.GetType()?.Name, "NULL")}], Value: [{value}]")
|
||||
|
||||
If value Is Nothing Then
|
||||
LOGGER.Warn("[SafeSqlEscape] Value is Nothing → returning ERROR_REPLACE_VALUE")
|
||||
Return ERROR_REPLACE_VALUE
|
||||
End If
|
||||
|
||||
Dim strValue As String
|
||||
Try
|
||||
strValue = value.ToString()
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
LOGGER.Warn($"[SafeSqlEscape] ToString() failed: {ex.Message} → returning ERROR_REPLACE_VALUE")
|
||||
Return ERROR_REPLACE_VALUE
|
||||
End Try
|
||||
|
||||
If String.IsNullOrEmpty(strValue) Then
|
||||
LOGGER.Warn("[SafeSqlEscape] String is empty → returning ERROR_REPLACE_VALUE")
|
||||
Return ERROR_REPLACE_VALUE
|
||||
End If
|
||||
|
||||
Dim escaped = strValue.Replace("'", "''")
|
||||
LOGGER.Debug($"[SafeSqlEscape] Output: [{escaped}]")
|
||||
Return escaped
|
||||
End Function
|
||||
Public Shared Function ReplaceWindreamIndicies(pInput As String, pDocument As WMObject, pIsSQL As Boolean) As String
|
||||
Try
|
||||
Dim oResult = pInput
|
||||
Dim oTryCounter As Integer = 0
|
||||
|
||||
LOGGER.Debug($"Starting ReplaceWindreamIndicies with input: [{oResult}] for document ID: {CURRENT_DOC_ID}")
|
||||
While ContainsPattern(oResult, PATTERN_WMI)
|
||||
|
||||
Dim oWMValue As String
|
||||
Dim oIndexName As String = GetNextPattern(oResult, PATTERN_WMI).Value
|
||||
Dim oWMValue As String = pDocument.GetVariableValue(oIndexName)
|
||||
|
||||
If IsNothing(oWMValue) And oTryCounter = MAX_TRY_COUNT Then
|
||||
Throw New Exception("Max tries in ReplaceWindreamIndicies exceeded.")
|
||||
If oIndexName = "@@DISPLAY_ONLY" Then
|
||||
oWMValue = String.Empty
|
||||
Else
|
||||
oWMValue = pDocument.GetVariableValue(oIndexName)
|
||||
End If
|
||||
|
||||
' FIX 1: >= statt = → Counter springt in 10er-Schritten, trifft niemals genau 5
|
||||
If IsNothing(oWMValue) AndAlso oTryCounter >= MAX_TRY_COUNT Then
|
||||
LOGGER.Warn($"[ReplaceWindreamIndicies] Max tries for [{oIndexName}] exceeded → replacing with empty string")
|
||||
oResult = ReplacePattern(oResult, PATTERN_WMI, String.Empty)
|
||||
Continue While
|
||||
End If
|
||||
|
||||
If oWMValue IsNot Nothing Then
|
||||
@@ -442,6 +522,11 @@ Public Class clsPatterns
|
||||
LOGGER.Debug($"oReplaceValue = {oWMValue}")
|
||||
End If
|
||||
oResult = ReplacePattern(oResult, PATTERN_WMI, oWMValue)
|
||||
Else
|
||||
' FIX 2: Else-Branch — Nothing-Wert ersetzt den Placeholder mit leerem String
|
||||
' verhindert Endless Loop wenn Windream-Index keinen Wert hat
|
||||
LOGGER.Warn($"[ReplaceWindreamIndicies] WMI value for [{oIndexName}] is Nothing → replacing with empty string (counter: {oTryCounter})")
|
||||
oResult = ReplacePattern(oResult, PATTERN_WMI, String.Empty)
|
||||
End If
|
||||
|
||||
' Increase counter by 10 to avoid DDOSing the Windream Service
|
||||
@@ -458,6 +543,7 @@ Public Class clsPatterns
|
||||
Try
|
||||
Dim result = input
|
||||
Dim oTryCounter As Integer = 0
|
||||
LOGGER.Debug($"Starting ReplaceIDBAttributes with input: [{result}] for document ID: {CURRENT_DOC_ID}")
|
||||
While ContainsPattern(result, PATTERN_IDBA)
|
||||
|
||||
Dim indexName As String = GetNextPattern(result, PATTERN_IDBA).Value
|
||||
@@ -509,6 +595,7 @@ Public Class clsPatterns
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
LOGGER.Info("Error in ReplaceIDBAttributes:" & ex.Message)
|
||||
Return input ' FIX: Originalwert zurückgeben statt implizit Nothing
|
||||
End Try
|
||||
End Function
|
||||
|
||||
|
||||
123
app/TaskFlow/frmColumn_Detail.Designer.vb
generated
123
app/TaskFlow/frmColumn_Detail.Designer.vb
generated
@@ -37,6 +37,8 @@ Partial Class frmColumn_Detail
|
||||
Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar()
|
||||
Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage()
|
||||
Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl()
|
||||
Me.SimpleButton4 = New DevExpress.XtraEditors.SimpleButton()
|
||||
Me.FORMULA_SQLTextBox = New System.Windows.Forms.TextBox()
|
||||
Me.SimpleButton3 = New DevExpress.XtraEditors.SimpleButton()
|
||||
Me.FORMULA_EXPRESSIONTextBox = New System.Windows.Forms.TextBox()
|
||||
Me.LU_CAPTIONTextBox = New System.Windows.Forms.TextBox()
|
||||
@@ -89,6 +91,8 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem21 = New DevExpress.XtraLayout.LayoutControlItem()
|
||||
Me.LayoutControlItem24 = New DevExpress.XtraLayout.LayoutControlItem()
|
||||
Me.LayoutControlItem26 = New DevExpress.XtraLayout.LayoutControlItem()
|
||||
Me.LayoutControlItem27 = New DevExpress.XtraLayout.LayoutControlItem()
|
||||
Me.LayoutControlItem15 = New DevExpress.XtraLayout.LayoutControlItem()
|
||||
CType(Me.TBPM_CONTROL_TABLEBindingSource, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
CType(Me.DD_DMSLiteDataSet, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
@@ -141,6 +145,8 @@ Partial Class frmColumn_Detail
|
||||
CType(Me.LayoutControlItem21, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
CType(Me.LayoutControlItem24, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
CType(Me.LayoutControlItem26, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
CType(Me.LayoutControlItem27, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
CType(Me.LayoutControlItem15, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
Me.SuspendLayout()
|
||||
'
|
||||
'TBPM_CONTROL_TABLEBindingSource
|
||||
@@ -237,6 +243,8 @@ Partial Class frmColumn_Detail
|
||||
'
|
||||
'LayoutControl1
|
||||
'
|
||||
Me.LayoutControl1.Controls.Add(Me.SimpleButton4)
|
||||
Me.LayoutControl1.Controls.Add(Me.FORMULA_SQLTextBox)
|
||||
Me.LayoutControl1.Controls.Add(Me.SimpleButton3)
|
||||
Me.LayoutControl1.Controls.Add(Me.FORMULA_EXPRESSIONTextBox)
|
||||
Me.LayoutControl1.Controls.Add(Me.LU_CAPTIONTextBox)
|
||||
@@ -266,6 +274,19 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControl1.Name = "LayoutControl1"
|
||||
Me.LayoutControl1.Root = Me.Root
|
||||
'
|
||||
'SimpleButton4
|
||||
'
|
||||
resources.ApplyResources(Me.SimpleButton4, "SimpleButton4")
|
||||
Me.SimpleButton4.Name = "SimpleButton4"
|
||||
Me.SimpleButton4.StyleController = Me.LayoutControl1
|
||||
'
|
||||
'FORMULA_SQLTextBox
|
||||
'
|
||||
Me.FORMULA_SQLTextBox.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.TBPM_CONTROL_TABLEBindingSource, "FORMULA_SQL", True))
|
||||
resources.ApplyResources(Me.FORMULA_SQLTextBox, "FORMULA_SQLTextBox")
|
||||
Me.FORMULA_SQLTextBox.Name = "FORMULA_SQLTextBox"
|
||||
Me.FORMULA_SQLTextBox.ReadOnly = True
|
||||
'
|
||||
'SimpleButton3
|
||||
'
|
||||
resources.ApplyResources(Me.SimpleButton3, "SimpleButton3")
|
||||
@@ -277,6 +298,7 @@ Partial Class frmColumn_Detail
|
||||
Me.FORMULA_EXPRESSIONTextBox.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.TBPM_CONTROL_TABLEBindingSource, "FORMULA_EXPRESSION", True))
|
||||
resources.ApplyResources(Me.FORMULA_EXPRESSIONTextBox, "FORMULA_EXPRESSIONTextBox")
|
||||
Me.FORMULA_EXPRESSIONTextBox.Name = "FORMULA_EXPRESSIONTextBox"
|
||||
Me.FORMULA_EXPRESSIONTextBox.ReadOnly = True
|
||||
'
|
||||
'LU_CAPTIONTextBox
|
||||
'
|
||||
@@ -478,9 +500,9 @@ Partial Class frmColumn_Detail
|
||||
'
|
||||
Me.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.[True]
|
||||
Me.Root.GroupBordersVisible = False
|
||||
Me.Root.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem1, Me.LayoutControlItem2, Me.LayoutControlItem3, Me.LayoutControlItem4, Me.LayoutControlItem5, Me.LayoutControlItem6, Me.LayoutControlItem8, Me.LayoutControlItem7, Me.LayoutControlItem9, Me.LayoutControlItem10, Me.LayoutControlItem12, Me.LayoutControlItem11, Me.LayoutControlItem13, Me.LayoutControlGroup1, Me.LayoutControlItem18, Me.LayoutControlItem19, Me.LayoutControlItem23, Me.LayoutControlItem21, Me.LayoutControlItem24, Me.LayoutControlItem26})
|
||||
Me.Root.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem1, Me.LayoutControlItem2, Me.LayoutControlItem3, Me.LayoutControlItem4, Me.LayoutControlItem5, Me.LayoutControlItem6, Me.LayoutControlItem8, Me.LayoutControlItem7, Me.LayoutControlItem9, Me.LayoutControlItem10, Me.LayoutControlItem12, Me.LayoutControlItem11, Me.LayoutControlItem13, Me.LayoutControlGroup1, Me.LayoutControlItem18, Me.LayoutControlItem19, Me.LayoutControlItem23, Me.LayoutControlItem21, Me.LayoutControlItem24, Me.LayoutControlItem26, Me.LayoutControlItem27, Me.LayoutControlItem15})
|
||||
Me.Root.Name = "Root"
|
||||
Me.Root.Size = New System.Drawing.Size(593, 816)
|
||||
Me.Root.Size = New System.Drawing.Size(630, 853)
|
||||
Me.Root.TextVisible = False
|
||||
'
|
||||
'LayoutControlItem1
|
||||
@@ -489,7 +511,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem1.Location = New System.Drawing.Point(0, 0)
|
||||
Me.LayoutControlItem1.Name = "LayoutControlItem1"
|
||||
Me.LayoutControlItem1.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem1.Size = New System.Drawing.Size(573, 40)
|
||||
Me.LayoutControlItem1.Size = New System.Drawing.Size(610, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem1, "LayoutControlItem1")
|
||||
Me.LayoutControlItem1.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -499,7 +521,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem2.Location = New System.Drawing.Point(0, 40)
|
||||
Me.LayoutControlItem2.Name = "LayoutControlItem2"
|
||||
Me.LayoutControlItem2.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem2.Size = New System.Drawing.Size(573, 40)
|
||||
Me.LayoutControlItem2.Size = New System.Drawing.Size(610, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem2, "LayoutControlItem2")
|
||||
Me.LayoutControlItem2.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -509,7 +531,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem3.Location = New System.Drawing.Point(0, 80)
|
||||
Me.LayoutControlItem3.Name = "LayoutControlItem3"
|
||||
Me.LayoutControlItem3.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem3.Size = New System.Drawing.Size(573, 40)
|
||||
Me.LayoutControlItem3.Size = New System.Drawing.Size(610, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem3, "LayoutControlItem3")
|
||||
Me.LayoutControlItem3.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -519,7 +541,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem4.Location = New System.Drawing.Point(0, 120)
|
||||
Me.LayoutControlItem4.Name = "LayoutControlItem4"
|
||||
Me.LayoutControlItem4.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem4.Size = New System.Drawing.Size(286, 40)
|
||||
Me.LayoutControlItem4.Size = New System.Drawing.Size(304, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem4, "LayoutControlItem4")
|
||||
Me.LayoutControlItem4.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -529,16 +551,16 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem5.Location = New System.Drawing.Point(0, 200)
|
||||
Me.LayoutControlItem5.Name = "LayoutControlItem5"
|
||||
Me.LayoutControlItem5.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem5.Size = New System.Drawing.Size(488, 46)
|
||||
Me.LayoutControlItem5.Size = New System.Drawing.Size(520, 46)
|
||||
resources.ApplyResources(Me.LayoutControlItem5, "LayoutControlItem5")
|
||||
Me.LayoutControlItem5.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem6
|
||||
'
|
||||
Me.LayoutControlItem6.Control = Me.SimpleButton1
|
||||
Me.LayoutControlItem6.Location = New System.Drawing.Point(488, 200)
|
||||
Me.LayoutControlItem6.Location = New System.Drawing.Point(520, 200)
|
||||
Me.LayoutControlItem6.Name = "LayoutControlItem6"
|
||||
Me.LayoutControlItem6.Size = New System.Drawing.Size(85, 46)
|
||||
Me.LayoutControlItem6.Size = New System.Drawing.Size(90, 46)
|
||||
Me.LayoutControlItem6.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem6.TextVisible = False
|
||||
'
|
||||
@@ -548,7 +570,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem8.Location = New System.Drawing.Point(0, 326)
|
||||
Me.LayoutControlItem8.Name = "LayoutControlItem8"
|
||||
Me.LayoutControlItem8.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem8.Size = New System.Drawing.Size(488, 46)
|
||||
Me.LayoutControlItem8.Size = New System.Drawing.Size(520, 46)
|
||||
resources.ApplyResources(Me.LayoutControlItem8, "LayoutControlItem8")
|
||||
Me.LayoutControlItem8.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -558,65 +580,65 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem7.Location = New System.Drawing.Point(0, 246)
|
||||
Me.LayoutControlItem7.Name = "LayoutControlItem7"
|
||||
Me.LayoutControlItem7.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem7.Size = New System.Drawing.Size(573, 40)
|
||||
Me.LayoutControlItem7.Size = New System.Drawing.Size(610, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem7, "LayoutControlItem7")
|
||||
Me.LayoutControlItem7.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem9
|
||||
'
|
||||
Me.LayoutControlItem9.Control = Me.SimpleButton2
|
||||
Me.LayoutControlItem9.Location = New System.Drawing.Point(488, 326)
|
||||
Me.LayoutControlItem9.Location = New System.Drawing.Point(520, 326)
|
||||
Me.LayoutControlItem9.Name = "LayoutControlItem9"
|
||||
Me.LayoutControlItem9.Size = New System.Drawing.Size(85, 46)
|
||||
Me.LayoutControlItem9.Size = New System.Drawing.Size(90, 46)
|
||||
Me.LayoutControlItem9.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem9.TextVisible = False
|
||||
'
|
||||
'LayoutControlItem10
|
||||
'
|
||||
Me.LayoutControlItem10.Control = Me.TextEdit7
|
||||
Me.LayoutControlItem10.Location = New System.Drawing.Point(0, 458)
|
||||
Me.LayoutControlItem10.Location = New System.Drawing.Point(0, 504)
|
||||
Me.LayoutControlItem10.Name = "LayoutControlItem10"
|
||||
Me.LayoutControlItem10.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem10.Size = New System.Drawing.Size(286, 40)
|
||||
Me.LayoutControlItem10.Size = New System.Drawing.Size(304, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem10, "LayoutControlItem10")
|
||||
Me.LayoutControlItem10.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem12
|
||||
'
|
||||
Me.LayoutControlItem12.Control = Me.CHANGED_WHOTextBox
|
||||
Me.LayoutControlItem12.Location = New System.Drawing.Point(0, 498)
|
||||
Me.LayoutControlItem12.Location = New System.Drawing.Point(0, 544)
|
||||
Me.LayoutControlItem12.Name = "LayoutControlItem12"
|
||||
Me.LayoutControlItem12.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem12.Size = New System.Drawing.Size(286, 40)
|
||||
Me.LayoutControlItem12.Size = New System.Drawing.Size(304, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem12, "LayoutControlItem12")
|
||||
Me.LayoutControlItem12.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem11
|
||||
'
|
||||
Me.LayoutControlItem11.Control = Me.TextEdit8
|
||||
Me.LayoutControlItem11.Location = New System.Drawing.Point(286, 458)
|
||||
Me.LayoutControlItem11.Location = New System.Drawing.Point(304, 504)
|
||||
Me.LayoutControlItem11.Name = "LayoutControlItem11"
|
||||
Me.LayoutControlItem11.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem11.Size = New System.Drawing.Size(287, 40)
|
||||
Me.LayoutControlItem11.Size = New System.Drawing.Size(306, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem11, "LayoutControlItem11")
|
||||
Me.LayoutControlItem11.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem13
|
||||
'
|
||||
Me.LayoutControlItem13.Control = Me.TextEdit10
|
||||
Me.LayoutControlItem13.Location = New System.Drawing.Point(286, 498)
|
||||
Me.LayoutControlItem13.Location = New System.Drawing.Point(304, 544)
|
||||
Me.LayoutControlItem13.Name = "LayoutControlItem13"
|
||||
Me.LayoutControlItem13.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem13.Size = New System.Drawing.Size(287, 40)
|
||||
Me.LayoutControlItem13.Size = New System.Drawing.Size(306, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem13, "LayoutControlItem13")
|
||||
Me.LayoutControlItem13.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlGroup1
|
||||
'
|
||||
Me.LayoutControlGroup1.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem16, Me.LayoutControlItem14, Me.LayoutControlItem17, Me.LayoutControlItem25, Me.LayoutControlItem20, Me.LayoutControlItem22})
|
||||
Me.LayoutControlGroup1.Location = New System.Drawing.Point(0, 538)
|
||||
Me.LayoutControlGroup1.Location = New System.Drawing.Point(0, 584)
|
||||
Me.LayoutControlGroup1.Name = "LayoutControlGroup1"
|
||||
Me.LayoutControlGroup1.Size = New System.Drawing.Size(573, 258)
|
||||
Me.LayoutControlGroup1.Size = New System.Drawing.Size(610, 249)
|
||||
resources.ApplyResources(Me.LayoutControlGroup1, "LayoutControlGroup1")
|
||||
'
|
||||
'LayoutControlItem16
|
||||
@@ -624,7 +646,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem16.Control = Me.VALIDATIONCheckbox
|
||||
Me.LayoutControlItem16.Location = New System.Drawing.Point(0, 0)
|
||||
Me.LayoutControlItem16.Name = "LayoutControlItem16"
|
||||
Me.LayoutControlItem16.Size = New System.Drawing.Size(274, 24)
|
||||
Me.LayoutControlItem16.Size = New System.Drawing.Size(292, 24)
|
||||
Me.LayoutControlItem16.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem16.TextVisible = False
|
||||
'
|
||||
@@ -633,7 +655,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem14.Control = Me.READ_ONLYCheckBox
|
||||
Me.LayoutControlItem14.Location = New System.Drawing.Point(0, 24)
|
||||
Me.LayoutControlItem14.Name = "LayoutControlItem14"
|
||||
Me.LayoutControlItem14.Size = New System.Drawing.Size(549, 22)
|
||||
Me.LayoutControlItem14.Size = New System.Drawing.Size(586, 22)
|
||||
Me.LayoutControlItem14.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem14.TextVisible = False
|
||||
'
|
||||
@@ -642,7 +664,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem17.Control = Me.ADVANCED_LOOKUPCheckbox
|
||||
Me.LayoutControlItem17.Location = New System.Drawing.Point(0, 46)
|
||||
Me.LayoutControlItem17.Name = "LayoutControlItem17"
|
||||
Me.LayoutControlItem17.Size = New System.Drawing.Size(549, 22)
|
||||
Me.LayoutControlItem17.Size = New System.Drawing.Size(586, 22)
|
||||
Me.LayoutControlItem17.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem17.TextVisible = False
|
||||
'
|
||||
@@ -651,16 +673,16 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem25.Control = Me.LOAD_IDX_VALUECheckBox
|
||||
Me.LayoutControlItem25.Location = New System.Drawing.Point(0, 68)
|
||||
Me.LayoutControlItem25.Name = "LayoutControlItem25"
|
||||
Me.LayoutControlItem25.Size = New System.Drawing.Size(549, 22)
|
||||
Me.LayoutControlItem25.Size = New System.Drawing.Size(586, 22)
|
||||
Me.LayoutControlItem25.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem25.TextVisible = False
|
||||
'
|
||||
'LayoutControlItem20
|
||||
'
|
||||
Me.LayoutControlItem20.Control = Me.SUMMARY_FUNCTIONCombobox
|
||||
Me.LayoutControlItem20.Location = New System.Drawing.Point(274, 0)
|
||||
Me.LayoutControlItem20.Location = New System.Drawing.Point(292, 0)
|
||||
Me.LayoutControlItem20.Name = "LayoutControlItem20"
|
||||
Me.LayoutControlItem20.Size = New System.Drawing.Size(275, 24)
|
||||
Me.LayoutControlItem20.Size = New System.Drawing.Size(294, 24)
|
||||
resources.ApplyResources(Me.LayoutControlItem20, "LayoutControlItem20")
|
||||
Me.LayoutControlItem20.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -670,7 +692,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem22.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.TBPM_CONTROL_TABLEBindingSource, "INHERIT_VALUE", True))
|
||||
Me.LayoutControlItem22.Location = New System.Drawing.Point(0, 90)
|
||||
Me.LayoutControlItem22.Name = "LayoutControlItem22"
|
||||
Me.LayoutControlItem22.Size = New System.Drawing.Size(549, 123)
|
||||
Me.LayoutControlItem22.Size = New System.Drawing.Size(586, 114)
|
||||
Me.LayoutControlItem22.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem22.TextVisible = False
|
||||
'
|
||||
@@ -680,17 +702,17 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem18.Location = New System.Drawing.Point(0, 372)
|
||||
Me.LayoutControlItem18.Name = "LayoutControlItem18"
|
||||
Me.LayoutControlItem18.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem18.Size = New System.Drawing.Size(573, 40)
|
||||
Me.LayoutControlItem18.Size = New System.Drawing.Size(610, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem18, "LayoutControlItem18")
|
||||
Me.LayoutControlItem18.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem19
|
||||
'
|
||||
Me.LayoutControlItem19.Control = Me.SEQUENCETextBox
|
||||
Me.LayoutControlItem19.Location = New System.Drawing.Point(286, 120)
|
||||
Me.LayoutControlItem19.Location = New System.Drawing.Point(304, 120)
|
||||
Me.LayoutControlItem19.Name = "LayoutControlItem19"
|
||||
Me.LayoutControlItem19.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem19.Size = New System.Drawing.Size(287, 40)
|
||||
Me.LayoutControlItem19.Size = New System.Drawing.Size(306, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem19, "LayoutControlItem19")
|
||||
Me.LayoutControlItem19.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -701,7 +723,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem23.Location = New System.Drawing.Point(0, 286)
|
||||
Me.LayoutControlItem23.Name = "LayoutControlItem23"
|
||||
Me.LayoutControlItem23.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem23.Size = New System.Drawing.Size(573, 40)
|
||||
Me.LayoutControlItem23.Size = New System.Drawing.Size(610, 40)
|
||||
Me.LayoutControlItem23.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem21
|
||||
@@ -710,7 +732,7 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem21.Location = New System.Drawing.Point(0, 160)
|
||||
Me.LayoutControlItem21.Name = "LayoutControlItem21"
|
||||
Me.LayoutControlItem21.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem21.Size = New System.Drawing.Size(573, 40)
|
||||
Me.LayoutControlItem21.Size = New System.Drawing.Size(610, 40)
|
||||
resources.ApplyResources(Me.LayoutControlItem21, "LayoutControlItem21")
|
||||
Me.LayoutControlItem21.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
@@ -720,19 +742,38 @@ Partial Class frmColumn_Detail
|
||||
Me.LayoutControlItem24.Location = New System.Drawing.Point(0, 412)
|
||||
Me.LayoutControlItem24.Name = "LayoutControlItem24"
|
||||
Me.LayoutControlItem24.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem24.Size = New System.Drawing.Size(488, 46)
|
||||
Me.LayoutControlItem24.Size = New System.Drawing.Size(520, 46)
|
||||
resources.ApplyResources(Me.LayoutControlItem24, "LayoutControlItem24")
|
||||
Me.LayoutControlItem24.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem26
|
||||
'
|
||||
Me.LayoutControlItem26.Control = Me.SimpleButton3
|
||||
Me.LayoutControlItem26.Location = New System.Drawing.Point(488, 412)
|
||||
Me.LayoutControlItem26.Location = New System.Drawing.Point(520, 412)
|
||||
Me.LayoutControlItem26.Name = "LayoutControlItem26"
|
||||
Me.LayoutControlItem26.Size = New System.Drawing.Size(85, 46)
|
||||
Me.LayoutControlItem26.Size = New System.Drawing.Size(90, 46)
|
||||
Me.LayoutControlItem26.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem26.TextVisible = False
|
||||
'
|
||||
'LayoutControlItem27
|
||||
'
|
||||
Me.LayoutControlItem27.Control = Me.FORMULA_SQLTextBox
|
||||
Me.LayoutControlItem27.Location = New System.Drawing.Point(0, 458)
|
||||
Me.LayoutControlItem27.Name = "LayoutControlItem27"
|
||||
Me.LayoutControlItem27.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
|
||||
Me.LayoutControlItem27.Size = New System.Drawing.Size(520, 46)
|
||||
resources.ApplyResources(Me.LayoutControlItem27, "LayoutControlItem27")
|
||||
Me.LayoutControlItem27.TextSize = New System.Drawing.Size(110, 13)
|
||||
'
|
||||
'LayoutControlItem15
|
||||
'
|
||||
Me.LayoutControlItem15.Control = Me.SimpleButton4
|
||||
Me.LayoutControlItem15.Location = New System.Drawing.Point(520, 458)
|
||||
Me.LayoutControlItem15.Name = "LayoutControlItem15"
|
||||
Me.LayoutControlItem15.Size = New System.Drawing.Size(90, 46)
|
||||
Me.LayoutControlItem15.TextSize = New System.Drawing.Size(0, 0)
|
||||
Me.LayoutControlItem15.TextVisible = False
|
||||
'
|
||||
'frmColumn_Detail
|
||||
'
|
||||
Me.Appearance.Options.UseFont = True
|
||||
@@ -799,6 +840,8 @@ Partial Class frmColumn_Detail
|
||||
CType(Me.LayoutControlItem21, System.ComponentModel.ISupportInitialize).EndInit()
|
||||
CType(Me.LayoutControlItem24, System.ComponentModel.ISupportInitialize).EndInit()
|
||||
CType(Me.LayoutControlItem26, System.ComponentModel.ISupportInitialize).EndInit()
|
||||
CType(Me.LayoutControlItem27, System.ComponentModel.ISupportInitialize).EndInit()
|
||||
CType(Me.LayoutControlItem15, System.ComponentModel.ISupportInitialize).EndInit()
|
||||
Me.ResumeLayout(False)
|
||||
Me.PerformLayout
|
||||
|
||||
@@ -868,4 +911,8 @@ End Sub
|
||||
Friend WithEvents LayoutControlItem25 As DevExpress.XtraLayout.LayoutControlItem
|
||||
Friend WithEvents SimpleButton3 As DevExpress.XtraEditors.SimpleButton
|
||||
Friend WithEvents LayoutControlItem26 As DevExpress.XtraLayout.LayoutControlItem
|
||||
Friend WithEvents SimpleButton4 As DevExpress.XtraEditors.SimpleButton
|
||||
Friend WithEvents FORMULA_SQLTextBox As TextBox
|
||||
Friend WithEvents LayoutControlItem27 As DevExpress.XtraLayout.LayoutControlItem
|
||||
Friend WithEvents LayoutControlItem15 As DevExpress.XtraLayout.LayoutControlItem
|
||||
End Class
|
||||
|
||||
@@ -149,13 +149,13 @@
|
||||
<value>RibbonPage1</value>
|
||||
</data>
|
||||
<data name="RibbonControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>593, 67</value>
|
||||
<value>630, 67</value>
|
||||
</data>
|
||||
<data name="RibbonStatusBar1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>0, 883</value>
|
||||
<value>0, 920</value>
|
||||
</data>
|
||||
<data name="RibbonStatusBar1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>593, 22</value>
|
||||
<value>630, 22</value>
|
||||
</data>
|
||||
<data name=">>RibbonStatusBar1.Name" xml:space="preserve">
|
||||
<value>RibbonStatusBar1</value>
|
||||
@@ -184,17 +184,65 @@
|
||||
<data name="RibbonPage2.Text" xml:space="preserve">
|
||||
<value>RibbonPage2</value>
|
||||
</data>
|
||||
<data name="SimpleButton3.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>500, 424</value>
|
||||
<data name="SimpleButton4.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>532, 470</value>
|
||||
</data>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="SimpleButton4.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>10, 10, 10, 10</value>
|
||||
</data>
|
||||
<data name="SimpleButton4.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>86, 42</value>
|
||||
</data>
|
||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="SimpleButton4.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>33</value>
|
||||
</data>
|
||||
<data name="SimpleButton4.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name=">>SimpleButton4.Name" xml:space="preserve">
|
||||
<value>SimpleButton4</value>
|
||||
</data>
|
||||
<data name=">>SimpleButton4.Type" xml:space="preserve">
|
||||
<value>DevExpress.XtraEditors.SimpleButton, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
||||
</data>
|
||||
<data name=">>SimpleButton4.Parent" xml:space="preserve">
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SimpleButton4.ZOrder" xml:space="preserve">
|
||||
<value>4</value>
|
||||
</data>
|
||||
<data name="FORMULA_SQLTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 478</value>
|
||||
</data>
|
||||
<data name="FORMULA_SQLTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>378, 20</value>
|
||||
</data>
|
||||
<data name="FORMULA_SQLTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>32</value>
|
||||
</data>
|
||||
<data name=">>FORMULA_SQLTextBox.Name" xml:space="preserve">
|
||||
<value>FORMULA_SQLTextBox</value>
|
||||
</data>
|
||||
<data name=">>FORMULA_SQLTextBox.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>FORMULA_SQLTextBox.Parent" xml:space="preserve">
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>FORMULA_SQLTextBox.ZOrder" xml:space="preserve">
|
||||
<value>5</value>
|
||||
</data>
|
||||
<data name="SimpleButton3.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>532, 424</value>
|
||||
</data>
|
||||
<data name="SimpleButton3.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>10, 10, 10, 10</value>
|
||||
</data>
|
||||
<data name="SimpleButton3.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>81, 42</value>
|
||||
<value>86, 42</value>
|
||||
</data>
|
||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="SimpleButton3.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>31</value>
|
||||
</data>
|
||||
@@ -211,13 +259,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SimpleButton3.ZOrder" xml:space="preserve">
|
||||
<value>4</value>
|
||||
<value>6</value>
|
||||
</data>
|
||||
<data name="FORMULA_EXPRESSIONTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 432</value>
|
||||
</data>
|
||||
<data name="FORMULA_EXPRESSIONTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>346, 20</value>
|
||||
<value>378, 20</value>
|
||||
</data>
|
||||
<data name="FORMULA_EXPRESSIONTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>29</value>
|
||||
@@ -232,13 +280,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>FORMULA_EXPRESSIONTextBox.ZOrder" xml:space="preserve">
|
||||
<value>5</value>
|
||||
<value>7</value>
|
||||
</data>
|
||||
<data name="LU_CAPTIONTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 306</value>
|
||||
</data>
|
||||
<data name="LU_CAPTIONTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>431, 20</value>
|
||||
<value>468, 20</value>
|
||||
</data>
|
||||
<data name="LU_CAPTIONTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>26</value>
|
||||
@@ -253,13 +301,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>LU_CAPTIONTextBox.ZOrder" xml:space="preserve">
|
||||
<value>6</value>
|
||||
<value>8</value>
|
||||
</data>
|
||||
<data name="GUIDTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 20</value>
|
||||
</data>
|
||||
<data name="GUIDTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>431, 20</value>
|
||||
<value>468, 20</value>
|
||||
</data>
|
||||
<data name="GUIDTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>4</value>
|
||||
@@ -274,13 +322,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>GUIDTextBox.ZOrder" xml:space="preserve">
|
||||
<value>7</value>
|
||||
<value>9</value>
|
||||
</data>
|
||||
<data name="SPALTENNAMETextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 60</value>
|
||||
</data>
|
||||
<data name="SPALTENNAMETextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>431, 20</value>
|
||||
<value>468, 20</value>
|
||||
</data>
|
||||
<data name="SPALTENNAMETextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>5</value>
|
||||
@@ -295,13 +343,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SPALTENNAMETextBox.ZOrder" xml:space="preserve">
|
||||
<value>8</value>
|
||||
<value>10</value>
|
||||
</data>
|
||||
<data name="SPALTEN_HEADERTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 100</value>
|
||||
</data>
|
||||
<data name="SPALTEN_HEADERTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>431, 20</value>
|
||||
<value>468, 20</value>
|
||||
</data>
|
||||
<data name="SPALTEN_HEADERTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>6</value>
|
||||
@@ -316,7 +364,7 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SPALTEN_HEADERTextBox.ZOrder" xml:space="preserve">
|
||||
<value>9</value>
|
||||
<value>11</value>
|
||||
</data>
|
||||
<data name="SPALTENBREITETextBox.EditValue" type="System.Decimal, mscorlib">
|
||||
<value>0</value>
|
||||
@@ -329,7 +377,7 @@
|
||||
<value>Combo</value>
|
||||
</data>
|
||||
<data name="SPALTENBREITETextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>144, 20</value>
|
||||
<value>162, 20</value>
|
||||
</data>
|
||||
<data name="SPALTENBREITETextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>7</value>
|
||||
@@ -344,13 +392,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SPALTENBREITETextBox.ZOrder" xml:space="preserve">
|
||||
<value>10</value>
|
||||
<value>12</value>
|
||||
</data>
|
||||
<data name="REGEX_MATCHTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 220</value>
|
||||
</data>
|
||||
<data name="REGEX_MATCHTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>346, 20</value>
|
||||
<value>378, 20</value>
|
||||
</data>
|
||||
<data name="REGEX_MATCHTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>8</value>
|
||||
@@ -365,10 +413,10 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>REGEX_MATCHTextBox.ZOrder" xml:space="preserve">
|
||||
<value>11</value>
|
||||
<value>13</value>
|
||||
</data>
|
||||
<data name="SimpleButton1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>500, 212</value>
|
||||
<value>532, 212</value>
|
||||
</data>
|
||||
<data name="SimpleButton1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>10, 10, 10, 10</value>
|
||||
@@ -377,7 +425,7 @@
|
||||
<value>10, 10, 10, 10</value>
|
||||
</data>
|
||||
<data name="SimpleButton1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>81, 42</value>
|
||||
<value>86, 42</value>
|
||||
</data>
|
||||
<data name="SimpleButton1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>9</value>
|
||||
@@ -395,13 +443,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SimpleButton1.ZOrder" xml:space="preserve">
|
||||
<value>12</value>
|
||||
<value>14</value>
|
||||
</data>
|
||||
<data name="REGEX_MESSAGE_DETextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 266</value>
|
||||
</data>
|
||||
<data name="REGEX_MESSAGE_DETextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>431, 20</value>
|
||||
<value>468, 20</value>
|
||||
</data>
|
||||
<data name="REGEX_MESSAGE_DETextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>10</value>
|
||||
@@ -416,13 +464,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>REGEX_MESSAGE_DETextBox.ZOrder" xml:space="preserve">
|
||||
<value>13</value>
|
||||
<value>15</value>
|
||||
</data>
|
||||
<data name="SQL_COMMANDTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 346</value>
|
||||
</data>
|
||||
<data name="SQL_COMMANDTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>346, 20</value>
|
||||
<value>378, 20</value>
|
||||
</data>
|
||||
<data name="SQL_COMMANDTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>11</value>
|
||||
@@ -437,16 +485,16 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SQL_COMMANDTextBox.ZOrder" xml:space="preserve">
|
||||
<value>14</value>
|
||||
<value>16</value>
|
||||
</data>
|
||||
<data name="SimpleButton2.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>500, 338</value>
|
||||
<value>532, 338</value>
|
||||
</data>
|
||||
<data name="SimpleButton2.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>10, 10, 10, 10</value>
|
||||
</data>
|
||||
<data name="SimpleButton2.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>81, 42</value>
|
||||
<value>86, 42</value>
|
||||
</data>
|
||||
<data name="SimpleButton2.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>12</value>
|
||||
@@ -464,13 +512,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SimpleButton2.ZOrder" xml:space="preserve">
|
||||
<value>15</value>
|
||||
<value>17</value>
|
||||
</data>
|
||||
<data name="TextEdit7.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 478</value>
|
||||
<value>142, 524</value>
|
||||
</data>
|
||||
<data name="TextEdit7.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>144, 20</value>
|
||||
<value>162, 20</value>
|
||||
</data>
|
||||
<data name="TextEdit7.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>13</value>
|
||||
@@ -485,13 +533,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>TextEdit7.ZOrder" xml:space="preserve">
|
||||
<value>16</value>
|
||||
<value>18</value>
|
||||
</data>
|
||||
<data name="TextEdit8.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>428, 478</value>
|
||||
<value>446, 524</value>
|
||||
</data>
|
||||
<data name="TextEdit8.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>145, 20</value>
|
||||
<value>164, 20</value>
|
||||
</data>
|
||||
<data name="TextEdit8.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>14</value>
|
||||
@@ -506,13 +554,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>TextEdit8.ZOrder" xml:space="preserve">
|
||||
<value>17</value>
|
||||
<value>19</value>
|
||||
</data>
|
||||
<data name="CHANGED_WHOTextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 518</value>
|
||||
<value>142, 564</value>
|
||||
</data>
|
||||
<data name="CHANGED_WHOTextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>144, 20</value>
|
||||
<value>162, 20</value>
|
||||
</data>
|
||||
<data name="CHANGED_WHOTextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>15</value>
|
||||
@@ -527,13 +575,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>CHANGED_WHOTextBox.ZOrder" xml:space="preserve">
|
||||
<value>18</value>
|
||||
<value>20</value>
|
||||
</data>
|
||||
<data name="TextEdit10.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>428, 518</value>
|
||||
<value>446, 564</value>
|
||||
</data>
|
||||
<data name="TextEdit10.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>145, 20</value>
|
||||
<value>164, 20</value>
|
||||
</data>
|
||||
<data name="TextEdit10.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>16</value>
|
||||
@@ -548,16 +596,16 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>TextEdit10.ZOrder" xml:space="preserve">
|
||||
<value>19</value>
|
||||
<value>21</value>
|
||||
</data>
|
||||
<data name="READ_ONLYCheckBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>24, 607</value>
|
||||
<value>24, 653</value>
|
||||
</data>
|
||||
<data name="READ_ONLYCheckBox.Properties.Caption" xml:space="preserve">
|
||||
<value>Read Only</value>
|
||||
</data>
|
||||
<data name="READ_ONLYCheckBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>545, 18</value>
|
||||
<value>582, 18</value>
|
||||
</data>
|
||||
<data name="READ_ONLYCheckBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>17</value>
|
||||
@@ -572,16 +620,16 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>READ_ONLYCheckBox.ZOrder" xml:space="preserve">
|
||||
<value>20</value>
|
||||
<value>22</value>
|
||||
</data>
|
||||
<data name="LOAD_IDX_VALUECheckBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>24, 651</value>
|
||||
<value>24, 697</value>
|
||||
</data>
|
||||
<data name="LOAD_IDX_VALUECheckBox.Properties.Caption" xml:space="preserve">
|
||||
<value>Lade Indexdaten</value>
|
||||
</data>
|
||||
<data name="LOAD_IDX_VALUECheckBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>545, 18</value>
|
||||
<value>582, 18</value>
|
||||
</data>
|
||||
<data name="LOAD_IDX_VALUECheckBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>18</value>
|
||||
@@ -596,16 +644,16 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>LOAD_IDX_VALUECheckBox.ZOrder" xml:space="preserve">
|
||||
<value>21</value>
|
||||
<value>23</value>
|
||||
</data>
|
||||
<data name="VALIDATIONCheckbox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>24, 583</value>
|
||||
<value>24, 629</value>
|
||||
</data>
|
||||
<data name="VALIDATIONCheckbox.Properties.Caption" xml:space="preserve">
|
||||
<value>Muss ausgefüllt werden</value>
|
||||
</data>
|
||||
<data name="VALIDATIONCheckbox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>270, 18</value>
|
||||
<value>288, 18</value>
|
||||
</data>
|
||||
<data name="VALIDATIONCheckbox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>19</value>
|
||||
@@ -620,16 +668,16 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>VALIDATIONCheckbox.ZOrder" xml:space="preserve">
|
||||
<value>22</value>
|
||||
<value>24</value>
|
||||
</data>
|
||||
<data name="ADVANCED_LOOKUPCheckbox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>24, 629</value>
|
||||
<value>24, 675</value>
|
||||
</data>
|
||||
<data name="ADVANCED_LOOKUPCheckbox.Properties.Caption" xml:space="preserve">
|
||||
<value>Erweitertes Auswahl Control (für lange Listen)</value>
|
||||
</data>
|
||||
<data name="ADVANCED_LOOKUPCheckbox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>545, 18</value>
|
||||
<value>582, 18</value>
|
||||
</data>
|
||||
<data name="ADVANCED_LOOKUPCheckbox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>20</value>
|
||||
@@ -644,13 +692,13 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>ADVANCED_LOOKUPCheckbox.ZOrder" xml:space="preserve">
|
||||
<value>23</value>
|
||||
<value>25</value>
|
||||
</data>
|
||||
<data name="DEFAULTVALUETextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 392</value>
|
||||
</data>
|
||||
<data name="DEFAULTVALUETextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>431, 20</value>
|
||||
<value>468, 20</value>
|
||||
</data>
|
||||
<data name="DEFAULTVALUETextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>21</value>
|
||||
@@ -665,19 +713,19 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>DEFAULTVALUETextBox.ZOrder" xml:space="preserve">
|
||||
<value>24</value>
|
||||
<value>26</value>
|
||||
</data>
|
||||
<data name="SEQUENCETextBox.EditValue" type="System.Decimal, mscorlib">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="SEQUENCETextBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>428, 140</value>
|
||||
<value>446, 140</value>
|
||||
</data>
|
||||
<data name="SEQUENCETextBox.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
|
||||
<value>Combo</value>
|
||||
</data>
|
||||
<data name="SEQUENCETextBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>145, 20</value>
|
||||
<value>164, 20</value>
|
||||
</data>
|
||||
<data name="SEQUENCETextBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>22</value>
|
||||
@@ -692,10 +740,10 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SEQUENCETextBox.ZOrder" xml:space="preserve">
|
||||
<value>25</value>
|
||||
<value>27</value>
|
||||
</data>
|
||||
<data name="SUMMARY_FUNCTIONCombobox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>420, 583</value>
|
||||
<value>438, 629</value>
|
||||
</data>
|
||||
<data name="SUMMARY_FUNCTIONCombobox.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v21.2">
|
||||
<value>Combo</value>
|
||||
@@ -704,7 +752,7 @@
|
||||
<value />
|
||||
</data>
|
||||
<data name="SUMMARY_FUNCTIONCombobox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>149, 20</value>
|
||||
<value>168, 20</value>
|
||||
</data>
|
||||
<data name="SUMMARY_FUNCTIONCombobox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>23</value>
|
||||
@@ -719,7 +767,7 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>SUMMARY_FUNCTIONCombobox.ZOrder" xml:space="preserve">
|
||||
<value>26</value>
|
||||
<value>28</value>
|
||||
</data>
|
||||
<data name="TYPE_COLUMNComboBox2.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>142, 180</value>
|
||||
@@ -731,7 +779,7 @@
|
||||
<value />
|
||||
</data>
|
||||
<data name="TYPE_COLUMNComboBox2.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>431, 20</value>
|
||||
<value>468, 20</value>
|
||||
</data>
|
||||
<data name="TYPE_COLUMNComboBox2.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>27</value>
|
||||
@@ -746,16 +794,16 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>TYPE_COLUMNComboBox2.ZOrder" xml:space="preserve">
|
||||
<value>27</value>
|
||||
<value>29</value>
|
||||
</data>
|
||||
<data name="CheckEditInheritValue.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>24, 673</value>
|
||||
<value>24, 719</value>
|
||||
</data>
|
||||
<data name="CheckEditInheritValue.Properties.Caption" xml:space="preserve">
|
||||
<value>Inherit Value (Vererbt den Wert der aktuellen Zelle auf alle nachfolgenden)</value>
|
||||
</data>
|
||||
<data name="CheckEditInheritValue.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>545, 18</value>
|
||||
<value>582, 18</value>
|
||||
</data>
|
||||
<data name="CheckEditInheritValue.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>28</value>
|
||||
@@ -770,7 +818,7 @@
|
||||
<value>LayoutControl1</value>
|
||||
</data>
|
||||
<data name=">>CheckEditInheritValue.ZOrder" xml:space="preserve">
|
||||
<value>28</value>
|
||||
<value>30</value>
|
||||
</data>
|
||||
<data name="LayoutControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
@@ -835,8 +883,11 @@
|
||||
<data name="LayoutControlItem24.Text" xml:space="preserve">
|
||||
<value>Formel:</value>
|
||||
</data>
|
||||
<data name="LayoutControlItem27.Text" xml:space="preserve">
|
||||
<value>Formel SQL:</value>
|
||||
</data>
|
||||
<data name="LayoutControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>593, 816</value>
|
||||
<value>630, 853</value>
|
||||
</data>
|
||||
<data name="LayoutControl1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>33</value>
|
||||
@@ -863,7 +914,7 @@
|
||||
<value>6, 13</value>
|
||||
</data>
|
||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||
<value>593, 905</value>
|
||||
<value>630, 942</value>
|
||||
</data>
|
||||
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
|
||||
<value>Segoe UI, 8.25pt</value>
|
||||
@@ -1093,6 +1144,18 @@
|
||||
<data name=">>LayoutControlItem26.Type" xml:space="preserve">
|
||||
<value>DevExpress.XtraLayout.LayoutControlItem, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
||||
</data>
|
||||
<data name=">>LayoutControlItem27.Name" xml:space="preserve">
|
||||
<value>LayoutControlItem27</value>
|
||||
</data>
|
||||
<data name=">>LayoutControlItem27.Type" xml:space="preserve">
|
||||
<value>DevExpress.XtraLayout.LayoutControlItem, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
||||
</data>
|
||||
<data name=">>LayoutControlItem15.Name" xml:space="preserve">
|
||||
<value>LayoutControlItem15</value>
|
||||
</data>
|
||||
<data name=">>LayoutControlItem15.Type" xml:space="preserve">
|
||||
<value>DevExpress.XtraLayout.LayoutControlItem, DevExpress.XtraLayout.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
||||
</data>
|
||||
<data name=">>$this.Name" xml:space="preserve">
|
||||
<value>frmColumn_Detail</value>
|
||||
</data>
|
||||
|
||||
@@ -100,6 +100,7 @@ Public Class frmColumn_Detail
|
||||
LU_CAPTIONTextBox.Text,
|
||||
CheckEditInheritValue.Checked,
|
||||
FORMULA_EXPRESSIONTextBox.Text,
|
||||
FORMULA_SQLTextBox.Text,
|
||||
GUIDTextBox.Text
|
||||
)
|
||||
tslblAenderungen.Visibility = DevExpress.XtraBars.BarItemVisibility.Always
|
||||
@@ -224,4 +225,52 @@ Public Class frmColumn_Detail
|
||||
Dim dt As DataTable = DatabaseFallback.GetDatatableECM(oSQL)
|
||||
Return dt
|
||||
End Function
|
||||
|
||||
Private Sub SimpleButton4_Click(sender As Object, e As EventArgs) Handles SimpleButton4.Click
|
||||
Dim oldSQL = FORMULA_SQLTextBox.Text
|
||||
CURRENT_DESIGN_TYPE = "SQL_SOURCE_TABLE_COLUMN"
|
||||
CURRENT_INDEX_ID = GUIDTextBox.Text
|
||||
Dim oForm2 As New frmSQLEditor(LOGCONFIG, DatabaseECM) With {
|
||||
.SQLCommand = FORMULA_SQLTextBox.Text,
|
||||
.SQLConnection = 0
|
||||
}
|
||||
oForm2.ShowDialog()
|
||||
|
||||
If oForm2.DialogResult = DialogResult.OK Then
|
||||
If oldSQL <> oForm2.SQLCommand Then
|
||||
Dim oUpdate As String = $"Update TBPM_CONTROL_TABLE SET CHANGED_WHO = '{USER_USERNAME}', FORMULA_SQL = '{oForm2.SQLCommand.Replace("'", "''")}'
|
||||
, CONNECTION_ID = {oForm2.SQLConnection} WHERE GUID = {GUIDTextBox.Text}"
|
||||
If DatabaseFallback.ExecuteNonQueryECM(oUpdate) = True Then
|
||||
tslblAenderungen.Visibility = DevExpress.XtraBars.BarItemVisibility.Always
|
||||
tslblAenderungen.Caption = "Changes saved - " & Now
|
||||
FORMULA_SQLTextBox.Text = oForm2.SQLCommand
|
||||
Else
|
||||
MsgBox("Fehler beim Speichern des SQL Befehls. Bitte überprüfen Sie Ihre Eingabe und versuchen Sie es erneut.", MsgBoxStyle.Critical, "Fehler")
|
||||
End If
|
||||
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub FORMULA_EXPRESSIONTextBox_TextChanged(sender As Object, e As EventArgs) Handles FORMULA_EXPRESSIONTextBox.TextChanged, FORMULA_SQLTextBox.TextChanged
|
||||
Dim oHasFormulaExpression As Boolean = FORMULA_EXPRESSIONTextBox.Text.Trim() <> String.Empty
|
||||
Dim oHasFormulaSql As Boolean = FORMULA_SQLTextBox.Text.Trim() <> String.Empty
|
||||
|
||||
' Entweder/Oder-Validierung: Beide gleichzeitig ist nicht erlaubt
|
||||
If oHasFormulaExpression AndAlso oHasFormulaSql Then
|
||||
MsgBox("Es darf nur FORMULA_EXPRESSION oder FORMULA_SQL gesetzt sein, nicht beides." & vbCrLf &
|
||||
"Bitte leeren Sie eines der beiden Felder.",
|
||||
MsgBoxStyle.Exclamation, "Ungültige Konfiguration")
|
||||
End If
|
||||
|
||||
' Wenn eine Formel gesetzt ist → ReadOnly aktivieren und sperren
|
||||
If oHasFormulaExpression OrElse oHasFormulaSql Then
|
||||
READ_ONLYCheckBox.Checked = True
|
||||
'READ_ONLYCheckBox.Enabled = False
|
||||
Else
|
||||
READ_ONLYCheckBox.Checked = False
|
||||
'READ_ONLYCheckBox.Enabled = True
|
||||
End If
|
||||
|
||||
End Sub
|
||||
End Class
|
||||
@@ -2,8 +2,21 @@
|
||||
|
||||
Public Class frmError
|
||||
Public ValidatorError As String = ""
|
||||
Private _isClosing As Boolean = False
|
||||
|
||||
Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
|
||||
Me.Close()
|
||||
' ========== FIX 1: Event-Handler SOFORT deregistrieren ==========
|
||||
RemoveHandler OK_Button.Click, AddressOf OK_Button_Click
|
||||
|
||||
' ========== DIAGNOSE: StackTrace ausgeben ==========
|
||||
Dim st As New StackTrace(True)
|
||||
LOGGER.Debug($"[frmError] OK_Button_Click aufgerufen von:")
|
||||
For Each frame As StackFrame In st.GetFrames()
|
||||
LOGGER.Debug($" {frame.GetMethod()?.DeclaringType?.Name}.{frame.GetMethod()?.Name} (Zeile {frame.GetFileLineNumber()})")
|
||||
Next
|
||||
' ========== ENDE DIAGNOSE ==========
|
||||
|
||||
CloseDialog()
|
||||
End Sub
|
||||
|
||||
Private Sub frmError_Load(sender As Object, e As System.EventArgs) Handles Me.Load
|
||||
@@ -27,7 +40,45 @@ Public Class frmError
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub frmError_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
|
||||
Me.Label1.Focus()
|
||||
Private Sub CloseDialog()
|
||||
' ========== FIX 2: Guard mit Dispose-Check ==========
|
||||
If _isClosing OrElse Me.IsDisposed Then
|
||||
LOGGER.Debug($"[frmError] CloseDialog blockiert (isClosing={_isClosing}, IsDisposed={Me.IsDisposed})")
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
_isClosing = True
|
||||
LOGGER.Debug($"[frmError] CloseDialog: Flag gesetzt, starte verzögerten Close")
|
||||
|
||||
' ========== FIX 3: VERZÖGERTER Close via BeginInvoke ==========
|
||||
' KRITISCH: Close wird NACH Abschluss des aktuellen Event-Handlers ausgeführt
|
||||
Me.BeginInvoke(New Action(Sub()
|
||||
If Not Me.IsDisposed Then
|
||||
Me.DialogResult = DialogResult.OK
|
||||
Me.Close()
|
||||
LOGGER.Debug($"[frmError] Dialog geschlossen via BeginInvoke")
|
||||
End If
|
||||
End Sub))
|
||||
' ========== ENDE FIX 3 ==========
|
||||
End Sub
|
||||
Private Sub frmError_Shown(sender As Object, e As EventArgs) Handles Me.Shown
|
||||
Me.Label1.Focus()
|
||||
LOGGER.Debug($"[frmError] Dialog angezeigt - Enabled: {Me.Enabled}")
|
||||
End Sub
|
||||
|
||||
Private Sub frmError_Activated(sender As Object, e As EventArgs) Handles Me.Activated
|
||||
LOGGER.Debug($"[frmError] Dialog aktiviert")
|
||||
End Sub
|
||||
' ========== FIX 4: FormClosing-Handler hinzufügen ==========
|
||||
Private Sub frmError_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
|
||||
If _isClosing Then
|
||||
LOGGER.Debug($"[frmError] FormClosing: Close bereits aktiv, erlauben")
|
||||
Return
|
||||
End If
|
||||
|
||||
' Falls Close von außen (z.B. [X]-Button) ausgelöst wurde
|
||||
_isClosing = True
|
||||
LOGGER.Debug($"[frmError] FormClosing: Flag gesetzt via FormClosing")
|
||||
End Sub
|
||||
' ========== ENDE FIX 4 ==========
|
||||
End Class
|
||||
|
||||
@@ -124,46 +124,46 @@
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADw
|
||||
CAAAAk1TRnQBSQFMAgEBAgEAAcABCwHAAQsBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
|
||||
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
|
||||
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
|
||||
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
|
||||
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
|
||||
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
|
||||
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
|
||||
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
|
||||
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
|
||||
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
|
||||
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
|
||||
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
|
||||
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
|
||||
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
|
||||
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
|
||||
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
|
||||
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
|
||||
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
|
||||
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
|
||||
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
|
||||
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
|
||||
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
|
||||
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
|
||||
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
|
||||
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
|
||||
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
|
||||
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
|
||||
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/0YAAQgEcgEICgABGgEc
|
||||
AnQBHAEaKQABcgFVAVoCWwFaAVUBTwgAAXQBeQF6AuUBegF5AXQnAAJVAVoBWwLkAVsBWgJVBgABdAJ6
|
||||
BOUBegF5AVIlAAFPAVUCWgRbAVoCVQFPBAABUgFZAXoG5QF6AlIjAAEIAlUIWgJVAQgCAAEaAVIBWQF6
|
||||
BuUBWQFYAVIBGiIAAU8CVQdaA1UBTwIAAUwBUgpZAVIBTCIAAU8BNApVATQBLgIAAUwBUgFTCFkBUwFS
|
||||
AUwiAAEtAzMHNAIzAS0CAAIrAjIGUwIyAisiAAFPAS0BMwhVATQCLQIAAUwCKwhTAVICKyIAAQgBLQFV
|
||||
CJcBVQEtAQgCAAEaASsBUgh1AVIBKwEaIwABAgGXCJgBlwEtBAABKgF0CJoBdAErJQABTwEIARsFwgHx
|
||||
AU8GAAFMARoBGwQaARsBGgFSJwABTwEIAfMC/wHzAQgBcggAAUwBGgT2ARoBdCkAAQgEcgEICgABGgR0
|
||||
ARplAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/AQAE/wQAAfgBHwH4AR8EAAHw
|
||||
AQ8B8AEPBAAB4AEHAeABBwQAAcABAwHAAQMEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
|
||||
AQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAHAAQMBwAEDBAAB4AEHAeABBwQAAfABDwHwAQ8EAAH4
|
||||
AR8B+AEfBAAE/wQACw==
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADu
|
||||
CAAAAk1TRnQBSQFMAgEBAgIAAQwBAAEMARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
|
||||
AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
|
||||
AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
|
||||
AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
|
||||
AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
|
||||
AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
|
||||
AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
|
||||
AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
|
||||
AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
|
||||
AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
|
||||
ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
|
||||
AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
|
||||
ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
|
||||
AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
|
||||
AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
|
||||
AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
|
||||
AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
|
||||
AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
|
||||
AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
|
||||
AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
|
||||
ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
|
||||
AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
|
||||
ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
|
||||
ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
|
||||
AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
|
||||
AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
|
||||
AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
|
||||
ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
|
||||
Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/9GAAEIBHIBCAoAARoBHAJ0
|
||||
ARwBGikAAXIBVQFaAlsBWgFVAU8IAAF0AXkBegLlAXoBeQF0JwACVQFaAVsC5AFbAVoCVQYAAXQCegTl
|
||||
AXoBeQFSJQABTwFVAloEWwFaAlUBTwQAAVIBWQF6BuUBegJSIwABCAJVCFoCVQEIAgABGgFSAVkBegbl
|
||||
AVkBWAFSARoiAAFPAlUHWgNVAU8CAAFMAVIKWQFSAUwiAAFPATQKVQE0AS4CAAFMAVIBUwhZAVMBUgFM
|
||||
IgABLQMzBzQCMwEtAgACKwIyBlMCMgIrIgABTwEtATMIVQE0Ai0CAAFMAisIUwFSAisiAAEIAS0BVQiX
|
||||
AVUBLQEIAgABGgErAVIIdQFSASsBGiMAAQIBlwiYAZcBLQQAASoBdAiaAXQBKyUAAU8BCAEbBcIB8QFP
|
||||
BgABTAEaARsEGgEbARoBUicAAU8BCAHzAv8B8wEIAXIIAAFMARoE9gEaAXQpAAEIBHIBCAoAARoEdAEa
|
||||
ZQABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEABP8EAAH4AR8B+AEfBAAB8AEP
|
||||
AfABDwQAAeABBwHgAQcEAAHAAQMBwAEDBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEB
|
||||
AYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABwAEDAcABAwQAAeABBwHgAQcEAAHwAQ8B8AEPBAAB+AEf
|
||||
AfgBHwQABP8EAAs=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="DD_DMSLiteDataSet.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
@@ -1506,13 +1506,13 @@
|
||||
<value>Aktionen</value>
|
||||
</data>
|
||||
<data name="RibbonControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>1178, 158</value>
|
||||
<value>1473, 158</value>
|
||||
</data>
|
||||
<data name="RibbonStatusBar1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>0, 666</value>
|
||||
<value>0, 838</value>
|
||||
</data>
|
||||
<data name="RibbonStatusBar1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>1178, 22</value>
|
||||
<value>1473, 22</value>
|
||||
</data>
|
||||
<data name=">>RibbonStatusBar1.Name" xml:space="preserve">
|
||||
<value>RibbonStatusBar1</value>
|
||||
@@ -1539,7 +1539,7 @@
|
||||
<value>4</value>
|
||||
</data>
|
||||
<data name="GridControlWorkflows.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>945, 484</value>
|
||||
<value>1240, 656</value>
|
||||
</data>
|
||||
<data name="GridControlWorkflows.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>10</value>
|
||||
@@ -1575,7 +1575,7 @@
|
||||
<value>233, 0</value>
|
||||
</data>
|
||||
<data name="Panel2.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>945, 24</value>
|
||||
<value>1240, 24</value>
|
||||
</data>
|
||||
<data name="Panel2.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>9</value>
|
||||
@@ -1782,7 +1782,7 @@
|
||||
<value>233</value>
|
||||
</data>
|
||||
<data name="NavBarControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>233, 508</value>
|
||||
<value>233, 680</value>
|
||||
</data>
|
||||
<data name="NavBarControl1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>5</value>
|
||||
@@ -1812,7 +1812,7 @@
|
||||
<value>0, 158</value>
|
||||
</data>
|
||||
<data name="Panel1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>1178, 508</value>
|
||||
<value>1473, 680</value>
|
||||
</data>
|
||||
<data name="Panel1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>4</value>
|
||||
@@ -2042,10 +2042,10 @@
|
||||
<value>Bottom</value>
|
||||
</data>
|
||||
<data name="barDockControlBottom.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>0, 688</value>
|
||||
<value>0, 860</value>
|
||||
</data>
|
||||
<data name="barDockControlBottom.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>1178, 0</value>
|
||||
<value>1473, 0</value>
|
||||
</data>
|
||||
<data name=">>barDockControlBottom.Name" xml:space="preserve">
|
||||
<value>barDockControlBottom</value>
|
||||
@@ -2066,7 +2066,7 @@
|
||||
<value>0, 0</value>
|
||||
</data>
|
||||
<data name="barDockControlLeft.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>0, 688</value>
|
||||
<value>0, 860</value>
|
||||
</data>
|
||||
<data name=">>barDockControlLeft.Name" xml:space="preserve">
|
||||
<value>barDockControlLeft</value>
|
||||
@@ -2084,10 +2084,10 @@
|
||||
<value>Right</value>
|
||||
</data>
|
||||
<data name="barDockControlRight.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>1178, 0</value>
|
||||
<value>1473, 0</value>
|
||||
</data>
|
||||
<data name="barDockControlRight.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>0, 688</value>
|
||||
<value>0, 860</value>
|
||||
</data>
|
||||
<data name=">>barDockControlRight.Name" xml:space="preserve">
|
||||
<value>barDockControlRight</value>
|
||||
@@ -2105,13 +2105,13 @@
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>147</value>
|
||||
<value>123</value>
|
||||
</metadata>
|
||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
||||
<value>9, 19</value>
|
||||
</data>
|
||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||
<value>1178, 688</value>
|
||||
<value>1473, 860</value>
|
||||
</data>
|
||||
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
|
||||
<value>Tahoma, 12pt</value>
|
||||
@@ -3574,7 +3574,7 @@
|
||||
<value>Graphisches Dokument</value>
|
||||
</data>
|
||||
<data name="barDockControlTop.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>1178, 0</value>
|
||||
<value>1473, 0</value>
|
||||
</data>
|
||||
<data name=">>barDockControlTop.Name" xml:space="preserve">
|
||||
<value>barDockControlTop</value>
|
||||
|
||||
@@ -15,6 +15,7 @@ Imports DevExpress.XtraGrid.Views.Grid
|
||||
Imports DevExpress.XtraGrid.Views.Grid.ViewInfo
|
||||
Imports DevExpress.XtraNavBar
|
||||
Imports DevExpress.XtraPrinting
|
||||
Imports DevExpress.XtraSplashScreen
|
||||
Imports DigitalData.GUIs.Common
|
||||
Imports DigitalData.Modules.Base
|
||||
Imports DigitalData.Modules.EDMI.API.Constants
|
||||
@@ -61,6 +62,7 @@ Public Class frmMain
|
||||
Private DetailLinkActive As Boolean = False
|
||||
Private FRONTEND_ACTION As String = "NONE"
|
||||
Private Ev_Filter_Panel_Closed As Boolean = False
|
||||
Private _overlayActive As Boolean = False
|
||||
|
||||
Dim omsgOpenWorkflow As String
|
||||
Dim omsgTitleWarning As String
|
||||
@@ -950,6 +952,7 @@ Public Class frmMain
|
||||
_tag = _tag.ToString.Replace("itmProfile#", "")
|
||||
If IsNumeric(_tag) Then
|
||||
If CURRENT_CLICKED_PROFILE_ID <> _tag Then
|
||||
LOGGER.Debug($"Profile with ID {_tag} clicked in NavBarControl...loading Profile...")
|
||||
OverviewOrDEtail = "DETAIL"
|
||||
If Not Application.OpenForms().OfType(Of frmValidator).Any Then
|
||||
CURRENT_CLICKED_PROFILE_ID = _tag
|
||||
@@ -966,14 +969,14 @@ Public Class frmMain
|
||||
|
||||
Me.Cursor = Cursors.WaitCursor
|
||||
Try
|
||||
LOGGER.Debug($"Loading profile with ID {_tag}...")
|
||||
' Zentral über Decide_Load laden
|
||||
Await Decide_Load(False, True)
|
||||
Finally
|
||||
Me.Cursor = Cursors.Default
|
||||
End Try
|
||||
Else
|
||||
CURRENT_CLICKED_PROFILE_TITLE = Nothing
|
||||
CURRENT_CLICKED_PROFILE_ID = Nothing
|
||||
LOGGER.Debug($"Profile with ID {_tag} clicked in NavBarControl is already active...ignoring click.")
|
||||
End If
|
||||
End If
|
||||
|
||||
@@ -1398,6 +1401,13 @@ Public Class frmMain
|
||||
' HAUPTLADEMETHODE - Koordiniert den gesamten Ladevorgang
|
||||
' ========================================
|
||||
Private Async Function Decide_Load(pIsFormLoad As Boolean, Optional ForceReload As Boolean = False) As Tasks.Task
|
||||
Dim oHandle As Object = Nothing
|
||||
Dim overlayStartedHere As Boolean = False
|
||||
If Not _overlayActive Then
|
||||
oHandle = SplashScreenManager.ShowOverlayForm(Me)
|
||||
_overlayActive = True
|
||||
overlayStartedHere = True
|
||||
End If
|
||||
Dim perfStart As DateTime = DateTime.MinValue
|
||||
Dim refreshWasEnabled As Boolean = False
|
||||
|
||||
@@ -1436,11 +1446,6 @@ Public Class frmMain
|
||||
LOGGER.Info("[PERF Decide_Load] ruft LoadOverviewData auf...")
|
||||
End If
|
||||
|
||||
' UI vorbereiten
|
||||
If Not PrepareGridForLoading() Then
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
Await Task.Yield()
|
||||
|
||||
' Daten laden
|
||||
@@ -1451,11 +1456,6 @@ Public Class frmMain
|
||||
LOGGER.Info("[PERF Decide_Load] ruft LoadProfileData auf...")
|
||||
End If
|
||||
|
||||
' UI vorbereiten
|
||||
If Not PrepareGridForLoading() Then
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
Await Task.Yield()
|
||||
|
||||
' Daten laden
|
||||
@@ -1470,6 +1470,10 @@ Public Class frmMain
|
||||
' ========== NACHBEARBEITUNG ==========
|
||||
ApplyPostLoadSettings()
|
||||
GridIsLoaded = True
|
||||
' ========== CAPTION FINAL SICHERSTELLEN ==========
|
||||
' ApplyPostLoadSettings kann durch Spalten-Events den Caption überschreiben,
|
||||
' daher hier nochmals den korrekten Caption setzen
|
||||
UpdateGridCaption()
|
||||
|
||||
Catch ex As Exception
|
||||
GridIsLoaded = True
|
||||
@@ -1477,7 +1481,10 @@ Public Class frmMain
|
||||
LOGGER.Info("Unexpected error in Decide_load: " & ex.Message)
|
||||
Finally
|
||||
FRONTEND_ACTION = FA_NONE
|
||||
|
||||
If overlayStartedHere Then
|
||||
_overlayActive = False
|
||||
SplashScreenManager.CloseOverlayForm(oHandle)
|
||||
End If
|
||||
If refreshWasEnabled Then
|
||||
TimerRefresh.Start()
|
||||
End If
|
||||
@@ -1491,33 +1498,6 @@ Public Class frmMain
|
||||
End If
|
||||
End Try
|
||||
End Function
|
||||
|
||||
' ========================================
|
||||
' UI-VORBEREITUNG - Macht Grid sichtbar und zeigt LoadingPanel
|
||||
' ========================================
|
||||
Private Function PrepareGridForLoading() As Boolean
|
||||
Try
|
||||
' Grid sichtbar machen
|
||||
If GridControlWorkflows.Visible = False Then
|
||||
GridControlWorkflows.Visible = True
|
||||
End If
|
||||
|
||||
' UI-Thread Zeit geben
|
||||
Application.DoEvents()
|
||||
|
||||
' LoadingPanel anzeigen
|
||||
GridViewWorkflows.ShowLoadingPanel()
|
||||
|
||||
' Nochmal Zeit zum Rendern
|
||||
Application.DoEvents()
|
||||
|
||||
Return True
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
|
||||
' ========================================
|
||||
' OVERVIEW DATEN LADEN - Spezialisiert auf Overview
|
||||
' ========================================
|
||||
@@ -1686,9 +1666,6 @@ Public Class frmMain
|
||||
GridControlWorkflows.EndUpdate()
|
||||
End If
|
||||
|
||||
' LoadingPanel verstecken (NUR HIER!)
|
||||
GridViewWorkflows.HideLoadingPanel()
|
||||
|
||||
If LOG_HOTSPOTS Then
|
||||
Dim totalElapsed = (DateTime.Now - perfStart).TotalMilliseconds
|
||||
If totalElapsed > 4000 Then
|
||||
@@ -1715,6 +1692,9 @@ Public Class frmMain
|
||||
Return False
|
||||
End If
|
||||
|
||||
' === FIX: Grid sichtbar machen bevor BeginUpdate ===
|
||||
GridControlWorkflows_Visible()
|
||||
|
||||
If GridControlWorkflows.Visible Then
|
||||
GridControlWorkflows.BeginUpdate()
|
||||
gridUpdateStarted = True
|
||||
@@ -1729,6 +1709,7 @@ Public Class frmMain
|
||||
DT_CURR_WF_ITEMS = Await DatabaseFallback.GetDatatableECMAsync(oSQL)
|
||||
|
||||
If IsNothing(DT_CURR_WF_ITEMS) Then
|
||||
LOGGER.Warn("Daten konnten nicht geladen werden für Profil: " & CURRENT_CLICKED_PROFILE_TITLE)
|
||||
Return False
|
||||
End If
|
||||
|
||||
@@ -1740,12 +1721,13 @@ Public Class frmMain
|
||||
GridControlWorkflows.Visible = False
|
||||
bindsourcegrid.DataSource = Nothing
|
||||
GridControlWorkflows.DataSource = Nothing
|
||||
LOGGER.Info("Keine Workflow-Items für Profil: " & CURRENT_CLICKED_PROFILE_TITLE)
|
||||
Return False
|
||||
End If
|
||||
|
||||
' ========== BASIC VIEW ERSTELLEN ==========
|
||||
Await CreateBasicViewForProfile()
|
||||
|
||||
LOGGER.Debug("Basic View für Profil erstellt: " & CURRENT_CLICKED_PROFILE_TITLE)
|
||||
Return True
|
||||
|
||||
Catch ex As Exception
|
||||
@@ -1759,9 +1741,6 @@ Public Class frmMain
|
||||
If gridUpdateStarted Then
|
||||
GridControlWorkflows.EndUpdate()
|
||||
End If
|
||||
|
||||
' LoadingPanel verstecken (NUR HIER!)
|
||||
GridViewWorkflows.HideLoadingPanel()
|
||||
End Try
|
||||
End Function
|
||||
|
||||
@@ -1998,6 +1977,8 @@ Public Class frmMain
|
||||
Dim useWaitCursorApplied As Boolean = False
|
||||
Dim previousMessage As String = bsiMessage.Caption
|
||||
Dim messageApplied As Boolean = False
|
||||
Dim oHandle As Object = Nothing
|
||||
Dim overlayStartedHere As Boolean = False
|
||||
|
||||
If LOG_HOTSPOTS Then
|
||||
perfStart = DateTime.Now
|
||||
@@ -2008,6 +1989,14 @@ Public Class frmMain
|
||||
CURRENT_ProfilGUID = pProfilID
|
||||
WM_AHWF_docPath = String.Empty
|
||||
|
||||
' ========== OVERLAY ANZEIGEN ==========
|
||||
If Not _overlayActive Then
|
||||
oHandle = SplashScreenManager.ShowOverlayForm(Me)
|
||||
_overlayActive = True
|
||||
overlayStartedHere = True
|
||||
End If
|
||||
|
||||
|
||||
' ========== UI-VORBEREITUNG ==========
|
||||
Me.UseWaitCursor = True
|
||||
useWaitCursorApplied = True
|
||||
@@ -2112,6 +2101,13 @@ Public Class frmMain
|
||||
MsgBox("Unexpected error in Load_Profil_from_Grid: " & ex.Message & vbNewLine & ADDITIONAL_TITLE & " will try to reload the overview - Please try again!", MsgBoxStyle.Information, ADDITIONAL_TITLE)
|
||||
Dim task = Decide_Load(False, True)
|
||||
Finally
|
||||
' ========== OVERLAY SCHLIESSEN (FALLBACK) ==========
|
||||
If overlayStartedHere AndAlso _overlayActive Then
|
||||
SplashScreenManager.CloseOverlayForm(oHandle)
|
||||
LOGGER.Debug("Overlay closed in Load_Profil_from_Grid")
|
||||
_overlayActive = False
|
||||
End If
|
||||
|
||||
' ========== UI AUFRÄUMEN ==========
|
||||
If useWaitCursorApplied Then
|
||||
Me.UseWaitCursor = False
|
||||
@@ -2287,6 +2283,13 @@ Public Class frmMain
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
|
||||
If oIds.Count > 1000 Then
|
||||
Dim omsg = String.Format("You chose more than 1000 Workflows. Please select fewer items.", vbNewLine)
|
||||
FormHelper.ShowInfoMessage(omsg, omsgTitleAttention)
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
' ========== DB-OPERATIONEN ==========
|
||||
LOGGER.Debug("Cleaning up queued DocIds..")
|
||||
Dim oDelete = $"DELETE FROM TBPM_VALIDATION_PROFILE_GROUP_USER WHERE UserID = {USER_ID}"
|
||||
@@ -2548,11 +2551,9 @@ Public Class frmMain
|
||||
Dim viewUpdateStarted As Boolean = False
|
||||
Dim layoutRestored As Boolean = False
|
||||
Dim resetLayoutTriggered As Boolean = False
|
||||
Dim showLoadingPanel As Boolean = False
|
||||
Dim useWaitCursorApplied As Boolean = False
|
||||
Dim previousMessage As String = bsiMessage.Caption
|
||||
Dim loadingMessageApplied As Boolean = False
|
||||
Dim gridWasMadeVisible As Boolean = False
|
||||
|
||||
If LOG_HOTSPOTS Then
|
||||
perfStart = DateTime.Now
|
||||
@@ -2564,24 +2565,11 @@ Public Class frmMain
|
||||
' SCHRITT 1: Grid sichtbar machen
|
||||
If GridControlWorkflows.Visible = False Then
|
||||
GridControlWorkflows.Visible = True
|
||||
gridWasMadeVisible = True
|
||||
End If
|
||||
|
||||
GRID_LOAD_TYPE = "OVERVIEW"
|
||||
CURRENT_CLICKED_PROFILE_ID = 0
|
||||
|
||||
' SCHRITT 2: UI-Thread Zeit geben, das Grid zu rendern
|
||||
Application.DoEvents()
|
||||
Await Task.Delay(100)
|
||||
|
||||
' SCHRITT 3: LoadingPanel anzeigen (jetzt ist das Grid definitiv sichtbar!)
|
||||
GridViewWorkflows.ShowLoadingPanel()
|
||||
showLoadingPanel = True
|
||||
|
||||
' SCHRITT 4: UI-Thread Zeit zum Rendern des LoadingPanels geben
|
||||
Application.DoEvents()
|
||||
Await Task.Delay(150)
|
||||
|
||||
If LOG_HOTSPOTS Then
|
||||
Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds
|
||||
If elapsed > 4000 Then
|
||||
@@ -2876,7 +2864,6 @@ Public Class frmMain
|
||||
|
||||
Finally
|
||||
' ========== AUFRÄUMEN ==========
|
||||
' EndUpdate IMMER aufrufen (vor dem Verstecken des LoadingPanel)
|
||||
If viewUpdateStarted Then
|
||||
GridViewWorkflows.EndUpdate()
|
||||
End If
|
||||
@@ -2884,11 +2871,6 @@ Public Class frmMain
|
||||
GridControlWorkflows.EndUpdate()
|
||||
End If
|
||||
|
||||
' LoadingPanel SOFORT nach EndUpdate verstecken
|
||||
If showLoadingPanel Then
|
||||
GridViewWorkflows.HideLoadingPanel()
|
||||
End If
|
||||
|
||||
' WaitCursor entfernen
|
||||
If useWaitCursorApplied Then
|
||||
Me.UseWaitCursor = False
|
||||
@@ -3474,11 +3456,26 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G
|
||||
End Sub
|
||||
|
||||
Private Sub bwBasicData_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bwBasicData.RunWorkerCompleted
|
||||
If USER_IS_ADMIN Then
|
||||
'bsiDebug.Caption = $"{ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("LicenseCountCaption")}: {USERCOUNT_LOGGED_IN}"
|
||||
bsiDebug.Caption = String.Format(S.Anzahl_Lizenzen___0_, USERCOUNT_LOGGED_IN)
|
||||
End If
|
||||
BarEditItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Never
|
||||
Try
|
||||
If e.Error IsNot Nothing Then
|
||||
LOGGER.Error(e.Error)
|
||||
LOGGER.Warn($"bwBasicData completed with error: {e.Error.Message}")
|
||||
End If
|
||||
|
||||
If USER_IS_ADMIN Then
|
||||
bsiDebug.Caption = String.Format(S.Anzahl_Lizenzen___0_, USERCOUNT_LOGGED_IN)
|
||||
End If
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
Finally
|
||||
BarEditItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Never
|
||||
' Caption zurücksetzen, falls sie noch auf "busy" steht
|
||||
If bsiMessage.Caption = "bwBasicData is busy - no Refreshing" Then
|
||||
bsiMessage.Caption = ""
|
||||
bsiMessage.ItemAppearance.Normal.BackColor = Color.Transparent
|
||||
bsiMessage.ItemAppearance.Normal.ForeColor = Color.Empty
|
||||
End If
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
Private Sub bwBasicData_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bwBasicData.ProgressChanged
|
||||
@@ -3597,7 +3594,7 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G
|
||||
|
||||
Private Sub GridViewWorkflows_ColumnFilterChanged(sender As Object, e As EventArgs) Handles GridViewWorkflows.ColumnFilterChanged
|
||||
Try
|
||||
If FormShown = False Or FRONTEND_ACTION = NAVBAR_CLICKED Then
|
||||
If FormShown = False Or FRONTEND_ACTION <> FA_NONE Then
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
@@ -3615,11 +3612,21 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G
|
||||
If lblCaptionMainGrid.Text.Contains(oTermFilterActive) Then
|
||||
Ev_Filter_Panel_Closed = False
|
||||
End If
|
||||
lblCaptionMainGrid.Text = String.Format("{0} - {1}", S.Gesamtübersicht, oTermFilterActive)
|
||||
|
||||
' Caption korrekt setzen: Profil-Titel oder Gesamtübersicht
|
||||
If GRID_LOAD_TYPE.StartsWith("PROFILE#") AndAlso Not String.IsNullOrEmpty(CURRENT_CLICKED_PROFILE_TITLE) Then
|
||||
LOGGER.Debug($"Setting Grid Caption with Profile Title [{CURRENT_CLICKED_PROFILE_TITLE}] and Filter Active Term [{oTermFilterActive}]")
|
||||
lblCaptionMainGrid.Text = String.Format("{0} - {1}", CURRENT_CLICKED_PROFILE_TITLE, oTermFilterActive)
|
||||
Else
|
||||
LOGGER.Debug($"Setting Grid Caption with Gesamtübersicht and Filter Active Term [{oTermFilterActive}]")
|
||||
lblCaptionMainGrid.Text = String.Format("{0} - {1}", S.Gesamtübersicht, oTermFilterActive)
|
||||
End If
|
||||
|
||||
bsitmCount.Visibility = DevExpress.XtraBars.BarItemVisibility.Always
|
||||
bsitmCount.Caption = oTermFilterActive
|
||||
Else
|
||||
bsitmCount.Visibility = DevExpress.XtraBars.BarItemVisibility.Never
|
||||
LOGGER.Debug("No active filter - resetting caption to default")
|
||||
End If
|
||||
|
||||
End If
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -468,7 +468,55 @@ Public Class frmValidatorSearch
|
||||
ToolStripDropDownButtonFile.Visible = False
|
||||
End Sub
|
||||
|
||||
Private Sub EnsureFormIsVisible()
|
||||
Try
|
||||
' Aktuellen Bildschirm basierend auf der Formularposition ermitteln
|
||||
Dim currentScreen As Screen = Screen.FromPoint(Me.Location)
|
||||
Dim workingArea As Rectangle = currentScreen.WorkingArea
|
||||
|
||||
' Prüfen ob das Formular vollständig außerhalb des sichtbaren Bereichs liegt
|
||||
Dim formBounds As New Rectangle(Me.Location, Me.Size)
|
||||
|
||||
' Wenn das Formular nicht mit dem Arbeitsbereich überschneidet
|
||||
If Not workingArea.IntersectsWith(formBounds) Then
|
||||
CenterFormOnScreen()
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
' Optional: Prüfen ob das Formular zu weit außerhalb liegt (z.B. nur 20% sichtbar)
|
||||
Dim visibleArea As Rectangle = Rectangle.Intersect(workingArea, formBounds)
|
||||
Dim visiblePercentage As Double = (visibleArea.Width * visibleArea.Height) / (formBounds.Width * formBounds.Height)
|
||||
|
||||
If visiblePercentage < 0.2 Then ' Weniger als 20% sichtbar
|
||||
CenterFormOnScreen()
|
||||
End If
|
||||
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
' Bei Fehler sicherheitshalber zentrieren
|
||||
CenterFormOnScreen()
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
Private Sub CenterFormOnScreen()
|
||||
Try
|
||||
' Formular auf dem primären Bildschirm zentrieren
|
||||
Me.StartPosition = FormStartPosition.CenterScreen
|
||||
|
||||
' Alternative: Auf aktuellem Bildschirm zentrieren
|
||||
Dim currentScreen As Screen = Screen.PrimaryScreen
|
||||
Dim x As Integer = currentScreen.WorkingArea.Left + (currentScreen.WorkingArea.Width - Me.Width) \ 2
|
||||
Dim y As Integer = currentScreen.WorkingArea.Top + (currentScreen.WorkingArea.Height - Me.Height) \ 2
|
||||
Me.Location = New Point(x, y)
|
||||
|
||||
LOGGER.Info("Formular wurde zentriert, da es außerhalb des sichtbaren Bereichs lag")
|
||||
Catch ex As Exception
|
||||
LOGGER.Error(ex)
|
||||
End Try
|
||||
End Sub
|
||||
Private Sub frmValidatorSearch_Shown(sender As Object, e As EventArgs) Handles Me.Shown
|
||||
' Prüfen ob das Formular im sichtbaren Bereich liegt
|
||||
EnsureFormIsVisible()
|
||||
formLoaded = True
|
||||
End Sub
|
||||
|
||||
|
||||
2141
app/TaskFlow/taskFLOW-TEST-Debug.txt
Normal file
2141
app/TaskFlow/taskFLOW-TEST-Debug.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -624,6 +624,12 @@
|
||||
<Compile Include="frmError.vb">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="frmExpression_Designer.Designer.vb">
|
||||
<DependentUpon>frmExpression_Designer.vb</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="frmExpression_Designer.vb">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="frmFileInfo.Designer.vb">
|
||||
<DependentUpon>frmFileInfo.vb</DependentUpon>
|
||||
</Compile>
|
||||
@@ -868,6 +874,9 @@
|
||||
<DependentUpon>frmError.vb</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="frmExpression_Designer.resx">
|
||||
<DependentUpon>frmExpression_Designer.vb</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="frmFileInfo.resx">
|
||||
<DependentUpon>frmFileInfo.vb</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
|
||||
Reference in New Issue
Block a user