Imports System.Reflection Imports System.Data.SqlClient ' ======================== ' 📦 Hauptklasse: DHF_Artikel ' ======================== Public Class DHF_Artikel Public LizenzNr As String = "S01122" Public FremdAdressID As String Public FremdKennung As String = "EXT" Public ArtikelCode As String Public AdressID As Integer? Public Bezeichnung As String Public Eigenmasse As Double? Public MengenEH As String Public GueltigAb As Date? Public Ursprungsland As String Public AusfVerfCode As String Public AusfVerfZusatzcode As String Public EinfVerfCode As String Public EinfVerfZusatzcode As String Public IndEAH As Byte? Public GeaendertVon As Integer = 1 Public GeaendertAm As Date = Now Public ArtikelTarife As New List(Of DHF_ArtikelTarif) Private db As New DHF_DBHelper Public Function Save() As Boolean Dim result = db.Save("imArtikel", GetParameterList()) For Each tarif In ArtikelTarife tarif.LizenzNr = LizenzNr tarif.FremdAdressID = FremdAdressID tarif.FremdKennung = FremdKennung tarif.ArtikelCode = ArtikelCode tarif.Save() Next Return result End Function Public Function Delete() As Boolean For Each tarif In ArtikelTarife tarif.Delete() Next Return db.Delete("imArtikel", GetParameterList()) End Function Public Shared Function Delete_KD(KdNr As String) As Boolean Dim db As New DHF_DBHelper db.DeleteByFremdAdressID("imArtikelTarifZucodes", KdNr) db.DeleteByFremdAdressID("imArtikelTarif", KdNr) Return db.DeleteByFremdAdressID("imArtikel", KdNr) End Function Private Function GetParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) Return New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) From { New VERAG_PROG_ALLGEMEIN.SQLVariable("LizenzNr", LizenzNr, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("FremdAdressID", FremdAdressID, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("FremdKennung", FremdKennung, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("ArtikelCode", ArtikelCode, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("AdressID", AdressID), New VERAG_PROG_ALLGEMEIN.SQLVariable("Bezeichnung", Bezeichnung), New VERAG_PROG_ALLGEMEIN.SQLVariable("Eigenmasse", Eigenmasse), New VERAG_PROG_ALLGEMEIN.SQLVariable("MengenEH", MengenEH), New VERAG_PROG_ALLGEMEIN.SQLVariable("GueltigAb", GueltigAb), New VERAG_PROG_ALLGEMEIN.SQLVariable("Ursprungsland", Ursprungsland), New VERAG_PROG_ALLGEMEIN.SQLVariable("AusfVerfCode", AusfVerfCode), New VERAG_PROG_ALLGEMEIN.SQLVariable("AusfVerfZusatzcode", AusfVerfZusatzcode), New VERAG_PROG_ALLGEMEIN.SQLVariable("EinfVerfCode", EinfVerfCode), New VERAG_PROG_ALLGEMEIN.SQLVariable("EinfVerfZusatzcode", EinfVerfZusatzcode), New VERAG_PROG_ALLGEMEIN.SQLVariable("IndEAH", IndEAH), New VERAG_PROG_ALLGEMEIN.SQLVariable("GeaendertVon", GeaendertVon), New VERAG_PROG_ALLGEMEIN.SQLVariable("GeaendertAm", GeaendertAm) } End Function End Class ' ======================== ' 💶 Unterklasse: DHF_ArtikelTarif ' ======================== Public Class DHF_ArtikelTarif Public LizenzNr As String Public FremdAdressID As String Public FremdKennung As String Public ArtikelCode As String Public GueltigAb As Date? Public TarifNr As String Public TarifZucodes As New List(Of DHF_ArtikelTarifZucode) Private db As New DHF_DBHelper Public Function Save() As Boolean Dim result = db.Save("imArtikelTarif", GetParameterList()) For Each zuc In TarifZucodes zuc.LizenzNr = LizenzNr zuc.FremdAdressID = FremdAdressID zuc.FremdKennung = FremdKennung zuc.ArtikelCode = ArtikelCode zuc.GueltigAb = GueltigAb zuc.Save() Next Return result End Function Public Function Delete() As Boolean For Each zuc In TarifZucodes zuc.Delete() Next Return db.Delete("imArtikelTarif", GetParameterList()) End Function Private Function GetParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) Return New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) From { New VERAG_PROG_ALLGEMEIN.SQLVariable("LizenzNr", LizenzNr, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("FremdAdressID", FremdAdressID, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("FremdKennung", FremdKennung, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("ArtikelCode", ArtikelCode, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("GueltigAb", GueltigAb, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("TarifNr", TarifNr) } End Function End Class ' ======================== ' 🧩 Unterklasse: DHF_ArtikelTarifZucode ' ======================== Public Class DHF_ArtikelTarifZucode Public LizenzNr As String Public FremdAdressID As String Public FremdKennung As String Public ArtikelCode As String Public GueltigAb As Date? Public TarifNrZusatzcode As String Private db As New DHF_DBHelper Public Function Save() As Boolean Return db.Save("imArtikelTarifZucodes", GetParameterList()) End Function Public Function Delete() As Boolean Return db.Delete("imArtikelTarifZucodes", GetParameterList()) End Function Private Function GetParameterList() As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) Return New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) From { New VERAG_PROG_ALLGEMEIN.SQLVariable("LizenzNr", LizenzNr, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("FremdAdressID", FremdAdressID, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("FremdKennung", FremdKennung, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("ArtikelCode", ArtikelCode, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("GueltigAb", GueltigAb, , True), New VERAG_PROG_ALLGEMEIN.SQLVariable("TarifNrZusatzcode", TarifNrZusatzcode) } End Function End Class ' ======================== ' 🧰 Datenbank-Hilfsklasse ' ======================== Public Class DHF_DBHelper Private SQL As New SQL Public Function Save(tableName As String, params As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)) As Boolean Dim whereClause = GetPrimaryKeyWhere(params) Dim existsSQL = "SELECT COUNT(*) FROM [" & tableName & "] WHERE " & whereClause For Each p In params If String.IsNullOrWhiteSpace(p.Scalarvariable) OrElse String.IsNullOrWhiteSpace(p.Text) Then Throw New Exception("❌ Ungültiger Parameter in SQLVariable! Text='" & p.Text & "', Scalarvariable='" & p.Scalarvariable & "'") End If Next ' Prüfen, ob Eintrag existiert Dim count = SQL.GetScalarValue(existsSQL, "EZOLL", params) Dim sqlCmd As String If count > 0 Then sqlCmd = GetUpdateCmd(tableName, params) Else sqlCmd = GetInsertCmd(tableName, params) End If Return SQL.doSQLVarList(sqlCmd, "EZOLL", , params) End Function Public Function Delete(tableName As String, params As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)) As Boolean Dim whereClause = GetPrimaryKeyWhere(params) Dim sqlstr = "DELETE FROM [" & tableName & "] WHERE " & whereClause Return SQL.doSQLVarList(sqlstr, "EZOLL", , params) End Function Public Function DeleteByFremdAdressID(tableName As String, fremdAdressID As String) As Boolean Dim sqlstr = "DELETE FROM [" & tableName & "] WHERE [FremdAdressID]=@FID" Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) From { New VERAG_PROG_ALLGEMEIN.SQLVariable("FID", fremdAdressID) } Return SQL.doSQLVarList(sqlstr, "EZOLL", , list) End Function Private Function GetPrimaryKeyWhere(params As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)) As String Return String.Join(" AND ", params.Where(Function(p) p.isPrimaryParam).Select(Function(p) "[" & p.Text & "]=@" & p.Scalarvariable)) End Function Private Function GetUpdateCmd(tableName As String, params As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)) As String ' Primärschlüssel-Felder NICHT in SET verwenden Dim setCmd = String.Join(",", params.Where(Function(p) p.isPrimaryParam <> True). Select(Function(p) "[" & p.Text & "]=@" & p.Scalarvariable)) Return "UPDATE [" & tableName & "] SET " & setCmd & " WHERE " & GetPrimaryKeyWhere(params) End Function Private Function GetInsertCmd(tableName As String, params As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)) As String Dim fields = String.Join(",", params.Select(Function(p) "[" & p.Text & "]")) Dim values = String.Join(",", params.Select(Function(p) "@" & p.Scalarvariable)) Return "INSERT INTO [" & tableName & "] (" & fields & ") VALUES (" & values & ")" End Function End Class Public Class DHF_ArtikelBeispiel Public Shared Sub Beispiel_TestSave() Dim KdNr = "123456" DHF_Artikel.Delete_KD(KdNr) MsgBox("del") Dim artikel As New DHF_Artikel With { .LizenzNr = "S01122", .FremdAdressID = KdNr, .FremdKennung = "EXT", .ArtikelCode = "ART1001", .Bezeichnung = "Testartikel223", .Eigenmasse = 12.5, .MengenEH = "kg", .GueltigAb = Date.Today, .Ursprungsland = "AT", .AusfVerfCode = "1000", .EinfVerfCode = "4000", .IndEAH = 0 } Dim tarif1 As New DHF_ArtikelTarif With { .GueltigAb = Date.Today, .TarifNr = "85011000" } tarif1.TarifZucodes.Add(New DHF_ArtikelTarifZucode With { .TarifNrZusatzcode = "V001" }) tarif1.TarifZucodes.Add(New DHF_ArtikelTarifZucode With { .TarifNrZusatzcode = "V002" }) artikel.ArtikelTarife.Add(tarif1) Dim tarif2 As New DHF_ArtikelTarif With { .GueltigAb = Date.Today.AddDays(30), .TarifNr = "85012000" } artikel.ArtikelTarife.Add(tarif2) If artikel.Save() Then Console.WriteLine("Artikel erfolgreich gespeichert.") Else Console.WriteLine("Fehler beim Speichern.") End If End Sub Public Shared Sub Beispiel_TestDelete() Dim artikel As New DHF_Artikel With { .LizenzNr = "S00001", .FremdAdressID = "K12345", .FremdKennung = "EXT", .ArtikelCode = "ART100" } If artikel.Delete() Then Console.WriteLine("Artikel erfolgreich gelöscht.") Else Console.WriteLine("Fehler beim Löschen.") End If End Sub Public Shared Sub Beispiel_DeleteAlleFuerKunde() If DHF_Artikel.Delete_KD("K12345") Then Console.WriteLine("Alle Artikel für Kunde gelöscht.") Else Console.WriteLine("Fehler beim Kundendaten-Löschen.") End If End Sub End Class