BBASIC Help-Funktionen
APP- Entwicklung

Eine Muster APP - die die grundlegenen Konzepte und die Einfachheit zeigt.

Es soll eine Abo-Verwaltung programmiert werden. Abonenten sollen automatisch Rechnungen bekommen und selbstverständlich automatisch in die FiBu erfasst werden. Kunden die Einzugsermächtigung gegeben haben sollen automatisch per SEPA-Lastschrift abgebucht werden.

ABOs sollen bestimmte Artikel sein - also zB. der Artikel in der Artikelverwaltung "Programmwartung BBasic" oder der Artikel "Newsletter richtig investieren". MwSt- und alle anderen Einstelltungen werden insofern in der Artikelverwaltung für den Artikel deklariert.

 

    '*****************
    'Einbindung in das Menu-System
    Sub InitMenu()
        Dim x As system.Windows.Forms.ToolstripMenuItem
        x = bbsys.Mainform.GenMenu("", "abo", "Aboverwaltung", "") 'Neues Hauptmenu
        x = bbsys.Mainform.GenMenu("abo", "abo/sel", "Abos Selektieren", "") 'Neues Untermenu
        x = bbsys.Mainform.GenMenu("abo", "abo/buchen", "Abos buchen", "")
        'So ändert man Menu-Einträge
        x.ForeColor = Drawing.Color.Blue
        x = bbsys.Mainform.GenMenu("abo", "abo/liste", "Abos auflisten", "")
    End Sub
    Private Sub bbsys_BBSysMenuClick(ByRef a As String, ByRef x As Form) Handles bbsys.MenuClick
        'Diese Funktion ist wichtig,
        'sie wird aufgerufen wenn ein Menu-Eintrag angeclickt wird.
        Select Case a$
            Case "abo/liste"
                Call aboliste
            Case "abo/sel"
                Call aboselect()
            Case "abo/buchen"
                Call abobuchen
            Case Else
        End Select
    End Sub
    '*****************
    'Ende: Einbindung in das Menu-System
   Sub aboliste()
        Dim rs As New BBRecordset
        If Not (bbsys.Rechte_TestUserRecht("ABOS/LIST/")) Then Exit Sub 
        Dim druck As Drucker
        druck = bbsys.DruckInitUndStart("Liste der Abos", "", 0, Class_bbsys.DruckerFlag.Druck_Normaleausgabe, Class_bbsys.ListAusgabe.ListAusgabe_AnwenderFragen)
        druck.SetSchrift("SmallFont", 7)
        druck.ZeileDrucken("unabhängig von der möglichen Buchungsperiode")
        druck.ZeileDrucken("")
        druck.TabelleStart("<1900|<3200|>1000|>1800|>2500", "Abo|Kunde|Abo-Preis|Periode|Bemerk")
        Dim Artikel As New DataClass.Merchandise(bbsys)
        Dim kunde As New DataClass.Customer(bbsys)
        Dim sqlx$ = "SELECT * from " + bbsys.MySqlMandant + ".abos order by pointertoartikel, pointertokunde"
        Dim ianr% = 0
        Dim anzabos% = 0
        bbsys.SqlSelect(rs, sqlx$)
        While Not (rs.EOF)
            If ianr <> rs.GetInteger("Pointertoartikel") Then
                If anzabos% > 0 Then
                    druck.TabelleBunt("" + "|Summe Abos" + str(anzabos) + "|" + "" + "|" + Artikel.Name + "|", Drucker.TabellenFarbe.TABF_Normal)
                End If
                ianr% = rs.GetInteger("Pointertoartikel")
                Artikel.Load(ianr)
                anzabos = 0
                druck.TabelleBunt(Artikel.Name + "|" + "" + "|" + "" + "|" + "" + "|", Drucker.TabellenFarbe.TABF_Grau)
            End If
            kunde.Load(rs.GetInteger("Pointertokunde"))
            anzabos = anzabos + 1
            'abo_Preis# = Local.FormatierteZahl(rs.Fields("Preis"))
            druck.TabelleBunt("" + "|" + kunde.Konto.AccountingUniqueID + " " + kunde.Adress.Name + "|" + FormatierteZahl(rs.GetDouble("Preis")) + "|" + rs.GetString("abgerechnetbis") + "|" + rs.GetString("bemerkung"), Drucker.TabellenFarbe.TABF_Normal)
            rs.MoveNext()
        End While
        If anzabos > 0 Then
            druck.TabelleBunt("" + "|Summe Abos" + str(anzabos) + "|" + "" + "|" + Artikel.Name + "|", Drucker.TabellenFarbe.TABF_Grau)
        End If
        rs.CloseRecordset()
        druck.Endprint()
    End Sub

 

 

Die komplette APP im Quellcode

Muster APP Aboverwaltung
Copy Code
Imports System.ComponentModel.Composition
Imports BBasic
Imports BBHelper.Helper
Imports BBHelper
Imports System.Windows.Forms
Imports BBasic.DataClass
<Export(GetType(BBasic.IPlugin))>
Public Class MeinPlugin
    Implements BBasic.IPlugin

    '**********************************************
    '*** Hier muss nichts geaendert werden     ****
    '**********************************************
#Region "Daten des Plugins"
    '**********************************************
    '*** Hier muss nichts geaendert werden     ****
    '**********************************************
    '
    'Diese Funktion bezeichnet die Plugin-Funktion >> Plugin-Version
    Public Function PluginVersion() As String Implements BBasic.IPlugin.PluginVersion
        Dim v$, d$
        v$ = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()
        d$ = System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToShortDateString()
        Return ("VER/" + Me.PluginName + ":" + v$ + "." + d$)
    End Function
    '>>>>Funktion Plugin Version
    Public Function PluginVersionDate() As Date Implements BBasic.IPlugin.PluginVersionDate
        'Diese Funktion ist wichtig, weil Endkunden die Lizenz gegeben werden kann Updates bis .... zu installieren.
        Return (_PluginVersionDatum)
    End Function

#End Region
#Region "Programmteile zu Pluginverwaltung"
    '**********************************************
    '*** Hier muss nichts geaendert werden     ****
    '**********************************************
    '
    Dim WithEvents bbsys As BBasic.Class_bbsys
    Dim lizenzdaten As BBasic.Class_PluginLizenz
    'Diese Funktion wird von BBasic zum Initialisieren aufgerufen
    Public Function Start(ByRef b As BBasic.Class_bbsys) As Boolean Implements BBasic.IPlugin.Start
        bbsys = b
        '---------------------------------------------------------------------------       
        'Ist die Datenbank aktuell? ggf Abgleich mit Referenzdatenbank
        if _PluginReferenzDatenbank_Server <>"" Then
            CheckIfDbSyncIsNecessary()
        End If
        '---------------------------------------------------------------------------
        If Not (PluginTestLizenz()) Then
            'Das Programm soll ohne Lizenz nicht starten
            MsgBox("Plugin Lizenz nicht vorhanden:" + _PluginName)
            Return (False)
            Exit Function
        End If
        'Hier werden die vom Programmentwickler des Plugins
        'vorgesehenen Initialisierungen vorgenommen
        Call InitMenu()
        Return (True)
    End Function

    '>>>>Funktion LICENESE
    Public Function PluginVerifyLicenseHash(a As String) As Integer Implements BBasic.IPlugin.PluginVerifyLicenseHash
        'Diese Funktion ist wichtig, damit der Lizenzcode nicht von anderen Entwicklern kopiert werden kann
        Return (HashWert(a + _PluginVerifyCode))
    End Function
    'Diese Funktion implementiert die Hash-Function um Lizenzen zu sichern
    Function HashWert(a_str$) As Integer
        Dim nr_lng% = 0
        Dim i_lng% = 1
        Dim t_int%
        Dim laenge_lng% = 1000003
        For t_int% = 1 To Len(a_str$)
            nr_lng% = ((nr_lng% * 256) + Asc(Mid$(a_str$, t_int%, 1))) Mod laenge_lng%
        Next
        Return (nr_lng%)
    End Function
    'Diese Funktion implementiert die Plugin-Funktion >> Plugin-Name
    Public Function PluginName() As String Implements BBasic.IPlugin.PluginName
        Return (_PluginName)
    End Function
    'Diese Funktion implementiert die Lizenz des Nutzers R.Schnurr
    Public Function PluginAuthor() As String Implements BBasic.IPlugin.PluginAuthor
        Return (_PluginLizenz)
    End Function

    Public Function EndkundenLizenzEMail() As String Implements IPlugin.EndkundenLizenzEMail
        If IsNothing(lizenzdaten) Then
            PluginTestLizenz()
        End If
        If IsNothing(lizenzdaten) Then
            Return ("Keine Lizenz")
        Else
            Return (lizenzdaten.KundeEMail)
        End If
    End Function

    Function PluginTestLizenz() As Boolean
        'Lizenz Testen
        If _PluginName = "Muster" Then
            'Keine Lizenz nötig
            Return (True)
            Exit Function
        End If

        'Die Lizenzdaten sollen in der Config gespeichert werden
        Dim a$, b$, z%
        z% = 0
        Do
            z% = z% + 1
            'Teilstring lesen
            b$ = bbsys.Config_ConfigurationSQL("LIZ/" + Me.PluginName + "/" + Trim(str(z%)))
            If b$ <> "" Then 'Teilstring an bestehenden String anhängen
                a$ = a$ + b$
            End If
        Loop Until b$ = "" 'Solange Teilstrings lesen bis kein Ergebnis mehr zurückgegeben wird
        If a$ = "" Then 'Wenn kein Lizenzstring hinterlegt ist
            a$ = InputBox("Lizenz", Me.PluginName) 'Lizenz-String abfragen
            b$ = a$
            z% = 0
            While Len(b$) > 0
                z% = z% + 1 'In Teilstrings a 200 Byte aufsplitten und speichern
                bbsys.Config_ConfigurationSQLSet("LIZ/" + Me.PluginName + "/" + Trim(Str(z%)), Left(b$, 200))
                b$ = Trim(Mid$(b$, 201, 9999))
            End While
        End If

        lizenzdaten = bbsys.Liz_GiveData(a$)
        If lizenzdaten.KundeEMail = "" Then 'Ungültige Lizenz löschen
            bbsys.Config_ConfigurationSQLSet("LIZ/" + Me.PluginName + "/1", "")
            Return (False)
            Exit Function
        End If
        If lizenzdaten.PluginName <> _PluginName Then 'Ungültige Lizenz löschen
            bbsys.Config_ConfigurationSQLSet("LIZ/" + Me.PluginName + "/1", "")
            Return (False)
            Exit Function
        End If
        'Sinnvoll: Lizenz anzeigen
        bbsys.Mainform.GenMenu("prog/lizenz", "prog/lizenz/" + Me.PluginName, "Lizenz " + Me.PluginName, lizenzdaten.KundeEMail + " " + lizenzdaten.User1)
        Return True
    End Function
#End Region
#Region "Programm zum SQL Datenabgleich mit Referenzdatenbank"
    '**********************************************
    '*** Hier muss nichts geaendert werden     ****
    '**********************************************
    '
    '>Zur Kopie in andere Plugnis
    Function CheckIfDbSyncIsNecessary() As Boolean
        ' Test auf Übereinstimmung der aktuellen BBasic Programm-Version / Benutzer ist Entwickler
        ' mit der in Tab config abgelegten Versionsnummer (wird dort nach erfolgter Syncronisation gespeichert)
        ' Return: false - Syncr. nicht nötig / true - Sync. notend whileig (Versionsnummern verschieden)
        ' TSchnurr 30.9.14
        Dim strVersion_BB As String = PluginVersion()
        Dim strVersion_SQL As String = bbsys.Config_ConfigurationSQL ("VER/" + Me.PluginName)
        If strVersion_BB = strVersion_SQL Or bbsys.IsDeveloper() Then
            Return False
        Else
            Dim x As New BBasic.SQLRemoteSync
            x.sqlsync(bbsys, _PluginReferenzDatenbank_Server, _PluginReferenzDatenbank_User, _PluginReferenzDatenbank_Password, _PluginReferenzDatenbank_Port, _PluginReferenzDatenbank_Database)
            bbsys.Config_ConfigurationSQLSet("VER/" + Me.PluginName, PluginVersion())
            Return True
        End If
    End Function
#End Region
    '**********************************************
    '*** Ab hier geht es los... Ihr Part!!!    ****
    '**********************************************
#Region "Lizenzdaten des Entwicklers"   
    'TODO Lizenzdaten die Sie von uns erhalten
    Dim _PluginVerifyCode As String = "ABXV1UEQ89"
    Dim _PluginName As String = "Muster"
    Dim _PluginEntwicklerName As String = "Oliver Fendt"
    Dim _PluginLizenz As String = "lgCAAMRgu5c08s8BjgBFbnR3aWNrbGVyTmFtZT1PbGl2ZXIgRmVuZHQjRU1haWw9b2xpdmVyQG9saXZlci1mZW5kdC5kZSNQbHVnaW5OYW1lPU11c3RlciNVUkw9aHR0cDovL3d3dy5iYmFzaWMuZGUjVmVyc2lvbj0wI0NWPTAjUmFuZG9tPUFCWFYxVUVRODkjPHNlcmlhbD49AQcpBsBhSaGGPZu9CPHgW6aBgIrCJzrquqBx1+aRT504IrZbnmUmj6+LSRKNKZoYoOsZE2T9Qs4CTeZn/3ar9OL0HP5rZ0EYvjAhMjRfk4Dk2mJRyZbL9UQCqRaQZZlIE9/Hzb00EVNGFHPPmS5dGhEANe+E+xyxkmuxpaYzFhN/Ukjky/Dd0spTA31jNsAFjB42hXdy5z3cuwW5xkJeUOkiQG3un9aCfrmGs6i3+9/nvXzc3FKcHwZzosT+wTzZzFlMf4HEW832VFQIYinIKVG5+2RJcCbuqEBFtDiC47msY2B1FyPVZrlQwe+db3iVVQuDACQwat7wXjWglVyTXMF3"
    Dim _PluginReferenzDatenbank_Server As String = "refdb.bbasic.de" 'Leer wenn kein Abgleich erfolgen soll
    Dim _PluginReferenzDatenbank_User As String = "referenz"
    Dim _PluginReferenzDatenbank_Password As String = "datenbank"
    Dim _PluginReferenzDatenbank_Port As String = "6612"
    Dim _PluginReferenzDatenbank_Database As String = "schnurrplugin"
    Dim _PluginVersionDatum As New Date(2022, 9, 13)

    'Diese Funktion implementiert die Plugin-Info-Funktion
    Public Function PluginInfo() As String Implements BBasic.IPlugin.PluginInfo
        Return ("Dies ist ein Testplugin.")
    End Function
#End Region
#Region "Variablen für das Plugin"
    'Dim WithEvents xxx As meine ErweiterungsDLL
#End Region
#Region "Einbindung in das bestehende Programm"
    'TODO Das Programm
    '*****************
    'Einbindung in das Menu-System
    Sub InitMenu()
        Dim x As system.Windows.Forms.ToolstripMenuItem
        x = bbsys.Mainform.GenMenu("", "abo", "Aboverwaltung", "")
        x = bbsys.Mainform.GenMenu("abo", "abo/sel", "Abos Selektieren", "")
        x = bbsys.Mainform.GenMenu("abo", "abo/buchen", "Abos buchen", "")
        'So ändert man Menu-Einträge
        x.ForeColor = Drawing.Color.Blue
        x = bbsys.Mainform.GenMenu("abo", "abo/liste", "Abos auflisten", "")
    End Sub
    Private Sub bbsys_BBSysMenuClick(ByRef a As String, ByRef x As Form) Handles bbsys.MenuClick
        'Diese Funktion ist wichtig,
        'sie wird aufgerufen wenn ein Menu-Eintrag angeclickt wird.
        Select Case a$
            Case "abo/liste"
                Call aboliste
            Case "abo/sel"
                Call aboselect()
            Case "abo/buchen"
                Call abobuchen
            Case Else
        End Select
    End Sub
    '*****************
    'Ende: Einbindung in das Menu-System
    '*****************
    'Einbindung in bestehende Formulare: Name herausfinden über MSGBOX oder DEBUG
    Private Sub bbsys_BBSysTextbildStartEingabe(tb As Class_Textbild, maxzeilen As Integer, ByRef formid As String) Handles bbsys.TextbildStartEingabe
        'Um unbekannte Funktionen herauszufinden
        'bbsys.XMsgBox(formid)
        Select Case formid
            Case "KDNEU"
                tb.fdef(11, "Abo")
            Case Else
        End Select
    End Sub

    Private Sub bbsys_BBSysStammdatenWeiter(tb As EingabeBild, id As Integer, funk As String, ftaste As Integer) Handles bbsys.StammdatenWeiter
        Select Case funk
            Case "KD"
                'Funtionstasten sind 11-22 =F1-F12 31-42=Shift-F1...
                If ftaste = 21 Then
                    Call abos(id)
                End If
            Case Else
        End Select
    End Sub
    '*****************
#End Region
#Region "Die eigenen Funktionen"

    Sub abos(PointerToKunde%)
        Dim rs As New BBRecordset
        Dim rs2 As New BBRecordset
        Dim kunde As New BBasic.DataClass.Customer(bbsys)
        kunde.Load(PointerToKunde)
aborestartaufbau:
        Dim tb2 As New BBasic.EingabeBild(bbsys)
        tb2.fdef(1, "Anlegen")
        tb2.edef("Kunde", kunde.Adress.Name, Class_bbsys.TextbildLaengen.TBL_Normal, "KUNDE", Class_bbsys.TextbildFlags.TBF_SperreKannAufgehobenWerden, 0)
        tb2.eedef("Abos", "SELECT abos.ID,artikel.name,abos.lmod,abos.startdatum,abos.enddatum from " + bbsys.MySqlMandant + ".artikel, " + bbsys.MySqlMandant + ".abos where abos.pointertokunde=" + Str(PointerToKunde) + " AND abos.pointertoartikel=artikel.id order by lmod desc", Class_bbsys.TextbildLaengen.TBL_SQLTabelle, "ABOS", 5, 2, 25, 45, Class_bbsys.TextbildFlags.TBF_Normal, 0)
        tb2.Eingabe("ABOX1")
        While tb2.ReturnCode < 0
            tb2.Wartebischen()
            If tb2.A_Event = Class_bbsys.TextbildEvent.A_Click Then
                Dim z% = tb2.A_Row
                Dim sp% = tb2.A_Col
                Dim m_id% = Val(tb2.TextbildTabelleGetWert(tb2.A_TabID, z%, 1))
                Dim pointerToAbo% = Val(tb2.TextbildTabelleGetWert(tb2.A_TabID, z%, 0))
                Dim merkm$ = tb2.TextbildTabelleGetWert(tb2.A_TabID, z%, 2)
                Dim todo% = bbsys.PopUpMenu("Abo/ändern/Abo löschen/")
                Select Case todo%
                    Case 1
                        Dim tb3 As New BBasic.EingabeBild(bbsys)
                        bbsys.SqlSelect(rs, "SELECT * from " + bbsys.MySqlMandant + ".abos where id=" + str(pointerToAbo%))
                        Dim artikel As New DataClass.Merchandise(bbsys)
                        artikel.Load(rs.GetInteger("Pointertoartikel"))
                        tb3.edef("Artikel", artikel.Name, Class_bbsys.TextbildLaengen.TBL_Lang, "ART", Class_bbsys.TextbildFlags.TBF_SperreKannAufgehobenWerden, 0)
                        tb3.edef("Von Datum", rs.GetBBDate("Startdatum").DatumStr, Class_bbsys.TextbildLaengen.TBL_Datum, "START")
                        tb3.edef("Bis Datum", rs.GetBBDate("Enddatum").DatumStr, Class_bbsys.TextbildLaengen.TBL_Datum, "END")
                        tb3.edef("Bemerkung", rs.GetString("bemerkung"), Class_bbsys.TextbildLaengen.TBL_Normal, "BEMERKUNG")
                        tb3.Eingabe("ABONEU")
                        While tb3.ReturnCode < 0
                            tb3.Wartebischen()
                        End While
                        If tb3.ReturnCode > 0 Then
                            tb3.Entfernen()
                            GoTo aborestartaufbau
                        End If
                        Dim vondatum As New BBDate
                        Dim bisdatum As New BBDate
                        vondatum.DatumStr = tb3.Text("START")
                        bisdatum.DatumStr = tb3.Text("END")
                        Dim sqlx$ = "UPDATE " + bbsys.MySqlMandant + ".abos LMOD=now(), pointertouser=" + Str(bbsys.AktiveUser_InterneUserNummer) + ", Enddatum=" + bisdatum.QSQLDT + ", Startdatum=" + vondatum.QSQLDT + " ,bemerkung=" + SQL.QSQLString(tb3.Text("BEMERKUNG")) + " where id=" + Str(pointerToAbo%)
                        bbsys.SQLExecuteW(sqlx$)
                        tb3.Entfernen()
                        GoTo aborestartaufbau
                    Case 2
                        If bbsys.WarteJaNein("ABO wirklich löschen", "NJ") = "J" Then
                            Dim sqlx$ = "DELETE from " + bbsys.MySqlMandant + ".abos where id=" + str(pointerToAbo%)
                            bbsys.SQLExecuteW(sqlx$)
                        End If
                        GoTo aborestartaufbau
                    Case Else
                End Select
            End If
        End While
        If tb2.ReturnCode = 11 Then 'F1=Neu anlegen
            Dim tb3 As New BBasic.EingabeBild(bbsys)
            Dim vondatum As New BBDate
            Dim bisdatum As New BBDate
            vondatum.SetToday()
            bisdatum.SetEndless()
            tb3.edef("Artikel", "", Class_bbsys.TextbildLaengen.TBL_Lang, "ARTIKEL")
            tb3.edef("Von Datum", vondatum.DatumStr, Class_bbsys.TextbildLaengen.TBL_Datum, "START")
            tb3.edef("Bis Datum", bisdatum.DatumStr, Class_bbsys.TextbildLaengen.TBL_Datum, "END")
            tb3.edef("Bemerkung", "", Class_bbsys.TextbildLaengen.TBL_Normal, "BEMERKUNG")
            tb3.Eingabe("ABONEU")
            While tb3.ReturnCode < 0
                tb3.Wartebischen()
            End While
            If tb3.ReturnCode > 0 Then
                tb3.Entfernen()
                GoTo aborestartaufbau
            End If
            Dim bbasic As New XBBMain(bbsys, "ABO Neu ist mein titel")
            Dim artid%, wgid%
            artid% = bbasic.ArtikelSuchen(tb3.Text("ARTIKEL"))
            vondatum.DatumStr = tb3.Text("START")
            bisdatum.DatumStr = tb3.Text("END")
            If artid% > 0 Then
                Dim sqlx$ = "INSERT INTO " + bbsys.MySqlMandant + ".abos set LMOD=now(), abgerechnetbis=now(), pointertouser=" +
                    Str(bbsys.AktiveUser_InterneUserNummer) + ", mandant=" + Str(bbsys.Setting.AktuellerMandant) +
                    ", Enddatum=" + bisdatum.QSQLDT + ", Startdatum=" + vondatum.QSQLDT + " , pointertokunde=" + Str(PointerToKunde%) + ", Pointertoartikel=" + Str(artid) + " ,bemerkung=" + SQL.QSQLString(tb3.Text("BEMERKUNG"))
                bbsys.SQLExecuteW(sqlx$)
            End If
            GoTo aborestartaufbau
        End If
        tb2.Entfernen()


    End Sub

    Sub aboselect()
        Dim rs As New BBRecordset

        Dim bbasic As New XBBMain(bbsys, "ABOSELECT")
        Dim aboid%
        aboid = bbasic.ArtikelSuchen(bbsys.InputBox("Artikel", "BBasic"))
        If Not (bbsys.Rechte_TestUserRecht ("ABOS/SELECT/" + ConvertToString(aboid) + "/")) Then Exit Sub
        Dim sqlx$ = "SELECT * from " + bbsys.MySqlMandant + ".abos where PointerToArtikel =" + str(aboid)
        bbsys.SqlSelect(rs, sqlx$)
        Dim pbar As New BBasic.Prozessbar(bbsys, "Suche Abos", 100)
        pbar.Abbrechen_Visible()
        Dim kunde As New DataClass.Customer(bbsys)

        Dim li2 As New BBasic.Liste2(bbsys, Class_bbsys.LI2Typ.Li2Typkunden, "Aboliste")
        li2.GenMenu("", "merkm", "Merkmal", "")
        li2.GenMenu("merkm", "merkm/select/", "Diese Kunden selectieren", "")
        li2.GenMenu("merkm", "merkm/deselect/", "Diese Kunden deselectieren", "")
        li2.GenMenu("merkm", "merkm/set/", "Diese Kunden Neues Merkmal setzen", "")
        li2.GenMenu("merkm", "merkm/kill/", "Merkmal entfernen", "")
        li2.GenMenu("merkm", "merkm/list/", "Liste mit Designer", "")
        li2.Show
        While Not (rs.EOF) And Not (pbar.Abgebrochen)
            pbar.ok()
            kunde.Load(rs.GetInteger("PointerToKunde"))
            li2.Add(kunde.Id.ToString + vbTab + kunde.Konto.AccountingUniqueID + vbTab + kunde.Adress.Name + vbTab + kunde.Adress.Ort)
            rs.MoveNext()
        End While
        rs.CloseRecordset()
        pbar.Entfernen()
    End Sub

    Sub aboliste()
        Dim rs As New BBRecordset
        If Not (bbsys.Rechte_TestUserRecht("ABOS/LIST/")) Then Exit Sub
        Dim druck As Drucker
        druck = bbsys.DruckInitUndStart("Liste der Abos", "", 0, Class_bbsys.DruckerFlag.Druck_Normaleausgabe, Class_bbsys.ListAusgabe.ListAusgabe_AnwenderFragen)
        druck.SetSchrift("SmallFont", 7)
        druck.ZeileDrucken("unabhängig von der möglichen Buchungsperiode")
        druck.ZeileDrucken("")
        druck.TabelleStart("<1900|<3200|>1000|>1800|>2500", "Abo|Kunde|Abo-Preis|Periode|Bemerk")
        Dim Artikel As New DataClass.Merchandise(bbsys)
        Dim kunde As New DataClass.Customer(bbsys)
        Dim sqlx$ = "SELECT * from " + bbsys.MySqlMandant + ".abos order by pointertoartikel, pointertokunde"
        Dim ianr% = 0
        Dim anzabos% = 0
        bbsys.SqlSelect(rs, sqlx$)
        While Not (rs.EOF)
            If ianr <> rs.GetInteger("Pointertoartikel") Then
                If anzabos% > 0 Then
                    druck.TabelleBunt("" + "|Summe Abos" + str(anzabos) + "|" + "" + "|" + Artikel.Name + "|", Drucker.TabellenFarbe.TABF_Normal)
                End If
                ianr% = rs.GetInteger("Pointertoartikel")
                Artikel.Load(ianr)
                anzabos = 0
                druck.TabelleBunt(Artikel.Name + "|" + "" + "|" + "" + "|" + "" + "|", Drucker.TabellenFarbe.TABF_Grau)
            End If
            kunde.Load(rs.GetInteger("Pointertokunde"))
            anzabos = anzabos + 1
            'abo_Preis# = Local.FormatierteZahl(rs.Fields("Preis"))
            druck.TabelleBunt("" + "|" + kunde.Konto.AccountingUniqueID + " " + kunde.Adress.Name + "|" + FormatierteZahl(rs.GetDouble("Preis")) + "|" + rs.GetString("abgerechnetbis") + "|" + rs.GetString("bemerkung"), Drucker.TabellenFarbe.TABF_Normal)
            rs.MoveNext()
        End While
        If anzabos > 0 Then
            druck.TabelleBunt("" + "|Summe Abos" + str(anzabos) + "|" + "" + "|" + Artikel.Name + "|", Drucker.TabellenFarbe.TABF_Grau)
        End If
        rs.CloseRecordset()
        druck.Endprint()
    End Sub

    Public Sub abobuchen()
        '-------------------------
        Dim rs As New BBRecordset
        Dim artikel As New DataClass.Merchandise(bbsys)
        Dim kunde As New DataClass.Customer(bbsys)
        Dim bbasic As New XBBMain(bbsys, "ABO Buchen")
        Dim tb As New BBasic.EingabeBild(bbsys)
        Dim periodendatum As New BBDate
        tb.edef("Artikel", "", Class_bbsys.TextbildLaengen.TBL_Artikel, "ARTIKEL")
        tb.edef("Für Datum", periodendatum.DatumStr, Class_bbsys.TextbildLaengen.TBL_Datum, "DATUM")
        '        tb.xedef("Zeitraum/Monatlich/Vierteljahr/Halbjahr/Jährlich/", "1", Class_bbsys.TextbildLaengen.TBL_Integer, 3, Class_bbsys.TextbildFlags.TBF_ListBox, 0)
        tb.Eingabe(2, "ABOBuchen")
        While tb.ReturnCode < 0
            tb.Wartebischen()
        End While
        If tb.ReturnCode > 0 Then
            tb.Entfernen()
            Exit Sub
        End If
        Dim aboid%
        aboid% = tb.TXTInteger("ARTIKEL")
        If aboid = 0 Then
            tb.Entfernen()
            Exit Sub
        End If
        Dim today As New BBDate
        today.SetToday()
        periodendatum.DatumStr = tb.Text("DATUM")
        artikel.Load(aboid)
        Dim rebem$ = "Folge_ABO-Buchung"
        Dim bem2$ = "ABO: " + periodendatum.YYYYMMDD + " " + artikel.Name
        Dim sqlx$ = "SELECT * from " + bbsys.MySqlMandant + ".abos where PointerToArtikel =" + str(aboid) + " and "
        sqlx$ = sqlx$ + "Enddatum >" + periodendatum.QSQLDT + " and startdatum <= " + periodendatum.QSQLDT + " and abgerechnetbis < " + today.QSQLDT
        bbsys.SqlSelect(rs, sqlx$)

        Dim anz As Integer = 0
        While Not (rs.EOF)
            anz = anz + 1
            '------------------------
            Dim abo_preis# = rs.GetDouble("Preis")
            Dim mandant% = rs.GetInteger("Mandant")
            Dim KDInterneNr% = rs.GetInteger("Pointertokunde")
            kunde.Load(KDInterneNr)
            Dim trid% 'Transaktionsid damit das Programm die korrekte Reihenfolge überprüfen kann
            bbsys.TransAktionStarten("ABO:" + kunde.Adress.Name, trid%)
            artikel.Load(aboid)                                         'Abo-Artikel laden

            Dim _ketteninfo As KettenInfo = bbasic.Fakt_REPOS_StarteKette("ABO")
            'Hier werden Artikel für die Rechnung geschrieben ... eine Zeile pro Artikel
            bbasic.Fakt_REPOS_EinzelneKettenZeileSchreiben(_ketteninfo, aboid, 1, abo_preis#, "", 0, Space$(1), 0#, 0, 0&)
            'Alle Zeilen fertig
            bbasic.Fakt_REPOS_KetteAbschliessen(_ketteninfo)
            Dim ausgre As DataClass.CustomerBills = bbasic.Fakt_AusgangsrechnungAnlegen(False, "ABO:" + kunde.Adress.Name + " " + artikel.Name, kunde.Id, _ketteninfo.Startwert, 0, today, "Musterplugin Rechnung", bem2$, 0)
            Dim InterneNr% = ausgre.Id
            '--------------------------------------
            'TODO?? Soll Lagerbuchung durchgeführt werden?
            Dim lagerok_int%
            bbasic.Art_LagerBestandVeraendernOderTesten(aboid, 1, abo_preis, XBBMain.BestandveraenderungsFlag.BESTANDVFLagerAbbuchen, lagerok_int%, "ABO " + ausgre.ExtNummer + " " + kunde.Adress.Name, 0, kunde.Konto.AccountingUniqueID)
            '------------------------------------------------bis hier------------------------------
            'TODO?? Soll Rechnung gedruckt werden?  (Wenn Kommunikationsflag Fibu wird automatisch per Mail verschickt)
            bbasic.Fakt_RechnungDrucken_Sub_Designer(ausgre.Id, "ABORECHNUNG", 1, 0, 0, Class_bbsys.ListAusgabe.ListAusgabe_Drucker, True, True)
            Dim bemerkung$
            '---------------------------------------
            'SEPA - Lastschrift anlegen
            '---------------------------------------
            If kunde.Adress.PaymentMode > 0 Then 'Darf ich beim Kunden LASTSCHRIFT machen?
                Dim bank As New DataClass.Banken(bbsys)
                If bank.TryLoadBank(kunde.Adress.Id) Then 'Ist eine Bank beim Kunden hinterlegt
                    Dim last As New DataClass.Direct_Debit(bbsys) 'SEPA Lastschrift
                    Dim lastid% = last.Create_SEPA(kunde.Adress.Name, kunde.Konto.AccountingUniqueID + "ABO",
                                                   kunde.Adress.Banking_Sepa_MandateID, kunde.Adress.Banking_Sepa_MandateDate,
                                                        "ABO " + artikel.Name + " " + periodendatum.YYYYMM,
                                                        bank.IBAN, bank.BIC,
                                                        genAbsolute(ausgre.Open_Value), 0, kunde.Konto.AccountingUniqueID, "Last " + periodendatum.YYYYMM,
                                                        kunde.Adress.EMail, 0)
                    bemerkung$ = "Lastschrift " + lastid.ToString
                Else
                    bemerkung$ = "Keine Lastschrift"
                End If
            Else
                bemerkung$ = "Keine Lastschrift"
                '  Kunde zahlt selbst
            End If
            sqlx$ = "UPDATE " + bbsys.MySqlMandant + ".abos SET abgerechnetbis=" + periodendatum.QSQLDT + ", bemerkung=" + SQL.QSQLString(bemerkung) + " where ID=" + rs.GetInteger("ID")
            bbsys.SQLExecuteW(sqlx$)
            bbsys.TransAktionBeenden("ABO:" + kunde.Adress.Name, trid%, False)
            '--------------------------------------------------------------------------------------------
            rs.MoveNext()
        End While
        rs.CloseRecordset()
        bbsys.MsgBox("heutige Abobuchungen automatisch verarbeitet")

    End Sub
    Private Sub bbsys_BBSysListe2Menu(id As Liste2, menu As String) Handles bbsys.Liste2_Menu
        Select Case menu
            Case "merkm/select/"
                Dim t%
                Dim fibukonto As New BBasic.DataClass.FinacialAccount(bbsys)
                For t = 1 To id.Grid.Rows
                    fibukonto.Load_By_AccountUniqueID(id.Grid.TextMatrix(t - 1, 1))
                    Dim kunde As New DataClass.Customer(bbsys)
                    kunde.Load_By_AccountID(fibukonto.Id)
                    If Not (kunde.IsSelected) Then
                        kunde.IsSelected = True
                        kunde.Save()
                    End If
                Next
            Case "merkm/deselect/"
                Dim t%
                Dim fibukonto As New BBasic.DataClass.FinacialAccount(bbsys)
                For t = 1 To id.Grid.Rows
                    fibukonto.Load_By_AccountUniqueID(id.Grid.TextMatrix(t - 1, 1))
                    Dim kunde As New DataClass.Customer(bbsys)
                    kunde.Load_By_AccountID(fibukonto.Id)
                    If (kunde.IsSelected) Then
                        kunde.IsSelected = False
                        kunde.Save()
                    End If
                Next
            Case "merkm/list/"
                Dim textbild As New Class_Textbild(bbsys, "Kunde Selectieren")
                Call textbild.eedef("Welche Kunden/Selektierte/Alle/Testausdruck 10 St./", "1", Class_bbsys.TextbildLaengen.TBL_Zahl2stelling, 1, 5, 2, 5, 25, Class_bbsys.TextbildFlags.TBF_ListBox, 0)
                Call textbild.eedefx(Meldung.Meldungstext.DesignerAktivieren, "0", Class_bbsys.TextbildLaengen.TBL_Zahl2stelling, 2, 6, 2, 6, 25, Class_bbsys.TextbildFlags.TBF_ListBox, 0)
                Call textbild.eedef("Information/Nicht speichern/Speichern/", "1", Class_bbsys.TextbildLaengen.TBL_Zahl2stelling, 3, 7, 2, 7, 25, Class_bbsys.TextbildFlags.TBF_ListBox, 0)
                Call textbild.eedef("Art/Liste/Ettiketten (Briefe)/Kartei/", "1", Class_bbsys.TextbildLaengen.TBL_Zahl2stelling, 4, 8, 2, 8, 25, Class_bbsys.TextbildFlags.TBF_ListBox, 0)
                Call textbild.eedef("Ab laufender Nr", "1", Class_bbsys.TextbildLaengen.TBL_Integer, 5, 9, 2, 9, 25, 0, 0)
                textbild.Eingabe(5, "KDLISTMM")
                While textbild.ReturnCode < 0
                    textbild.Wartebischen
                End While
                Dim Flag% = textbild.TXTInteger(1)
                Dim xNr% = textbild.TXTInteger(2) + 1
                Dim ispeich_int% = textbild.TXTInteger(3)
                Dim druck_art% = textbild.TXTInteger(4)
                Dim xstart% = textbild.TXTInteger(5)
                Dim fibukonto As New BBasic.DataClass.FinacialAccount(bbsys)
                Dim kunde As New DataClass.Customer(bbsys)
                fibukonto.Load_By_AccountUniqueID(id.Grid.TextMatrix(1, 1))
                kunde.Load_By_AccountID(fibukonto.Id)
                Dim anz% = id.Grid.Rows
                Dim designer As New ListLabel
                druck_art = Class_bbsys.ListTypen.ListTyp_Liste

                Dim Datei$ = designer.init(druck_art, "KD", "Selektionsliste", bbsys.Setting.Path_BBasicData + "\listen\Kunden\", bbsys)

                designer.Definiere_KundenStandard(kunde.Id, druck_art)
                designer.DefSortOrder(1, "Name")
                designer.DefSortOrder(2, "Ort")
                designer.DefSortOrder(3, "Bemerkung1")
                designer.DefSortOrder(4, "Bemerkung2")
                designer.DefSortOrder(5, "Kundennummer")
                designer.DefSortOrder(6, "Suchbegriff")
                designer.DefSortOrder(7, "FiBu Kontoname")
                designer.DefSortOrder(8, "Umsatz")
                designer.DefSortOrder(9, "USTID")
                designer.DefSortOrder(10, "Statistik")

                If xNr% = 2 Then
                    designer.Neueliste(Datei)
                End If
                Dim fehlerkode% = designer.StartListe("Selektionsliste", Datei, Class_bbsys.ListAusgabe.ListAusgabe_AnwenderFragen, Class_bbsys.ListStartliste.ListStart_DateiAuswahl, "", "", 0, 0, "", "")
                If fehlerkode% < 0 Then
                    Exit Sub
                End If
                Dim a$ = designer.GetSortOrder
                Dim sort% = Val(a$)
                Dim pb As New Prozessbar(bbsys, "Liste verarbeiten", anz)
                Dim tempd As New BBasic.TempListe
                Dim itc As InternTempClass
                Dim n% = 0
                For t = 1 To anz
                    pb.SetAktuell(t)
                    fibukonto.Load_By_AccountUniqueID(id.Grid.TextMatrix(t - 1, 1))
                    kunde.Load_By_AccountID(fibukonto.Id)
                    n = n + 1
                    itc = New InternTempClass
                    itc.Text = kunde.sortfeld(sort)
                    itc.Pointer = kunde.Id
                    tempd.add(itc)
                Next
                textbild.Entfernen()
                tempd.Sort()
                For t = 1 To tempd.Count
                    pb.SetAktuell(t)
                    Dim nr_lng% = tempd.Sorted(t%)
                    designer.Definiere_KundenStandard(nr_lng, druck_art)
                    designer.drucken()
                Next
                pb.Entfernen()
                designer.PrintEnd()
                designer.Ende()
            Case "merkm/set/"
                Dim fibukonto As New BBasic.DataClass.FinacialAccount(bbsys)
                Dim kunde As New DataClass.Customer(bbsys)
                Dim merk% = bbsys.Merkmal_Suchen("Merkmal für Selektion")
                If merk% <> 0 Then
                    Dim xa$ = InputBox("Kurztext", "Merkmal", "")
                    Dim t%
                    Dim anz% = id.Grid.Rows
                    For t = 1 To anz
                        fibukonto.Load_By_AccountUniqueID(id.Grid.TextMatrix(t - 1, 1))
                        bbsys.Merkmal_AnlegenSub(FiBuKonto, merk, xa$)
                    Next
                End If
            Case "merkm/kill/"
                Dim fibukonto As New BBasic.DataClass.FinacialAccount(bbsys)
                Dim kunde As New DataClass.Customer(bbsys)
                Dim merk% = bbsys.Merkmal_Suchen("Merkmal zum Löschen")
                If merk% <> 0 Then
                    Dim t%
                    Dim anz% = id.Grid.Rows
                    For t = 1 To anz
                        fibukonto.Load_By_AccountUniqueID(id.Grid.TextMatrix(t - 1, 1))
                        Dim sqlx$ = "DELETE from " + bbsys.MySqlMandant + ".Merkmale where PointerToFibukonto = " + str$(fibukonto.Id) + " and Merkmal=" + str(merk)
                        bbsys.SQLExecuteW(sqlx$)
                    Next
                End If
            Case Else
        End Select
    End Sub
    Private Sub bbsys_BBSysKundenInfoDruck(druck As Drucker, kd As Customer) Handles bbsys.KundenInfoDruck
        Dim rs As New BBRecordset
        Dim sqlx$= "SELECT abos.ID,artikel.name,abos.lmod,abos.startdatum,abos.enddatum from " + bbsys.MySqlMandant + ".artikel, " + bbsys.MySqlMandant + ".abos where abos.pointertokunde=" + str(kd.id) + " AND abos.pointertoartikel=artikel.id order by lmod desc"
        bbsys.SqlSelect(rs,sqlx$)
        If rs.NOF Then
            druck.ZeileDrucken("")
            druck.SetSchrift("Arial",16)
            druck.ZeileDrucken("Abos Mustermakro")
            druck.SetSchrift("SmallFont",10)
            druck.TabelleStart("<1000|2000|1000","ID|Artikel|Enddatum")
            Dim a$
            While rs.NOF
                a$=ConvertToString(rs.GetInteger("id"))+"|"+rs.GetString("name")+"|"+rs.GetBBDate ("enddatum").DatumStr
                druck.TabelleBunt(a$,Drucker.TabellenFarbe.TABF_Normal )
                rs.MoveNext
            End While
            rs.CloseRecordset
        End If
    End Sub

#End Region
End Class
See Also