Der Einstieg in die Programmierung und APP-Enbtwicklung geht am einfachsten mit Beispielen und durch COPY-Paste
Wie liefern ein funktionsfähiges-Muster-Plugin mit - das die komplette Verwaltung eines Ortsverbandes einer Partei erledigt.
Was Sie im mitglelieferten Beispiel-Plugin sehen:
- Wie man auf Daten zugreift und eine neue Datenklasse anlegt (hier "ABO" für die Abonements(Mitgliedsbeiträge))
Durch Kapseln der Daten in unsere Basisklasse profitieren Sie von allen Datensicherungs-Maßnahmen und diversen automatischen Funktionen.
Die Klasse kann automatisch angelegt werden.
(Programm/Programmwartung/Diverse Administrative/SQL-Info und Dataclass-Generator)
- Wie man sich ins Menu einklinkt - und wie von dort Programmfunktionen aufgerufen werden
- Wie man automatisch Buchungen, Lagerbuchungen und Rechnungen anlegt
- Wie man sich mit neuen Informationen in die Info-Systeme einklinkt (hier unter Kunde [F2])
Das funktioniert analog auch unter Lieferanten und Mietern.
- Wie man Konfigurations-Einstellungen speichert und darauf zugreift.
- Wie man Daten importiert
(hier Kunden mit automatischer Überprüfung ob der Kunden bereits existiert und automatischem Anlegen seines ABOs (Mitgliedsbeitrag))
An dem hier abgebildeten Makro sehen Sie eindrucksvoll wie mächtig BBasic ist. Die gesamte Lagerverwaltung in einer Programm-Zeile.
Die Buchhaltung sehen Sie garnicht erst - die wird im Befehl "bbasic.Fakt_AusgangsrechnungAnlegen" mit angelegt. ggf. sogar auf abweichende Erlöskonten etc.
Dim ausgre As DataClass.CustomerBills = bbasic.Fakt_AusgangsrechnungAnlegen(False, "ABO:" + kunde.Adress.Name + " " + artikel.Name, kunde.Id, _ketteninfo.Startwert, 0, today, RechnungsBemerkung$, RechnungsBemerkung2
Ohne die hilfreiche Dokumentation ist das Programm nur wenige Leilen lang.
SEPA_Lastschrift.Create_SEPA(kunde.Adress.Bezeichnung, 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)
Das sind mächtige Befehle die Ihnen hier zur Verfügung stehen!
Sie finden das komplette Muster finden Sie im Verzeichnis BBasic\ProgrammNET\Samples
Sie können es mit VisualStudio - welches Sie kostenlos im Internet von Microsoft herunterladen können - jederzeit selbst ändern.
Das ist auch die Herangehensweise die wir zum Einstieg empfehlen. Copy - Paste - und ein paar Anpassungen... und sich dann schrittweise weiter vortasten.
Deshalb haben wir uns auch für dieses Muster entschieden - es hat alle wesentlichen Aspekte bereits zum Kopieren.
Hinweise zum Programmieren eigener Apps in BBasic
- Das Programm BBASIC.DLL ist NICHT Verschlüsselt oder geschützt. Sie können also mit Visual-Studio im Quellcode nachsehen was passiert - und mit Copy Paste ein quasi gleiches Programm schreiben - und nur die Zeilen verändern die ihnen nicht passen.
- Es gibt ein (automatisch generiertes) Handbuch zu den Funktionen
unter https://www.bbasic.de/Apphelp Die wichtigsten Classen in BBASIC.DLL sind
BBSYS (Class_bbsys) - diese Klasse hat alle aktuellen Nutzereinstellungen etc. Deshalb wird es in allen Klassen benötigt
zB. Dim Adresse as new Dataclass.Adresse(bbsys)
In dieser Klasse sind auch viele Funktionen die für fast alles benötigt werden (z.B. Test ob ein Nutzer ein bestimmtes Recht hat)
XBBMAIN in dieser Klasse sind alle High-Level-Funktionen
zB. Einzelrechnung, Sammelrechnung, Kundenstamm
- Eine weitere wichtige Klasse ist BBHELPER.DLL
HELPER Hier sind viele kleine Hilfsfunktionen für Strings...
SQL, BBRECORDSET Funktionen um auf den SQL-Server zuzugreifen
Wie sie starten
Download des kostenlosen Visual-Studio von Microsoft








Ab jetzt können Sie im Programm stöbern und Veränderungen durchführen
Damit das Programm nach Änderungen auch gestartet wird müssen Sie die DLL-Datei ins Pluginverzeichnis kopieren ODER in der CONIG-Datei unter dem PC-Namen "PluginPath"
den Pfad der DLL eintragen, damit auf Ihrem PC auch Plugins aus diesem Pfad geladen werden.
Muster - Rechnungerstellung mit Finanzbuchhaltung und Lastschrift in wenigen Zeilen - hier ohne Beschreibung, deshalb nochmals deutlich kürzer
Public Sub abobuchen()
Dim bbasic As New XBBMain(bbsys, "ABO Buchen")
Dim tb As New BBasic.Class_Textbild(bbsys)
Dim periodendatum As New BBDate
periodendatum.DatumStr = "31.12." + Date.Now.Year.ToString
Dim Buchungsdatum As New BBDate
Buchungsdatum.SetToday()
tb.edef("Artikel", "", Class_bbsys.TextbildLaengen.TBL_Artikel, 1)
tb.edef("Bis Datum", periodendatum.DatumStr, Class_bbsys.TextbildLaengen.TBL_Datum, 2)
tb.edef("Buchung Datum", Buchungsdatum.DatumStr, Class_bbsys.TextbildLaengen.TBL_Datum, 3)
tb.Eingabe(2, "ABOBuchen")
While tb.ReturnCode < 0
tb.Wartebischen()
End While
If tb.ReturnCode > 0 Then
tb.Entfernen()
Exit Sub
End If
Dim PointerToArtikel_des_Abo% = tb.TXTInteger(1)
If PointerToArtikel_des_Abo = 0 Then
tb.Entfernen()
Exit Sub
End If
periodendatum = tb.TXTBBDate(2)
Buchungsdatum = tb.TXTBBDate(3)
Dim RechnungsBemerkung$ = "Folge_ABO-Buchung"
Dim RechnungsBemerkung2$ = "ABO: " + periodendatum.YYYYMMDD + " " + bbsys.Cache.ArtikelName(PointerToArtikel_des_Abo)
Dim abo As New Abos(bbsys)
abo.Search("PointerToArtikel =" + Str(PointerToArtikel_des_Abo) + " and " + "Enddatum >=" + periodendatum.QSQLDT + " and startdatum <" + periodendatum.QSQLDT + " and (isnull(abgerechnetbis) or (abgerechnetbis < " + periodendatum.QSQLDT + "))")
Dim druck As New BBasic.Drucker(bbsys, "Liste der Abo-Buchungen Stichtag:" + periodendatum.DatumStr, "")
druck.SetSchrift_SmallFontKlein9()
druck.TabelleStart(">1000|<2000|>500", "Rechnung|Name|Betrag")
Dim anz As Integer = 0
While abo.Nof
anz = anz + 1
Dim kunde As New DataClass.Customer(bbsys, abo.PointerToKunde)
Dim trid% = bbsys.TransAktionStarten("ABO:" + kunde.AdressFromCache.Bezeichnung)
Dim _ketteninfo As KettenInfo = bbasic.Fakt_REPOS_StarteKette("A" + abo.PointerToArtikel.ToString + "." + abo.PointerToKunde.ToString)
bbasic.Fakt_REPOS_EinzelneKettenZeileSchreiben(_ketteninfo, abo.PointerToArtikel, 1, abo.Preis, "", 0, "", 0#, 0, 0&)
bbasic.Fakt_REPOS_KetteAbschliessen(_ketteninfo) 'Es kommen keine weiteren Artikel mehr
Dim ausgre As DataClass.CustomerBills = bbasic.Fakt_AusgangsrechnungAnlegen(False,"ABO:" + kunde.Adress.Name + " " + bbsys.Cache.ArtikelName(abo.PointerToArtikel),
kunde.Id, _ketteninfo.Startwert, 0,Buchungsdatum, RechnungsBemerkung$, RechnungsBemerkung2$, 0)
If bbsys.Config_ConfigurationSQLCached("ABO/AUTO/ABOLAGERBUCHEN") = "1" Then
Dim lagerok_int%
bbasic.Art_LagerBestandVeraendernOderTesten(PointerToArtikel_des_Abo, 1, abo.Preis, XBBMain.BestandveraenderungsFlag.BESTANDVFLagerAbbuchen, lagerok_int%,
"ABO " + ausgre.EXTNummer + " " + kunde.Adress.Name, 0, kunde.Konto.AccountingUniqueID)
End If
Dim bemerkung$ = ""
If kunde.Adress.PaymentMode > 0 Then
Dim SEPA_Lastschrift As New BBasic.DataClass.Direct_Debit(bbsys)
Dim bank As New BBasic.DataClass.Banken(bbsys)
If bank.TryLoadBank(kunde.PointerToAdress) Then
Dim lastid% = SEPA_Lastschrift.Create_SEPA(kunde.Adress.Bezeichnung, kunde.Konto.AccountingUniqueID + "ABO", kunde.Adress.Banking_Sepa_MandateID,
kunde.Adress.Banking_Sepa_MandateDate, "ABO " + bbsys.Cache.ArtikelName(abo.PointerToArtikel) + " " + periodendatum.YYYYMM, bank.IBAN, bank.BIC,
ausgre.Open_Value, 0, kunde.Konto.AccountingUniqueID, "Last " + periodendatum.YYYYMM, kunde.Adress.EMail, 0)
bemerkung$ = "Lastschrift " + lastid.ToString
End If
Else
bemerkung$ = "Keine Lastschrift"
End If
abo.AbgerechnetBis.Datum = periodendatum.Datum
abo.Bemerkung = bemerkung
abo.Save()
bbsys.TransAktionBeenden("ABO:" + kunde.Adress.Name, trid%, False) 'Jetzt ist alles erledigt. Alle Daten schreiben
druck.TabelleBunt(ausgre.EXTNummer + vbTab + kunde.AdressFromCache.Bezeichnung + vbTab + FormatierteZahl(ausgre.REBetrag), Drucker.TabellenFarbe.TABF_Normal)
If bbsys.Config_ConfigurationSQLCached_Integer("ABO/AUTO/ANZAHLAUSDRUCKE") > 0 Then
bbasic.Fakt_RechnungDrucken_Sub_Designer(ausgre.Id, "ABORECHNUNG",bbsys.Config_ConfigurationSQLCached_Integer("ABO/AUTO/ANZAHLAUSDRUCKE"),
0, 0, Class_bbsys.ListAusgabe.ListAusgabe_Drucker, True, True)
End If
abo.Next() 'Nächstes Abo suchen
End While
druck.Endprint()
bbsys.MSGBox("heutige Abobuchungen (Anz:" + anz.ToString + ") automatisch verarbeitet")
End Sub
Example Title |
Copy Code |
'Die Klasse ABO (siehe hier im Quelltext. Automatisch Generiert)
Dim abo As New Abos(bbsys)
abo.Search("PointerToArtikel =" + Str(PointerToArtikel_des_Abo) + " and " +
"Enddatum >=" + periodendatum.QSQLDT + " and startdatum <" + periodendatum.QSQLDT + " and (isnull(abgerechnetbis) or (abgerechnetbis < " + periodendatum.QSQLDT + "))")
'(virtuellen)Drucker für Protokoll initialisieren
Dim druck As New BBasic.Drucker(bbsys, "Liste der Abo-Buchungen Stichtag:" + periodendatum.DatumStr, "")
druck.SetSchrift_SmallFontKlein9()
druck.TabelleStart(">1000|<2000|>500", "Rechnung|Name|Betrag")
Dim anz As Integer = 0
While abo.Nof
anz = anz + 1
'------------------------
Dim kunde As New DataClass.Customer(bbsys, abo.PointerToKunde)
'Wir nutzen Transaktionen - damit die Daten immer konsistent sind
Dim trid% = bbsys.TransAktionStarten("ABO:" + kunde.AdressFromCache.Bezeichnung) 'Transaktionsid damit das Programm die korrekte Reihenfolge überprüfen kann
'Als erstes müssen die Artikel-Postitionen der Rechnung geschrieben werden
'(Nennt sich Kette - weil es eine aneinanderreihung von Artikelpositionen ist)
Dim _ketteninfo As KettenInfo = bbasic.Fakt_REPOS_StarteKette("A" + abo.PointerToArtikel.ToString + "." + abo.PointerToKunde.ToString)
'Die og Nummer ABO xxxxx.xxxxx ist unwichtig - erscheint aber in den Protokoll-Dateien wie Transakt - könnte hilfreich werden
bbasic.Fakt_REPOS_EinzelneKettenZeileSchreiben(_ketteninfo,
abo.PointerToArtikel, 'Welcher artikel
1, 'Stückzahl (Menge)
abo.Preis, 'Preis
"", 0, 'Alles Standard
"", 'ggf. Zusatztext zur Artikel-Position
0#, 0, 0&) 'Alles Standard
'Ggf. noch weitere Zeilen (Artikel-Positionen der Rechnung)...
'bbasic.Fakt_REPOS_EinzelneKettenZeileSchreiben(_ketteninfo, PointerToArtikel_des_Abo, menge, preis#, "", 0, "Zusatztext", Ggf_SonmderEK#, 0, 0&)
'Alle Zeilen fertig
bbasic.Fakt_REPOS_KetteAbschliessen(_ketteninfo) 'Es kommen keine weiteren Artikel mehr
'Jetzt wird die eigentliche Ausgangsrechnung angelegt
Dim ausgre As DataClass.CustomerBills = bbasic.Fakt_AusgangsrechnungAnlegen(False,
"ABO:" + kunde.Adress.Name + " " + bbsys.Cache.ArtikelName(abo.PointerToArtikel), 'Text
kunde.Id, 'Welcher Kunde
_ketteninfo.Startwert, 'Welche Artikel (siehe oben)
0, 'Keine Proforma-Rechnung
Buchungsdatum, 'Buchungsdatum
RechnungsBemerkung$, RechnungsBemerkung2$, 'Bemerkung
0) 'Rabatt
'--------------------------------------
'TODO?? Soll Lagerbuchung durchgeführt werden?
If bbsys.Config_ConfigurationSQLCached("ABO/AUTO/ABOLAGERBUCHEN") = "1" Then 'Wir haben soeben einen neuen Config-Eintrag definiert. Der ist im Standard '' (Leer)
Dim lagerok_int%
bbasic.Art_LagerBestandVeraendernOderTesten(PointerToArtikel_des_Abo, 'Welcher Artikel soll gebucht werden
1, 'Wieviel Stück sollen gebucht werden
abo.Preis, 'Der Wert der veränderung
XBBMain.BestandveraenderungsFlag.BESTANDVFLagerAbbuchen, 'Das Lager soll abgebucht werden (ggf. Reservierung oder Gutschrift als Möglichkeiten)
lagerok_int%, 'Rückgabewert der zB bei Produktion oder nur Test bestimmte Infos erhält
"ABO " + ausgre.EXTNummer + " " + kunde.Adress.Name, 'Text in der Lagerkartei
0, 'Lagerposition 0=Standard
kunde.Konto.AccountingUniqueID) 'KontoID
End If
'------------------------------------------------bis hier------------------------------
Dim bemerkung$ = ""
'---------------------------------------
'SEPA - Lastschrift anlegen - wenn der Kunde einen Abbuchungsauftrag erteilt hat
'---------------------------------------
If kunde.Adress.PaymentMode > 0 Then
Dim SEPA_Lastschrift As New BBasic.DataClass.Direct_Debit(bbsys)
Dim bank As New BBasic.DataClass.Banken(bbsys)
If bank.TryLoadBank(kunde.PointerToAdress) Then 'Hat der Kunde überhaupt eine Bank hinterlegt
Dim lastid% = SEPA_Lastschrift.Create_SEPA(kunde.Adress.Bezeichnung, 'Name
kunde.Konto.AccountingUniqueID + "ABO", 'Kennzeichen für den Kunden
kunde.Adress.Banking_Sepa_MandateID, 'Mandat
kunde.Adress.Banking_Sepa_MandateDate, 'Mandat vom (Datum)
"ABO " + bbsys.Cache.ArtikelName(abo.PointerToArtikel) + " " + periodendatum.YYYYMM, 'Lastschrift-Text
bank.IBAN, bank.BIC, 'Bank Konto
genAbsolute(ausgre.Open_Value), 'Offener Rechnungsbetrag - vorsichtshalber gerundet (keine halben Cent)
0, 'Fälligkeit in Tagen (sofort)
kunde.Konto.AccountingUniqueID, 'Fibu-Kontonummer zum automatischen Buchen später
"Last " + periodendatum.YYYYMM, 'FiBu-Bemerkung zum automatischen Buchen später
kunde.Adress.EMail, 'EMail-Adresse zur vorgeschriebenen Vorab-Information
0) 'Mandant 0=Aktueller Mandant
bemerkung$ = "Lastschrift " + lastid.ToString
End If
Else
bemerkung$ = "Keine Lastschrift"
' Kunde zahlt selbst
End If
'Update - das diese Periode berechnet ist - damit nicht ggf 2x berechnet wird
abo.AbgerechnetBis.Datum = periodendatum.Datum
abo.Bemerkung = bemerkung
abo.Save()
bbsys.TransAktionBeenden("ABO:" + kunde.Adress.Name, trid%, False) 'Jetzt ist alles erledigt. Alle Daten schreiben
druck.TabelleBunt(ausgre.EXTNummer + vbTab + kunde.AdressFromCache.Bezeichnung + vbTab + FormatierteZahl(ausgre.REBetrag), Drucker.TabellenFarbe.TABF_Normal)
If bbsys.Config_ConfigurationSQLCached_Integer("ABO/AUTO/ANZAHLAUSDRUCKE") > 0 Then 'Wir haben soeben einen neuen Config-Eintrag definiert. Der ist im Standard '' (Leer)
'TODO?? Soll Rechnung gedruckt werden? (Wenn Kommunikationsflag Fibu wird automatisch per Mail verschickt)
bbasic.Fakt_RechnungDrucken_Sub_Designer(ausgre.Id,
"ABORECHNUNG",'Formular
bbsys.Config_ConfigurationSQLCached_Integer("ABO/AUTO/ANZAHLAUSDRUCKE"), 'Anzahl ausdrucke
0, 'Defnition wie gerundet werden soll 0=Standard
0, 'Soll der Designer aufgerufen werden (0=Nein)
Class_bbsys.ListAusgabe.ListAusgabe_Drucker, 'Ausgabe auf den Drucker bzw EMail (nicht Vorschau)
True, 'Versuche die EMail zu nutzen - falls hinterlegt
True) 'Direkt als EMail verschicken - falls zulässig
End If
'--------------------------------------------------------------------------------------------
abo.Next() 'Nächstes Abo suchen |
See Also
Technische Dokumentation
Programmieren mit BBasic