Imports System.Data
'Imports Gemeinsames
Imports VERAG_PROG_ALLGEMEIN.cMeineFunktionenAVISO
Imports VERAG_PROG_ALLGEMEIN.cGlobal
Imports System.Data.SqlClient
Imports System.Globalization
Imports System.Reflection
Imports System.Web.UI.WebControls.WebParts
Imports System.Windows.Forms

Public Class cSqlDb

    Public Shared Function GetSDLConnectionString() As String
        Return VERAG_PROG_ALLGEMEIN.SQL.GetSDLConnectionString()
    End Function
    Public Shared Function GetADMINConnectionString() As String
        Return VERAG_PROG_ALLGEMEIN.SQL.GetADMINConnectionString
    End Function
    Public Shared Function GetFMZOLLConnectionString() As String
        Return VERAG_PROG_ALLGEMEIN.SQL.GetFMZOLLConnectionString
    End Function
    Public Shared Function GetATLASConnectionString() As String
        Return VERAG_PROG_ALLGEMEIN.SQL.GetATLASConnectionString
    End Function

    Public Shared Function GetEZOLLConnectionString() As String
        Return VERAG_PROG_ALLGEMEIN.SQL.GetEZOLLConnectionString
    End Function
    Public Shared Function GetAVISOConnectionString() As String
        Return VERAG_PROG_ALLGEMEIN.SQL.GetAVISOConnectionString
    End Function


    Public Shared Function GetNewOpenConnection(Optional pooling As Boolean = True) As SqlConnection
        Dim cn As New SqlConnection()
        'cn.ConnectionString = My.Resources.connStringSDL_DEV
        ' IMMER DIE AKTUELLE CONNECTION IN MY.SETTINGS ÄNDERN!!! --> WG. BINDING
        cn.ConnectionString = GetSDLConnectionString() & CStr(IIf(pooling, "", ";pooling=false"))
        cn.Open()
        Return cn
    End Function
    Public Shared Function GetNewOpenConnectionLogin() As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = GetADMINConnectionString()
        cn.Open()
        Return cn
    End Function

    Public Shared Function GetNewOpenConnectionFMZOLL(Optional pooling As Boolean = True) As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = GetFMZOLLConnectionString() & CStr(If(pooling, "", ";pooling=false"))
        cn.Open()
        Return cn
    End Function
    Public Shared Function GetNewOpenConnectionATLAS() As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = GetATLASConnectionString()

        cn.Open()
        Return cn
    End Function

    Public Shared Function GetNewOpenConnectionEZOLL() As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = GetEZOLLConnectionString()

        cn.Open()
        Return cn
    End Function

    Public Shared Function GetNewOpenConnectionAVISO() As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = GetAVISOConnectionString()

        cn.Open()
        Return cn
    End Function

    Public Shared Function GetNewOpenConnectionFMZOLLREAL() As SqlConnection
        Dim cn As New SqlConnection()
        cn.ConnectionString = VERAG_PROG_ALLGEMEIN.My.MySettings.Default.FMZOLL_PRODConnectionString
        cn.Open()
        Return cn
    End Function


    Public Shared Function checkNullStr(ByVal o As Object) As String
        If o IsNot Nothing And o IsNot DBNull.Value Then Return CStr(o)
        Return ""
    End Function
    Public Shared Function checkNullInteger(ByVal o As Object) As Integer
        If o IsNot Nothing And o IsNot DBNull.Value Then Return CInt(o)
        Return -1
    End Function
    Public Shared Function checkNullReturnValue(ByVal o As Object, ByVal returnValue As Object) As Object
        If o IsNot Nothing And o IsNot DBNull.Value Then Return (o)
        Return returnValue
    End Function

    Public Shared Function checkNullIntegerZero(ByVal o As Object) As Integer
        If o IsNot Nothing And o IsNot DBNull.Value Then Return CInt(o)
        Return 0
    End Function
    Public Shared Function checkNulDbl(ByVal o As Object) As Double
        If o IsNot Nothing And o IsNot DBNull.Value Then Return CDbl(o)
        Return -1
    End Function
    Public Shared Function checkNullBoolCheckState(ByVal o As Object) As Integer
        If o IsNot Nothing And o IsNot DBNull.Value Then Return 2
        Try
            If CBool(o) = True Then Return 1
            If CBool(o) = False Then Return 0
        Catch ex As Exception
        End Try
        Return 2
    End Function
    Public Shared Function checkNullBool(ByVal o As Object) As Boolean
        If o Is Nothing Or o Is DBNull.Value Then Return False
        Try
            Return CBool(o)
        Catch ex As Exception
        End Try
        Return False
    End Function
    Public Shared Function checkNullDate(ByVal o As Object) As Date
        If o IsNot Nothing And o IsNot DBNull.Value Then Return CDate(o)
        Return Now
    End Function
    Public Shared Function checkNullDateNothing(ByVal o As Object) As Object
        If o Is DBNull.Value Then
            Return Nothing
        Else
            Return CDate(o)
        End If
    End Function
    Public Shared Function setNullDate(ByVal o As String) As Object
        Try
            If IsDate(o) Then Return CDate(o)
        Catch ex As Exception
        End Try
        Return DBNull.Value
    End Function
    Public Shared Function setNullInteger(ByVal o As Integer) As Object
        Try
            If IsNumeric(o) AndAlso o >= 0 Then Return CInt(o)
        Catch ex As Exception
        End Try
        Return DBNull.Value
    End Function
    Public Shared Function setNullBoolean(ByVal o As Integer) As Object
        Try
            If o = 0 Then Return False
            If o = 1 Then Return True
        Catch ex As Exception
        End Try
        Return DBNull.Value
    End Function
End Class


Public Class cDatenbankAVISO


    Public Shared GlobalConnection As SqlConnection = Nothing
    Public Shared GlobalConnectionFMZOLL As SqlConnection = Nothing

    Public Shared Function GetNewOpenConnection(Optional newConn As Boolean = False) As SqlConnection
        Try
            If GlobalConnection Is Nothing Or newConn Then
                GlobalConnection = New SqlConnection(cSqlDb.GetAVISOConnectionString)
            End If
            If GlobalConnection.State = ConnectionState.Broken Or GlobalConnection.State = ConnectionState.Closed Then
                GlobalConnection.Open()
            End If
            Return GlobalConnection
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Es konnte keine Verbindung zur Datenbank aufgebaut werden!! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            ' MsgBox("Es konnte keine Verbindung zur Datenbank aufgebaut werden!! " & vbCrLf & vbNewLine & vbCrLf & "Fehler: " & ex.Message & ex.StackTrace)
        End Try
        Return Nothing
    End Function

    Public Shared Function GetNewOpenConnectionFMZOLL(Optional newConn As Boolean = False) As SqlConnection
        Try
            If GlobalConnectionFMZOLL Is Nothing Or newConn Then
                GlobalConnectionFMZOLL = New SqlConnection(cSqlDb.GetFMZOLLConnectionString)
            End If
            If GlobalConnectionFMZOLL.State = ConnectionState.Broken Or GlobalConnectionFMZOLL.State = ConnectionState.Closed Then
                GlobalConnectionFMZOLL.Open()
            End If
            Return GlobalConnectionFMZOLL
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("SQLGUIDE01_USED: " & VERAG_PROG_ALLGEMEIN.cAllgemein.SQLGUIDE01_USED & "   Es konnte keine Verbindung zur Datenbank aufgebaut werden!! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '     MsgBox("Es konnte keine Verbindung zur Datenbank aufgebaut werden!! " & vbCrLf & vbNewLine & vbCrLf & "Fehler: " & ex.Message)
        End Try
        Return Nothing
    End Function

    Public Shared Function CreateNewOpenConnection() As SqlConnection
        Dim conn As New SqlConnection(cSqlDb.GetAVISOConnectionString())
        conn.Open()
        Return conn
    End Function


    Public Shared Function GetNewOpenConnectionWithoutError(Optional newConn As Boolean = False) As SqlConnection
        Try
            If GlobalConnection Is Nothing Or newConn Then
                GlobalConnection = New SqlConnection(cSqlDb.GetAVISOConnectionString)
            End If
            If GlobalConnection.State = ConnectionState.Broken Or GlobalConnection.State = ConnectionState.Closed Then
                GlobalConnection.Open()
            End If
            Return GlobalConnection
        Catch ex As Exception
            '  MsgBox("Problem" & vbCrLf & vbNewLine & vbCrLf & "Fehler: " & ex.Message)
        End Try
        Return Nothing
    End Function
    Public Shared Function GetNewOpenConnectionADMIN() As SqlConnection
        Try
            Dim conn As New SqlConnection(cSqlDb.GetADMINConnectionString)
            conn.Open()
            Return conn
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Es konnte keine Verbindung zur Datenbank aufgebaut werden!! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '     MsgBox("Es konnte keine Verbindung zur ADMIN-Datenbank aufgebaut werden." & vbCrLf & "connStr=" & cSqlDb.GetAVISOConnectionString & vbCrLf & "Fehler: " & ex.Message)
        End Try
        Return Nothing
    End Function


    Public Shared Function GetNewOpenConnection2() As SqlConnection
        'Dim Start As Integer = My.Computer.Clock.TickCount
        Const useGlobalConnection As Boolean = True
        Try
            If useGlobalConnection Then
                If GlobalConnection Is Nothing Then
                    GlobalConnection = New SqlConnection
                    GlobalConnection.ConnectionString = cSqlDb.GetAVISOConnectionString
                End If
                If GlobalConnection.State = ConnectionState.Broken Or GlobalConnection.State = ConnectionState.Closed Then
                    GlobalConnection.Open()
                End If
                'cGlobal.hDauerOpen += My.Computer.Clock.TickCount - Start
                Return GlobalConnection
            Else
                Dim conn As New SqlConnection
                conn.ConnectionString = cSqlDb.GetAVISOConnectionString
                conn.Open()
                'cGlobal.hDauerOpen += 1
                'cGlobal.hDauerOpen += My.Computer.Clock.TickCount - Start
                Return (conn)
            End If
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Fehler bei Datenbank öffnen. " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '     MsgBox("Fehler bei Datenbank öffnen." & vbCrLf & "connStr=" & cSqlDb.GetAVISOConnectionString & vbCrLf & "Fehler: " & ex.Message)
            Return Nothing
        End Try
    End Function

End Class


Public Class cMitarbeiterAVISO
    Property MitarbeiterID As Integer
    Property Mitarbeiter As String
    Property Mitarbeitername As String
    Property KW As String
    ' Property Sicherheitsstufe As Integer
    Property Info As String
    ' Property Grenzstelle As String
    ' Property Abteilung As String = ""
    Property StandartFiliale As Integer = -1
    Property mit_FMZollPersID As Integer = -1
    Property mit_username As String

End Class

Public Class cADMIN

    ' Public USRNAME As String
    'Public USRID As String
    'Public USERBER As String
    Public cMitarbeiterAVISO As cMitarbeiterAVISO
    ' Private Property USERBER As Object



    Public Function getAktuelleVersion(Optional progname As String = "AVISO_NEW") As String
        Dim sql As String = "SELECT prog_aktuelleVersion FROM tblProgramme WHERE prog_codename=@codename"
        Dim dr As SqlDataReader
        Using conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnectionADMIN()
            Using cmd As New SqlCommand(sql, conn)
                cmd.Parameters.AddWithValue("@codename", progname)
                dr = cmd.ExecuteReader()
                Try
                    If dr.Read Then Return CStr(dr.Item("prog_aktuelleVersion"))
                Catch ex As Exception
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Fehler mit der Datenbankverbindung. " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '           MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Fehler mit der Datenbankverbindung:" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Datenbankfehler")
                Finally
                    dr.Close()
                End Try
            End Using
        End Using
        Return "0"
    End Function
    Public Function getPwdFromUsrname(ByVal user As String, ByVal firma As String) As String
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Return SQL.getValueTxtBySql("SELECT mit_pwd FROM tblMitarbeiter where mit_username='" & user & "' COLLATE Latin1_General_CS_AS AND (mit_firma='" & firma & "' OR mit_firma='ALL' ) ", "ADMIN")
    End Function

    Public Function getPwdFromUsrId(ByVal userId As String) As String
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Return SQL.getValueTxtBySql("SELECT mit_pwd FROM tblMitarbeiter where mit_id='" & userId & "' ", "ADMIN")
    End Function
    Public Function getUnameFromUsrId(ByVal userId As String) As String
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Return SQL.getValueTxtBySql("SELECT mit_username FROM tblMitarbeiter where mit_id='" & userId & "' ", "ADMIN")
    End Function

    Public Function checkLogin(ByVal user As String, ByVal pwd As String, ByVal firma As String, Optional nlTmp As String = "", Optional switchCompany As Boolean = False, Optional bepr_programm As String = "AVISO") As Boolean

        VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = If(firma = "", "VERAG", firma)

        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        'Dim sql As String = "SELECT mit_vname,mit_nname,mit_berechtigung FROM tblUser where mit_username=@mit_username COLLATE Latin1_General_CS_AS and mit_pwd=@mit_pwd COLLATE Latin1_General_CS_AS "
        Dim sql As String = "SELECT mit_id,mit_vname,mit_nname,mit_niederlassung,mit_username, case WHEN isnull(mit_abweichenderAnzeigename,'')='' THEN mit_username ELSE mit_abweichenderAnzeigename END mit_usernameDisplay,mit_pwd,mit_info,mit_abteilung,mit_standartFiliale,mit_FMZollPersID,mit_firmaFMZoll,mit_TESTonly,mit_abweichenderAnzeigename FROM " &
                            " tblMitarbeiter,tblBerProg where mit_username=@mit_username and mit_pwd=@mit_pwd COLLATE Latin1_General_CS_AS AND (mit_firma=@mit_firma OR mit_firma='ALL' ) AND bepr_programm=@bepr_programm AND bepr_userId=mit_id "


        Dim dr As SqlDataReader

        Try
            Using conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnectionADMIN()
                Using cmd As New SqlCommand(sql, conn)

                    cmd.Parameters.AddWithValue("@mit_username", user)
                    cmd.Parameters.AddWithValue("@mit_pwd", pwd)
                    cmd.Parameters.AddWithValue("@bepr_programm", bepr_programm)
                    cmd.Parameters.AddWithValue("@mit_firma", firma)

                    dr = cmd.ExecuteReader()
                    cMitarbeiterAVISO = New cMitarbeiterAVISO


                    If dr.Read Then
                        cMitarbeiterAVISO.MitarbeiterID = CInt(dr.Item("mit_id"))
                        '  cMitarbeiterAVISO.Grenzstelle = CStr(dr.Item("mit_niederlassung"))
                        '  If cMitarbeiterAVISO.Grenzstelle = "Suben" Then cMitarbeiterAVISO.Grenzstelle = "SUB"
                        '  If cMitarbeiterAVISO.Grenzstelle = "Waidhaus" Then cMitarbeiterAVISO.Grenzstelle = "WAI"
                        '  If cMitarbeiterAVISO.Grenzstelle = "Nickelsdorf" Then cMitarbeiterAVISO.Grenzstelle = "NKD"
                        '  If cMitarbeiterAVISO.Grenzstelle = "Salzburg" Then cMitarbeiterAVISO.Grenzstelle = "SBG"
                        '  If cMitarbeiterAVISO.Grenzstelle = "" Then cMitarbeiterAVISO.Grenzstelle = "???"
                        cMitarbeiterAVISO.Mitarbeiter = CStr(dr.Item("mit_usernameDisplay"))
                        'cMitarbeiterAVISO.Mitarbeiter = If(CStr(dr.Item("mit_abweichenderAnzeigename")) <> "", CStr(dr.Item("mit_abweichenderAnzeigename")), CStr(dr.Item("mit_username")))
                        cMitarbeiterAVISO.Mitarbeitername = CStr(dr.Item("mit_vname")) & " " & CStr(dr.Item("mit_nname"))
                        cMitarbeiterAVISO.KW = CStr(dr.Item("mit_pwd"))
                        '  cMitarbeiterAVISO.Sicherheitsstufe = CInt(dr.Item("ber_sicherheitsstufe"))
                        cMitarbeiterAVISO.Info = CStr(dr.Item("mit_info"))
                        '   If dr.Item("mit_abteilung") IsNot DBNull.Value Then cMitarbeiterAVISO.Abteilung = CStr(dr.Item("mit_abteilung"))
                        cMitarbeiterAVISO.StandartFiliale = VarToInt2(dr.Item("mit_standartFiliale"))
                        cMitarbeiterAVISO.mit_FMZollPersID = VarToInt2(dr.Item("mit_FMZollPersID"))
                        cMitarbeiterAVISO.mit_username = VarToStr(dr.Item("mit_username"))

                        '     VERAG_PROG_ALLGEMEIN.cAllgemein.USRBER = CInt(dr.Item("ber_sicherheitsstufe"))
                        VERAG_PROG_ALLGEMEIN.cAllgemein.NIEDERLASSUNG = CStr(dr.Item("mit_niederlassung"))
                        VERAG_PROG_ALLGEMEIN.cAllgemein.ABTEILUNG = CStr(dr.Item("mit_abteilung"))
                        VERAG_PROG_ALLGEMEIN.cAllgemein.USRID = CInt(dr.Item("mit_id"))
                        ' VERAG_PROG_ALLGEMEIN.cAllgemein.USR_VNAME = CStr(dr.Item("mit_vname"))
                        ' VERAG_PROG_ALLGEMEIN.cAllgemein.USR_NNAME = CStr(dr.Item("mit_nname"))
                        'VERAG_PROG_ALLGEMEIN.cAllgemein.USRNAME = CStr(dr.Item("mit_vname")) & " " & CStr(dr.Item("mit_nname"))
                        VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME = CStr(dr.Item("mit_username"))
                        '  VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME = CStr(dr.Item("mit_usernameDisplay"))
                        If dr.Item("mit_firmaFMZoll") Is DBNull.Value Then
                            MsgBox("Benutzer muss einer Firma zugeordnet sein!")
                            Return False
                        End If

                        If dr.Item("mit_TESTonly") And Not VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then
                            MsgBox("Benutzer ist nur für das Testsystem freigeschaltet!")
                            VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM = True 'umschalten auf das TESTSYSTEM
                        End If


                        VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA_ID = CInt(dr.Item("mit_firmaFMZoll"))
                        VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA_NAME = getValueTxtBySql("SELECT Firma_Bez FROM tblFirma WHERE Firma_ID= " & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA_ID, "FMZOLL")

                        VERAG_PROG_ALLGEMEIN.cAllgemein.LOAD_BER()
                        VERAG_PROG_ALLGEMEIN.cAllgemein.LOAD_DATA(switchCompany, firma, nlTmp)

                        cGlobal.AktiverMitarbeiter = cMitarbeiterAVISO
                        Return True
                    End If
                    'USERBER = CStr(dr.Item("ber_sicherheitsstufe")) : USRNAME = CStr(dr.Item("mit_vname")) & " " & CStr(dr.Item("mit_nname")) : USRID = CStr(dr.Item("mit_id")) : Return True

                End Using
            End Using
            dr.Close()
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Fehler mit der Datenbankverbindung. " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            Return False
        End Try

        Return False
    End Function




    Public Function getUstName_ByAD(Domain As String, User As String) As String
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Return SQL.getValueTxtBySql("SELECT TOP 1 [mit_username]  FROM [tblMitarbeiter] WHERE ([mit_AliasAD_Domain]='" & Domain & "' AND [mit_AliasAD_Username]='" & User & "') Or ([mit_AliasAD_Domain2]='" & Domain & "' AND [mit_AliasAD_Username2]='" & User & "' )", "ADMIN")
    End Function

    Public Function getUstFirma_ByAD(Domain As String, User As String) As String
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Return SQL.getValueTxtBySql("SELECT TOP 1 case when mit_firma='ALL' then mit_FirmaHaupt else mit_firma  END mit_firma FROM  [tblMitarbeiter] WHERE ([mit_AliasAD_Domain]='" & Domain & "' AND [mit_AliasAD_Username]='" & User & "') Or ([mit_AliasAD_Domain2]='" & Domain & "' AND [mit_AliasAD_Username2]='" & User & "' )", "ADMIN")
    End Function

    Public Function getUstId_ByAD(Domain As String, User As String) As Integer
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Return SQL.getValueTxtBySql("SELECT TOP 1 [mit_id]  FROM [tblMitarbeiter] WHERE ([mit_AliasAD_Domain]='" & Domain & "' AND [mit_AliasAD_Username]='" & User & "') Or ([mit_AliasAD_Domain2]='" & Domain & "' AND [mit_AliasAD_Username2]='" & User & "' )", "ADMIN",,, "-1")
    End Function

    Public Function getBezById(id As Integer) As String

        Dim sql As String = "SELECT Firma_Bez FROM tblFirma WHERE Firma_ID=@id "
        Dim dr As SqlDataReader
        Try
            Using conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnectionFMZOLL()
                Using cmd As New SqlCommand(sql, conn)
                    cmd.Parameters.AddWithValue("@id", id)
                    dr = cmd.ExecuteReader()
                    If dr.HasRows AndAlso dr.Read Then
                        Return CStr(dr.Item(0))
                    End If
                End Using
            End Using
            dr.Close()
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Fehler mit der Datenbankverbindung. " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '    MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Fehler mit der Datenbankverbindung:" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Datenbankfehler")
        End Try
        Return ""
    End Function


    Public Function loadCboBySql(ByVal sql As String, Optional conn_art As String = "AVISO", Optional newConn As Boolean = False, Optional conn As SqlConnection = Nothing) As List(Of Object)


        Dim o As New List(Of Object)
        Try
            If conn Is Nothing Then
                Select Case conn_art
                    Case "AVISO" : conn = cDatenbankAVISO.GetNewOpenConnection(newConn)
                    Case "FMZOLL" : conn = cDatenbankAVISO.GetNewOpenConnectionFMZOLL(newConn)
                End Select
            End If
            ' Using conn As SqlConnection = cSqlDb.GetNewOpenConnection()
            Using cmd As New SqlCommand(sql, conn)
                Dim dr As SqlDataReader = cmd.ExecuteReader()
                While dr.Read
                    o.Add(dr.Item(0))
                End While
                dr.Close()
            End Using
            conn.Close()
            ' End Using
            Return o  'While Schleife wird hier verlassen
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '    MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message)
        End Try

        Return Nothing
    End Function

    Public Function loadCboBySqlWithListItem(ByVal sql As String, Optional showValueInText As Boolean = True, Optional conn_art As String = "AVISO") As List(Of MyListItem)
        Dim o As New List(Of MyListItem)
        Try
            Dim conn As New SqlConnection
            Select Case conn_art
                Case "AVISO" : conn = cDatenbankAVISO.GetNewOpenConnection()
                Case "FMZOLL" : conn = cDatenbankAVISO.GetNewOpenConnectionFMZOLL
            End Select

            Using cmd As New SqlCommand(sql, conn)
                Dim dr As SqlDataReader = cmd.ExecuteReader()
                While dr.Read
                    If showValueInText Then
                        o.Add(New MyListItem(CStr(dr.Item(0)) & vbTab & " - " & CStr(dr.Item(1)), CStr(dr.Item(0))))
                    Else
                        Try
                            o.Add(New MyListItem(CStr(dr.Item(1)), CStr(dr.Item(0))))
                        Catch ex As Exception
                            o.Add(New MyListItem(CStr(dr.Item(0)), CStr(dr.Item(0))))
                        End Try
                    End If

                End While
                dr.Close()
            End Using
            conn.Close()

            Return o  'While Schleife wird hier verlassen
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '   MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message)
        End Try

        Return Nothing
    End Function

    Public Function getValueTxtBySql(ByVal sql As String, Optional conn_art As String = "AVISO") As String
        Dim s As String = ""
        Try
            'MsgBox("1")
            Dim conn As New SqlConnection
            Select Case conn_art
                Case "AVISO" : conn = cDatenbankAVISO.GetNewOpenConnection()
                Case "ADMIN" : conn = cDatenbankAVISO.GetNewOpenConnectionADMIN()
                Case "FMZOLL" : conn = cDatenbankAVISO.GetNewOpenConnectionFMZOLL

            End Select

            Using cmd As New SqlCommand(sql, conn)
                Dim dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    If Not dr.Item(0) Is DBNull.Value Then
                        s = CStr(dr.Item(0))
                    End If
                End If
                dr.Close()
            End Using
            conn.Close()

            Return s
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '  MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message)
        End Try
        'MsgBox("3")
        Return ""
    End Function

    Public Function doSQL(ByVal sql As String, Optional conn_art As String = "AVISO", Optional conn As SqlConnection = Nothing) As Boolean
        If conn Is Nothing Then
            Select Case conn_art
                Case "AVISO" : conn = cDatenbankAVISO.GetNewOpenConnection()
                Case "FMZOLL" : conn = cDatenbankAVISO.GetNewOpenConnectionFMZOLL
            End Select
        End If
        Try
            ' MsgBox(sql)
            Using cmd As New SqlCommand(sql, conn)
                cmd.ExecuteNonQuery()
            End Using
            conn.Close()
            Return True
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '    MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message)
        End Try
        Return False
    End Function

End Class

Public Class cMitarbeiterAVISODAL

    Public Function LesenMitarbeiter(hID As Integer, hKürzel As String) As cMitarbeiterAVISO
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If hID > 0 Then
            sql = String.Format("SELECT * FROM Mitarbeiter WHERE MitarbeiterID = {0}", hID)
        Else
            sql = String.Format("SELECT * FROM Mitarbeiter WHERE Mitarbeiter = '" & hKürzel.Trim & "'")
        End If
        Dim daten As cMitarbeiterAVISO = Nothing

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    daten = New cMitarbeiterAVISO
                    daten.MitarbeiterID = VarToInt(dr.Item("MitarbeiterID"))
                    daten.Mitarbeiter = VarToStr(dr.Item("Mitarbeiter"))
                    daten.Mitarbeitername = VarToStr(dr.Item("Mitarbeitername"))
                    daten.KW = VarToStr(dr.Item("KW"))
                    '     daten.Sicherheitsstufe = VarToInt(dr.Item("Sicherheitsstufe"))
                    daten.Info = VarToStr(dr.Item("Info"))
                    ' daten.Grenzstelle = VarToStr(dr.Item("Grenzstelle"))
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return daten
    End Function

    Public Function Anzeigen_Mitarbeiter(hSQL As String) As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try
                Dim myTable = New DataTable()
                'Dim sql As String
                'sql = hSQL
                Using cmd As New SqlCommand(hSQL, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Mitarbeiter'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Programm wird aufgrund eines kritischen Problems beendet." & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '  MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
            conn.Close()
        End While
        Return Nothing
    End Function

    Public Function Anzeigen_cboMitarbeiter() As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try
                Dim myTable = New DataTable()
                Dim sql = "SELECT MitarbeiterID, Mitarbeiter FROM Mitarbeiter ORDER BY Mitarbeiter"
                Using cmd As New SqlCommand(sql, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_cboMitarbeiter'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Programm wird aufgrund eines kritischen Problems beendet." & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '   MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
            conn.Close()
        End While

        Return Nothing
    End Function


    Public Sub SpeichernMitarbeiter(ByVal d As cMitarbeiterAVISO)
        Dim hAuswahl As String
        If d.MitarbeiterID = 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO Mitarbeiter " &
                       "(Mitarbeiter, Mitarbeitername, KW, Sicherheitsstufe, Info, Grenzstelle) VALUES (" &
                       "@Mitarbeiter, @Mitarbeitername, @KW, @Sicherheitsstufe, @Info, @Grenzstelle)"
        Else
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE Mitarbeiter SET Mitarbeiter = @Mitarbeiter, Mitarbeitername = @Mitarbeitername, KW=@KW, Sicherheitsstufe=@Sicherheitsstufe, Info=@Info, Grenzstelle=@Grenzstelle " &
                       "WHERE MitarbeiterID = @MitarbeiterID")
        End If
        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Mitarbeiter", d.Mitarbeiter)
            cmd.Parameters.AddWithValue("@Mitarbeitername", d.Mitarbeitername)
            cmd.Parameters.AddWithValue("@KW", d.KW)
            ' cmd.Parameters.AddWithValue("@Sicherheitsstufe", d.Sicherheitsstufe)
            cmd.Parameters.AddWithValue("@Info", d.Info)
            '  cmd.Parameters.AddWithValue("@Grenzstelle", d.Grenzstelle)
            cmd.Parameters.AddWithValue("@MitarbeiterID", d.MitarbeiterID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Datensatz kann nicht gespeichert werden!" & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                '     MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Mitarbeiterstamm")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub LöschenMitarbeiter(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM Mitarbeiter WHERE MitarbeiterID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Mitarbeiter-Stammdaten können nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub

End Class


Public Class cFirma
    Property FirmaID As Integer
    Property Firma As String
    Property eMail As String
    Property eMail2 As String
    Property Info As String
    Property Frächter As Boolean
    Property Auftraggeber As Boolean
    Property FMZollKdnr As String = ""

    'Property Adresse As String
    'Property Telefon As String
    'Property Fax As String
    'Property Ansprechpersonen As String
End Class

Public Class cFirmenDAL

    Public Function LesenFirma(hID As Integer, hFirma As String, hSQL As String) As cFirma
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If hID > 0 Then
            sql = String.Format("SELECT * FROM Firmen WHERE FirmaID = {0}", hID)
        ElseIf hFirma <> "" Then
            sql = String.Format("SELECT * FROM Firmen WHERE Firma = '" & hFirma.Trim & "'")
        Else
            sql = hSQL
        End If
        Dim daten As cFirma = Nothing

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    daten = New cFirma()
                    daten.FirmaID = VarToInt(dr.Item("FirmaID"))
                    daten.Firma = VarToStr(dr.Item("Firma"))
                    daten.eMail = VarToStr(dr.Item("eMail"))
                    daten.eMail2 = VarToStr(dr.Item("eMail2"))
                    daten.Info = VarToStr(dr.Item("Info"))
                    daten.Frächter = VarToBool(dr.Item("Frächter"))
                    daten.Auftraggeber = VarToBool(dr.Item("Auftraggeber"))
                    'daten.FMZollKdnr = VarToStr(dr.Item("KundenNr"))
                    If Not dr.Item("KundenNr") Is DBNull.Value Then daten.FMZollKdnr = CStr(dr.Item("KundenNr"))
                    'daten.Ansprechpersonen = VarToStr(dr.Item("Ansprechpersonen"))
                    'daten.Adresse = VarToStr(dr.Item("Adresse"))
                    'daten.Telefon = VarToStr(dr.Item("Telefon"))
                    'daten.Fax = VarToStr(dr.Item("Fax"))
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return daten
    End Function

    Public Function Anzeigen_Firmen(hSQL As String) As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try
                Dim myTable = New DataTable()
                'Dim sql As String
                'sql = hSQL
                Using cmd As New SqlCommand(hSQL, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Firmen'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Programm wird aufgrund eines kritischen Problems beendet." & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '      MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
            conn.Close()
        End While
        Return Nothing
    End Function

    Public Function Anzeigen_cboFirmen(hSQL As String) As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try
                Dim myTable = New DataTable()
                If hSQL = "" Then hSQL = "SELECT FirmaID, Firma FROM Firmen ORDER BY Firma"
                Using cmd As New SqlCommand(hSQL, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_cboFirma'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Programm wird aufgrund eines kritischen Problems beendet." & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '    MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
            conn.Close()
        End While

        Return Nothing
    End Function

    Public Sub SpeichernFirma(ByVal d As cFirma)
        Dim hAuswahl As String
        If d.FirmaID = 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO Firmen " &
                       "(Firma, eMail, eMail2, Info, Frächter, Auftraggeber, KundenNr) VALUES (" &
                       "@Firma, @eMail, @eMail2, @Info, @Frächter, @Auftraggeber, @KundenNr)"
        Else
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE Firmen SET Firma = @Firma, eMail=@eMail, eMail2=@eMail2, Info=@Info, Frächter=@Frächter, Auftraggeber=@Auftraggeber, KundenNr=@KundenNr " &
                       "WHERE FirmaID = @FirmaID")
        End If
        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Firma", d.Firma)
            cmd.Parameters.AddWithValue("@eMail", d.eMail)
            cmd.Parameters.AddWithValue("@eMail2", d.eMail2)
            cmd.Parameters.AddWithValue("@Info", d.Info)
            cmd.Parameters.AddWithValue("@Frächter", d.Frächter)
            cmd.Parameters.AddWithValue("@Auftraggeber", d.Auftraggeber)
            cmd.Parameters.AddWithValue("@FirmaID", d.FirmaID)
            If d.FMZollKdnr = "" Then
                cmd.Parameters.AddWithValue("@KundenNr", DBNull.Value)
            Else
                cmd.Parameters.AddWithValue("@KundenNr", d.FMZollKdnr)
            End If
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Firma")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub LöschenFirma(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM Firmen WHERE FirmaID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Firma-Stammdaten können nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub

End Class



Public Class cQSAufträge
    Property QS_auftragpos_id As Integer = -1
    Property AvisoID As Integer = -1
    Property QS_Abfertigungsart_ID As Integer = -1
    Property QS_Abfertigungsart_Anzahl As Integer = 0
End Class



Public Class cAvisoVorpapier
    Property vp_AvisoId As Integer
    Property vp_Art As String = "T1"
    Property vp_Nr As String = ""
End Class


Public Class cAviso
    Property AvisoID As Integer
    Property Datum As Date
    Property LKW_Nr As String
    Property Telefonisch As String
    Property Änderungen As String
    Property Info As String
    Property Status As Integer
    Property Auftraggeber As String
    Property Auftraggeber_KdNr As String = ""
    Property Frächter As String
    Property Frächter_KdNr As String = ""
    Property letzterMitarbeiter As String
    Property LetzterMitarbeiterId As Object = Nothing
    Property Ankunft As Date
    Property Freigabe As Date
    Property Vorbereitet As Date
    Property Vorgeschrieben As Date
    Property Dauer As Integer
    Property AvisoEingang As Date
    Property Grenzstelle As String
    Property LKW_fertig As Boolean
    Property Handling As Boolean = False
    Property AvisoTVHinweis As String = ""
    Property Sendungen_Gesamtanzahl As Integer = 0
    Property Sammelakt As Boolean = False
    Property Buero As String = ""
    Property ImEx As String = ""
    Property Abgeschlossen As Boolean = False
    Property FIRMA As String = VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA

    Property Durchgangszollstelle1 As Object = Nothing
    Property Durchgangszollstelle2 As Object = Nothing
    Property Durchgangszollstelle3 As Object = Nothing
    Property Durchgangszollstelle4 As Object = Nothing
    Property Durchgangszollstelle5 As Object = Nothing
    Property Durchgangszollstelle6 As Object = Nothing
    Property Ausgangszollstelle As Object = Nothing
    Property Zollstelle As Object = Nothing


    Property TransportTemperatur As Object = Nothing
    Property Zugmaschine As Object = Nothing
    Property FahrerHandy As Object = Nothing
    Property LKW_Nationalitaet As Object = Nothing
    Property DakosyRef As Object = Nothing
    Property TeamId As Object = Nothing
    Property Cluster As Object = Nothing
    Property Freigabe_Info As String = ""


    Property KdAuftragsNr_Avisierer As Object = Nothing
    Property KdAuftragsNr_Frachtfuehrer As Object = Nothing
    Property FreigabeFiliale As Object = Nothing
    Property VoraussichtlichesEintreffen As Object = Nothing
    Property VORSYSTEM As Object = Nothing
    Property Warenort As Boolean = False
    Property ZOLLDigitalEingereicht As Boolean = False

    Property Transportmittelart As Object = Nothing
    Property WeiterleitungTextTV As String = ""
    Property VerwahrungStatus As Integer
    Property VerwahrungStatusDate As Object = Nothing
    Property EintragMehrfach As Boolean = False
    Property AvisoTripId As Integer

    Public VORPAPIERE As New List(Of cAvisoVorpapier)

    Shared Function getAvisoById(hID, Optional hSQL = "") As cAviso
        Dim AVISODAL As New cAvisoDAL
        Return AVISODAL.LesenAviso(hID, hSQL)
    End Function

    Shared Function getFirmaByAvisoId(AvisoId) As String
        Dim SQL As New SQL
        Return SQL.getValueTxtBySql("SELECT TOP 1 Firma FROM AVISO WHERE AvisoId=" & AvisoId, "AVISO")
    End Function

    Shared Function getAVISO_List(Optional Standort = "SUB") As DataTable 'Optional FIRMA = "VERAG") As DataTable
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Dim sqlWhere = ""
        Select Case Standort
            Case "SUB" : sqlWhere = " AND ( FIRMA='VERAG' OR CLUSTER='FRONTOFFICE' ) AND ImEx IN ('IMPORT','')  AND Grenzstelle = '" & Standort & "' "
            Case "ATILLA" : sqlWhere = " AND ( FIRMA='ATILLA')   "
            Case "IMEX" : sqlWhere = " AND ( FIRMA='IMEX')  "
            Case "UNISPED" : sqlWhere = " AND ( FIRMA='UNISPED')  "
            Case Else : sqlWhere = " AND  FIRMA='VERAG' AND ( Grenzstelle='" & Standort & "') "
        End Select

        '   Standort = ""

        Dim dt = SQL.loadDgvBySql("SELECT TOP 1000  AvisoID, Status, LKW_Nr, Auftraggeber, Frächter,VoraussichtlichesEintreffen, AvisoEingang, Ankunft, Dauer, Grenzstelle,letzterMitarbeiter, CASE WHEN [LKW_fertig] = 1 THEN 'OK' ELSE '' END AS [LKW_fertig], Datum, Vorbereitet, Vorgeschrieben,  Freigabe,  Telefonisch, Info,Handling,AvisoTVHinweis,DATEDIFF(DAY,getdate(),[VoraussichtlichesEintreffen]) TageBisEintreffen 
                                    FROM Aviso 
                                    WHERE 1=1  " & sqlWhere & "   AND Status = 3 ORDER BY Ankunft ASC, AvisoEingang ASC, Datum ASC", "AVISO")
        Return dt
    End Function

    'Shared Function getAviso_WEB(hID, Optional where = "") As cAviso

    '    sadf
    '    Dim AVISODAL As New cAvisoDAL
    '    Return AVISODAL.LesenAviso(hID, hSQL)
    'End Function
    Public Shared Function GET_KDLIST_WEB(ART As String, KundenNr As Integer, Optional Status() As Integer = Nothing, Optional von As Object = Nothing, Optional bis As Object = Nothing, Optional Absender As String = "", Optional Empfänger As String = "", Optional LKW_Nr As String = "", Optional KdAuftragsNr As String = "") As DataTable
        Dim dt As New DataTable

        Dim SQL As New SQL
        Try

            Dim sqlWHERE = ""
            ' sqlWHERE &= " AND KundenNr LIKE @KundenNr"
            If LKW_Nr <> "" Then sqlWHERE &= " AND LKW_Nr LIKE @LKW_Nr"
            If Empfänger <> "" Then sqlWHERE &= " AND Empfänger LIKE @Empfänger"
            If Absender <> "" Then sqlWHERE &= " AND Absender LIKE @Absender"
            If KdAuftragsNr <> "" Then sqlWHERE &= " AND KdAuftragsNr LIKE @KdAuftragsNr"
            If von IsNot Nothing Then
                If bis IsNot Nothing Then
                    sqlWHERE &= " AND AvisoEingang BETWEEN @AvisoEingang AND @AvisoEingangBIS"
                Else
                    sqlWHERE &= " AND AvisoEingang >= @AvisoEingang"
                End If
            End If

            'Alle Einträge in Status druchlaufen
            Dim statusWhere = ""
            If Status IsNot Nothing AndAlso Status.Count > 0 Then
                statusWhere = " AND Status IN ("
                For Each st In Status
                    statusWhere &= "'" & st & "',"
                Next
                statusWhere = statusWhere.Substring(0, statusWhere.Length - 1) ' Beistrich weg
                statusWhere &= ") "
            End If


            'Art des Kunden
            Dim sqlstr = ""
            Select Case ART
                Case "AVISIERER"
                    sqlstr = "SELECT TOP 1000 *  FROM [AVISO] 
                                        WHERE  (SELECT count(*) FROM tblSendungen where AvisoID=tblSnd_AvisoID  AND (tblSnd_AuftraggeberKdNr=@KundenNr OR tblSnd_AvisiererKdNr=@KundenNr OR tblSnd_FrachtfuehrerKdNr=@KundenNr))>0
                                         "
                Case "EMPFAENGER"
                    sqlstr = "SELECT TOP 1000 *  FROM [AVISO] 
                                        WHERE  (SELECT count(*) FROM tblSendungen where AvisoID=tblSnd_AvisoID  AND (tblSnd_EmpfaengerKdNr = @KundenNr OR tblSnd_AbsenderKdNr =@KundenNr OR tblSnd_AuftraggeberKdNr=@KundenNr OR tblSnd_AvisiererKdNr=@KundenNr ))>0 "

                Case Else 'Default, alle KdNr-Felder
                    sqlstr = "SELECT TOP 1000 *  FROM [AVISO] 
                                        WHERE  (SELECT count(*) FROM tblSendungen where AvisoID=tblSnd_AvisoID  AND ( tblSnd_AbsenderKdNr =@KundenNr OR tblSnd_EmpfaengerKdNr = @KundenNr OR  tblSnd_AuftraggeberKdNr=@KundenNr OR tblSnd_AvisiererKdNr=@KundenNr OR tblSnd_FrachtfuehrerKdNr=@KundenNr ))>0 "
            End Select

            Dim list As New List(Of VERAG_PROG_ALLGEMEIN.SQLVariable)
            list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KundenNr", KundenNr))
            list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("LKW_Nr", LKW_Nr))
            list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Empfänger", Empfänger))
            list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Absender", Absender))
            list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("KdAuftragsNr", KdAuftragsNr))
            list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AvisoEingang", von))
            list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("AvisoEingangBIS", bis))
            'list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("Status", Status))

            dt = SQL.loadDgvBySql_Param(sqlstr & sqlWHERE & statusWhere & " ORDER BY Status desc, Ankunft, Freigabe, Datum ", "AVISO",, list)

        Catch ex As Exception
            MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace)
        End Try
        Return dt
    End Function

    Public Function getSENDUNG_LIST() As List(Of VERAG_PROG_ALLGEMEIN.cSendungen)
        Dim SENDUNG_LIST As New List(Of VERAG_PROG_ALLGEMEIN.cSendungen)
        VERAG_PROG_ALLGEMEIN.cSendungen.LOAD_LIST(SENDUNG_LIST, -1, AvisoID) 'LÄDT alle SENDUNGSDATEN
        Return SENDUNG_LIST
    End Function

    Sub UPDATE_FahrerHandy(FahrerHandy As String)
        If AvisoID <= 0 Then Exit Sub
        If If(FahrerHandy, "") = "" Then Exit Sub
        Me.FahrerHandy = FahrerHandy

        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        SQL.doSQL("UPDATE AVISO SET FahrerHandy='" & FahrerHandy & "' WHERE AvisoId=" & AvisoID, "AVISO")
    End Sub
    Sub UPDATE_Trips(AvisoTripId As Integer)
        If AvisoID <= 0 Then Exit Sub
        Me.AvisoTripId = AvisoTripId

        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        SQL.doSQL("UPDATE AVISO SET AvisoTripId='" & AvisoTripId & "' WHERE AvisoId=" & AvisoID, "AVISO")
    End Sub


    Sub UPDATE_FreigabeInfo(Freigabe_Info As String)
        If AvisoID <= 0 Then Exit Sub
        Me.Freigabe_Info = Freigabe_Info

        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        SQL.doSQL("UPDATE AVISO SET Freigabe_Info='" & Freigabe_Info & "' WHERE AvisoId=" & AvisoID, "AVISO")
    End Sub


    Sub LOAD_Vorpapiere()
        If AvisoID <= 0 Then Exit Sub
        VORPAPIERE.Clear()
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        Dim dt = SQL.loadDgvBySql("SELECT * FROM tblAvisoVorpapier WHERE vp_AvisoId='" & AvisoID & "'", "AVISO")
        If dt IsNot Nothing Then
            For Each r In dt.Rows
                Dim VP As New cAvisoVorpapier
                VP.vp_AvisoId = AvisoID
                VP.vp_Nr = r("vp_Nr")
                VP.vp_Art = r("vp_Art")
                VORPAPIERE.Add(VP)
            Next
        End If
    End Sub



End Class

Public Class cDruckAviso
    Property Datum As String
    Property Status As String
    Property LetzterMitarbeiter As String
    Property LKW_Nr As String
    Property Fraechter As String
    Property Auftraggeber As String
    Property Ankunft As String
    Property Freigabe As String
    Property Dauer As String
    Property Info As String
    Property Aenderungen As String
    Property Telefonisch As String
    Property AvisoEingang As String
    Property Grenzstelle As String
End Class

Public Class cAvisoDAL

    Public Function LesenAviso(hID As Integer, hSQL As String) As cAviso
        'Dim FIRMA = VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If hID > 0 Then
            sql = String.Format("SELECT * FROM Aviso WHERE AvisoID = {0} ", hID)
            'If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "" Then
            '    sql = String.Format("SELECT * FROM Aviso WHERE AvisoID = {0} AND Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' ", hID)
            'Else
            '    sql = String.Format("SELECT * FROM Aviso WHERE AvisoID = {0} ", hID)
            'End If
        Else
            sql = hSQL
        End If

        If sql = "" Then Return Nothing 'weder ID noch hSQL

        Dim daten As cAviso = Nothing
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    daten = New cAviso()
                    daten.AvisoID = VarToInt(dr.Item("AvisoID"))
                    daten.Datum = CDate(VarToDate(dr.Item("Datum")))
                    daten.LKW_Nr = VarToStr(dr.Item("LKW_Nr"))
                    daten.Telefonisch = VarToStr(dr.Item("Telefonisch"))
                    daten.Änderungen = VarToStr(dr.Item("Änderungen"))
                    daten.Info = VarToStr(dr.Item("Info"))
                    daten.Status = VarToInt(dr.Item("Status"))
                    daten.Auftraggeber = VarToStr(dr.Item("Auftraggeber"))
                    daten.Auftraggeber_KdNr = CStr(VarToInt(dr.Item("Auftraggeber_KdNr")))
                    daten.Frächter_KdNr = CStr(VarToInt(dr.Item("Frächter_KdNr")))
                    daten.Frächter = VarToStr(dr.Item("Frächter"))
                    daten.letzterMitarbeiter = VarToStr(dr.Item("letzterMitarbeiter"))
                    daten.Ankunft = CDate(VarToDate(dr.Item("Ankunft")))
                    daten.Freigabe = CDate(VarToDate(dr.Item("Freigabe")))
                    daten.Vorbereitet = CDate(VarToDate(dr.Item("Vorbereitet")))
                    daten.Vorgeschrieben = CDate(VarToDate(dr.Item("Vorgeschrieben")))
                    daten.AvisoEingang = CDate(VarToDate(dr.Item("AvisoEingang")))
                    daten.Dauer = VarToInt(dr.Item("Dauer"))
                    daten.Grenzstelle = VarToStr(dr.Item("Grenzstelle"))
                    daten.LKW_fertig = VarToBool(dr.Item("LKW_fertig"))
                    daten.Handling = VarToBool(dr.Item("Handling"))
                    daten.AvisoTVHinweis = VarToStr(dr.Item("AvisoTVHinweis"))
                    daten.Sammelakt = VarToBool(dr.Item("Sammelakt"))
                    daten.Buero = VarToStr(dr.Item("Buero"))
                    daten.ImEx = VarToStr(dr.Item("ImEx"))
                    daten.Abgeschlossen = VarToBool(dr.Item("Abgeschlossen"))
                    daten.FIRMA = VarToStr(dr.Item("FIRMA"))
                    daten.Durchgangszollstelle1 = VarToStr(dr.Item("Durchgangszollstelle1"))
                    daten.Durchgangszollstelle2 = VarToStr(dr.Item("Durchgangszollstelle2"))
                    daten.Durchgangszollstelle3 = VarToStr(dr.Item("Durchgangszollstelle3"))
                    daten.Durchgangszollstelle4 = VarToStr(dr.Item("Durchgangszollstelle4"))
                    daten.Durchgangszollstelle5 = VarToStr(dr.Item("Durchgangszollstelle5"))
                    daten.Durchgangszollstelle6 = VarToStr(dr.Item("Durchgangszollstelle6"))
                    daten.Ausgangszollstelle = VarToStr(dr.Item("Ausgangszollstelle"))
                    daten.Zollstelle = VarToStr(dr.Item("Zollstelle"))
                    daten.TransportTemperatur = VarToStr(dr.Item("TransportTemperatur"))
                    daten.Zugmaschine = VarToStr(dr.Item("Zugmaschine"))
                    daten.FahrerHandy = VarToStr(dr.Item("FahrerHandy"))
                    daten.LKW_Nationalitaet = VarToStr(dr.Item("LKW_Nationalitaet"))
                    daten.DakosyRef = VarToStr(dr.Item("DakosyRef"))
                    daten.LetzterMitarbeiterId = If(dr.Item("letzterMitarbeiterid") Is DBNull.Value, Nothing, dr.Item("letzterMitarbeiterid"))
                    daten.TeamId = If(dr.Item("TeamId") Is DBNull.Value, Nothing, dr.Item("TeamId"))
                    daten.Cluster = If(dr.Item("Cluster") Is DBNull.Value, Nothing, dr.Item("Cluster"))
                    daten.Freigabe_Info = VarToStr(dr.Item("Freigabe_Info"))
                    daten.KdAuftragsNr_Frachtfuehrer = If(dr.Item("KdAuftragsNr_Frachtfuehrer") Is DBNull.Value, Nothing, dr.Item("KdAuftragsNr_Frachtfuehrer"))
                    daten.KdAuftragsNr_Avisierer = If(dr.Item("KdAuftragsNr_Avisierer") Is DBNull.Value, Nothing, dr.Item("KdAuftragsNr_Avisierer"))
                    daten.FreigabeFiliale = If(dr.Item("FreigabeFiliale") Is DBNull.Value, Nothing, dr.Item("FreigabeFiliale"))
                    daten.VoraussichtlichesEintreffen = If(dr.Item("VoraussichtlichesEintreffen") Is DBNull.Value, Nothing, dr.Item("VoraussichtlichesEintreffen"))
                    daten.VORSYSTEM = If(dr.Item("VORSYSTEM") Is DBNull.Value, Nothing, dr.Item("VORSYSTEM"))
                    daten.Warenort = If(dr.Item("Warenort") Is DBNull.Value, Nothing, dr.Item("Warenort"))
                    daten.ZOLLDigitalEingereicht = If(dr.Item("ZOLLDigitalEingereicht") Is DBNull.Value, Nothing, dr.Item("ZOLLDigitalEingereicht"))
                    daten.Transportmittelart = If(dr.Item("Transportmittelart") Is DBNull.Value, Nothing, dr.Item("Transportmittelart"))
                    daten.WeiterleitungTextTV = VarToStr(dr.Item("WeiterleitungTextTV"))
                    daten.VerwahrungStatus = VarToInt(dr.Item("VerwahrungStatus"))
                    daten.VerwahrungStatusDate = If(dr.Item("VerwahrungStatusDate") Is DBNull.Value, Nothing, dr.Item("VerwahrungStatusDate"))
                    daten.EintragMehrfach = VarToBool(dr.Item("EintragMehrfach"))
                    daten.AvisoTripId = VarToInt(dr.Item("AvisoTripId"))



                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return daten
    End Function

    Public Function Suche_LKW(ByRef LKW_Nr As String, ByRef Optional avisoID As Integer = 1) As String
        'hier wird nachgesehen, wann diese LKW-Nr zuletzt eingetragen war



        Suche_LKW = ""
        Dim sql As String = "SELECT * FROM Aviso WHERE (LKW_Nr = '" & LKW_Nr & "' or LKW_Nr like '%" & LKW_Nr & "%')  AND Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' ORDER BY Datum DESC"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    'Hinweis erfolgt nur, wenn LKW in den letzten 4 Tagen gefahren ist
                    If CDate(VarToDate(dr.Item("Datum"))) > Now.AddDays(-4) Then
                        Suche_LKW = "Achtung: der LKW mit der Nr. " & LKW_Nr & " wurde bereits vor kurzem eingetragen - und zwar am " &
                             Format(CDate(VarToDate(dr.Item("Datum"))), "ddd, dd.MM.yyyy - HH:mm")
                        avisoID = CInt(dr.Item("AvisoID"))
                    End If

                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return Suche_LKW
    End Function

    Public Function Suche_LKWStatus(ByRef LKW_Nr As String, Optional ByRef AVISOID As Integer = -1) As String
        'hier wird nachgesehen, wann diese LKW-Nr zuletzt eingetragen war
        Suche_LKWStatus = ""

        Dim firma = VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
        If firma = "" Then firma = "VERAG"

        If VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER <> "" Then
            firma = " AND ( FIRMA='" & firma & "' OR CLUSTER='" & VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER & "' ) "
        Else
            firma = " AND FIRMA='" & firma & "'  "
        End If


        ' LKWNr kann als einzelens Kennzeichen angegeben werden oder LKWKZ1/LKWKZ2

        Dim sql As String = "SELECT * FROM Aviso WHERE (LKW_Nr = '" & LKW_Nr & "' or LKW_Nr like '%" & LKW_Nr & "%')  AND [Status] Not in (1,2)  " & firma & " ORDER BY Datum DESC"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    Suche_LKWStatus = "Achtung: der LKW mit der Nr. " & LKW_Nr & " existiert bereits mit dem Status '" & cGlobal.getStatusText(VarToInt2(dr.Item("Status"))) & "', Eingetragen, am " &
                     Format(CDate(VarToDate(dr.Item("Datum"))), "ddd, dd.MM.yyyy - HH:mm")
                    AVISOID = CInt(dr.Item("AvisoID"))
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return Suche_LKWStatus
    End Function

    Public Function getAvisoInfo(AvisoID As Integer) As String
        Dim Info As String = ""
        Dim sql As String = "SELECT Info FROM Aviso WHERE AvisoID = '" & AvisoID & "' "
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Try
            Using cmd As New SqlCommand(sql, conn)
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    If dr.HasRows Then
                        dr.Read()
                        If Not dr.Item("Info") Is DBNull.Value Then
                            Info = dr.Item("Info").ToString
                        End If
                    End If
                    dr.Close()
                End Using
            End Using
            conn.Close()
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '     MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle), "Problem in Function 'Suche_LKW'")
        End Try
        Return Info
    End Function

    Public Function VermerkExistsInAvisoByID(AvisoID As Integer, VermerkeCode As Integer) As Boolean
        'hier wird nachgesehen, wann diese LKW-Nr zuletzt eingetragen war
        Dim b As Boolean = False
        Dim sql As String = "SELECT top 1 VermerkID FROM Vermerke WHERE AvisoID = '" & AvisoID & "' AND VermerkeCode = '" & VermerkeCode & "' "
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    b = True
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return b
    End Function



    Public Function loadDataTableBySQL(hSQL As String, Optional timeout As Integer = 0) As DataTable
        Try
            Dim myTable = New DataTable()
            Dim conn As SqlConnection = cSqlDb.GetNewOpenConnectionAVISO()

            ' Using conn As SqlConnection = cSqlDb.GetNewOpenConnection()
            Using cmd As New SqlCommand(hSQL, conn)
                If timeout > 0 Then cmd.CommandTimeout = timeout
                Dim dr As SqlDataReader = cmd.ExecuteReader()

                myTable.Load(dr)
                dr.Close()
            End Using
            conn.Close()
            '  End Using
            Return myTable  'While Schleife wird hier verlassen
        Catch ex As Exception
            VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            '     MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message)
        End Try

        Return Nothing
    End Function

    Public Function loadDataTableBySQL_OLD(hSQL As String) As DataTable
        '  While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
        Using conn As New SqlConnection(cSqlDb.GetAVISOConnectionString) '= cDatenbank.GetNewOpenConnection()
            SqlConnection.ClearPool(conn) ' Wenn Beim Drucken die Vorschau abgebrochen wird, tritt ansonsten ein Fehler auf.

            Try
                conn.Open()
                Dim myTable = New DataTable()
                'Dim sql As String
                'sql = hSQL
                Using cmd As New SqlCommand(hSQL, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                conn.Close()
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Aviso'")
                conn.Close()
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Programm wird aufgrund eines kritischen Problems beendet." & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '         MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    '   Environment.Exit(0)
                End If
            End Try
        End Using
        'End While

        Return Nothing
    End Function


    Public Function getStandzeitInfo(maId As Integer, von As Integer, bis As Integer, Warnstufe As Integer) As DataTable
        Dim hSQL As String = "SELECT AvisoID,[LKW_Nr], [Ankunft], StandzeitWarnstufe " &
                                 " FROM  Aviso INNERJOIN" &
                                 "         WHERE [Status] = 3 AND LetzterMitarbeiterId = " & maId & " " &
                                 " AND DATEDIFF(MINUTE, Ankunft, getdate()) between " & von & " AND " & bis & " " &
                                 " AND (StandzeitWarnstufe is null OR StandzeitWarnstufe < " & Warnstufe & ")"

        Using conn As New SqlConnection(cSqlDb.GetAVISOConnectionString) '= cDatenbank.GetNewOpenConnection()
            SqlConnection.ClearPool(conn) ' Wenn Beim Drucken die Vorschau abgebrochen wird, tritt ansonsten ein Fehler auf.
            conn.Open()
            Try
                Dim myTable = New DataTable()
                'Dim sql As String
                'sql = hSQL
                Using cmd As New SqlCommand(hSQL, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                conn.Close()
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Aviso'")
                conn.Close()
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Programm wird aufgrund eines kritischen Problems beendet." & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '   MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
        End Using


        Return Nothing
    End Function

    Public Sub UpdateWarnstufe(ByVal avisoID As Integer, ByVal Warnstufe As Integer)

        Dim sql = "UPDATE Aviso SET [StandzeitWarnstufe]= @Warnstufe WHERE AvisoID = @AvisoID"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Warnstufe", Warnstufe)
            cmd.Parameters.AddWithValue("@AvisoID", avisoID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Datensatz kann nicht gespeichert werden! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                '   MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler UpdateWarnstufe")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub UpdateAvisoTVHinweis(ByVal avisoID As Integer, ByVal AvisoTVHinweis As String)

        Dim sql = "UPDATE Aviso SET [AvisoTVHinweis]= @AvisoTVHinweis WHERE AvisoID = @AvisoID"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@AvisoTVHinweis", AvisoTVHinweis)
            cmd.Parameters.AddWithValue("@AvisoID", avisoID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Datensatz kann nicht gespeichert werden! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                '  MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler UpdateWarnstufe")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub addAenderung(AvisoID As Integer, Aenderung_Art As String, Aenderung_Text As String)
        Dim hAuswahl As String = " INSERT INTO Aenderungen " &
                   " ([AvisoID], [Datum], [Mitarbeiter], [MitarbeiterId], [Aenderung_Art], [Aenderung_Text]) " &
                   " VALUES (@AvisoID, @Datum, @Mitarbeiter, @MitarbeiterId, @Aenderung_Art, @Aenderung_Text)"

        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)

            cmd.Parameters.AddWithValue("@AvisoID", AvisoID)
            cmd.Parameters.AddWithValue("@Datum", Now)
            cmd.Parameters.AddWithValue("@Mitarbeiter", cGlobal.AktiverMitarbeiter.Mitarbeiter)
            cmd.Parameters.AddWithValue("@MitarbeiterId", cGlobal.AktiverMitarbeiter.MitarbeiterID)
            cmd.Parameters.AddWithValue("@Aenderung_Art", Aenderung_Art)
            cmd.Parameters.AddWithValue("@Aenderung_Text", Aenderung_Text)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Datensatz kann nicht gespeichert werden! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                '  MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Aenderungen")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Function SpeichernAviso(ByVal d As cAviso, Optional letzerMaIdAuto As Boolean = True) As Integer
        Dim hAuswahl As String
        Dim id As Integer = -1
        If d.AvisoID <= 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO Aviso " &
                       "(Datum, LKW_Nr, Telefonisch, Änderungen, Info, Status, Auftraggeber, Frächter, letzterMitarbeiter, " &
                       "Vorbereitet,Vorgeschrieben, Ankunft, Freigabe, Dauer, AvisoEingang, Grenzstelle, LKW_fertig,letzterMitarbeiterId,Handling,Sendungen_Gesamtanzahl,Sammelakt,Frächter_KdNr,Auftraggeber_KdNr,AvisoTVHinweis,Buero,Imex,Abgeschlossen,FIRMA, " &
                       " Durchgangszollstelle1,Durchgangszollstelle2,Durchgangszollstelle3,Durchgangszollstelle4,Durchgangszollstelle5,Durchgangszollstelle6,Ausgangszollstelle,Zollstelle,TransportTemperatur,Zugmaschine,FahrerHandy,LKW_Nationalitaet,DakosyRef,TeamId,Cluster,Freigabe_Info,KdAuftragsNr_Frachtfuehrer,KdAuftragsNr_Avisierer,FreigabeFiliale,VoraussichtlichesEintreffen,Warenort,ZOLLDigitalEingereicht,Transportmittelart,WeiterleitungTextTV,VerwahrungStatus,VerwahrungStatusDate, EintragMehrfach,AvisoTripId) VALUES (" &
                       "@Datum, @LKW_Nr, @Telefonisch, @Änderungen, @Info, @Status, @Auftraggeber, @Frächter, @letzterMitarbeiter, " &
                       "@Vorbereitet, @Vorgeschrieben, @Ankunft, @Freigabe, @Dauer, @AvisoEingang, @Grenzstelle, @LKW_fertig,@letzterMitarbeiterId,@Handling,@Sendungen_Gesamtanzahl,@Sammelakt,@Frächter_KdNr,@Auftraggeber_KdNr,@AvisoTVHinweis,@Buero,@Imex,@Abgeschlossen,@FIRMA," &
                       "@Durchgangszollstelle1,@Durchgangszollstelle2,@Durchgangszollstelle3,@Durchgangszollstelle4,@Durchgangszollstelle5,@Durchgangszollstelle6,@Ausgangszollstelle,@Zollstelle,@TransportTemperatur,@Zugmaschine,@FahrerHandy,@LKW_Nationalitaet,@DakosyRef,@TeamId,@Cluster,@Freigabe_Info,@KdAuftragsNr_Frachtfuehrer,@KdAuftragsNr_Avisierer,@FreigabeFiliale,@VoraussichtlichesEintreffen,@Warenort,@ZOLLDigitalEingereicht,@Transportmittelart,@WeiterleitungTextTV,@VerwahrungStatus,@VerwahrungStatusDate, @EintragMehrfach,@AvisoTripId); SELECT CAST(scope_identity() AS int);"
        Else
            id = d.AvisoID
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE Aviso SET Datum = @Datum, LKW_Nr = @LKW_Nr, Telefonisch=@Telefonisch, Änderungen=@Änderungen, Info=@Info, Status=@Status, Auftraggeber=@Auftraggeber, Frächter=@Frächter, " &
                       " letzterMitarbeiter = @letzterMitarbeiter, Vorbereitet=@Vorbereitet,Vorgeschrieben=@Vorgeschrieben, Ankunft = @Ankunft, Freigabe = @Freigabe, Dauer = @Dauer, AvisoEingang = @AvisoEingang, Grenzstelle=@Grenzstelle, LKW_fertig=@LKW_fertig, letzterMitarbeiterId=@letzterMitarbeiterId, Handling=@Handling,Sendungen_Gesamtanzahl=@Sendungen_Gesamtanzahl,Sammelakt=@Sammelakt,Frächter_KdNr=@Frächter_KdNr,Auftraggeber_KdNr=@Auftraggeber_KdNr,AvisoTVHinweis=@AvisoTVHinweis,Buero=@Buero,Imex=@Imex,Abgeschlossen=@Abgeschlossen,  " &
                       " Durchgangszollstelle1=@Durchgangszollstelle1,Durchgangszollstelle2=@Durchgangszollstelle2,Durchgangszollstelle3=@Durchgangszollstelle3,Durchgangszollstelle4=@Durchgangszollstelle4,Durchgangszollstelle5=@Durchgangszollstelle5,Durchgangszollstelle6=@Durchgangszollstelle6,Ausgangszollstelle=@Ausgangszollstelle,Zollstelle=@Zollstelle,TransportTemperatur=@TransportTemperatur,Zugmaschine=@Zugmaschine,FahrerHandy=@FahrerHandy, LKW_Nationalitaet=@LKW_Nationalitaet, DakosyRef=@DakosyRef,TeamId=@TeamId,Cluster=@Cluster,Freigabe_Info=@Freigabe_Info,KdAuftragsNr_Frachtfuehrer =@KdAuftragsNr_Frachtfuehrer,KdAuftragsNr_Avisierer=@KdAuftragsNr_Avisierer , FreigabeFiliale=@FreigabeFiliale,VoraussichtlichesEintreffen=@VoraussichtlichesEintreffen,Warenort=@Warenort,ZOLLDigitalEingereicht=@ZOLLDigitalEingereicht,Transportmittelart=@Transportmittelart,WeiterleitungTextTV=@WeiterleitungTextTV,VerwahrungStatus=@VerwahrungStatus,VerwahrungStatusDate=@VerwahrungStatusDate,EintragMehrfach=@EintragMehrfach,AvisoTripId=@AvisoTripId,FIRMA=@FIRMA" &
                       " WHERE AvisoID = @AvisoID")
        End If

        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)

            cmd.Parameters.Add("@Datum", SqlDbType.DateTime).Value = SQLNullDate(d.Datum)
            ' cmd.Parameters.AddWithValue("@Datum", SQLNullDate(d.Datum))
            cmd.Parameters.AddWithValue("@LKW_Nr", d.LKW_Nr)
            cmd.Parameters.AddWithValue("@Telefonisch", d.Telefonisch)
            cmd.Parameters.AddWithValue("@Änderungen", d.Änderungen)
            cmd.Parameters.AddWithValue("@Info", d.Info)
            cmd.Parameters.AddWithValue("@Status", d.Status)
            cmd.Parameters.AddWithValue("@Auftraggeber", d.Auftraggeber)
            cmd.Parameters.AddWithValue("@Frächter", d.Frächter)
            cmd.Parameters.AddWithValue("@letzterMitarbeiter", d.letzterMitarbeiter)
            cmd.Parameters.Add("@Vorbereitet", SqlDbType.DateTime).Value = SQLNullDate(d.Vorbereitet)
            cmd.Parameters.Add("@Vorgeschrieben", SqlDbType.DateTime).Value = SQLNullDate(d.Vorgeschrieben)
            cmd.Parameters.Add("@Ankunft", SqlDbType.DateTime2).Value = SQLNullDate(d.Ankunft)
            cmd.Parameters.Add("@Freigabe", SqlDbType.DateTime2).Value = SQLNullDate(d.Freigabe)
            ' cmd.Parameters.AddWithValue("@Vorbereitet", SQLNullDate(d.Vorbereitet))
            ' cmd.Parameters.AddWithValue("@Vorgeschrieben", SQLNullDate(d.Vorgeschrieben))
            ' cmd.Parameters.AddWithValue("@Ankunft", d.Ankunft)
            ' cmd.Parameters.AddWithValue("@Freigabe", d.Freigabe)


            cmd.Parameters.AddWithValue("@Dauer", d.Dauer)
            cmd.Parameters.Add("@AvisoEingang", SqlDbType.DateTime).Value = SQLNullDate(d.AvisoEingang)
            '  cmd.Parameters.AddWithValue("@AvisoEingang", SQLNullDate(d.AvisoEingang))

            cmd.Parameters.AddWithValue("@Grenzstelle", d.Grenzstelle)
            cmd.Parameters.AddWithValue("@LKW_fertig", d.LKW_fertig)
            cmd.Parameters.AddWithValue("@AvisoID", d.AvisoID)
            cmd.Parameters.AddWithValue("@letzterMitarbeiterId", If(letzerMaIdAuto, cGlobal.AktiverMitarbeiter.MitarbeiterID, IIf(IsNumeric(d.LetzterMitarbeiterId), d.LetzterMitarbeiterId, DBNull.Value)))
            cmd.Parameters.AddWithValue("@Handling", d.Handling)
            cmd.Parameters.AddWithValue("@Sendungen_Gesamtanzahl", d.Sendungen_Gesamtanzahl)
            cmd.Parameters.AddWithValue("@Sammelakt", d.Sammelakt)

            cmd.Parameters.AddWithValue("@Auftraggeber_KdNr", IIf(IsNumeric(d.Auftraggeber_KdNr), d.Auftraggeber_KdNr, DBNull.Value))
            cmd.Parameters.AddWithValue("@Frächter_KdNr", IIf(IsNumeric(d.Frächter_KdNr), d.Frächter_KdNr, DBNull.Value))
            cmd.Parameters.AddWithValue("@AvisoTVHinweis", d.AvisoTVHinweis)
            cmd.Parameters.AddWithValue("@Buero", If(d.Buero, ""))
            cmd.Parameters.AddWithValue("@Imex", d.ImEx)
            cmd.Parameters.AddWithValue("@Abgeschlossen", d.Abgeschlossen)
            cmd.Parameters.AddWithValue("@FIRMA", d.FIRMA)

            cmd.Parameters.AddWithValue("@Durchgangszollstelle1", If(d.Durchgangszollstelle1 Is Nothing, DBNull.Value, d.Durchgangszollstelle1))
            cmd.Parameters.AddWithValue("@Durchgangszollstelle2", If(d.Durchgangszollstelle2 Is Nothing, DBNull.Value, d.Durchgangszollstelle2))
            cmd.Parameters.AddWithValue("@Durchgangszollstelle3", If(d.Durchgangszollstelle3 Is Nothing, DBNull.Value, d.Durchgangszollstelle3))
            cmd.Parameters.AddWithValue("@Durchgangszollstelle4", If(d.Durchgangszollstelle4 Is Nothing, DBNull.Value, d.Durchgangszollstelle4))
            cmd.Parameters.AddWithValue("@Durchgangszollstelle5", If(d.Durchgangszollstelle5 Is Nothing, DBNull.Value, d.Durchgangszollstelle5))
            cmd.Parameters.AddWithValue("@Durchgangszollstelle6", If(d.Durchgangszollstelle6 Is Nothing, DBNull.Value, d.Durchgangszollstelle6))
            cmd.Parameters.AddWithValue("@Ausgangszollstelle", If(d.Ausgangszollstelle Is Nothing, DBNull.Value, d.Ausgangszollstelle))
            cmd.Parameters.AddWithValue("@Zollstelle", If(d.Zollstelle Is Nothing, DBNull.Value, d.Zollstelle))
            cmd.Parameters.AddWithValue("@TransportTemperatur", If(d.TransportTemperatur Is Nothing, DBNull.Value, d.TransportTemperatur))
            cmd.Parameters.AddWithValue("@Zugmaschine", If(d.Zugmaschine Is Nothing, DBNull.Value, d.Zugmaschine))
            cmd.Parameters.AddWithValue("@FahrerHandy", If(d.FahrerHandy Is Nothing, DBNull.Value, d.FahrerHandy))
            cmd.Parameters.AddWithValue("@LKW_Nationalitaet", If(d.LKW_Nationalitaet Is Nothing, DBNull.Value, d.LKW_Nationalitaet))
            cmd.Parameters.AddWithValue("@DakosyRef", If(d.DakosyRef Is Nothing, DBNull.Value, d.DakosyRef))
            cmd.Parameters.AddWithValue("@TeamId", If(d.TeamId Is Nothing, DBNull.Value, d.TeamId))
            cmd.Parameters.AddWithValue("@Cluster", If(d.Cluster Is Nothing, DBNull.Value, d.Cluster))
            cmd.Parameters.AddWithValue("@Freigabe_Info", d.Freigabe_Info)

            cmd.Parameters.AddWithValue("@KdAuftragsNr_Frachtfuehrer", If(d.KdAuftragsNr_Frachtfuehrer Is Nothing, DBNull.Value, d.KdAuftragsNr_Frachtfuehrer))
            cmd.Parameters.AddWithValue("@KdAuftragsNr_Avisierer", If(d.KdAuftragsNr_Avisierer Is Nothing, DBNull.Value, d.KdAuftragsNr_Avisierer))
            cmd.Parameters.AddWithValue("@FreigabeFiliale", If(d.FreigabeFiliale Is Nothing, DBNull.Value, d.FreigabeFiliale))
            cmd.Parameters.AddWithValue("@VoraussichtlichesEintreffen", If(d.VoraussichtlichesEintreffen Is Nothing, DBNull.Value, d.VoraussichtlichesEintreffen))
            cmd.Parameters.AddWithValue("@Warenort", d.Warenort)
            cmd.Parameters.AddWithValue("@ZOLLDigitalEingereicht", d.ZOLLDigitalEingereicht)
            cmd.Parameters.AddWithValue("@Transportmittelart", If(d.Transportmittelart, ""))
            cmd.Parameters.AddWithValue("@WeiterleitungTextTV", d.WeiterleitungTextTV)
            cmd.Parameters.AddWithValue("@VerwahrungStatus", d.VerwahrungStatus)

            cmd.Parameters.AddWithValue("@VerwahrungStatusDate", If(d.VerwahrungStatusDate Is Nothing, DBNull.Value, d.VerwahrungStatusDate))
            cmd.Parameters.AddWithValue("@EintragMehrfach", d.EintragMehrfach)
            cmd.Parameters.AddWithValue("@AvisoTripId", d.AvisoTripId)

            Try
                If d.AvisoID <= 0 Then
                    id = (Convert.ToInt32(cmd.ExecuteScalar()))
                    ' MsgBox(id)
                Else
                    If Not VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then cmd.ExecuteNonQuery()
                End If

            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Datensatz kann nicht gespeichert werden! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                '   MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Aviso")
            End Try
        End Using
        conn.Close()

        Return id

    End Function



    Public Function SpeichernAvisoVorpapiere(ByVal AvisoId As Integer, VORPAPIERE As List(Of cAvisoVorpapier)) As Boolean
        SpeichernAvisoVorpapiere = True
        Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
        If SQL.doSQL("DELETE tblAvisoVorpapier WHERE [vp_AvisoId]='" & AvisoId & "'", "AVISO") Then
            For Each VP In VORPAPIERE
                If Not SQL.doSQL("INSERT INTO tblAvisoVorpapier (vp_AvisoId, vp_Art,vp_Nr) VALUES ('" & AvisoId & "','" & VP.vp_Art & "','" & VP.vp_Nr & "') ", "AVISO") Then SpeichernAvisoVorpapiere = False
            Next
        Else
            SpeichernAvisoVorpapiere = True = False
        End If

    End Function



    Public Function setQSAufträge(ByVal daten As List(Of cQSAufträge)) As Boolean
        For Each d As cQSAufträge In daten
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Dim sql As String = " begin tran" &
                                        " if exists (select * from tblQS_Auftragspositionen with (updlock,serializable) where QS_Abfertigungsart_ID = @QS_Abfertigungsart_ID AND  AvisoID = @AvisoID) " &
                                               " begin " &
                                               " UPDATE tblQS_Auftragspositionen " &
                                               " SET QS_Abfertigungsart_Anzahl=@QS_Abfertigungsart_Anzahl " &
                                               " WHERE QS_Abfertigungsart_ID = @QS_Abfertigungsart_ID AND  AvisoID = @AvisoID " &
                                        " End " &
                                        " Else " &
                                        " begin " &
                                            " INSERT INTO tblQS_Auftragspositionen " &
                                                " ([AvisoID],[QS_Abfertigungsart_ID],[QS_Abfertigungsart_Anzahl]) " &
                                            " VALUES(@AvisoID, @QS_Abfertigungsart_ID, @QS_Abfertigungsart_Anzahl) " &
                                         " End " &
                                        " commit tran "

            Using cmd As New SqlCommand(sql, conn)
                cmd.Parameters.AddWithValue("@AvisoID", d.AvisoID)
                cmd.Parameters.AddWithValue("@QS_Abfertigungsart_ID", d.QS_Abfertigungsart_ID)
                cmd.Parameters.AddWithValue("@QS_Abfertigungsart_Anzahl", d.QS_Abfertigungsart_Anzahl)
                Try
                    cmd.ExecuteNonQuery()
                Catch ex As SqlException
                    VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR("Datensatz kann nicht gespeichert werden! " & ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                    '   MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Programm")
                    Return False
                End Try

            End Using
            ' conn.Close()
        Next

        Return True
    End Function


    Public Function insertSendungEmpty(ByVal AvisoID As Integer, ByVal PosUnterNr As Integer, ByVal FilialenNr As Integer, ByVal AbfertigungsNr As Object, ByVal UnterNr As Integer, ByVal tblSnd_Abfertigungsart_ID As Object, Optional tblSnd_AuftraggeberKdNr As Object = Nothing, Optional tblSnd_Auftraggeber As Object = Nothing, Optional tblSnd_Fremdspedition As Boolean = False, Optional ByRef sndId As Integer = -1) As Boolean
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Dim sql As String = " INSERT INTO tblSendungen " &
                                            " ([tblSnd_PosUnterNr],[tblSnd_AvisoID],FilialenNr,AbfertigungsNr,UnterNr,tblSnd_Abfertigungsart_ID,tblSnd_AuftraggeberKdNr,tblSnd_Auftraggeber,tblSnd_Fremdspedition,tblSnd_QS_MA,LetzterMitarbeiterId,LetzterMitarbeiter) " &
                                        " VALUES(@PosUnterNr,@AvisoID,@FilialenNr,@AbfertigungsNr,@UnterNr,@tblSnd_Abfertigungsart_ID,@tblSnd_AuftraggeberKdNr,@tblSnd_Auftraggeber,@tblSnd_Fremdspedition,@tblSnd_QS_MA,@LetzterMitarbeiterId,@LetzterMitarbeiter) "

        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@AvisoID", AvisoID)
            cmd.Parameters.AddWithValue("@PosUnterNr", PosUnterNr)


            cmd.Parameters.AddWithValue("@FilialenNr", FilialenNr)
            cmd.Parameters.AddWithValue("@AbfertigungsNr", AbfertigungsNr)
            cmd.Parameters.AddWithValue("@UnterNr", UnterNr)

            cmd.Parameters.AddWithValue("@tblSnd_Abfertigungsart_ID", IIf(tblSnd_Abfertigungsart_ID Is Nothing, DBNull.Value, tblSnd_Abfertigungsart_ID))
            cmd.Parameters.AddWithValue("@tblSnd_AuftraggeberKdNr", IIf(tblSnd_AuftraggeberKdNr Is Nothing, DBNull.Value, tblSnd_AuftraggeberKdNr))
            cmd.Parameters.AddWithValue("@tblSnd_Auftraggeber", IIf(tblSnd_Auftraggeber Is Nothing, DBNull.Value, tblSnd_Auftraggeber))
            cmd.Parameters.AddWithValue("@tblSnd_Fremdspedition", tblSnd_Fremdspedition)

            If VERAG_PROG_ALLGEMEIN.cAllgemein.ABTEILUNG = "QS" Then
                cmd.Parameters.AddWithValue("@tblSnd_QS_MA", VERAG_PROG_ALLGEMEIN.cAllgemein.USRID)
            Else
                cmd.Parameters.AddWithValue("@tblSnd_QS_MA", DBNull.Value)
            End If

            cmd.Parameters.AddWithValue("@LetzterMitarbeiter", VERAG_PROG_ALLGEMEIN.cAllgemein.USRNAME)
            cmd.Parameters.AddWithValue("@LetzterMitarbeiterId", VERAG_PROG_ALLGEMEIN.cAllgemein.USRID)


            Try
                cmd.ExecuteNonQuery()

                If sndId <= 0 Then
                    Dim newcmd As New SqlCommand("SELECT @@IDENTITY", conn)
                    sndId = CInt(newcmd.ExecuteScalar)
                End If

            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                '  MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Programm")
                Return False
            End Try

        End Using

        Return True
    End Function


    Public Function reIndexSendungen(ByVal AvisoID As Integer) As Boolean
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Dim sql As String = "  DECLARE @counter int " &
                            " SET @counter = 0 " &
                            " UPDATE AVISO_new.dbo.tblSendungen " &
                            " SET  @counter = tblSnd_PosUnterNr = @counter + 1 " &
                            " WHERE tblSnd_AvisoID = @AvisoID "

        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@AvisoID", AvisoID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                '  MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Programm")
                Return False
            End Try

        End Using

        Return True
    End Function


    Public Sub LöschenAviso(ByVal hID As Integer)

        Exit Sub
        '  LöschenAviso_Vermerke(hID)
        '  LöschenAviso_Aenderungen(hID)
        LöschenAviso_Aviso(hID)
    End Sub

    Public Sub LöschenAviso_Vermerke(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM Vermerke WHERE AvisoID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Vermerke-Eintrag kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub
    Public Sub LöschenAviso_Aenderungen(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM Aenderungen WHERE AvisoID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Aenderungen-Eintrag kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub
    Public Sub LöschenAviso_Aviso(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM Aviso WHERE AvisoID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Aviso-Eintrag kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Function LeseAvisoFürDruck(hSQL As String, hIntern As Boolean) As List(Of cDruckAviso)
        Dim datenListe As List(Of cDruckAviso) = New List(Of cDruckAviso)
        Dim datensatz As cDruckAviso

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()

        Using cmd As New SqlCommand(hSQL, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If (dr.HasRows) Then
                    While dr.Read()
                        datensatz = New cDruckAviso()
                        datensatz.Datum = Format(CDate(dr.Item("Datum")), "dd.MM.yyyy")
                        Select Case VarToInt(dr.Item("Status"))
                            Case cGlobal.Status_Erfasst
                                datensatz.Status = "erfasst"
                            Case cGlobal.Status_Ankunft
                                datensatz.Status = "Ankunft"
                            Case cGlobal.Status_Freigegeben
                                datensatz.Status = "freigegeben"
                            Case cGlobal.Status_NichtEingetroffen
                                datensatz.Status = "LKW n.e."
                            Case Else
                                datensatz.Status = "unbekannt"
                        End Select
                        datensatz.LetzterMitarbeiter = dr.Item("LetzterMitarbeiter").ToString
                        datensatz.LKW_Nr = dr.Item("LKW_Nr").ToString
                        datensatz.Fraechter = dr.Item("Frächter").ToString
                        datensatz.Auftraggeber = dr.Item("Auftraggeber").ToString
                        datensatz.Grenzstelle = dr.Item("Grenzstelle").ToString
                        datensatz.Telefonisch = VarToStr(dr.Item("Telefonisch"))


                        If CDate(VarToDate(dr.Item("Ankunft"))) = LeerDatum Then
                            datensatz.Ankunft = ""
                        Else
                            datensatz.Ankunft = Format(CDate(dr.Item("Ankunft")), "dd.MM. HH:mm")
                        End If
                        If CDate(VarToDate(dr.Item("Freigabe"))) = LeerDatum Then
                            datensatz.Freigabe = ""
                        Else
                            datensatz.Freigabe = Format(CDate(dr.Item("Freigabe")), "dd.MM. HH:mm")
                        End If
                        If CDate(VarToDate(dr.Item("AvisoEingang"))) = LeerDatum Then
                            datensatz.Freigabe = ""
                        Else
                            datensatz.Freigabe = Format(CDate(dr.Item("AvisoEingang")), "dd.MM. HH:mm")
                        End If
                        If VarToInt(dr.Item("Dauer")) = 0 Then
                            datensatz.Dauer = ""
                        Else
                            datensatz.Dauer = Minuten_auf_Text(VarToInt(dr.Item("Dauer")))
                        End If

                        If CDate(VarToDate(dr.Item("AvisoEingang"))) = LeerDatum Then
                            datensatz.AvisoEingang = ""
                        Else
                            datensatz.AvisoEingang = Format(CDate(dr.Item("AvisoEingang")), "dd.MM. HH:mm")
                        End If

                        datensatz.Grenzstelle = dr.Item("Grenzstelle").ToString

                        'je nach Listenauswahl werden manche Felder unterschiedlich befüllt
                        If hIntern Then
                            datensatz.Aenderungen = dr.Item("Änderungen").ToString
                            datensatz.Info = dr.Item("Info").ToString
                        Else
                            'das Feld 'Änderungen' wird hier "mißbraucht" (schnelle Lösung)
                            If CDate(VarToDate(dr.Item("AvisoEingang"))) = LeerDatum Then
                                datensatz.Aenderungen = ""
                            Else
                                datensatz.Aenderungen = Format(CDate(dr.Item("AvisoEingang")), "dd.MM. HH:mm")
                            End If

                            'ins Infofeld kommen die Vermerke
                            Dim hVermerke As New cVermerkeDAL
                            datensatz.Info = hVermerke.Vermerke_einlesen(VarToInt(dr.Item("AvisoID")))

                        End If
                        datenListe.Add(datensatz)
                    End While
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()

        Return datenListe
    End Function

    Public Function Check_Nicht_eingetroffen(hSQL As String) As Integer
        'Hier werden alle als Urlaub gekennzeichneten Tage zusammengezählt
        Check_Nicht_eingetroffen = 0
        Dim sql As String = hSQL
        Dim AvisoDAL As New cAvisoDAL
        Using conn As New SqlConnection(cSqlDb.GetAVISOConnectionString)
            Try
                SqlConnection.ClearPool(conn)
                conn.Open()

                Using cmd As New SqlCommand(sql, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        While dr.Read()
                            Dim av As New cAviso
                            av = AvisoDAL.LesenAviso(VarToInt(dr.Item("AvisoID")), "")
                            av.Änderungen = "automatisch auf 'LKW nicht eingetroffen' gestellt am " & Format(Now, "dd.MM.yyyy HH:mm") & ", da bereits länger als 10 Tage offen" & vbCrLf & av.Änderungen
                            av.letzterMitarbeiter = "Automatik"
                            av.Status = cGlobal.Status_NichtEingetroffen
                            Dim tmpid = AvisoDAL.SpeichernAviso(av)
                            AvisoDAL.addAenderung(tmpid, "automatisch auf 'LKW nicht eingetroffen' gestellt", "automatisch auf 'LKW nicht eingetroffen' gestellt am " & Format(Now, "dd.MM.yyyy HH:mm") & ", da bereits länger als 10 Tage offen")

                            VERAG_PROG_ALLGEMEIN.cAvisoBenachrichtigungen.INSERT_BENACHRICHTIGUNG(av.AvisoID, -1, 3, "B", av.LetzterMitarbeiterId, "automatisch auf 'LKW nicht eingetroffen gesetzt", 0,, "automatisch auf 'LKW nicht eingetroffen' gestellt am " & Format(Now, "dd.MM.yyyy HH:mm") & ", da bereits länger als 10 Tage offen")

                            Check_Nicht_eingetroffen += 1
                        End While
                        dr.Close()
                    End Using
                End Using

            Catch ex As Exception
                MsgBox("Fehler in der Function Check_Nicht_eingetroffen:" & vbCrLf & vbCrLf & ex.Message & vbCrLf & vbCrLf & "Der Vorgang wird abgebrochen!", MsgBoxStyle.Exclamation)
                Check_Nicht_eingetroffen = 0
                Exit Try
            Finally
                conn.Close()
            End Try

        End Using
        Return Check_Nicht_eingetroffen
    End Function

    Public Function Anzahl_Aviso_ermitteln(hSQL As String) As Integer
        'Hier werden alle als Urlaub gekennzeichneten Tage zusammengezählt
        Anzahl_Aviso_ermitteln = 0
        Dim sql As String = hSQL
        Dim daten As cAviso = Nothing
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnectionWithoutError()
        Try
            Using cmd As New SqlCommand(sql, conn)
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    While dr.Read()
                        Anzahl_Aviso_ermitteln += 1
                    End While
                    dr.Close()
                End Using
            End Using
            conn.Close()
        Catch ex As Exception
            'MsgBox("Fehler in der Function Anzahl_Aviso_ermitteln:" & vbCrLf & vbCrLf & ex.Message & vbCrLf & vbCrLf & "Der Vorgang wird abgebrochen!", MsgBoxStyle.Exclamation)
            Return 0
            Exit Try
        End Try

        Return Anzahl_Aviso_ermitteln
    End Function

End Class

Public Class cVermerk
    Property VermerkID As Integer
    Property AvisoID As Integer
    Property SendungID As Integer = -1
    Property VermerkArt As String = "A"
    Property Datum As Date
    Property Mitarbeiter As String
    Property MitarbeiterId As Integer
    Property Hinweis_Vermerk As String
    Property VermerkCodeId As Integer
    Property VorauskasseId As Object = Nothing
    Property Beschreibung As String = ""
    Property SMSId As Integer
    Property SMSStatus As Integer
    Property Geloescht As Boolean
    Property AAS_Warnstufe As Boolean
    Property HintergrundVermerk As Boolean


End Class

Public Class cVermerkeDAL


    Public Function LesenVermerk(hID As Integer, hSQL As String) As cVermerk
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If hID > 0 Then
            sql = String.Format("SELECT * FROM Vermerke WHERE VermerkID = {0}", hID)
        Else
            sql = hSQL
        End If
        Dim daten As cVermerk = Nothing
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    daten = New cVermerk()
                    daten.VermerkID = VarToInt(dr.Item("VermerkID"))
                    daten.AvisoID = VarToInt(dr.Item("AvisoID"))
                    daten.Datum = CDate(VarToDate(dr.Item("Datum")))
                    daten.Hinweis_Vermerk = VarToStr(dr.Item("Hinweis_Vermerk"))
                    daten.Mitarbeiter = VarToStr(dr.Item("Mitarbeiter"))
                    daten.VermerkCodeId = VarToInt(dr.Item("VermerkeCode"))
                    daten.SendungID = VarToInt(dr.Item("SendungID"))
                    daten.VermerkArt = VarToStr(dr.Item("VermerkArt"))
                    daten.VorauskasseId = VarToInt(dr.Item("VorauskasseId"))
                    daten.SMSId = VarToInt(dr.Item("SMSId"))
                    daten.SMSStatus = VarToInt(dr.Item("SMSstatus"))
                    daten.Geloescht = VarToBool(dr.Item("Geloescht"))
                    daten.AAS_Warnstufe = VarToBool(dr.Item("AAS_Warnstufe"))
                    daten.HintergrundVermerk = VarToBool(dr.Item("HintergrundVermerk"))
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return daten
    End Function

    Public Function Anzeigen_Vermerke(hSQL As String) As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try
                Dim myTable = New DataTable()
                'Dim sql As String
                'sql = hSQL
                Using cmd As New SqlCommand(hSQL, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Vermerke'")
                '   If antwort <> MsgBoxResult.Retry Then
                'Programm wird beendet
                ' MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                ' Environment.Exit(0)
                '  End If
            End Try
            conn.Close()
        End While

        Return Nothing
    End Function


    Shared Function insertSendungsVermerk(SendungID As Integer, AvisoID As Integer, Text As String, VermerkCodeId As Integer, Optional Beschreibung As String = "", Optional VorauskasseId As Object = Nothing, Optional addAuto As Boolean = False, Optional useMitarbeiterTxt As String = "") As Integer
        'Daten zuweisen und speichern
        Dim myVermerk As New cVermerk
        myVermerk.VermerkID = 0
        myVermerk.AvisoID = AvisoID
        myVermerk.Datum = Now
        myVermerk.Mitarbeiter = If(String.IsNullOrWhiteSpace(useMitarbeiterTxt), cGlobal.AktiverMitarbeiter.Mitarbeiter, useMitarbeiterTxt) & If(addAuto, " (AUTO)", "")
        myVermerk.MitarbeiterId = cGlobal.AktiverMitarbeiter.MitarbeiterID
        myVermerk.Hinweis_Vermerk = Text
        myVermerk.VermerkCodeId = VermerkCodeId
        'myVermerk.her = VermerkCodeId
        myVermerk.SendungID = SendungID
        If VorauskasseId IsNot Nothing AndAlso VorauskasseId IsNot DBNull.Value Then myVermerk.VorauskasseId = VorauskasseId
        myVermerk.VermerkArt = "S"
        Dim VermerkeDAL As New cVermerkeDAL

        insertSendungsVermerk = VermerkeDAL.SpeichernVermerk(myVermerk)

        If myVermerk.VermerkCodeId = 18 Then
            VermerkeDAL.UpdateLKW(myVermerk.AvisoID, False)

        End If

    End Function
    Public Function loadTableMyAviso(maId As Integer) As DataTable
        '  While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
        Try

            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try

                Dim myTable = New DataTable()
                Dim sql As String = " SELECT AvisoID, [Status],CASE WHEN LetzterMitarbeiterId=@maId then '0' ELSE '1' END as [statVorb], LKW_Nr, Dauer, Datum, AvisoEingang, Ankunft, Grenzstelle, Freigabe, LetzterMitarbeiterId AS maId, CASE WHEN LetzterMitarbeiterId=@maId then '0' ELSE '1' END  as Vorbereitung,LetzterMitarbeiter,CASE WHEN [LKW_fertig] = 1 THEN 'OK' ELSE '' END AS [LKW_fertig],AvisoTVHinweis " &
                                    " FROM Aviso " &
                                    " WHERE   (  Status IN (0, 3, 4, 5)  OR ( Status = 1 AND [Abgeschlossen] = 0 )) " &
                                            " AND Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' AND (LetzterMitarbeiterId=@maId OR " &
                                            " AVISOid IN ( SELECT distinct(tblSnd_AvisoID) FROM [tblSendungen] WHERE tblSnd_inbearbeitung=1 AND tblSnd_Bearbeitung_MaId=@maId) ) " &
                                     "ORDER BY case	 " &
                                            " when [Status] =3 then 0 " &
                                            " when [Status] =1 then 1 " &
                                            " when [Status] =99 then 2 " &
                                            " when [Status] =4 then 3 " &
                                            " when [Status] =5 then 4 " &
                                            " when [Status] =0 then 5 " &
                                    " END, Ankunft "

                Using cmd As New SqlCommand(sql, conn)
                    'Using dr As SqlDataReader = cmd.ExecuteReader()
                    Dim adapter As New SqlDataAdapter(cmd)

                    'cmd.CommandType = CommandType.StoredProcedure
                    cmd.Parameters.AddWithValue("@maId", maId)
                    'Add parameters, e.g.
                    adapter.ContinueUpdateOnError = True
                    'Get the data.
                    adapter.Fill(myTable)


                    'dr.Close()
                    ' End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception

                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Vermerke'")
                '  If antwort <> MsgBoxResult.Retry Then
                'Programm wird beendet
                'MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                ' Environment.Exit(0)
                'End If
            End Try
            conn.Close()
            '  End While

        Catch ex As Exception
            Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                            "Problem in Function 'Anzeigen_Vermerke'")

        End Try
        Return Nothing
    End Function


    Public Function loadTableMyAvisoOLD(maId As Integer) As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try

                Dim myTable = New DataTable()
                'Dim sql As String
                'sql = hSQL
                '   command As New SqlCommand("sproc name here", connection),
                '  adapter As New SqlDataAdapter(command)

                Using cmd As New SqlCommand("spmyaviso2", conn)
                    'Using dr As SqlDataReader = cmd.ExecuteReader()
                    Dim adapter As New SqlDataAdapter(cmd)

                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.Parameters.AddWithValue("@maId", maId)
                    'Add parameters, e.g.
                    adapter.ContinueUpdateOnError = True
                    'Get the data.
                    adapter.Fill(myTable)


                    'dr.Close()
                    ' End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Vermerke'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
            conn.Close()
        End While

        Return Nothing
    End Function


    Public Function SpeichernVermerk(ByVal d As cVermerk) As Integer
        SpeichernVermerk = -1

        Dim hAuswahl As String
        If d.VermerkID = 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO Vermerke " &
                       "(AvisoID,VermerkArt,SendungID, Datum, Mitarbeiter, Hinweis_Vermerk, VermerkeCode,MitarbeiterId,Beschreibung,VorauskasseId,SMSId,SMSStatus,Geloescht,AAS_Warnstufe,HintergrundVermerk) VALUES (@AvisoID,@VermerkArt, @SendungID, @Datum, @Mitarbeiter, @Hinweis_Vermerk, @VermerkeCode,@MitarbeiterId,@Beschreibung,@VorauskasseId,@SMSId,@SMSStatus,@Geloescht,@AAS_Warnstufe,@HintergrundVermerk)"
        Else
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE Vermerke SET AvisoID = @AvisoID, VermerkArt=@VermerkArt,SendungID=@SendungID,Datum = @Datum, Mitarbeiter = @Mitarbeiter, Hinweis_Vermerk = @Hinweis_Vermerk, VermerkeCode = @VermerkeCode, MitarbeiterId=@MitarbeiterId, Beschreibung=@Beschreibung,VorauskasseId=@VorauskasseId WHERE VermerkID = @VermerkID,SMSId=@SMSId,SMSStatus=@SMSStatus,Geloescht=@Geloescht,AAS_Warnstufe=@AAS_Warnstufe,HintergrundVermerk=@HintergrundVermerk")
        End If
        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@AvisoID", d.AvisoID)
            cmd.Parameters.Add("@Datum", SqlDbType.DateTime).Value = SQLNullDate(d.Datum)
            cmd.Parameters.AddWithValue("@Mitarbeiter", d.Mitarbeiter)
            cmd.Parameters.AddWithValue("@Hinweis_Vermerk", d.Hinweis_Vermerk)
            cmd.Parameters.AddWithValue("@VermerkID", d.VermerkID)
            cmd.Parameters.AddWithValue("@VermerkeCode", d.VermerkCodeId)
            cmd.Parameters.AddWithValue("@MitarbeiterId", d.MitarbeiterId)
            cmd.Parameters.AddWithValue("@Beschreibung", d.Beschreibung)
            cmd.Parameters.AddWithValue("@VermerkArt", d.VermerkArt)
            cmd.Parameters.AddWithValue("@SendungID", If(d.SendungID > 0, d.SendungID, DBNull.Value))
            cmd.Parameters.AddWithValue("@VorauskasseId", If(d.VorauskasseId IsNot Nothing, d.VorauskasseId, DBNull.Value))
            cmd.Parameters.AddWithValue("@SMSId", d.SMSId)
            cmd.Parameters.AddWithValue("@SMSStatus", d.SMSStatus)
            cmd.Parameters.AddWithValue("@Geloescht", d.Geloescht)
            cmd.Parameters.AddWithValue("@AAS_Warnstufe", d.AAS_Warnstufe)
            cmd.Parameters.AddWithValue("@HintergrundVermerk", d.HintergrundVermerk)

            Try
                cmd.ExecuteNonQuery()

                Dim newcmd As New SqlCommand("SELECT @@IDENTITY", conn)
                SpeichernVermerk = CInt(newcmd.ExecuteScalar)


            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
                ' VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()

    End Function

    Public Function SpeichernVermerkIDAufgehoben(VermerkID, VermerkIDAufgehoben) As Boolean
        Dim SQLstr As String = " UPDATE Vermerke SET VermerkIDAufgehoben = @VermerkIDAufgehoben WHERE VermerkID = @VermerkID"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(SQLstr, conn)
            cmd.Parameters.AddWithValue("@VermerkID", VermerkID)
            cmd.Parameters.AddWithValue("@VermerkIDAufgehoben", VermerkIDAufgehoben)

            Try
                cmd.ExecuteNonQuery()
                SpeichernVermerkID_AAS_Aufgehoben(VermerkID)
                Return True
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()
        Return False
    End Function

    Public Function SpeichernVermerkID_AAS_Aufgehoben(VermerkID) As Boolean
        Dim SQLstr As String = " UPDATE [tblAvisoBenachrichtigungen] SET ab_Status = 1 , ab_Bestaetigt_MaId = @ab_Bestaetigt_MaId , ab_Bestaetigt_Datum=GETDATE() WHERE ab_VermerkID=@ab_VermerkID AND ab_Status = 0  "
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(SQLstr, conn)
            cmd.Parameters.AddWithValue("@ab_Bestaetigt_MaId", VERAG_PROG_ALLGEMEIN.cAllgemein.USRID)
            cmd.Parameters.AddWithValue("@ab_VermerkID", VermerkID)

            Try
                cmd.ExecuteNonQuery()
                Return True
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()
        Return False
    End Function

    Public Shared Function increaseWarnstufe(VermerkID) As Boolean

        Dim SQLstr As String = " UPDATE Vermerke SET AAS_Warnstufe = (AAS_Warnstufe+1) WHERE VermerkID = @VermerkID"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(SQLstr, conn)
            cmd.Parameters.AddWithValue("@VermerkID", VermerkID)

            Try
                cmd.ExecuteNonQuery()
                Return True
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()
        Return False
    End Function


    Public Sub togglegeloescht(ByVal hID As Integer, ByVal VermerkText As String, AvisoID As Integer)
        Dim sql = String.Format("UPDATE Vermerke SET Geloescht=Geloescht-1 WHERE VermerkID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()

                'Vermerkzuweisung aufheben, falls vorhanden
                Dim VERAG_SQL As New VERAG_PROG_ALLGEMEIN.SQL
                VERAG_SQL.doSQL("UPDATE [Vermerke] SET VermerkIDAufgehoben = null where VermerkIDAufgehoben = '" & hID & "'", "AVISO")


                Dim cAvisoDAL As New cAvisoDAL
                cAvisoDAL.addAenderung(AvisoID, "Vermerk gelöscht/nicht gelöscht markiert", "Vermerk '" & VermerkText & "' wurde als gelöscht/nicht gelöscht markiert. VermerkID: '" & hID & "'")



            Catch ex As SqlException
                MsgBox("Gelöscht kann nicht gesetzt werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()

    End Sub


    Public Sub UpdateLKW(ByVal avisoID As Integer, ByVal LKW_fertig As Boolean)

        Dim sql = "UPDATE Aviso Set [LKW_fertig]= @LKW_fertig WHERE AvisoID = @AvisoID"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@LKW_fertig", LKW_fertig)
            cmd.Parameters.AddWithValue("@AvisoID", avisoID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub UpdateSendungVorbereitet(ByVal AvisoID As Integer, ByVal sendungsId As Integer, ByVal MaId As Integer, ByVal inBearbeitung As Boolean)

        Dim sql = "UPDATE tblSendungen Set tblSnd_inBearbeitung= @inBearbeitung, tblSnd_Bearbeitung_MaId = @MaId WHERE tblSnd_SendungID = @sendungsId"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@inBearbeitung", inBearbeitung)
            cmd.Parameters.AddWithValue("@MaId", MaId)
            cmd.Parameters.AddWithValue("@sendungsId", sendungsId)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()
        'SetInBearbeitungAVISO(AvisoID)
    End Sub


    Public Sub SetInBearbeitungAVISO(ByVal AvisoID As Integer)

        Dim sql = "UPDATE Aviso SET inBearbeitung= (SELECT CASE WHEN count([tblSnd_inBearbeitung])>0 Then '1' ELSE '0' END  FROM [tblSendungen]  where [tblSnd_AvisoID]=@AvisoID)  WHERE AvisoID = @AvisoID "
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@AvisoID", AvisoID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub UpdateGrenzstelle(ByVal avisoID As Integer, ByVal Grenzstelle As String)

        Dim sql = "UPDATE Aviso SET [Grenzstelle]= @Grenzstelle WHERE AvisoID = @AvisoID AND Status <> " & cGlobal.Status_Ankunft & ""
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Grenzstelle", Grenzstelle)
            cmd.Parameters.AddWithValue("@AvisoID", avisoID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, "Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
            End Try
        End Using
        conn.Close()
    End Sub


    Public Sub LöschenVermerk(ByVal hID As Integer, ByVal VermerkText As String, AvisoID As Integer)
        Dim sql = String.Format("DELETE FROM Vermerke WHERE VermerkID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()

                'Vermerkzuweisung aufheben, falls vorhanden
                Dim VERAG_SQL As New VERAG_PROG_ALLGEMEIN.SQL
                VERAG_SQL.doSQL("UPDATE [Vermerke] SET VermerkIDAufgehoben = null where VermerkIDAufgehoben = '" & hID & "'", "AVISO")

                Dim cAvisoDAL As New cAvisoDAL
                cAvisoDAL.addAenderung(AvisoID, "Vermerk endgültig gelöscht", "Vermerk '" & VermerkText & "' wurde endgültig gelöscht. VermerkID: '" & hID & "'")

                ''
            Catch ex As SqlException
                MsgBox("Vermerk kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()

    End Sub


    Public Shared Sub toggleHervorheben(ByVal hID As Integer)
        Dim sql = String.Format("UPDATE Vermerke SET Hervorheben=Hervorheben-1 WHERE VermerkID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Hervorheben kann nicht gesetzt werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Hervorheben")
            End Try
        End Using
        conn.Close()

    End Sub

    Public Shared Sub DeleteSNDVermerkCode(ByVal SendungID As Integer, VermerkeCode As Integer)
        Dim sql = "DELETE Vermerke WHERE VermerkeCode = '" & VermerkeCode & "' and SendungID= '" & SendungID & "'"

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Hervorheben kann nicht gesetzt werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Hervorheben")
            End Try
        End Using
        conn.Close()

    End Sub
    Public Function Vermerke_einlesen(hAvisoID As Integer) As String
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim x As String = ""
        Dim Anz As Long = 0
        Dim sql As String = "SELECT * FROM Vermerke WHERE AvisoID = " & hAvisoID & " ORDER BY Datum"
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Try
            Using cmd As New SqlCommand(sql, conn)
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    While dr.Read()
                        x += Format(CDate(dr.Item("Datum")), "dd.MM. HH:mm") & vbTab &
                             VarToStr(dr.Item("Hinweis_Vermerk")) & vbCrLf
                        Anz += 1
                    End While
                    dr.Close()
                End Using
            End Using
        Catch ex As Exception
            MsgBox("Fehler in der Function Vermerke_einlesen:" & vbCrLf & vbCrLf & ex.Message & vbCrLf & vbCrLf & "Der Vorgang wird abgebrochen!", MsgBoxStyle.Exclamation)
            Anz = 0
            Exit Try
        End Try
        conn.Close()
        If Anz = 0 Then x = "keine Vermerke vorhanden"

        Return x

    End Function

    Public Function Druckinfo(hSQL As String) As String
        'Hier werden alle Sonderkorrektur-Einträge des Tages in einem Textfile zusammengefasst (als Info für Druck)
        Druckinfo = ""
        Dim Anz As Integer = 0
        Dim daten As cVermerk = Nothing
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Try
            Using cmd As New SqlCommand(hSQL, conn)
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    While dr.Read()
                        Anz += 1
                        Druckinfo += Format(CDate(dr.Item("Datum")), "dd.MM. HH:mm") & "  " &
                                     VarToStr(dr.Item("Hinweis_Vermerk")) & vbCrLf
                    End While
                    dr.Close()
                    If Anz = 0 Then Druckinfo = "" 'wenn nichts gefunden, dann Druckzeile leer lassen
                End Using
            End Using
        Catch ex As Exception
            Druckinfo = "Es ist ein Fehler beim Lesen der Vermerke aufgetreten."
            Exit Try
        End Try
        conn.Close()
        Return Druckinfo
    End Function

End Class


Public Class cAvisoTvNew
    Public Property TvTextBezeichnungID As Integer
    Public Property TvTextBezeichnung As String
    Public Property FixeZeile1RTF As String
    Public Property FixeZeile1HTML As String
    Public Property FixeZeile2RTF As String
    Public Property FixeZeile2HTML As String
    Public Property FixeZeile3HTML As String
    Public Property FixeZeile3RTF As String
    Public Property StandortID As Integer
    Public Property Standort As String
    Public Property Prio As Integer
    Public Property StartDate As Date?
    Public Property EndDate As Date?
    Public Property StartTime As TimeSpan?
    Public Property EndTime As TimeSpan?
    Public Property IsRecurring As Boolean?
    Public Property IsMonday As Boolean?
    Public Property IsTuesday As Boolean?
    Public Property IsWednesday As Boolean?
    Public Property IsThursday As Boolean?
    Public Property IsFriday As Boolean?
    Public Property IsSaturday As Boolean?
    Public Property IsSunday As Boolean?
    Public Property IsActive As Boolean


End Class

Public Class cTvTextBezeichnung
    Public Property TvTextBezeichnungID As Integer
    Public Property TvTextBezeichnung As String
End Class

Public Class cTvSettings
    Public Property TVSettingID As Integer
    Public Property StandortID As Integer
    Public Property KachelWidthInPercent As Double?
    Public Property KachelHeightInPercent As Double?
    Public Property KachelFontSizeLkwNummer As Double?
    Public Property KachelFontSizeDateTime As Double?
    Public Property KachelRowGapInPercent As Double?
    Public Property SeitenwechselInSek As Integer?
    Public Property TextBalkenHeightInPercent As Double?
    Public Property TextFlaggeLeft As Double?
    Public Property TextFlaggeBottom As Double?
    Public Property SelectedLogoValue As String
    Public Property Reload As Byte?


End Class


Public Class cAvisoTvNewDAL

    ''' <summary>
    ''' Holt die StandortID basierend auf dem Standortnamen.
    ''' </summary>
    ''' <param name="standort">Der Name des Standorts.</param>
    ''' <returns>Die zugehörige StandortID oder 0, wenn nicht gefunden.</returns>
    Public Function GetStandortID(standort As String) As Integer
        Dim standortID As Integer = 0
        Dim sql As String = "SELECT StandortID FROM StandorteTV WHERE StandortBezeichnung = @StandortBezeichnung"

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using cmd As New SqlCommand(sql, conn)
                    cmd.Parameters.AddWithValue("@StandortBezeichnung", standort)
                    Dim result As Object = cmd.ExecuteScalar()
                    If result IsNot Nothing AndAlso Not IsDBNull(result) Then
                        standortID = Convert.ToInt32(result)
                    End If
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("SQL Fehler beim Abrufen der StandortID: " & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Allgemeiner Fehler beim Abrufen der StandortID: " & ex.Message, ex)
        End Try

        Return standortID
    End Function

    ''' <summary>
    ''' Speichert die TV-Einstellungen in der Datenbank.
    ''' </summary>
    ''' <param name="settings">Die TV-Einstellungen, die gespeichert werden sollen.</param>
    Public Sub SaveTvSettings(settings As cTvSettings)
        Dim sqlCheck As String = "SELECT COUNT(*) FROM AvisoTvSettings WHERE StandortID = @StandortID"
        Dim sqlUpdate As String = "UPDATE AvisoTvSettings SET 
                                    KachelWidthInPercent = @KachelWidthInPercent, 
                                    KachelHeightInPercent = @KachelHeightInPercent,
                                    KachelFontSizeLkwNummer = @KachelFontSizeLkwNummer,
                                    KachelFontSizeDateTime = @KachelFontSizeDateTime,
                                    KachelRowGapInPercent = @KachelRowGapInPercent,
                                    SeitenwechselInSek = @SeitenwechselInSek,
                                    TextBalkenHeightInPercent = @TextBalkenHeightInPercent,
                                    FlaggeLeft = @FlaggeLeft,
                                    FlaggeBottom = @FlaggeBottom,
                                    Logo = @Logo,
                                    Reload = @Reload
                                    WHERE StandortID = @StandortID"
        Dim sqlInsert As String = "INSERT INTO AvisoTvSettings 
                                    (StandortID, KachelWidthInPercent, KachelHeightInPercent,KachelRowGapInPercent,
                                     KachelFontSizeLkwNummer, KachelFontSizeDateTime, 
                                     SeitenwechselInSek, TextBalkenHeightInPercent,FlaggeLeft,FlaggeBottom,Logo) 
                                    VALUES 
                                    (@StandortID, @KachelWidthInPercent, @KachelHeightInPercent,@KachelRowGapInPercent,
                                     @KachelFontSizeLkwNummer, @KachelFontSizeDateTime, 
                                     @SeitenwechselInSek, @TextBalkenHeightInPercent,@FlaggeLeft,@FlaggeBottom,@Logo)"

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                ' Überprüfen, ob bereits Einstellungen für den Standort existieren
                Dim recordExists As Boolean
                Using cmdCheck As New SqlCommand(sqlCheck, conn)
                    cmdCheck.Parameters.AddWithValue("@StandortID", settings.StandortID)
                    recordExists = Convert.ToInt32(cmdCheck.ExecuteScalar()) > 0
                End Using

                ' Wähle Update oder Insert basierend auf der Existenz
                Dim sql As String = If(recordExists, sqlUpdate, sqlInsert)

                Using cmdSave As New SqlCommand(sql, conn)
                    cmdSave.Parameters.AddWithValue("@StandortID", settings.StandortID)
                    cmdSave.Parameters.AddWithValue("@KachelWidthInPercent", settings.KachelWidthInPercent)
                    cmdSave.Parameters.AddWithValue("@KachelHeightInPercent", settings.KachelHeightInPercent)
                    cmdSave.Parameters.AddWithValue("@KachelRowGapInPercent", settings.KachelRowGapInPercent)
                    cmdSave.Parameters.AddWithValue("@KachelFontSizeLkwNummer", settings.KachelFontSizeLkwNummer)
                    cmdSave.Parameters.AddWithValue("@KachelFontSizeDateTime", settings.KachelFontSizeDateTime)
                    cmdSave.Parameters.AddWithValue("@SeitenwechselInSek", settings.SeitenwechselInSek)
                    cmdSave.Parameters.AddWithValue("@TextBalkenHeightInPercent", settings.TextBalkenHeightInPercent)
                    cmdSave.Parameters.AddWithValue("@FlaggeLeft", settings.TextFlaggeLeft)
                    cmdSave.Parameters.AddWithValue("@FlaggeBottom", settings.TextFlaggeBottom)
                    cmdSave.Parameters.AddWithValue("@Logo", settings.SelectedLogoValue)
                    cmdSave.Parameters.AddWithValue("@Reload", settings.Reload)
                    cmdSave.ExecuteNonQuery()
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("SQL Fehler beim Speichern der TV-Einstellungen: " & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Allgemeiner Fehler beim Speichern der TV-Einstellungen: " & ex.Message, ex)
        End Try
    End Sub

    ''' <summary>
    ''' Lädt die TV-Einstellungen basierend auf der StandortID.
    ''' </summary>
    ''' <param name="standortID">Die StandortID, für die die Einstellungen geladen werden sollen.</param>
    ''' <returns>Eine Liste der entsprechenden TV-Einstellungen.</returns>
    Public Function GetTvSettingsByStandort(standortID As Integer) As List(Of cTvSettings)
        Dim SettingsList As New List(Of cTvSettings)()
        Dim sql As String = "SELECT * FROM AvisoTvSettings WHERE StandortID = @StandortID"

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using cmd As New SqlCommand(sql, conn)
                    cmd.Parameters.AddWithValue("@StandortID", standortID)

                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        While dr.Read()
                            Dim settings As New cTvSettings() With {
                                .TVSettingID = Convert.ToInt32(dr("TvSettingID")),
                                .StandortID = Convert.ToInt32(dr("StandortID")),
                                .KachelWidthInPercent = If(IsDBNull(dr("KachelWidthInPercent")), 0, Convert.ToDouble(dr("KachelWidthInPercent"))),
                                .KachelHeightInPercent = If(IsDBNull(dr("KachelHeightInPercent")), 0, Convert.ToDouble(dr("KachelHeightInPercent"))),
                                .KachelRowGapInPercent = If(IsDBNull(dr("KachelRowGapInPercent")), 0, Convert.ToDouble(dr("KachelRowGapInPercent"))),
                                .KachelFontSizeLkwNummer = If(IsDBNull(dr("KachelFontSizeLkwNummer")), 0, Convert.ToDouble(dr("KachelFontSizeLkwNummer"))),
                                .KachelFontSizeDateTime = If(IsDBNull(dr("KachelFontSizeDateTime")), 0, Convert.ToDouble(dr("KachelFontSizeDateTime"))),
                                .SeitenwechselInSek = If(IsDBNull(dr("SeitenwechselInSek")), 0, Convert.ToInt32(dr("SeitenwechselInSek"))),
                                .TextBalkenHeightInPercent = If(IsDBNull(dr("TextBalkenHeightInPercent")), 0, Convert.ToDouble(dr("TextBalkenHeightInPercent"))),
                                .TextFlaggeBottom = If(IsDBNull(dr("FlaggeBottom")), 0, Convert.ToDouble(dr("FlaggeBottom"))),
                                .TextFlaggeLeft = If(IsDBNull(dr("FlaggeLeft")), 0, Convert.ToDouble(dr("FlaggeLeft"))),
                                .SelectedLogoValue = If(IsDBNull(dr("Logo")), "", Convert.ToString(dr("Logo")))
                            }

                            SettingsList.Add(settings)
                        End While
                    End Using
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("SQL Fehler beim Laden der TV-Einstellungen: " & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Allgemeiner Fehler beim Laden der TV-Einstellungen: " & ex.Message, ex)
        End Try

        Return SettingsList
    End Function

    ''' <summary>
    ''' Lädt alle TV-Textbezeichnungen aus der Datenbank.
    ''' </summary>
    ''' <returns>Eine Liste aller TV-Textbezeichnungen.</returns>
    Public Function LadenAlleTvTextBezeichnungen() As List(Of cTvTextBezeichnung)
        Dim bezeichnungen As New List(Of cTvTextBezeichnung)()
        Dim sql As String = "
            SELECT TvTextBezeichnungID, TvTextBezeichnung
            FROM AvisoTvNew
            ORDER BY TvTextBezeichnung
        "

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using cmd As New SqlCommand(sql, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        While dr.Read()
                            Dim bezeichnung As New cTvTextBezeichnung() With {
                                .TvTextBezeichnungID = Convert.ToInt32(dr("TvTextBezeichnungID")),
                                .TvTextBezeichnung = Convert.ToString(dr("TvTextBezeichnung"))
                            }
                            bezeichnungen.Add(bezeichnung)
                        End While
                    End Using
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("SQL Fehler beim Laden der TvTextBezeichnungen: " & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Allgemeiner Fehler beim Laden der TvTextBezeichnungen: " & ex.Message, ex)
        End Try

        Return bezeichnungen
    End Function

    ''' <summary>
    ''' Überprüft, ob eine TV-Textbezeichnung bereits vorhanden ist.
    ''' </summary>
    ''' <param name="tvTextBezeichnung">Die TV-Textbezeichnung, die überprüft werden soll.</param>
    ''' <returns>True, wenn die Bezeichnung vorhanden ist; andernfalls False.</returns>
    Public Function IstTvTextBezeichnungVorhanden(tvTextBezeichnung As String) As Boolean
        Dim vorhanden As Boolean = False
        Dim sql As String = "SELECT COUNT(*) FROM AvisoTvNew WHERE TvTextBezeichnung = @TvTextBezeichnung"

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using cmd As New SqlCommand(sql, conn)
                    cmd.Parameters.AddWithValue("@TvTextBezeichnung", tvTextBezeichnung)
                    Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())
                    If count > 0 Then
                        vorhanden = True
                    End If
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("SQL Fehler beim Überprüfen der TvTextBezeichnung: " & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Allgemeiner Fehler beim Überprüfen der TvTextBezeichnung: " & ex.Message, ex)
        End Try

        Return vorhanden
    End Function

    ''' <summary>
    ''' Liest AvisoTvNew-Einträge basierend auf den angegebenen Kriterien.
    ''' </summary>
    ''' <param name="tvid">Die TV-TextbezeichnungID.</param>
    ''' <param name="bezeichnung">Die Bezeichnung.</param>
    ''' <param name="StandortBezeichnung">Der Standort.</param>
    ''' <param name="liste">Die Liste, in die die Ergebnisse eingefügt werden.</param>
    Public Sub LesenAvisoTvNew(tvid As Integer, bezeichnung As String, StandortBezeichnung As String, ByRef liste As List(Of cAvisoTvNew))
        Dim sql As String = "SELECT 
                        stv.TvTextBezeichnungID, 
                        stv.StandortID, 
                        stv.Prio,
                        a.TvTextBezeichnung,
                        s.Standort, 
                        a.FixeZeile1RTF, 
                        a.FixeZeile2RTF, 
                        a.FixeZeile3RTF, 
                        a.StartDate, 
                        a.EndDate, 
                        a.StartTime, 
                        a.EndTime, 
                        a.IsRecurring, 
                        a.IsMonday, 
                        a.IsTuesday, 
                        a.IsWednesday, 
                        a.IsThursday, 
                        a.IsFriday, 
                        a.IsSaturday, 
                        a.IsSunday, 
                        a.IsActive
                     FROM AvisoTvNew a
                     JOIN StandortTvBezeichnung stv ON a.TvTextBezeichnungID = stv.TvTextBezeichnungID
                     JOIN StandorteTV s ON stv.StandortID = s.StandortID
                     WHERE 1=1"

        If tvid <> 0 Then
            sql &= " AND a.TvTextBezeichnungID = @TvTextBezeichnungID"
        End If

        If Not String.IsNullOrWhiteSpace(bezeichnung) Then
            sql &= " AND a.TVTextBezeichnung LIKE @TVTextBezeichnung"
        End If

        If Not String.IsNullOrWhiteSpace(StandortBezeichnung) Then
            sql &= " AND s.Standortbezeichnung = @StandortBezeichnung"
        End If

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using cmd As New SqlCommand(sql, conn)
                    If tvid <> 0 Then
                        cmd.Parameters.AddWithValue("@TvTextBezeichnungID", tvid)
                    End If

                    If Not String.IsNullOrWhiteSpace(bezeichnung) Then
                        cmd.Parameters.AddWithValue("@TVTextBezeichnung", "%" & bezeichnung & "%")
                    End If

                    If Not String.IsNullOrWhiteSpace(StandortBezeichnung) Then
                        cmd.Parameters.AddWithValue("@StandortBezeichnung", StandortBezeichnung)
                    End If

                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        While dr.Read()
                            Dim aviso As New cAvisoTvNew() With {
                                .TvTextBezeichnungID = Convert.ToInt32(dr("TvTextBezeichnungID")),
                                .StandortID = Convert.ToInt32(dr("StandortID")),
                                .TvTextBezeichnung = Convert.ToString(dr("TVTextBezeichnung")),
                                .Standort = Convert.ToString(dr("Standort")),
                                .FixeZeile1RTF = If(IsDBNull(dr("FixeZeile1RTF")), Nothing, Convert.ToString(dr("FixeZeile1RTF"))),
                                .FixeZeile2RTF = If(IsDBNull(dr("FixeZeile2RTF")), Nothing, Convert.ToString(dr("FixeZeile2RTF"))),
                                .FixeZeile3RTF = If(IsDBNull(dr("FixeZeile3RTF")), Nothing, Convert.ToString(dr("FixeZeile3RTF"))),
                                .Prio = If(IsDBNull(dr("Prio")), Nothing, Convert.ToInt32(dr("Prio"))),
                                .StartDate = If(IsDBNull(dr("StartDate")), CType(Nothing, Date?), Convert.ToDateTime(dr("StartDate"))),
                                .EndDate = If(IsDBNull(dr("EndDate")), CType(Nothing, Date?), Convert.ToDateTime(dr("EndDate"))),
                                .StartTime = If(IsDBNull(dr("StartTime")), CType(Nothing, TimeSpan?), CType(dr("StartTime"), TimeSpan)),
                                .EndTime = If(IsDBNull(dr("EndTime")), CType(Nothing, TimeSpan?), CType(dr("EndTime"), TimeSpan)),
                                .IsRecurring = If(IsDBNull(dr("IsRecurring")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsRecurring"))),
                                .IsMonday = If(IsDBNull(dr("IsMonday")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsMonday"))),
                                .IsTuesday = If(IsDBNull(dr("IsTuesday")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsTuesday"))),
                                .IsWednesday = If(IsDBNull(dr("IsWednesday")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsWednesday"))),
                                .IsThursday = If(IsDBNull(dr("IsThursday")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsThursday"))),
                                .IsFriday = If(IsDBNull(dr("IsFriday")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsFriday"))),
                                .IsSaturday = If(IsDBNull(dr("IsSaturday")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsSaturday"))),
                                .IsSunday = If(IsDBNull(dr("IsSunday")), CType(Nothing, Boolean?), Convert.ToBoolean(dr("IsSunday"))),
                                .IsActive = Convert.ToBoolean(dr("IsActive"))
                            }
                            liste.Add(aviso)
                        End While
                    End Using
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("SQL Fehler beim Lesen der Daten: " & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Allgemeiner Fehler beim Lesen der Daten: " & ex.Message, ex)
        End Try
    End Sub

    ''' <summary>
    ''' Liest alle AvisoTvNew-Einträge aus der Datenbank.
    ''' </summary>
    ''' <param name="liste">Die Liste, in die die Ergebnisse eingefügt werden.</param>
    Public Sub LesenAlleAvisoTvNew(ByRef liste As List(Of cAvisoTvNew))
        ' Basis-SQL-Abfrage ohne Filter
        Dim sql As String = "SELECT 
                            a.TvTextBezeichnungID, 
                            a.TvTextBezeichnung,
                            a.FixeZeile1RTF, 
                            a.FixeZeile2RTF, 
                            a.FixeZeile3RTF, 
                            a.Prio, 
                            a.StartDate, 
                            a.EndDate, 
                            a.StartTime, 
                            a.EndTime, 
                            a.IsRecurring, 
                            a.IsMonday, 
                            a.IsTuesday, 
                            a.IsWednesday, 
                            a.IsThursday, 
                            a.IsFriday, 
                            a.IsSaturday, 
                            a.IsSunday, 
                            a.IsActive
                        FROM AvisoTvNew a"

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using cmd As New SqlCommand(sql, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        While dr.Read()
                            Dim aviso As New cAvisoTvNew() With {
                                .TvTextBezeichnungID = If(IsDBNull(dr("TvTextBezeichnungID")), 0, Convert.ToInt32(dr("TvTextBezeichnungID"))),
                                .TvTextBezeichnung = If(IsDBNull(dr("TvTextBezeichnung")), String.Empty, dr("TvTextBezeichnung").ToString()),
                                .FixeZeile1RTF = If(IsDBNull(dr("FixeZeile1RTF")), Nothing, dr("FixeZeile1RTF").ToString()),
                                .FixeZeile2RTF = If(IsDBNull(dr("FixeZeile2RTF")), Nothing, dr("FixeZeile2RTF").ToString()),
                                .FixeZeile3RTF = If(IsDBNull(dr("FixeZeile3RTF")), Nothing, dr("FixeZeile3RTF").ToString()),
                                .Prio = If(IsDBNull(dr("Prio")), 0, Convert.ToInt32(dr("Prio"))),
                                .StartDate = If(IsDBNull(dr("StartDate")), CType(Nothing, Date?), Convert.ToDateTime(dr("StartDate"))),
                                .EndDate = If(IsDBNull(dr("EndDate")), CType(Nothing, Date?), Convert.ToDateTime(dr("EndDate"))),
                                .StartTime = If(IsDBNull(dr("StartTime")), CType(Nothing, TimeSpan?), CType(dr("StartTime"), TimeSpan)),
                                .EndTime = If(IsDBNull(dr("EndTime")), CType(Nothing, TimeSpan?), CType(dr("EndTime"), TimeSpan)),
                                .IsRecurring = If(IsDBNull(dr("IsRecurring")), False, Convert.ToBoolean(dr("IsRecurring"))),
                                .IsMonday = If(IsDBNull(dr("IsMonday")), False, Convert.ToBoolean(dr("IsMonday"))),
                                .IsTuesday = If(IsDBNull(dr("IsTuesday")), False, Convert.ToBoolean(dr("IsTuesday"))),
                                .IsWednesday = If(IsDBNull(dr("IsWednesday")), False, Convert.ToBoolean(dr("IsWednesday"))),
                                .IsThursday = If(IsDBNull(dr("IsThursday")), False, Convert.ToBoolean(dr("IsThursday"))),
                                .IsFriday = If(IsDBNull(dr("IsFriday")), False, Convert.ToBoolean(dr("IsFriday"))),
                                .IsSaturday = If(IsDBNull(dr("IsSaturday")), False, Convert.ToBoolean(dr("IsSaturday"))),
                                .IsSunday = If(IsDBNull(dr("IsSunday")), False, Convert.ToBoolean(dr("IsSunday"))),
                                .IsActive = If(IsDBNull(dr("IsActive")), False, Convert.ToBoolean(dr("IsActive")))
                            }

                            liste.Add(aviso)
                        End While
                    End Using
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception($"SQL Fehler beim Lesen der Daten: {ex.Message}", ex)
        Catch ex As Exception
            Throw New Exception($"Allgemeiner Fehler beim Lesen der Daten: {ex.Message}", ex)
        End Try
    End Sub

    ''' <summary>
    ''' Speichert einen AvisoTvNew-Eintrag in der Datenbank.
    ''' </summary>
    ''' <param name="aviso">Der AvisoTvNew-Eintrag, der gespeichert werden soll.</param>
    Public Sub SpeichernAvisoTvNew(aviso As cAvisoTvNew)
        Dim sqlInsert As String
        Dim sqlUpdate As String

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using transaction As SqlTransaction = conn.BeginTransaction()
                    Try
                        If aviso.TvTextBezeichnungID = 0 Then
                            ' Neuanlage
                            sqlInsert = "INSERT INTO AvisoTvNew (
                                TvTextBezeichnung,
                                FixeZeile1RTF, 
                                FixeZeile1HTML, 
                                FixeZeile2RTF, 
                                FixeZeile2HTML, 
                                FixeZeile3RTF, 
                                FixeZeile3HTML, 
                                StartDate, 
                                EndDate, 
                                StartTime, 
                                EndTime, 
                                IsRecurring, 
                                IsMonday, 
                                IsTuesday, 
                                IsWednesday, 
                                IsThursday, 
                                IsFriday, 
                                IsSaturday, 
                                IsSunday,
                                Prio,
                                IsActive
                            ) VALUES (
                                @TvTextBezeichnung, 
                                @FixeZeile1RTF, 
                                @FixeZeile1HTML, 
                                @FixeZeile2RTF, 
                                @FixeZeile2HTML, 
                                @FixeZeile3RTF, 
                                @FixeZeile3HTML, 
                                @StartDate, 
                                @EndDate, 
                                @StartTime, 
                                @EndTime, 
                                @IsRecurring, 
                                @IsMonday, 
                                @IsTuesday, 
                                @IsWednesday, 
                                @IsThursday, 
                                @IsFriday, 
                                @IsSaturday, 
                                @IsSunday, 
                                @Prio, 
                                @IsActive
                            ); 
                            SELECT CAST(scope_identity() AS int);"

                            Using cmd As New SqlCommand(sqlInsert, conn, transaction)
                                cmd.Parameters.AddWithValue("@TvTextBezeichnung", aviso.TvTextBezeichnung)
                                cmd.Parameters.AddWithValue("@FixeZeile1RTF", If(String.IsNullOrWhiteSpace(aviso.FixeZeile1RTF), CType(Nothing, String), aviso.FixeZeile1RTF))
                                cmd.Parameters.AddWithValue("@FixeZeile1HTML", If(String.IsNullOrWhiteSpace(aviso.FixeZeile1HTML), CType(Nothing, String), aviso.FixeZeile1HTML))
                                cmd.Parameters.AddWithValue("@FixeZeile2RTF", If(String.IsNullOrWhiteSpace(aviso.FixeZeile2RTF), DBNull.Value, aviso.FixeZeile2RTF))
                                cmd.Parameters.AddWithValue("@FixeZeile2HTML", If(String.IsNullOrWhiteSpace(aviso.FixeZeile2HTML), DBNull.Value, aviso.FixeZeile2HTML))
                                cmd.Parameters.AddWithValue("@FixeZeile3RTF", If(String.IsNullOrWhiteSpace(aviso.FixeZeile3RTF), DBNull.Value, aviso.FixeZeile3RTF))
                                cmd.Parameters.AddWithValue("@FixeZeile3HTML", If(String.IsNullOrWhiteSpace(aviso.FixeZeile3HTML), DBNull.Value, aviso.FixeZeile3HTML))
                                cmd.Parameters.AddWithValue("@StartDate", If(aviso.StartDate.HasValue, CType(aviso.StartDate.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@EndDate", If(aviso.EndDate.HasValue, CType(aviso.EndDate.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@StartTime", If(aviso.StartTime.HasValue, CType(aviso.StartTime.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@EndTime", If(aviso.EndTime.HasValue, CType(aviso.EndTime.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@Prio", aviso.Prio)
                                cmd.Parameters.AddWithValue("@IsRecurring", aviso.IsRecurring)
                                cmd.Parameters.AddWithValue("@IsMonday", aviso.IsMonday)
                                cmd.Parameters.AddWithValue("@IsTuesday", aviso.IsTuesday)
                                cmd.Parameters.AddWithValue("@IsWednesday", aviso.IsWednesday)
                                cmd.Parameters.AddWithValue("@IsThursday", aviso.IsThursday)
                                cmd.Parameters.AddWithValue("@IsFriday", aviso.IsFriday)
                                cmd.Parameters.AddWithValue("@IsSaturday", aviso.IsSaturday)
                                cmd.Parameters.AddWithValue("@IsSunday", aviso.IsSunday)
                                cmd.Parameters.AddWithValue("@IsActive", aviso.IsActive)

                                Dim result As Object = cmd.ExecuteScalar()
                                If result Is Nothing OrElse IsDBNull(result) Then
                                    Throw New Exception("Das INSERT hat keine ID zurückgegeben.")
                                End If
                                aviso.TvTextBezeichnungID = Convert.ToInt32(result)
                            End Using
                        Else
                            ' Aktualisierung
                            sqlUpdate = "UPDATE AvisoTvNew SET 
                                FixeZeile1RTF = @FixeZeile1RTF, 
                                FixeZeile1HTML = @FixeZeile1HTML, 
                                FixeZeile2RTF = @FixeZeile2RTF, 
                                FixeZeile2HTML = @FixeZeile2HTML, 
                                FixeZeile3RTF = @FixeZeile3RTF, 
                                FixeZeile3HTML = @FixeZeile3HTML, 
                                StartDate = @StartDate, 
                                EndDate = @EndDate, 
                                StartTime = @StartTime, 
                                EndTime = @EndTime, 
                                IsRecurring = @IsRecurring, 
                                IsMonday = @IsMonday, 
                                IsTuesday = @IsTuesday, 
                                IsWednesday = @IsWednesday, 
                                IsThursday = @IsThursday, 
                                IsFriday = @IsFriday, 
                                IsSaturday = @IsSaturday, 
                                IsSunday = @IsSunday, 
                                IsActive = @IsActive,
                                Prio = @Prio 
                            WHERE TvTextBezeichnungID = @TvTextBezeichnungID"

                            Using cmd As New SqlCommand(sqlUpdate, conn, transaction)
                                cmd.Parameters.AddWithValue("@FixeZeile1RTF", If(String.IsNullOrWhiteSpace(aviso.FixeZeile1RTF), CType(Nothing, String), aviso.FixeZeile1RTF))
                                cmd.Parameters.AddWithValue("@FixeZeile1HTML", If(String.IsNullOrWhiteSpace(aviso.FixeZeile1HTML), CType(Nothing, String), aviso.FixeZeile1HTML))
                                cmd.Parameters.AddWithValue("@FixeZeile2RTF", If(String.IsNullOrWhiteSpace(aviso.FixeZeile2RTF), DBNull.Value, aviso.FixeZeile2RTF))
                                cmd.Parameters.AddWithValue("@FixeZeile2HTML", If(String.IsNullOrWhiteSpace(aviso.FixeZeile2HTML), DBNull.Value, aviso.FixeZeile2HTML))
                                cmd.Parameters.AddWithValue("@FixeZeile3RTF", If(String.IsNullOrWhiteSpace(aviso.FixeZeile3RTF), DBNull.Value, aviso.FixeZeile3RTF))
                                cmd.Parameters.AddWithValue("@FixeZeile3HTML", If(String.IsNullOrWhiteSpace(aviso.FixeZeile3HTML), DBNull.Value, aviso.FixeZeile3HTML))
                                cmd.Parameters.AddWithValue("@StartDate", If(aviso.StartDate.HasValue, CType(aviso.StartDate.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@EndDate", If(aviso.EndDate.HasValue, CType(aviso.EndDate.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@StartTime", If(aviso.StartTime.HasValue, CType(aviso.StartTime.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@EndTime", If(aviso.EndTime.HasValue, CType(aviso.EndTime.Value, Object), DBNull.Value))
                                cmd.Parameters.AddWithValue("@IsRecurring", aviso.IsRecurring)
                                cmd.Parameters.AddWithValue("@IsMonday", aviso.IsMonday)
                                cmd.Parameters.AddWithValue("@IsTuesday", aviso.IsTuesday)
                                cmd.Parameters.AddWithValue("@IsWednesday", aviso.IsWednesday)
                                cmd.Parameters.AddWithValue("@IsThursday", aviso.IsThursday)
                                cmd.Parameters.AddWithValue("@IsFriday", aviso.IsFriday)
                                cmd.Parameters.AddWithValue("@IsSaturday", aviso.IsSaturday)
                                cmd.Parameters.AddWithValue("@IsSunday", aviso.IsSunday)
                                cmd.Parameters.AddWithValue("@IsActive", aviso.IsActive)
                                cmd.Parameters.AddWithValue("@Prio", aviso.Prio)
                                cmd.Parameters.AddWithValue("@TvTextBezeichnungID", aviso.TvTextBezeichnungID)

                                cmd.ExecuteNonQuery()
                            End Using
                        End If

                        ' Einfügen oder Aktualisieren in die StandortTvBezeichnung-Tabelle
                        Dim sqlLink As String = "
                                IF EXISTS (
                                    SELECT 1 
                                    FROM StandortTvBezeichnung 
                                    WHERE StandortID = @StandortID 
                                      AND TvTextBezeichnungID = @TvTextBezeichnungID
                                )
                                BEGIN
                                    UPDATE StandortTvBezeichnung
                                    SET 
                                     Prio = @Prio
                                    WHERE StandortID = @StandortID 
                                      AND TvTextBezeichnungID = @TvTextBezeichnungID
                                END
                                ELSE
                                BEGIN
                                    INSERT INTO StandortTvBezeichnung (StandortID, TvTextBezeichnungID) 
                                    VALUES (@StandortID, @TvTextBezeichnungID)
                                END
                            "

                        Using cmdLink As New SqlCommand(sqlLink, conn, transaction)
                            cmdLink.Parameters.AddWithValue("@StandortID", aviso.StandortID)
                            cmdLink.Parameters.AddWithValue("@Prio", aviso.Prio)
                            cmdLink.Parameters.AddWithValue("@TvTextBezeichnungID", aviso.TvTextBezeichnungID)

                            cmdLink.ExecuteNonQuery()
                        End Using

                        ' Transaktion committen
                        transaction.Commit()
                    Catch ex As Exception
                        ' Fehler: Transaktion zurückrollen
                        Try
                            transaction.Rollback()
                        Catch rollbackEx As Exception
                            Throw New Exception("Fehler beim Zurückrollen der Transaktion: " & rollbackEx.Message, rollbackEx)
                        End Try
                        Throw
                    End Try
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("SQL Fehler beim Speichern des Eintrags: " & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Allgemeiner Fehler beim Speichern des Eintrags: " & ex.Message, ex)
        End Try
    End Sub

    ''' <summary>
    ''' Setzt einen AvisoTvNew-Eintrag auf inaktiv.
    ''' </summary>
    ''' <param name="hID">Die ID des Eintrags, der inaktiv gesetzt werden soll.</param>
    Public Sub SetzeAufInaktiv(ByVal hID As Integer)
        Dim sql As String = "UPDATE AvisoTvNew SET IsActive = 0 WHERE TVID = @TVID"

        Try
            Using conn As SqlConnection = cDatenbankAVISO.CreateNewOpenConnection()
                Using cmd As New SqlCommand(sql, conn)
                    cmd.Parameters.AddWithValue("@TVID", hID)
                    Dim rowsAffected As Integer = cmd.ExecuteNonQuery()
                    If rowsAffected = 0 Then
                        Throw New Exception("Der Datensatz konnte nicht auf inaktiv gesetzt werden. Möglicherweise existiert er nicht mehr.")
                    End If
                End Using
            End Using
        Catch ex As SqlException
            Throw New Exception("AvisoTvNew-Eintrag kann nicht auf inaktiv gesetzt werden! " & vbCrLf & ex.Message, ex)
        Catch ex As Exception
            Throw New Exception("Fehler beim Setzen auf inaktiv: " & ex.Message, ex)
        End Try
    End Sub

End Class






Public Class cAvisoTV
    Property TVID As Long = 0
    Property FixeZeile1 As String
    Property FixeZeile2 As String
    Property FixeZeile3 As String
    Property Standort As String
    Property Art As String
    Property Special As String
End Class

Public Class cAvisoTVDAL

    Public Function LesenAvisoTV(hID As Integer, wherehSQL As String, Standort As String, Special As String, Optional ByRef list As List(Of cAvisoTV) = Nothing) As cAvisoTV
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If list IsNot Nothing Then list.Clear()
        sql = "SELECT * FROM AvisoTV WHERE 1=1 "
        If hID > 0 Then
            sql &= String.Format(" AND TVID = {0}", hID)
        Else
            sql &= wherehSQL
        End If

        If Standort <> "" Then
            sql &= " AND Standort='" & Standort & "'"
        End If

        If Special <> "" Then
            sql &= " AND (Special is null or Special='" & Special & "' or Special='" & Now.ToShortDateString & "') "
        End If

        sql &= " ORDER BY Special  desc,TVID "
        'MsgBox(sql)
        Dim daten As cAvisoTV = Nothing
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnectionWithoutError()
        Try
            Using cmd As New SqlCommand(sql, conn)
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    If dr.HasRows Then
                        dr.Read()
                        daten = New cAvisoTV()
                        daten.TVID = VarToInt(dr.Item("TVID"))
                        daten.FixeZeile1 = VarToStr(dr.Item("FixeZeile1"))
                        daten.FixeZeile2 = VarToStr(dr.Item("FixeZeile2"))
                        daten.FixeZeile3 = VarToStr(dr.Item("FixeZeile3"))
                        daten.Standort = VarToStr(dr.Item("Standort"))
                        daten.Art = VarToStr(dr.Item("Art"))
                        daten.Special = VarToStr(dr.Item("Special"))

                        For Each ds In dr
                            Dim avisoTv = New cAvisoTV()
                            avisoTv.TVID = VarToInt(ds.Item("TVID"))
                            avisoTv.FixeZeile1 = VarToStr(ds.Item("FixeZeile1"))
                            avisoTv.FixeZeile2 = VarToStr(ds.Item("FixeZeile2"))
                            avisoTv.FixeZeile3 = VarToStr(ds.Item("FixeZeile3"))
                            avisoTv.Standort = VarToStr(ds.Item("Standort"))
                            avisoTv.Art = VarToStr(ds.Item("Art"))
                            avisoTv.Special = VarToStr(ds.Item("Special"))
                            If list IsNot Nothing Then list.Add(avisoTv)
                        Next


                    End If
                    dr.Close()
                End Using
            End Using
            Return daten
        Catch ex As Exception
            Return Nothing
        End Try
        conn.Close()

    End Function

    Public Sub SpeichernAvisoTV(ByVal d As cAvisoTV)
        Dim hAuswahl As String
        If d.TVID = 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO AvisoTV " &
                       "(FixeZeile1, FixeZeile2, FixeZeile3,Standort,Art) VALUES (@FixeZeile1, @FixeZeile2, @FixeZeile3, @Standort, @Art)"
        Else
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE AvisoTV SET FixeZeile1=@FixeZeile1, FixeZeile2=@FixeZeile2, FixeZeile3=@FixeZeile3 , Standort=@Standort , Art=@Art WHERE TVID = @TVID")
        End If
        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@FixeZeile1", d.FixeZeile1)
            cmd.Parameters.AddWithValue("@FixeZeile2", d.FixeZeile2)
            cmd.Parameters.AddWithValue("@FixeZeile3", d.FixeZeile3)
            cmd.Parameters.AddWithValue("@Standort", d.Standort)
            cmd.Parameters.AddWithValue("@Art", d.Art)
            cmd.Parameters.AddWithValue("@TVID", d.TVID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern AvisoTV")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub LöschenAvisoTV(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM AvisoTV WHERE TVID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("AvisoTV-Eintrag kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub


End Class

Public Class cOption
    Property OptionID As Long
    Property eMail_Ankunft_Betreff As String
    Property eMail_Ankunft_Text As String
    Property eMail_Freigabe_Betreff As String
    Property eMail_Freigabe_Text As String
    Property eMail_Status_Text As String
    Property eMail_Status_Betreff As String
End Class

Public Class cOptionenDAL

    Public Function LesenOptionen(hID As Integer, hSQL As String) As cOption
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If hID > 0 Then
            sql = String.Format("SELECT * FROM Optionen WHERE OptionID = {0}", hID)
        Else
            sql = hSQL
        End If
        Dim daten As cOption = Nothing
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    daten = New cOption()
                    daten.OptionID = VarToInt(dr.Item("OptionID"))
                    daten.eMail_Ankunft_Betreff = VarToStr(dr.Item("eMail_Ankunft_Betreff"))
                    daten.eMail_Ankunft_Text = VarToStr(dr.Item("eMail_Ankunft_Text"))
                    daten.eMail_Freigabe_Betreff = VarToStr(dr.Item("eMail_Freigabe_Betreff"))
                    daten.eMail_Freigabe_Text = VarToStr(dr.Item("eMail_Freigabe_Text"))
                    daten.eMail_Status_Betreff = VarToStr(dr.Item("eMail_Status_Betreff"))
                    daten.eMail_Status_Text = VarToStr(dr.Item("eMail_Status_Text"))
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return daten
    End Function



    Public Function setAVISOFromPcName() As Integer
        Dim zeilen As Integer = 0
        Dim sql = String.Format(
                    " UPDATE Aviso SET LetzterMitarbeiter = @LetzterMitarbeiter, LetzterMitarbeiterId = @LetzterMitarbeiterId " &
                    " WHERE Status IN (" & cGlobal.Status_Ankunft & ")  AND LetzterMitarbeiter like '%/" & cAllgemein.USRNAME.ToString & "' " &
                    " AND LetzterMitarbeiterId NOT LIKE @LetzterMitarbeiterId")
        ' MsgBox(sql)
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            ' cmd.Parameters.AddWithValue("@LetzterMitarbeiter", cGlobal.AktiverMitarbeiter.Mitarbeiter & "/" & cAllgemein.USRNAME.ToString)
            cmd.Parameters.AddWithValue("@LetzterMitarbeiter", cGlobal.AktiverMitarbeiter.Mitarbeiter)
            cmd.Parameters.AddWithValue("@LetzterMitarbeiterId", cGlobal.AktiverMitarbeiter.MitarbeiterID)
            Try
                zeilen = cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler bei setAVISOFromPcName")
            End Try
        End Using
        conn.Close()
        Return zeilen
    End Function



    Public Sub SpeichernOptionen(ByVal d As cOption)
        Dim hAuswahl As String
        If d.OptionID = 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO Optionen " &
                       "(eMail_Ankunft_Betreff, eMail_Ankunft_Text, eMail_Freigabe_Betreff, eMail_Freigabe_Text) VALUES (@eMail_Ankunft_Betreff, @eMail_Ankunft_Text, @eMail_Freigabe_Betreff, @eMail_Freigabe_Text)"
        Else
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE Optionen SET eMail_Ankunft_Betreff=@eMail_Ankunft_Betreff, eMail_Ankunft_Text=@eMail_Ankunft_Text, eMail_Freigabe_Betreff=@eMail_Freigabe_Betreff, eMail_Freigabe_Text=@eMail_Freigabe_Text WHERE OptionID = @OptionID")
        End If
        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@eMail_Ankunft_Betreff", d.eMail_Ankunft_Betreff)
            cmd.Parameters.AddWithValue("@eMail_Ankunft_Text", d.eMail_Ankunft_Text)
            cmd.Parameters.AddWithValue("@eMail_Freigabe_Betreff", d.eMail_Freigabe_Betreff)
            cmd.Parameters.AddWithValue("@eMail_Freigabe_Text", d.eMail_Freigabe_Text)
            cmd.Parameters.AddWithValue("@OptionID", d.OptionID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Optionen können nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Optionen")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub LöschenOptionen(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM Optionen WHERE TVID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Optionen-Eintrag kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub


End Class

Public Class cStandort
    Property StandortID As Integer
    Property Standort As String
    Property Standort_Text As String
    Property Info As String
    Property eMail_Ankunft_Betreff As String
    Property eMail_Ankunft_Text As String
    Property eMail_Freigabe_Betreff As String
    Property eMail_Freigabe_Text As String

    Property eMail_Zollbeleg_Betreff As String
    Property eMail_Zollbeleg_Text As String
    Property eMail_Status_Betreff As String
    Property eMail_Status_Text As String
End Class

Public Class cStandorteDAL

    Public Function LesenStandort(hID As Integer, hStandort As String, hSQL As String) As cStandort
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If hID > 0 Then
            sql = String.Format("SELECT * FROM Standorte WHERE StandortID = {0}", hID)
        ElseIf hStandort <> "" Then
            sql = String.Format("SELECT * FROM Standorte WHERE Standort = '" & hStandort.Trim & "' and FIRMA ='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "'")
        Else
            sql = hSQL
        End If

        Dim daten As cStandort = Nothing
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()

        Using cmd As New SqlCommand(sql, conn)
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    dr.Read()
                    daten = New cStandort()
                    daten.StandortID = VarToInt(dr.Item("StandortID"))
                    daten.Standort = VarToStr(dr.Item("Standort"))
                    daten.Standort_Text = VarToStr(dr.Item("Standort_Text"))
                    daten.Info = VarToStr(dr.Item("Info"))
                    daten.eMail_Ankunft_Betreff = VarToStr(dr.Item("eMail_Ankunft_Betreff"))
                    daten.eMail_Ankunft_Text = VarToStr(dr.Item("eMail_Ankunft_Text"))
                    daten.eMail_Freigabe_Betreff = VarToStr(dr.Item("eMail_Freigabe_Betreff"))
                    daten.eMail_Freigabe_Text = VarToStr(dr.Item("eMail_Freigabe_Text"))
                    daten.eMail_Zollbeleg_Betreff = VarToStr(dr.Item("eMail_Zollbeleg_Betreff"))
                    daten.eMail_Zollbeleg_Text = VarToStr(dr.Item("eMail_Zollbeleg_Text"))
                    daten.eMail_Status_Betreff = VarToStr(dr.Item("eMail_Status_Betreff"))
                    daten.eMail_Status_Text = VarToStr(dr.Item("eMail_Status_Text"))
                End If
                dr.Close()
            End Using
        End Using
        conn.Close()
        Return daten
    End Function

    Public Function Anzeigen_Standorte(hSQL As String) As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try
                Dim myTable = New DataTable()
                'Dim sql As String
                'sql = hSQL

                Using cmd As New SqlCommand(hSQL, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_Standorte'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
            conn.Close()
        End While

        Return Nothing
    End Function

    Public Function Anzeigen_cboStandorte() As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
            Try
                Dim myTable = New DataTable()
                Dim sql As String

                sql = "SELECT StandortID, Standort FROM Standorte ORDER BY Standort"

                Using cmd As New SqlCommand(sql, conn)
                    Using dr As SqlDataReader = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'Anzeigen_cboStandort'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
            conn.Close()
        End While

        Return Nothing
    End Function

    Public Sub SpeichernStandort(ByVal d As cStandort)
        Dim hAuswahl As String
        If d.StandortID = 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO Standorte " &
                       "(Standort, Standort_Text, Info, eMail_Ankunft_Betreff, eMail_Ankunft_Text, eMail_Freigabe_Betreff, eMail_Freigabe_Text,eMail_Zollbeleg_Betreff,eMail_Zollbeleg_Text,eMail_Status_Betreff,eMail_Status_Text) VALUES (" &
                       "@Standort, @Standort_Text, @Info, @eMail_Ankunft_Betreff, @eMail_Ankunft_Text, @eMail_Freigabe_Betreff, @eMail_Freigabe_Text,@eMail_Zollbeleg_Betreff,@eMail_Zollbeleg_Text,@eMail_Status_Betreff,@eMail_Status_Text)"
        Else
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE Standorte SET Standort = @Standort, Standort_Text=@Standort_Text, Info=@Info, eMail_Ankunft_Betreff=@eMail_Ankunft_Betreff, eMail_Ankunft_Text=@eMail_Ankunft_Text, eMail_Freigabe_Betreff=@eMail_Freigabe_Betreff, eMail_Freigabe_Text=@eMail_Freigabe_Text , eMail_Zollbeleg_Betreff=@eMail_Zollbeleg_Betreff , eMail_Zollbeleg_Text=@eMail_Zollbeleg_Text,eMail_Status_Betreff=@eMail_Status_Betreff,eMail_Status_Text=@eMail_Status_Text  " &
                       "WHERE StandortID = @StandortID")
        End If
        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Standort", d.Standort)
            cmd.Parameters.AddWithValue("@Standort_Text", d.Standort_Text)
            cmd.Parameters.AddWithValue("@Info", d.Info)
            cmd.Parameters.AddWithValue("@eMail_Ankunft_Betreff", d.eMail_Ankunft_Betreff)
            cmd.Parameters.AddWithValue("@eMail_Ankunft_Text", d.eMail_Ankunft_Text)
            cmd.Parameters.AddWithValue("@eMail_Freigabe_Betreff", d.eMail_Freigabe_Betreff)
            cmd.Parameters.AddWithValue("@eMail_Freigabe_Text", d.eMail_Freigabe_Text)
            cmd.Parameters.AddWithValue("@eMail_Zollbeleg_Betreff", d.eMail_Zollbeleg_Betreff)
            cmd.Parameters.AddWithValue("@eMail_Zollbeleg_Text", d.eMail_Zollbeleg_Text)
            cmd.Parameters.AddWithValue("@eMail_Status_Betreff", d.eMail_Status_Betreff)
            cmd.Parameters.AddWithValue("@eMail_Status_Text", d.eMail_Status_Text)
            cmd.Parameters.AddWithValue("@StandortID", d.StandortID)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Standort")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub LöschenStandort(ByVal hID As Integer)
        Dim sql = String.Format("DELETE FROM Standorte WHERE StandortID = {0}", hID)

        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Standort kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
            End Try
        End Using
        conn.Close()
    End Sub

End Class


Public Class Statistik
    Public Function getKunden(hSQL As String) As DataTable
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Try
            Dim myTable = New DataTable()
            'Dim sql As String
            'sql = hSQL
            Using cmd As New SqlCommand(hSQL, conn)
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    myTable.Load(dr)
                    dr.Close()
                End Using
            End Using
            Return myTable  'While Schleife wird hier verlassen
        Catch ex As Exception
            Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                          "Problem in Function 'getKunden'")
            If antwort <> MsgBoxResult.Retry Then
                'Programm wird beendet
                MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                Environment.Exit(0)
            End If
        End Try
        conn.Close()
        ' End While
        Return Nothing
    End Function


    Public Function getAVG(ByVal datumVon As DateTime, ByVal datumBis As DateTime, ByVal DauerVon As String, ByVal DauerBis As String) As Long
        If DauerVon = "" Then DauerBis = "0"
        If DauerBis = "" Then DauerBis = "999999"
        Dim sql As String = "SELECT avg(Dauer) " &
                     " FROM Aviso WHERE ( Datum BETWEEN '" & datumVon.ToShortDateString & "' AND '" & datumBis.ToShortDateString & "') AND ( Dauer BETWEEN  '" & DauerVon & "' AND '" & DauerBis & "') AND Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' "
        ' Dim sql As String = "SELECT * " &
        '             " FROM Aviso"
        '  MsgBox(sql)
        '  Dim daten As New List(Of cEntry)
        Dim dr As SqlDataReader
        'Using conn As SqlConnection = cDatenbank.GetNewOpenConnection()
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()

        '  MsgBox(conn.ConnectionString)
        Using cmd As New SqlCommand(sql, conn)
            dr = cmd.ExecuteReader()
            Try
                Dim cnt As Integer = 0
                If dr.Read Then
                    If Not dr.GetValue(0) Is DBNull.Value Then
                        Return CLng(dr.GetValue(0))
                    End If
                End If
                conn.Close()
                Return 0
            Catch ex As Exception
                MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Fehler mit der Datenbankverbindung:" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Datenbankfehler")
            Finally
                dr.Close()
            End Try
            'end Using
        End Using
        Return -1
    End Function

    Public Function getAVGMa(ByVal datumVon As DateTime, ByVal datumBis As DateTime, ByVal DauerVon As String, ByVal DauerBis As String) As List(Of listMaAVG)
        If DauerVon = "" Then DauerBis = "0"
        If DauerBis = "" Then DauerBis = "999999"
        Dim sql As String = "SELECT LetzterMitarbeiterId,avg(Dauer) as avg,mit_nname + ' ' + mit_vname as name, count([LetzterMitarbeiterId]) as count " &
                     " FROM Aviso INNER JOIN ADMIN.dbo.tblMitarbeiter ON mit_id=LetzterMitarbeiterId  WHERE ( Datum BETWEEN '" & datumVon.ToShortDateString & "' AND '" & datumBis.ToShortDateString & "') AND ( Dauer BETWEEN  '" & DauerVon & "' AND '" & DauerBis & "')  AND Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' GROUP BY LetzterMitarbeiterId,mit_nname,mit_vname"
        Dim dr As SqlDataReader

        Dim ll As New List(Of listMaAVG)
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            dr = cmd.ExecuteReader()
            Try
                Dim cnt As Integer = 0
                If dr.HasRows Then
                    While dr.Read
                        If Not dr.Item("LetzterMitarbeiterId") Is DBNull.Value Then
                            Dim l As New listMaAVG
                            l.mit_id = CInt(dr.Item("LetzterMitarbeiterId"))
                            l.mit_name = CStr(dr.Item("name"))
                            l.mit_avg = CInt(dr.Item("avg"))
                            l.mit_count = CInt(dr.Item("count"))
                            ll.Add(l)
                        End If
                    End While
                    Return ll
                End If
                conn.Close()
            Catch ex As Exception
                MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Fehler mit der Datenbankverbindung:" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Datenbankfehler")
            Finally
                dr.Close()
            End Try
            'end Using
        End Using
        Return Nothing
    End Function

End Class

Public Class StatDB
    Public Function getAnzahlLkwAnkunft(art As String, ByVal datTmp As Date, i As Integer, firma As String, CLUSTER As String) As Integer
        Dim lkws As Integer = 0
        Try
            Dim cn As New SqlConnection()
            '  cn.ConnectionString = "Data Source=BUCHHALTUNG\SQLEXPRESS;Initial Catalog=AVISO;Integrated Security=false;User ID=sa;Password=BmWr501956;"
            '  cn.Open()
            cn = cDatenbankAVISO.GetNewOpenConnection()
            Using cmd As New SqlCommand("SELECT COUNT(*)  FROM [Aviso]  where  " & art & " between @DatVon and @DatBis " & If(firma <> "", " AND Firma='" & firma & "' ", "") & If(CLUSTER <> "", " AND CLUSTER='" & CLUSTER & "' ", "") & " ", cn)
                'DATEADD(dd, 0, DATEDIFF(dd, 0, [Ankunft]))=DATEADD(dd, 0, DATEDIFF(dd, 0, [Freigabe])) AND
                Dim VonStr = ""
                Dim BisStr = ""
                If i = 6 Then
                    VonStr = datTmp.ToString("yyyy-MM-dd ") & "00:00:00"
                Else
                    VonStr = datTmp.ToString("yyyy-MM-dd ") & i & ":00:00"
                End If

                If i = 22 Then
                    BisStr = datTmp.ToString("yyyy-MM-dd ") & "23:59:59"
                Else
                    BisStr = datTmp.ToString("yyyy-MM-dd ") & i & ":59:59"
                End If

                cmd.Parameters.AddWithValue("@DatVon", VonStr)
                cmd.Parameters.AddWithValue("@DatBis", BisStr)
                '  MsgBox(VonStr)
                Dim dr = cmd.ExecuteReader()

                If dr.HasRows Then
                    dr.Read()
                    lkws = CInt(dr.Item(0))
                End If
                dr.Close()
                cn.Close()
            End Using
            Return lkws
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return 0
    End Function

    Public Function getAnzahlLkwAnkunft(art As String, ByVal datTmp As Date, firma As String) As Integer
        Dim lkws As Integer = 0
        Try
            Dim cn As New SqlConnection()
            '  cn.ConnectionString = "Data Source=BUCHHALTUNG\SQLEXPRESS;Initial Catalog=AVISO;Integrated Security=false;User ID=sa;Password=BmWr501956;"
            '  cn.Open()
            cn = cDatenbankAVISO.GetNewOpenConnection()
            Using cmd As New SqlCommand("SELECT COUNT(*)  FROM [Aviso]  where  " & art & " between @DatVon and @DatBis  AND Firma='" & If(firma <> "", firma, VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA) & "' ", cn)
                'DATEADD(dd, 0, DATEDIFF(dd, 0, [Ankunft]))=DATEADD(dd, 0, DATEDIFF(dd, 0, [Freigabe])) AND
                Dim VonStr = ""
                Dim BisStr = ""

                VonStr = datTmp.ToString("yyyy-MM-dd ") & "00:00:00"
                BisStr = datTmp.ToString("yyyy-MM-dd ") & "23:59:59"


                cmd.Parameters.AddWithValue("@DatVon", VonStr)
                cmd.Parameters.AddWithValue("@DatBis", BisStr)
                '  MsgBox(VonStr)
                Dim dr = cmd.ExecuteReader()

                If dr.HasRows Then
                    dr.Read()
                    lkws = CInt(dr.Item(0))
                End If
                dr.Close()
                cn.Close()
            End Using
            Return lkws
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return 0
    End Function

    Public Function getAnzahlLkwDauer(ByVal datumVon As DateTime, ByVal datumBis As DateTime, ByVal DauerVon As String, ByVal DauerBis As String, ByVal DauerEinschrVon As String, ByVal DauerEinschrBis As String, Optional where As String = "") As Integer
        Dim sql As String = "SELECT count(*) as count " &
                     " FROM Aviso  WHERE ( Datum BETWEEN '" & datumVon.ToShortDateString & "' AND '" & datumBis.ToShortDateString & "') AND ( Dauer BETWEEN  '" & DauerVon & "' AND '" & DauerBis & "') AND ( Dauer BETWEEN  '" & DauerEinschrVon & "' AND '" & DauerEinschrBis & "')  AND Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' " & where
        Dim dr As SqlDataReader
        'MsgBox(sql)
        Dim anz As Integer = 0
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            dr = cmd.ExecuteReader()
            Try
                Dim cnt As Integer = 0
                If dr.HasRows Then
                    dr.Read()
                    anz = CInt(dr.Item(0))
                End If
                conn.Close()
                Return anz
            Catch ex As Exception
                MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Fehler mit der Datenbankverbindung:" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Datenbankfehler")
            Finally
                dr.Close()
            End Try
            'end Using
        End Using
        Return 0
    End Function

    Public Function getAnzahlAvisoProbleme(ByVal kdNr As String, ByVal datumVon As DateTime, ByVal datumBis As DateTime, ByVal DauerVon As String, ByVal DauerBis As String, Optional where As String = "") As List(Of listStatAvisoProleme)
        'ZWEICHFACE SELECT, um Doppelte Einträge mit selber AvisoId zu umgehen
        Dim sql As String = " SELECT VermerkeCode,[Bezeichnung], count(*) as anzahlVermerk " &
                            " FROM " &
                                " (SELECT aviso.avisoid, VermerkeCode,[Bezeichnung] " &
                                        " FROM [AVISO].[dbo].[Vermerke] " &
                                        " INNER JOIN [Aviso] ON [Vermerke].[AvisoID]=[AVISO].[AvisoID] " &
                                        " INNER JOIN [AVISO].[dbo].[VermerkeCodes] ON VermerkeCode=VermerkCodeId " &
                                        " where  AVISO.Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' AND /*([Auftraggeber_KdNr] = @kdNr) " &
                                        " AND */ ( Aviso.Datum BETWEEN @datumVon AND @datumBis) AND ( Aviso.Dauer BETWEEN @DauerVon AND @DauerBis )  " & where &
                                  " group by aviso.avisoid,VermerkeCode,[Bezeichnung] " &
                                " ) AS tbl  " &
                            " WHERE VermerkeCode IN (1,3,5,7,9,11,13,15,16,25) " &
                            " group by VermerkeCode,[Bezeichnung] " &
                            " ORDER BY anzahlVermerk DESC "

        Dim dr As SqlDataReader
        Dim data As New List(Of listStatAvisoProleme)
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@kdNr", kdNr)
            cmd.Parameters.AddWithValue("@datumVon", datumVon.ToShortDateString)
            cmd.Parameters.AddWithValue("@datumBis", datumBis.ToShortDateString)
            cmd.Parameters.AddWithValue("@DauerVon", DauerVon)
            cmd.Parameters.AddWithValue("@DauerBis", DauerBis)
            'cmd.Parameters.AddWithValue("@DauerEinschrVon", DauerEinschrVon)
            'cmd.Parameters.AddWithValue("@DauerEinschrBis", DauerEinschrBis)
            dr = cmd.ExecuteReader()
            Try
                Dim cnt As Integer = 0
                While dr.Read()
                    Dim d As New listStatAvisoProleme
                    d.VermerkeCode = CInt(dr.Item("VermerkeCode"))
                    d.Bezeichnung = CStr(dr.Item("Bezeichnung"))
                    d.AnzahlVermerke = CInt(dr.Item("anzahlVermerk"))
                    data.Add(d)
                End While
                conn.Close()
            Catch ex As Exception
                MsgBox(System.Reflection.MethodInfo.GetCurrentMethod.Name & ": Fehler mit der Datenbankverbindung:" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Datenbankfehler")
            Finally
                dr.Close()
            End Try
            'end Using
        End Using
        Return data
    End Function





End Class
Public Class adminfunc
    Public Function getDatatable(connstr As String, hSQL As String) As DataTable
        Dim conn As SqlConnection = Nothing
        Try
            conn = New SqlConnection(connstr)
            conn.Open()
            Dim myTable = New DataTable()
            'Dim sql As String
            'sql = hSQL
            Using cmd As New SqlCommand(hSQL, conn)
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    myTable.Load(dr)
                    dr.Close()
                End Using
            End Using
            Return myTable  'While Schleife wird hier verlassen
        Catch ex As Exception
            Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                          "Problem in Function 'getKunden'")
            If antwort <> MsgBoxResult.Retry Then
                'Programm wird beendet
                MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                Environment.Exit(0)
            End If
        End Try
        conn.Close()
        ' End While
        Return Nothing
    End Function



    Public Sub setAuftraggber(ByVal Auftraggeber As String, ByVal Auftraggeber_KdNr As String)
        Dim hAuswahl As String

        hAuswahl = String.Format(
                    "UPDATE Aviso SET [Auftraggeber_KdNr] = @Auftraggeber_KdNr " &
                    "WHERE [Auftraggeber] = @Auftraggeber")

        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Auftraggeber", Auftraggeber)
            cmd.Parameters.AddWithValue("@Auftraggeber_KdNr", Auftraggeber_KdNr)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Firma")
            End Try
        End Using
        conn.Close()
    End Sub

    Public Sub setFirmenKdNr(ByVal Firma As String, ByVal KundenNr As String)
        Dim sql = "UPDATE Firmen SET KundenNr = @KundenNr " &
                    "WHERE [Firma] like @Firma "

        '     MsgBox("UPDATE Firmen SET KundenNr = '" & KundenNr & "' " &
        '              "WHERE [Firma] like '" & Firma & "' ")
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Firma", Firma)
            cmd.Parameters.AddWithValue("@KundenNr", KundenNr)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Firma")
            End Try
        End Using
        conn.Close()
    End Sub


    Public Sub setFraechter(ByVal Frächter As String, ByVal Frächter_KdNr As String)
        Dim hAuswahl As String

        hAuswahl = String.Format(
                    "UPDATE Aviso SET [Frächter_KdNr] = @Frächter_KdNr " &
                    "WHERE [Frächter] = @Frächter")

        Dim sql = hAuswahl
        Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnection()
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("@Frächter", Frächter)
            cmd.Parameters.AddWithValue("@Frächter_KdNr", Frächter_KdNr)
            Try
                cmd.ExecuteNonQuery()
            Catch ex As SqlException
                MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Firma")
            End Try
        End Using
        conn.Close()
    End Sub


End Class