From 8c22ee27f97f9bf8aa65748f39596e95905aba1d Mon Sep 17 00:00:00 2001 From: "d.breimaier" Date: Fri, 26 Jun 2026 16:02:47 +0200 Subject: [PATCH] Offerte, etc. --- SDL/cProgramFunctions.vb | 2 +- VERAG_PROG_ALLGEMEIN/Classes/cOfferte.vb | 2 - VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb | 91 +++++++++++++++++------ 3 files changed, 70 insertions(+), 25 deletions(-) diff --git a/SDL/cProgramFunctions.vb b/SDL/cProgramFunctions.vb index 1e2607df..3ea43dfb 100644 --- a/SDL/cProgramFunctions.vb +++ b/SDL/cProgramFunctions.vb @@ -318,7 +318,7 @@ Public Class cProgramFunctions Case 1, 7 : Return openThereforeNavigatorZollvollmachten_DE(KundenNr) Case 2, 8 : Return openThereforeNavigatorFiskalVM_DE(KundenNr) Case 4, 9 : Return openThereforeNavigatorFiskalVM_AT(KundenNr) - Case 12, 13 : Return openThereforeNavigatorVM_AT(KundenNr) + 'Case 12, 13 : Return openThereforeNavigatorVM_AT(KundenNr) End Select Return False End Function diff --git a/VERAG_PROG_ALLGEMEIN/Classes/cOfferte.vb b/VERAG_PROG_ALLGEMEIN/Classes/cOfferte.vb index d42abc61..69d997fb 100644 --- a/VERAG_PROG_ALLGEMEIN/Classes/cOfferte.vb +++ b/VERAG_PROG_ALLGEMEIN/Classes/cOfferte.vb @@ -960,10 +960,8 @@ Public Class cStandardofferten Property BGebMinBetrag As Object = Nothing Property BerechnungsartPosInkludiert As Object = Nothing Property BerechnungsartNr As Object = Nothing - Property LeistungsBez_EN As Object = Nothing Property LeistungsBez_RO As Object = Nothing - Property LeistungsBez_TR As Object = Nothing Public hasEntry = False diff --git a/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb b/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb index 98c17f2b..40296602 100644 --- a/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb +++ b/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb @@ -367,24 +367,23 @@ Public Class cProgramFunctions End Sub Public Shared Function ValidateSQLFieldLengths(parameters As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable), tableName As String, Info As String, Optional conn_art As String = "FMZOLL", Optional showError As Boolean = True) As Boolean - Try - Dim sql As String = - "SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" & tableName & "' AND DATA_TYPE IN ('varchar','nvarchar','char','nchar')" + "SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = '" & tableName & "' + AND DATA_TYPE IN ('varchar','nvarchar','char','nchar','decimal','numeric','float','real')" Dim dt As DataTable = - (New SQL).loadDgvBySql(sql, conn_art) + (New SQL).loadDgvBySql(sql, conn_art) If dt Is Nothing Then Return False - Dim fieldLengths As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase) + ' Struktur für Feldinfos + Dim fieldInfo As New Dictionary(Of String, DataRow)(StringComparer.OrdinalIgnoreCase) For Each r As DataRow In dt.Rows - - fieldLengths(r!COLUMN_NAME.ToString) = - CInt(r!CHARACTER_MAXIMUM_LENGTH) - + fieldInfo(r!COLUMN_NAME.ToString) = r Next Dim errors As New List(Of String) @@ -397,41 +396,89 @@ Public Class cProgramFunctions Dim fieldName As String = p.Text().TrimStart("@"c) - If Not fieldLengths.ContainsKey(fieldName) Then Continue For + If Not fieldInfo.ContainsKey(fieldName) Then Continue For - Dim maxLen As Integer = fieldLengths(fieldName) + Dim row As DataRow = fieldInfo(fieldName) + Dim dataType As String = row!DATA_TYPE.ToString.ToLower - ' varchar(max) / nvarchar(max) - If maxLen = -1 Then Continue For + Dim valueObj As Object = p.Value() + Dim valueStr As String = valueObj.ToString - Dim value As String = p.Value().ToString + ' ------------------------- + ' 1) TEXTFELDER + ' ------------------------- + If dataType.Contains("char") Then - If value.Length > maxLen Then + Dim maxLen As Integer = If(IsDBNull(row!CHARACTER_MAXIMUM_LENGTH), -1, CInt(row!CHARACTER_MAXIMUM_LENGTH)) - errors.Add(fieldName & " -> " & value.Length & "/" & maxLen) + If maxLen = -1 Then Continue For ' varchar(max) + + If valueStr.Length > maxLen Then + errors.Add(fieldName & " -> " & valueStr.Length & "/" & maxLen) + End If + + End If + + ' ------------------------- + ' 2) NUMERISCHE FELDER + ' ------------------------- + If dataType = "decimal" OrElse dataType = "numeric" OrElse dataType = "float" OrElse dataType = "real" Then + + Dim decValue As Decimal + + If Not Decimal.TryParse(valueStr, Globalization.NumberStyles.Any, + Globalization.CultureInfo.InvariantCulture, decValue) Then + + errors.Add(fieldName & " -> Ungültiger numerischer Wert: " & valueStr) + Continue For + End If + + ' decimal / numeric prüfen (Precision/Scale) + If dataType = "decimal" OrElse dataType = "numeric" Then + + Dim precision As Integer = If(IsDBNull(row!NUMERIC_PRECISION), 0, CInt(row!NUMERIC_PRECISION)) + Dim scale As Integer = If(IsDBNull(row!NUMERIC_SCALE), 0, CInt(row!NUMERIC_SCALE)) + + Dim parts = decValue.ToString(Globalization.CultureInfo.InvariantCulture).Split("."c) + + Dim digitsBefore As Integer = parts(0).Replace("-", "").Length + Dim digitsAfter As Integer = If(parts.Length > 1, parts(1).Length, 0) + + If digitsBefore + digitsAfter > precision OrElse digitsAfter > scale Then + errors.Add(fieldName & " -> " & decValue & + " überschreitet precision/scale (" & precision & "," & scale & ")") + End If + End If + + ' float/real -> Catch Overflow ähnlich SQL Server Verhalten + If dataType = "float" OrElse dataType = "real" Then + Try + Dim test As Double = CDbl(decValue) + Catch + errors.Add(fieldName & " -> Float/Real Überlauf: " & valueStr) + End Try + End If End If Next If errors.Count > 0 Then - Info = "Folgende SQL-Felder sind zu lang:" & vbCrLf & vbCrLf & String.Join(vbCrLf, errors) + Info = "Folgende SQL-Felder sind ungültig:" & vbCrLf & vbCrLf & + String.Join(vbCrLf, errors) + If showError Then MsgBox(Info, MsgBoxStyle.Exclamation) End If Return False - End If Return True Catch ex As Exception - MsgBox("ValidateSQLFieldLengths:" & vbCrLf & ex.Message) - - Return False - + Return False End Try End Function