D - BASIC: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Root (Diskussion | Beiträge) |
||
(58 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Vorwort == | |||
BASIC ist die Abkürzung für <b>B</b>eginners <b>A</b>ll purpose <b>S</b>ymbolic <b>I</b>nstruction <b>C</b>ode. BASIC wurde in den Jahren 1963-1965 am Dartmouth College in Hanover (USA) entwickelt, und gehörte zu den am weitesten verbreiteten Programmiersprachen auf kleinen Rechnern bis 1985. | |||
D-BASIC entstand in Anlehnung an diese erfolgreiche Programmiersprache und steht für <b>D</b>ruckvorlagen-BASIC. | |||
== D - BASIC == | |||
Bei der Anpassung des OrgaMon an Anforderungen des Anwenders kommt man mit statischen Parametern oft nicht weiter. An diesen Stellen hilft eine freie Programmier-Möglichkeit am besten weiter. Der End-Anwender des OrgaMon hat selbst Zugriff auf diese Programmierung und kann individuelle Anforderungen an den OrgaMon selbst realisieren. Inerhalb des OrgaMon wird D-BASIC breit eingesetzt: | |||
* Druckvorlagen: die Drucker-Ausgabe (Druckvorlagen, also html-Generatoren) mit Hilfe von [[Kasse3#Druckstücke|Druckvorlagen]] / [[Label_Druck|Etiketten]] für noch mehr Flexibilität. | |||
* OLAP: erhöht die Flexibilität bei der Ermittlung einer [[basic|OLAP-Abfrage Dimension]] Add-On für SQL-Statements | |||
* Vor Beleg-Buchungen, um z.B. Marketing-Aktionen automatisiert zu steuern | |||
* Nimmt Buchungserweiterungen bei Verträgen und [[Belege#BerechneBeleg-1.txt|Belegen]] vor | |||
* In der Tagwache und dem Tagesabschluss (via OLAP) | |||
=== Historie === | |||
D-BASIC hat bereits eine lange Geschichte und war bereits in der "RAGAL" Software integriert, ein Vorgänger des OrgaMon. | |||
* 12.12.1991 erste Version fürs RAGAL. | |||
* 11.04.1992 "PRN" und "NUL" eingeführt | |||
* 16.02.1993 Erweiterung für TÜV Hannover "CALL" | |||
* 01.01.1995 Integration ins AA2 / AA3 | |||
* 16.12.2003 Basic32 ist nun ein Objekt / Portierung Turbo-Pascal -> Delphi | |||
* 12.12.2006 Erweitert um PREIS ( ) Funktion (erstmalige Anbindung an eCommerce) | |||
* 19.07.2010 Integration ins OLAP | |||
* 09.07.2014 Integration in die Beleg-Buchung / Portierung Delphi -> FreePascal | |||
== BASIC Einführung == | |||
=== Lektion 1: REM, PRINT, LET, VAL === | |||
<i> | |||
<b>REM</b> ist die Abkürzung für Remark und bedeutet Kommentar. Hier können Sie also | |||
Ihr Programm kommentieren, alle Eingaben hinter dem REM-Bezeichner werden | |||
ignoriert. | |||
<b>PRINT</b> ("Drucke!") Gibt Texte oder Zahlen auf dem Drucker (oder Bildschirm) aus. | |||
<b>LET</b> ("Es sei") wird benutzt, um Zwischenergebnisse in einer Variable | |||
zwischenzuspeichern. Variable sind Schubladen, die Sie mit Namen | |||
versehen können. Dort werden Werte gespeichert bis Sie diese wieder | |||
verwenden. In diesem Fall geschieht das sofort in der nächsten Zeile. | |||
<b>VAL</b> ("Wert") wandelt das wissenschaftliche Zahlenformat (3.4982398E+02) | |||
in ein besser lesbares Format um, dazu müssen die Anzahl der | |||
Vorkommastellen und die Anzahl der Nachkommastellen angegeben werden. | |||
</i> | |||
REM mein erstes Programm: | REM mein erstes Programm: | ||
PRINT "2"+"2" | PRINT "2"+"2" | ||
Wenn Sie nun Ihr Programm starten (d.h. <F4>-drucken oder <F5>-Layout) erhalten | Wenn Sie nun Ihr Programm starten (d.h. <F4>-drucken oder <F5>-Layout) erhalten | ||
Zeile 30: | Zeile 67: | ||
PRINT VAL(ERGEBNIS,"2","1") | PRINT VAL(ERGEBNIS,"2","1") | ||
Nach dieser kleinen | Nach dieser kleinen Änderung sieht die Ausgabe schon besser aus: | ||
4,0 | 4,0 | ||
2 und 2 zu addieren ist uns jedoch zu wenig. Jetzt soll der Benutzer bestimmen, | 2 und 2 zu addieren ist uns jedoch zu wenig. Jetzt soll der Benutzer bestimmen, | ||
welche Werte eingegeben werden sollen. Die Benutzereingabe erfolgt durch den | welche Werte eingegeben werden sollen. | ||
=== Lektion 2: INPUT === | |||
<i> | |||
<b>INPUT</b> ("Eingabe") stoppt den Programmablauf, und fordert den Benutzer auf, eine | |||
Eingabe zu tätigen. | |||
</i> | |||
Die Benutzereingabe erfolgt durch den INPUT-Befehl. | |||
INPUT "Geben Sie die erste Zahl ein:",XWERT | INPUT "Geben Sie die erste Zahl ein:",XWERT | ||
Zeile 49: | Zeile 89: | ||
PRINT VAL(ERGEBNIS,"2","1") | PRINT VAL(ERGEBNIS,"2","1") | ||
=== Lektion 3: IF, GOTO, Sprungmarke === | |||
Da es im D-Basic keine Zeilen-Nummern gibt, müssen Sprungziele durch sogenannte Sprungmarken markiert werden. Dies geschieht einfach durch Strings, die am Anfang der Zeile angegeben sind. | |||
LET A="0" | |||
"Start-Loop" | |||
PRINT "HALLO Nummer " & VAL(A,"2","0") | |||
LET A=A+"1" | |||
IF A="10" THEN "Ende" | |||
GOTO "Start-Loop" | |||
"Ende" | |||
PRINT "Fertig" | |||
Das erste "sinnvolle" Programm errechnet den Durchschnittlichen Verbrauch Ihres KFZ; z.B. nach einer Urlaubsreise. | |||
"Start" | "Start" | ||
INPUT "KM-Stand (Tank leer, frisch getankt)",KM0 | INPUT "KM-Stand (Tank leer, frisch getankt)",KM0 | ||
IF KM0="0" THEN "Ende" | IF KM0="0" THEN "Ende" | ||
INPUT "KM-Stand (Tank wieder leer)",KM1 | INPUT "KM-Stand (Tank wieder leer)",KM1 | ||
IF KM1="0" THEN "Ende" | IF KM1="0" THEN "Ende" | ||
INPUT "Liter-Sprit",L | INPUT "Liter-Sprit",L | ||
IF L="0" THEN "Ende" | IF L="0" THEN "Ende" | ||
INPUT "Liter-Preis",PREIS | INPUT "Liter-Preis",PREIS | ||
IF PREIS="0" THEN "Ende" | IF PREIS="0" THEN "Ende" | ||
LET KM=KM1-KM0 | LET KM=KM1-KM0 | ||
LET VERBRAUCH100=(L/KM)*"100" | LET VERBRAUCH100=(L/KM)*"100" | ||
LET KOSTENKM=(L*PREIS)/KM | LET KOSTENKM=(L*PREIS)/KM | ||
PRINT "gefahrene kM : " & VAL(KM,"6","2") | PRINT "gefahrene kM : " & VAL(KM,"6","2") | ||
PRINT "Benzinkosten pro kM : " & VAL(KOSTENKM,"6","2") & " DM" | PRINT "Benzinkosten pro kM : " & VAL(KOSTENKM,"6","2") & " DM" | ||
Zeile 78: | Zeile 127: | ||
"Ende" | "Ende" | ||
"Start" und "Ende" sind sogenannte Sprungmarken, d.h. an diesen Stellen können Sie die Programmausführung wiederholen oder fortsetzen. Sie können also mit Hilfe des GOTO-Befehls im Programm die Ausführung des Programmes an diesen benannten Stellen fortsetzen. Dabei kann man zurück und vorspringen. | |||
=== Lektion 4: GOSUB, RETURN === | |||
GOTO springt an eine andere Stelle des Codes. Erst mal dort angelangt weiß BASIC nicht mehr von woher es gesprungen kam. GOSUB merkt sich das und kann die Arbeit an alter Stelle wieder aufnehmen. Dadurch lassen sich Code-Teile anspringen, die mehrfach von unterschiedlichen Stellen des Programmes immer wieder benutzt werden. | |||
LET A="10" | |||
GOSUB "Ausgabe" | |||
LET A="102" | |||
GOSUB "Ausgabe" | |||
GOTO "Ende" | |||
"Ausgabe" | |||
PRINT "Mein Wert ist " & VAL(A,"10","5") | |||
RETURN | |||
"Ende" | |||
== Reservierte BASIC-Bezeichner == | |||
'&' String Addierung | '&' String Addierung | ||
Zeile 89: | Zeile 150: | ||
'*' Zahlen Multiplikation | '*' Zahlen Multiplikation | ||
'/' Zahlen Division | '/' Zahlen Division | ||
'=' Zahlen und String | '=' Zahlen und String Identität | ||
'(' Klammerung von Formeln und Funktionen | '(' Klammerung von Formeln und Funktionen | ||
')' Klammerung von Formeln und Funktionen | ')' Klammerung von Formeln und Funktionen | ||
Zeile 95: | Zeile 156: | ||
'[' Alias und Variablen Begrenzer | '[' Alias und Variablen Begrenzer | ||
']' Alias und Variablen Begrenzer | ']' Alias und Variablen Begrenzer | ||
';' | ';' für PRINT ohne Zeilenumbruch | ||
',' Komma zur Parameter-Abtrennung | ',' Komma zur Parameter-Abtrennung | ||
'>' | '>' Größer-Operator Strings/Zahlen | ||
'<' Kleiner-Operator Strings/Zahlen | '<' Kleiner-Operator Strings/Zahlen | ||
'IF' Bedingte Abfrage mit GOTO oder GOSUB-Sprung | 'IF' Bedingte Abfrage mit GOTO oder GOSUB-Sprung | ||
'OR' logisches ODER | 'OR' logisches ODER Verknüpfung | ||
'LET' Variablen Zuweisung | 'LET' Variablen Zuweisung | ||
'REM' Einleitung eines Kommentars | 'REM' Einleitung eines Kommentars | ||
'AND' logische UND | 'AND' logische UND Verknüpfung | ||
'NOT' logische NICHT Negierung | 'NOT' logische NICHT Negierung | ||
'LEN' String- | 'LEN' String-Länge bestimmen | ||
'MID' Sub-String ausschneiden | 'MID' Sub-String ausschneiden | ||
'VAL' Wert aus einen String bilden | 'VAL' Wert aus einen String bilden | ||
Zeile 118: | Zeile 179: | ||
"<x>","<y>","<Bild-Dateiname>" gibt eine Grafik aus | "<x>","<y>","<Bild-Dateiname>" gibt eine Grafik aus | ||
'GOSUB' Aufruf einer Subroutine | 'GOSUB' Aufruf einer Subroutine | ||
'INPUT' Eingabe | 'INPUT' Eingabe über Bildschirm | ||
'ALIAS' einer Variable einen extern sichtbaren Namen geben | 'ALIAS' einer Variable einen extern sichtbaren Namen geben | ||
'RETURN' | 'RETURN' Rücksprung aus einer Subroutine | ||
'END' Beendet das BASIC-Programm | 'END' Beendet das BASIC-Programm | ||
'ABORT' Bricht das BASIC-Programm ohne Druck ab | |||
'ROUND' Runden von Zahlenwerten | 'ROUND' Runden von Zahlenwerten | ||
'DEBUG' Aktiviert den Debuggermodus | 'DEBUG' Aktiviert den Debuggermodus | ||
'FOPEN' | 'FOPEN' öffnet die Text-Datei | ||
'FCREATE' erzeugt eine neue Text-Datei | 'FCREATE' erzeugt eine neue Text-Datei | ||
'FPRINT' Ausgabe eines Strings in eine Datei | 'FPRINT' Ausgabe eines Strings in eine Datei | ||
'FINPUT' Auslesen einer Datei | 'FINPUT' Auslesen einer Datei | ||
'FCLOSE' | 'FCLOSE' Schließen einer Text-Datei | ||
'FSORT' Sortieren einer Text-Datei | 'FSORT' Sortieren einer Text-Datei | ||
'SYSTEM' Ein DOS-Programm wird aufrufen | 'SYSTEM' Ein DOS-Programm wird aufrufen | ||
'DEVICE' | 'DEVICE' Wählt das Ausgabegerät aus (den Drucker) | ||
Wählt das Ausgabe-Formular aus | |||
'MOVE' Setzt die Druckposition (x,y) | 'MOVE' Setzt die Druckposition (x,y) | ||
'FONT' Setzt die Druckschrift (Fontname, | 'FONT' Setzt die Druckschrift (Fontname,Grösse,Attribute[italic,bold,underline]) | ||
== Besondere Variable == | |||
TITEL Titel des Dokumentes im Druckspooler | TITEL Titel des Dokumentes im Druckspooler | ||
ANZAHL Anzahl der Druckexemplare (mit " | ANZAHL Anzahl der Druckexemplare (mit "MENGE" der Warenbewegung initialisiert) | ||
FORMULAR Druckausgabe Formular das verwendet werden soll | FORMULAR Druckausgabe Formular das verwendet werden soll | ||
X Offset X der ersten Druckposition | X Offset X der ersten Druckposition | ||
Y Offset Y der ersten Druckposition | Y Offset Y der ersten Druckposition | ||
ZEILE Aktuelle Zeilennummer des D-BASIC Scripts (Wird nur im Debug-Modus gesetzt!) | |||
== Unterschiede zum normalen BASIC == | |||
D-BASIC hat einigen Balast abgeworfen, die ältere BASIC-Varianten mit sich tragen müssen. Dadurch ist es jedoch nur in gewissem Umfang kompatibel zu anderen BASIC-Dialekten. | |||
* So gibt es keine Zeilen-Nummern mehr | |||
* Es muß mit Sprungmarken gearbeitet werden | |||
* Die Variable müssen kein "$" am Anfang haben | |||
* Arrays bzw. das DIM Statement wird nicht unterstützt | |||
* Datenbank Integration mit '[' DATENBANK-FELDNAME ']' | |||
* Programmzeilen können mit '#' am Ende mit der nächsten Zeile verbunden werden | |||
=== Daten-Typen === | |||
Der größte Unterschied zu Standard-BASIC ist, dass keine verscheidenen | |||
Daten-Typen mehr gibt, sondern nur noch den Datentyp String. Sie können | |||
dennoch mit Zahlen arbeiten oder mit logischen Ausdrücken, beachten Sie | |||
jedoch, dass alle konstanten Werte immer als String geschrieben werden müssen: | |||
1.2 muss als "1.2" oder "1,2" geschrieben werden | |||
TRUE muss als "Y" geschrieben werden | |||
FALSE muss als "N" geschrieben werden | |||
=== Variablen-Namen === | |||
Variable sind beliebige Kombinationen aus Buchstaben und Zahlen, jedoch darf | Variable sind beliebige Kombinationen aus Buchstaben und Zahlen, jedoch darf | ||
kein BASIC- | kein BASIC-Schlüsselwort (GOTO, IF, PRINT) in der Variable enthalten sein. | ||
REM Fehlerhafte Variable!!! | REM Fehlerhafte Variable!!! | ||
Zeile 193: | Zeile 238: | ||
IF PRINTIT THEN GOSUB "DruckeZeile" | IF PRINTIT THEN GOSUB "DruckeZeile" | ||
== Basic Syntax == | |||
Im folgenden wird der komplette Basic-Syntax beschrieben, nach welchem alle | Im folgenden wird der komplette Basic-Syntax beschrieben, nach welchem alle | ||
BASIC-Programme | BASIC-Programme aufgelöst werden. | ||
EOLId ist das Ende einer Zeile. | EOLId ist das Ende einer Zeile. | ||
Zeile 209: | Zeile 252: | ||
REM (c)by Heinz Spotlum, PEUS SYSTEMS | REM (c)by Heinz Spotlum, PEUS SYSTEMS | ||
LET X="10"*"120."+B | LET X="10"*"120."+B | ||
REM ^^ das hier ggf. | REM ^^ das hier ggf. Ändern! | ||
ReturnId EOLId -> eps | ReturnId EOLId -> eps | ||
ENDId EOLId -> eps | ENDId EOLId -> eps | ||
REM Jetzt endet die Programm- | REM Jetzt endet die Programm-Ausführung | ||
REM In der | REM In der nächsten Zeile | ||
END | END | ||
Zeile 364: | Zeile 399: | ||
InputId Sid kommaid Sid -> eps | InputId Sid kommaid Sid -> eps | ||
LET A="Anton | LET A="Anton Müller" | ||
INPUT "Geben Sie Ihren Namen ein",A | INPUT "Geben Sie Ihren Namen ein",A | ||
PRINT "Ihr Eingabe ist " & A | PRINT "Ihr Eingabe ist " & A | ||
Zeile 388: | Zeile 423: | ||
FOPEN sid -> eps | FOPEN sid -> eps | ||
FOPEN "C:\autoexec.bat" | FOPEN "C:\autoexec.bat" | ||
REM Die Datei AUTOEXEC.BAT wird | REM Die Datei AUTOEXEC.BAT wird geöffnet | ||
REM sie kann mit FINPUT eingelesen werden | REM sie kann mit FINPUT eingelesen werden | ||
REM Erfolg der Aktion steht in [LISTE-ENDE] | REM Erfolg der Aktion steht in [LISTE-ENDE] | ||
Zeile 394: | Zeile 429: | ||
FCREATE sid -> eps | FCREATE sid -> eps | ||
FCREATE "TEST.TXT" | FCREATE "TEST.TXT" | ||
FPRINT "Name; | FPRINT "Name;Straße;Ort" | ||
"Schleife" | "Schleife" | ||
FPRINT [K.Name] & ";" ; | FPRINT [K.Name] & ";" ; | ||
FPRINT [K. | FPRINT [K.Straße] & ";" ; | ||
FPRINT [K.Ort] | FPRINT [K.Ort] | ||
FCLOSE | FCLOSE | ||
FPRINT sid [ ";" ] -> eps | FPRINT sid [ ";" ] -> eps | ||
REM Ausgabe von Strings erfolgen in | REM Ausgabe von Strings erfolgen in geöffnete | ||
REM Dateien (FCREATE). | REM Dateien (FCREATE). | ||
REM um die Ausgabe | REM um die Ausgabe ordnungsgemäß abzuschließen | ||
REM nach dem letzten FPRINT- Befehl ein FCLOSE | REM nach dem letzten FPRINT- Befehl ein FCLOSE | ||
REM folgen | REM folgen | ||
Zeile 430: | Zeile 465: | ||
REM Die aktuelle Datei wird sortiert | REM Die aktuelle Datei wird sortiert | ||
REM Die Datei darf nicht "offen" sein. | REM Die Datei darf nicht "offen" sein. | ||
REM ggf. zuvor mir FCLOSE | REM ggf. zuvor mir FCLOSE schließen | ||
SYSTEM sid -> eps | SYSTEM sid -> eps | ||
Verlässt das Programm, um ein anderes DOS-Programm auszuführen. Oder auch einen | |||
Batch-File. Damit | Batch-File. Damit können andere Hilfsprogramme gerufen werden. | ||
REM ********************************************* | REM ********************************************* | ||
Zeile 447: | Zeile 482: | ||
SYSTEM "SEND C:\PEUS\MYFAX.TXT" | SYSTEM "SEND C:\PEUS\MYFAX.TXT" | ||
== Fehler-Meldungen und ihre Behebung == | |||
zuviele Objekte pro Zeile | zuviele Objekte pro Zeile | ||
Ihre Berechnungs-Formel ist zu lang oder hat zu viele Klammern bzw Einzel-Objekte. | Ihre Berechnungs-Formel ist zu lang oder hat zu viele Klammern bzw Einzel-Objekte. | ||
Zeile 453: | Zeile 489: | ||
] erwartet | ] erwartet | ||
Ihre Druckvariable | Ihre Druckvariable muss immer mit "[" und "]" umschlossen werden. | ||
" erwartet | " erwartet | ||
Zeile 459: | Zeile 495: | ||
Sprungmarke zu lang | Sprungmarke zu lang | ||
Verkürzen Sie den symbolischen Bezeichner Ihrer Sprungmarke. | |||
Sprungmarke bereits vergeben | Sprungmarke bereits vergeben | ||
Benutzen Sie einen anderen eindeutigen Namen | Benutzen Sie einen anderen eindeutigen Namen für Ihre Sprung-Marke. | ||
Zu viele Labels | Zu viele Labels | ||
Ihr Programm hat zuviele Sprung-Marken und ist somit | Ihr Programm hat zuviele Sprung-Marken und ist somit für das ASR-BASIC zu komplex. | ||
Wenden Sie sich an den Software-Hersteller. | Wenden Sie sich an den Software-Hersteller. | ||
Zu tiefe GOSUB-Verschachtelung oder Rekursion | Zu tiefe GOSUB-Verschachtelung oder Rekursion | ||
Vermutlich wird | Vermutlich wird ständig mit GOSUB ein Programm-Teil aufgerufen, ohne dass dieser | ||
mit RETURN | mit RETURN ordnungsgemäß verlassen wird. Unter Umständen wird mit GOTO direkt | ||
das Unterprogramm verlassen. Zur Einkreisung des Fehlers leistet der Debugger | das Unterprogramm verlassen. Zur Einkreisung des Fehlers leistet der Debugger | ||
gute Dienste. | gute Dienste. | ||
Zeile 476: | Zeile 512: | ||
RETURN ohne vorherigen GOSUB-Aufruf | RETURN ohne vorherigen GOSUB-Aufruf | ||
Ein Unterprogramm wurde versehentlich mit GOTO anstatt mit GOSUB angesprungen, | Ein Unterprogramm wurde versehentlich mit GOTO anstatt mit GOSUB angesprungen, | ||
das GOTO liefert keine Information wohin der | das GOTO liefert keine Information wohin der Rücksprung zu erfolgen hat. | ||
Sprungmarke unbekannt | Sprungmarke unbekannt | ||
Zeile 482: | Zeile 518: | ||
definiert ist. | definiert ist. | ||
Anweisung | Anweisung unverständlich | ||
Die Basic-Syntax wurde nicht eingehalten. Sehen Sie sich die Beispiele an, wie | Die Basic-Syntax wurde nicht eingehalten. Sehen Sie sich die Beispiele an, wie | ||
Befehle verwendnet werden. Im Besonderen kann eine Klammerung falsch sein. | Befehle verwendnet werden. Im Besonderen kann eine Klammerung falsch sein. | ||
Zeile 494: | Zeile 530: | ||
Abbruch durch Tastendruck | Abbruch durch Tastendruck | ||
Ihr Programm wurde durch Tasten-Druck unterbrochen. Es | Ihr Programm wurde durch Tasten-Druck unterbrochen. Es muss ggf. nochmals | ||
gestartet werden. | gestartet werden. | ||
Bitte | Bitte gültige Variable angeben | ||
Es wurde zwar der Name einer Variable angegeben, jedoch ist diese nicht als | Es wurde zwar der Name einer Variable angegeben, jedoch ist diese nicht als | ||
Variable zugelassen. So kann z.B. X7 nicht als Variablen-Name verwendet werden. | Variable zugelassen. So kann z.B. X7 nicht als Variablen-Name verwendet werden. | ||
Division durch "0" | Division durch "0" | ||
Prüfen Sie bei Divisionen zunächst den Divisor auf Identität mit "0" ab. | |||
Variable ergibt keine Zahl | Variable ergibt keine Zahl | ||
Es wurde versucht mit einem String zu rechnen, der keinen | Es wurde versucht mit einem String zu rechnen, der keinen gültigen Zahlenwert | ||
ergibt. | ergibt. | ||
Bitte [ENDE-BASIC] | Bitte [ENDE-BASIC] einfügen | ||
Es fehlt in Ihrem Programm das [ENDE-BASIC] Satement. Am Ende Ihres Textes | Es fehlt in Ihrem Programm das [ENDE-BASIC] Satement. Am Ende Ihres Textes | ||
sollte sich das Programm im normalen Ausgabe - Modus befinden. | sollte sich das Programm im normalen Ausgabe - Modus befinden. | ||
PRN ohne NUL | PRN ohne NUL | ||
Es wurde versucht den Drucker zu aktivieren, ohne | Es wurde versucht den Drucker zu aktivieren, ohne dass er zuvor ausgeschaltet war. | ||
NUL bereits eingeschaltet | NUL bereits eingeschaltet | ||
Zeile 520: | Zeile 556: | ||
Alias-Name ist zu lang | Alias-Name ist zu lang | ||
Ihr Alias Name | Ihr Alias Name für eine Variable ist zu lang, und sollte verkürzt werden. | ||
== Debugging == | |||
* Versetzen Sie den OrgaMon in den Diagnosemodus, nun entstehen 2 Dateien | |||
** Fehler-Protokoll .\Diagnose\D-BASIC-ERROR-*.log.txt | |||
** Ausgabe (PRINT) .\Diagnose\D-BASIC-RUN-*.log.txt | |||
== Tipps für Programmierer == | |||
Bei BASIC-Programmen hat der Programmierer alle | Bei BASIC-Programmen hat der Programmierer alle Möglichkeiten ein Programm | ||
undurchsichtig zu gestalten. BASIC wird jedoch dennoch eingesetzt, da die | undurchsichtig zu gestalten. BASIC wird jedoch dennoch eingesetzt, da die | ||
Sprache recht einfach und sicher funktioniert und sich im Nu kleine Programme | Sprache recht einfach und sicher funktioniert und sich im Nu kleine Programme | ||
erstellen lassen. Beachten Sie jedoch einige goldene Regeln der BASIC-Welt. | erstellen lassen. Beachten Sie jedoch einige goldene Regeln der BASIC-Welt. | ||
1. In den ersten Zeilen des Programms sollte eine Liste aller Variable | 1. In den ersten Zeilen des Programms sollte eine Liste aller Variable geführt | ||
werden, die das Programm verwendet. Dadurch stellen Sie sicher, | werden, die das Programm verwendet. Dadurch stellen Sie sicher, dass Sub-Module | ||
Ihre wichtigen Werte nicht | Ihre wichtigen Werte nicht überschreiben dürfen. | ||
REM Variablen, und ihre Verwendung | REM Variablen, und ihre Verwendung | ||
Zeile 538: | Zeile 581: | ||
REM Z = Laufvariable, freie Verwendung | REM Z = Laufvariable, freie Verwendung | ||
2. Benutzen Sie | 2. Benutzen Sie für Labels nicht einfach die Namen "Start", "Stop" oder | ||
"Schleife", sondern versehen Sie die Namen mit einem Kontext-Hinweis: | "Schleife", sondern versehen Sie die Namen mit einem Kontext-Hinweis: | ||
"O2.Start", oder "Druck.Ende" usf. | "O2.Start", oder "Druck.Ende" usf. | ||
3. Bedenken Sie immer, | 3. Bedenken Sie immer, dass Ihre BASIC-Software nur dann nicht von Ihrem | ||
Nachfolger | Nachfolger gelöscht wird, wenn sie lesbar und einfach geschrieben ist. | ||
Vermeiden Sie wildes Hin- und Herspringen. Machen Sie einen PASCAL-Kurs um | Vermeiden Sie wildes Hin- und Herspringen. Machen Sie einen PASCAL-Kurs um | ||
dann BASIC zu programmieren. | dann BASIC zu programmieren. | ||
== Datenbank-Anbindung mit Kontext-Tabellen == | |||
Um auch Listen ausdrucken zu | Um auch Listen ausdrucken zu können stehen Ihnen besondere Druckvariable zur | ||
Verfügung. Mit Hilfe dieser Varibale können Sie z.B. in einer KFZ-Datenbank | |||
von Fahrzeug zu Fahrzeug | von Fahrzeug zu Fahrzeug blättern, bis das Datenbankende erreicht ist. | ||
[??.ERSTER] | [??.ERSTER] blättert zum ersten Datensatz | ||
[??.N�CHSTER] | [??.N�CHSTER] blättert zum nächsten Datensatz | ||
[LISTE-ENDE] zeigt an, | [LISTE-ENDE] zeigt an, dass das Ende der Datenbank erreicht ist. | ||
Programmbeispiel zur KFZ-Listenausgabe. | Programmbeispiel zur KFZ-Listenausgabe. | ||
Zeile 561: | Zeile 604: | ||
PRINT [GW.ERSTER] | PRINT [GW.ERSTER] | ||
" | "nächstes KFZ" | ||
IF [LISTE-ENDE] THEN "Ende" | IF [LISTE-ENDE] THEN "Ende" | ||
PRINT [GW.Marke/Typ] & [GW.Modell] | PRINT [GW.Marke/Typ] & [GW.Modell] | ||
PRINT [GW. | PRINT [GW.NÄCHSTER]; | ||
GOTO " | GOTO "nächstes KFZ" | ||
"Ende" | "Ende" | ||
PRINT "Ende der Liste erreicht" | PRINT "Ende der Liste erreicht" | ||
[ENDE-BASIC] | [ENDE-BASIC] | ||
Datenbank Anbindung | Datenbank Anbindung über freies SQL | ||
a) Beispiel: Ermitteln der Programmversion | a) Beispiel: Ermitteln der Programmversion |
Aktuelle Version vom 23. Januar 2024, 14:15 Uhr
Vorwort
BASIC ist die Abkürzung für Beginners All purpose Symbolic Instruction Code. BASIC wurde in den Jahren 1963-1965 am Dartmouth College in Hanover (USA) entwickelt, und gehörte zu den am weitesten verbreiteten Programmiersprachen auf kleinen Rechnern bis 1985.
D-BASIC entstand in Anlehnung an diese erfolgreiche Programmiersprache und steht für Druckvorlagen-BASIC.
D - BASIC
Bei der Anpassung des OrgaMon an Anforderungen des Anwenders kommt man mit statischen Parametern oft nicht weiter. An diesen Stellen hilft eine freie Programmier-Möglichkeit am besten weiter. Der End-Anwender des OrgaMon hat selbst Zugriff auf diese Programmierung und kann individuelle Anforderungen an den OrgaMon selbst realisieren. Inerhalb des OrgaMon wird D-BASIC breit eingesetzt:
- Druckvorlagen: die Drucker-Ausgabe (Druckvorlagen, also html-Generatoren) mit Hilfe von Druckvorlagen / Etiketten für noch mehr Flexibilität.
- OLAP: erhöht die Flexibilität bei der Ermittlung einer OLAP-Abfrage Dimension Add-On für SQL-Statements
- Vor Beleg-Buchungen, um z.B. Marketing-Aktionen automatisiert zu steuern
- Nimmt Buchungserweiterungen bei Verträgen und Belegen vor
- In der Tagwache und dem Tagesabschluss (via OLAP)
Historie
D-BASIC hat bereits eine lange Geschichte und war bereits in der "RAGAL" Software integriert, ein Vorgänger des OrgaMon.
- 12.12.1991 erste Version fürs RAGAL.
- 11.04.1992 "PRN" und "NUL" eingeführt
- 16.02.1993 Erweiterung für TÜV Hannover "CALL"
- 01.01.1995 Integration ins AA2 / AA3
- 16.12.2003 Basic32 ist nun ein Objekt / Portierung Turbo-Pascal -> Delphi
- 12.12.2006 Erweitert um PREIS ( ) Funktion (erstmalige Anbindung an eCommerce)
- 19.07.2010 Integration ins OLAP
- 09.07.2014 Integration in die Beleg-Buchung / Portierung Delphi -> FreePascal
BASIC Einführung
Lektion 1: REM, PRINT, LET, VAL
REM ist die Abkürzung für Remark und bedeutet Kommentar. Hier können Sie also Ihr Programm kommentieren, alle Eingaben hinter dem REM-Bezeichner werden ignoriert. PRINT ("Drucke!") Gibt Texte oder Zahlen auf dem Drucker (oder Bildschirm) aus. LET ("Es sei") wird benutzt, um Zwischenergebnisse in einer Variable zwischenzuspeichern. Variable sind Schubladen, die Sie mit Namen versehen können. Dort werden Werte gespeichert bis Sie diese wieder verwenden. In diesem Fall geschieht das sofort in der nächsten Zeile. VAL ("Wert") wandelt das wissenschaftliche Zahlenformat (3.4982398E+02) in ein besser lesbares Format um, dazu müssen die Anzahl der Vorkommastellen und die Anzahl der Nachkommastellen angegeben werden.
REM mein erstes Programm: PRINT "2"+"2"
Wenn Sie nun Ihr Programm starten (d.h. <F4>-drucken oder <F5>-Layout) erhalten Sie die Ausgabe
4.0000000000E+00
Die ist zwar genau richtig, dennoch haben Sie sicher ein schlichteres Ergebnis erwartet, z.B. einfach nur 4,0. Wir verfeinern also unser Programm:
REM mein erstes Programm: LET ERGEBNIS="2"+"2" PRINT VAL(ERGEBNIS,"2","1")
Nach dieser kleinen Änderung sieht die Ausgabe schon besser aus: 4,0 2 und 2 zu addieren ist uns jedoch zu wenig. Jetzt soll der Benutzer bestimmen, welche Werte eingegeben werden sollen.
Lektion 2: INPUT
INPUT ("Eingabe") stoppt den Programmablauf, und fordert den Benutzer auf, eine Eingabe zu tätigen.
Die Benutzereingabe erfolgt durch den INPUT-Befehl.
INPUT "Geben Sie die erste Zahl ein:",XWERT INPUT "Geben Sie die zweite Zahl ein:",YWERT LET ERGEBNIS=XWERT+YWERT PRINT VAL(ERGEBNIS,"2","1")
Lektion 3: IF, GOTO, Sprungmarke
Da es im D-Basic keine Zeilen-Nummern gibt, müssen Sprungziele durch sogenannte Sprungmarken markiert werden. Dies geschieht einfach durch Strings, die am Anfang der Zeile angegeben sind.
LET A="0" "Start-Loop" PRINT "HALLO Nummer " & VAL(A,"2","0") LET A=A+"1" IF A="10" THEN "Ende" GOTO "Start-Loop" "Ende" PRINT "Fertig"
Das erste "sinnvolle" Programm errechnet den Durchschnittlichen Verbrauch Ihres KFZ; z.B. nach einer Urlaubsreise.
"Start" INPUT "KM-Stand (Tank leer, frisch getankt)",KM0 IF KM0="0" THEN "Ende" INPUT "KM-Stand (Tank wieder leer)",KM1 IF KM1="0" THEN "Ende" INPUT "Liter-Sprit",L IF L="0" THEN "Ende" INPUT "Liter-Preis",PREIS IF PREIS="0" THEN "Ende" LET KM=KM1-KM0 LET VERBRAUCH100=(L/KM)*"100" LET KOSTENKM=(L*PREIS)/KM PRINT "gefahrene kM : " & VAL(KM,"6","2") PRINT "Benzinkosten pro kM : " & VAL(KOSTENKM,"6","2") & " DM" PRINT "Verbrauch pro 100 kM : " & VAL(VERBRAUCH100,"6","2") & " DM" GOTO "Start" "Ende"
"Start" und "Ende" sind sogenannte Sprungmarken, d.h. an diesen Stellen können Sie die Programmausführung wiederholen oder fortsetzen. Sie können also mit Hilfe des GOTO-Befehls im Programm die Ausführung des Programmes an diesen benannten Stellen fortsetzen. Dabei kann man zurück und vorspringen.
Lektion 4: GOSUB, RETURN
GOTO springt an eine andere Stelle des Codes. Erst mal dort angelangt weiß BASIC nicht mehr von woher es gesprungen kam. GOSUB merkt sich das und kann die Arbeit an alter Stelle wieder aufnehmen. Dadurch lassen sich Code-Teile anspringen, die mehrfach von unterschiedlichen Stellen des Programmes immer wieder benutzt werden.
LET A="10" GOSUB "Ausgabe" LET A="102" GOSUB "Ausgabe" GOTO "Ende" "Ausgabe" PRINT "Mein Wert ist " & VAL(A,"10","5") RETURN "Ende"
Reservierte BASIC-Bezeichner
'&' String Addierung '+' Zahlen Addition '-' Zahlen Subtraktion '*' Zahlen Multiplikation '/' Zahlen Division '=' Zahlen und String Identität '(' Klammerung von Formeln und Funktionen ')' Klammerung von Formeln und Funktionen '"' String Begrenzer '[' Alias und Variablen Begrenzer ']' Alias und Variablen Begrenzer ';' für PRINT ohne Zeilenumbruch ',' Komma zur Parameter-Abtrennung '>' Größer-Operator Strings/Zahlen '<' Kleiner-Operator Strings/Zahlen 'IF' Bedingte Abfrage mit GOTO oder GOSUB-Sprung 'OR' logisches ODER Verknüpfung 'LET' Variablen Zuweisung 'REM' Einleitung eines Kommentars 'AND' logische UND Verknüpfung 'NOT' logische NICHT Negierung 'LEN' String-Länge bestimmen 'MID' Sub-String ausschneiden 'VAL' Wert aus einen String bilden 'POS' Position eines Sub-Strings bestimmen 'SQL' Ermittle das Ergebnis eines SQL Statements. Es kann nur ein einzelne Zelle ermittelt werden 'THEN' IF Statement Begrenzung 'FILL' Wiederholung eines Strings 'GOTO' Sprung-Anweisung 'PRINT' String-Ausgabe auf Drucker ";" am Ende -> kein Zeilenumbruch "<x>","<y>","<Bild-Dateiname>" gibt eine Grafik aus 'GOSUB' Aufruf einer Subroutine 'INPUT' Eingabe über Bildschirm 'ALIAS' einer Variable einen extern sichtbaren Namen geben 'RETURN' Rücksprung aus einer Subroutine 'END' Beendet das BASIC-Programm 'ABORT' Bricht das BASIC-Programm ohne Druck ab 'ROUND' Runden von Zahlenwerten 'DEBUG' Aktiviert den Debuggermodus 'FOPEN' öffnet die Text-Datei 'FCREATE' erzeugt eine neue Text-Datei 'FPRINT' Ausgabe eines Strings in eine Datei 'FINPUT' Auslesen einer Datei 'FCLOSE' Schließen einer Text-Datei 'FSORT' Sortieren einer Text-Datei 'SYSTEM' Ein DOS-Programm wird aufrufen 'DEVICE' Wählt das Ausgabegerät aus (den Drucker) Wählt das Ausgabe-Formular aus 'MOVE' Setzt die Druckposition (x,y) 'FONT' Setzt die Druckschrift (Fontname,Grösse,Attribute[italic,bold,underline])
Besondere Variable
TITEL Titel des Dokumentes im Druckspooler ANZAHL Anzahl der Druckexemplare (mit "MENGE" der Warenbewegung initialisiert) FORMULAR Druckausgabe Formular das verwendet werden soll X Offset X der ersten Druckposition Y Offset Y der ersten Druckposition ZEILE Aktuelle Zeilennummer des D-BASIC Scripts (Wird nur im Debug-Modus gesetzt!)
Unterschiede zum normalen BASIC
D-BASIC hat einigen Balast abgeworfen, die ältere BASIC-Varianten mit sich tragen müssen. Dadurch ist es jedoch nur in gewissem Umfang kompatibel zu anderen BASIC-Dialekten.
- So gibt es keine Zeilen-Nummern mehr
- Es muß mit Sprungmarken gearbeitet werden
- Die Variable müssen kein "$" am Anfang haben
- Arrays bzw. das DIM Statement wird nicht unterstützt
- Datenbank Integration mit '[' DATENBANK-FELDNAME ']'
- Programmzeilen können mit '#' am Ende mit der nächsten Zeile verbunden werden
Daten-Typen
Der größte Unterschied zu Standard-BASIC ist, dass keine verscheidenen Daten-Typen mehr gibt, sondern nur noch den Datentyp String. Sie können dennoch mit Zahlen arbeiten oder mit logischen Ausdrücken, beachten Sie jedoch, dass alle konstanten Werte immer als String geschrieben werden müssen:
1.2 muss als "1.2" oder "1,2" geschrieben werden TRUE muss als "Y" geschrieben werden FALSE muss als "N" geschrieben werden
Variablen-Namen
Variable sind beliebige Kombinationen aus Buchstaben und Zahlen, jedoch darf kein BASIC-Schlüsselwort (GOTO, IF, PRINT) in der Variable enthalten sein.
REM Fehlerhafte Variable!!! LET GOTO3="2837" IF PRINTIT THEN GOSUB "DruckeZeile"
Basic Syntax
Im folgenden wird der komplette Basic-Syntax beschrieben, nach welchem alle BASIC-Programme aufgelöst werden.
EOLId ist das Ende einer Zeile. Sid ist ein String. eps ist der Hinweis, das keine weitere Bearbeitung erfolgt (Epsilon ist die Leeren Anweisung).
RemId EOLId -> eps REM Jetzt wird gerechnet REM (c)by Heinz Spotlum, PEUS SYSTEMS LET X="10"*"120."+B REM ^^ das hier ggf. Ändern!
ReturnId EOLId -> eps
ENDId EOLId -> eps REM Jetzt endet die Programm-Ausführung REM In der nächsten Zeile END
lenId BraOpenId sId BraCloseId -> sId LET A="Sepp" PRINT A & " ist " & VAL(LEN(A),"3","0") & " Zeichen lang!"
BraOpenId sId BraCloseId -> sId IF ("X") THEN "Funktioniert"
sId concatid sId -> sId LET A=" Sehr " & "geehrter" & " Herr " & [NAME]
midId BraOpenId sId kommaId sId kommaId sId BraCloseId -> sId PRINT MID("Thomas Gottschalk","12","6") REM liefert "schalk"
valId BraOpenId sId kommaId sId kommaId sId BraCloseId -> sId REM Formatierte Ausgabe eines Wertes und Rundung PRINT VAL("1,2","4","3") REM liefert ___1,000
posId BraOpenId sId kommaId sId BraCloseId -> sId REM Position eines Strings in einem Sub-String PRINT POS("rot","Schrottplatz") REM liefert "4"
fillId BraOpenId sId kommaId sId BraCloseId -> sId REM mehrfach Addierung eines Strings PRINT FILL("X","10") REM ergibt "XXXXXXXXXX"
NotId sId -> sId IF NOT("X") THEN "Computer spinnt!"
sId andId sId -> sId IF (A AND NOT(B)) THEN "ok"
sId orId sId -> sId IF (A OR NOT(B)) THEN "kann sein"
sId MalId sId -> sId PRINT "10"*"120" REM ergibt "1.200"
sId DivId sId -> sId PRINT "102"/"1.23434" REM ergibt "78,23"
sId PlusId sId -> sId PRINT "102"+"300" REM ergibt "402"
sId MinusId sId -> sId PRINT "3"-"1" REM ergibt "2"
letid sId eqId sId EOLId -> eps LET A="Zeige Hilfe"
AliasId Sid eqId Sid EOLId -> eps LET A="10" ALIAS A="Aussen" IF [Aussen]="10" THEN "WeltInOrdnung"
sId EqId sId -> sId LET A= ([Druck]=[InnenDruck]) IF A THEN "Druck ausgeglichen"
sId GreaterId sId -> sId IF "10">"3" THEN "WeltInOrdnung"
sId LessId sId -> sId IF "10"<"123" THEN "WeltInOrdnung"
ifId sId thenId sid EOLId -> eps "Hallo" IF "X" THEN "Hallo" REM klassische Endlos-Schleife
ifId sId thenId Gosubid sid EOLId -> eps IF TESTEKURZ THEN GOSUB "Test" REM Sprung mit GOSUB, anstatt GOTO
printId sId SemiId EOLId -> eps REM Druckausgabe ohne Zeilen-Umbruch PRINT ABC; PRINT DEFG REM ergibt "ABCDEFG" auf dem Drucker
printId sId EOLId -> eps REM Druckausgabe mit Zeilen-Umbruch PRINT "Hallo Welt" PRINT "hier ist die 2. Zeile" REM ergibt REM Hallo Welt REM 2. Zeilen
printId EOLId -> eps REM nur Zeilen-Vorschub PRINT REM ergibt eine leere Zeile
gotoId sId EOLId -> eps "Hallo" PRINT "Hallo" GOTO "Hallo"
gosubId sId EOLId -> eps GOTO "Start" "HilfsProgramm" PRINT "Hier bin ich jetzt" RETURN "Start" GOSUB "HilfsProgramm" PRINT "und jetzt wieder hier" GOSUB "HilfsProgramm" PRINT "und jetzt wieder da"
sId EOLId -> eps "Start" REM ^ Dies ist die Sprung-Marke Start
nulid EOLId -> eps REM NUL unterbricht die Druckausgabe NUL PRINT "XYZ" PRN PRINT "ABC" REM ergibt nur "ABC"
prnId EOLId -> eps REM PRN schaltet die Druckausgabe wieder ein NUL PRINT "XYZ" PRN PRINT "ABC" REM ergibt nur "ABC"
InputId Sid kommaid Sid -> eps LET A="Anton Müller" INPUT "Geben Sie Ihren Namen ein",A PRINT "Ihr Eingabe ist " & A LET J="J" INPUT "Ist das ok?",J IF (J="J") OR (J="j") THEN "Drucken" GOTO "Ende" "Drucken" PRINT "Hallo "& A "Ende"
RoundId BraOpenId sId BraCloseIdSid -> Sid LET A=DRUCK/"1283.2736" LET DRUCK=ROUND(DRUCK*"10") REM ^^ runden auf 1. Nachkommastelle PRINT VAL(DRUCK,"10","2")
DEBUGId -> eps DEBUG REM ^^^^^Ab hier soll das Programm kontrolliert werden PRINT VAL("2.3","10","2")
FOPEN sid -> eps FOPEN "C:\autoexec.bat" REM Die Datei AUTOEXEC.BAT wird geöffnet REM sie kann mit FINPUT eingelesen werden REM Erfolg der Aktion steht in [LISTE-ENDE]
FCREATE sid -> eps FCREATE "TEST.TXT" FPRINT "Name;Straße;Ort" "Schleife" FPRINT [K.Name] & ";" ; FPRINT [K.Straße] & ";" ; FPRINT [K.Ort] FCLOSE
FPRINT sid [ ";" ] -> eps REM Ausgabe von Strings erfolgen in geöffnete REM Dateien (FCREATE). REM um die Ausgabe ordnungsgemäß abzuschließen REM nach dem letzten FPRINT- Befehl ein FCLOSE REM folgen
FINPUT sid -> eps FOPEN "C:\AUTOEXEC.BAT" REM Die aktuelle Text-Datei (FOPEN) wird REM ausgelesen! "Einlesen" FINPUT INPSTR IF [LISTE-ENDE] THEN "Ende" PRINT INPSTR GOTO "Einlesen" "Ende" FCLOSE
FCLOSE -> eps FCLOSE REM Die aktuelle Text-Datei wird geschlossen REM nach Eingabe (FINPUT) und Ausgabe (FOUTPUT) REM notwendig!
FSORT sid -> eps FSORT "KUNDE.STR" REM Die aktuelle Datei wird sortiert REM Die Datei darf nicht "offen" sein. REM ggf. zuvor mir FCLOSE schließen
SYSTEM sid -> eps Verlässt das Programm, um ein anderes DOS-Programm auszuführen. Oder auch einen Batch-File. Damit können andere Hilfsprogramme gerufen werden.
REM ********************************************* REM Ein FAX senden REM ********************************************* FCREATE "MYFAX.TXT" FPRINT "Hallo Hubi, wie gehts Dir?" FPRINT "Bitte ruf mal an:" FPRINT [K.Name] FPRINT [K.Ort] FCLOSE SYSTEM "SEND C:\PEUS\MYFAX.TXT"
Fehler-Meldungen und ihre Behebung
zuviele Objekte pro Zeile Ihre Berechnungs-Formel ist zu lang oder hat zu viele Klammern bzw Einzel-Objekte. Zerlegen Sie die Zeile in mehrere Teil-Schritte.
] erwartet Ihre Druckvariable muss immer mit "[" und "]" umschlossen werden.
" erwartet Ihr String-Bezeichner endet nicht mit ".
Sprungmarke zu lang Verkürzen Sie den symbolischen Bezeichner Ihrer Sprungmarke.
Sprungmarke bereits vergeben Benutzen Sie einen anderen eindeutigen Namen für Ihre Sprung-Marke.
Zu viele Labels Ihr Programm hat zuviele Sprung-Marken und ist somit für das ASR-BASIC zu komplex. Wenden Sie sich an den Software-Hersteller.
Zu tiefe GOSUB-Verschachtelung oder Rekursion Vermutlich wird ständig mit GOSUB ein Programm-Teil aufgerufen, ohne dass dieser mit RETURN ordnungsgemäß verlassen wird. Unter Umständen wird mit GOTO direkt das Unterprogramm verlassen. Zur Einkreisung des Fehlers leistet der Debugger gute Dienste.
RETURN ohne vorherigen GOSUB-Aufruf Ein Unterprogramm wurde versehentlich mit GOTO anstatt mit GOSUB angesprungen, das GOTO liefert keine Information wohin der Rücksprung zu erfolgen hat.
Sprungmarke unbekannt Mit GOTO oder GOSUB oder IF .. THEN " " wird ein Label angesprungen, das nicht definiert ist.
Anweisung unverständlich Die Basic-Syntax wurde nicht eingehalten. Sehen Sie sich die Beispiele an, wie Befehle verwendnet werden. Im Besonderen kann eine Klammerung falsch sein.
Variable erwartet Die Basic-Syntax erwartet an dieser Stelle eine Variable, und keinen konstanten Ausdruck. Benutzen Sie die Variable A bis Z.
Sprungmarke falsch formuliert eine Sprungmarke kann nicht angelegt werden.
Abbruch durch Tastendruck Ihr Programm wurde durch Tasten-Druck unterbrochen. Es muss ggf. nochmals gestartet werden.
Bitte gültige Variable angeben Es wurde zwar der Name einer Variable angegeben, jedoch ist diese nicht als Variable zugelassen. So kann z.B. X7 nicht als Variablen-Name verwendet werden.
Division durch "0" Prüfen Sie bei Divisionen zunächst den Divisor auf Identität mit "0" ab.
Variable ergibt keine Zahl Es wurde versucht mit einem String zu rechnen, der keinen gültigen Zahlenwert ergibt.
Bitte [ENDE-BASIC] einfügen Es fehlt in Ihrem Programm das [ENDE-BASIC] Satement. Am Ende Ihres Textes sollte sich das Programm im normalen Ausgabe - Modus befinden.
PRN ohne NUL Es wurde versucht den Drucker zu aktivieren, ohne dass er zuvor ausgeschaltet war.
NUL bereits eingeschaltet Es wurde versucht den Drucker auszuschalten, obwohl zuvor der Drucker bereits deaktiviert war.
Alias-Name ist zu lang Ihr Alias Name für eine Variable ist zu lang, und sollte verkürzt werden.
Debugging
- Versetzen Sie den OrgaMon in den Diagnosemodus, nun entstehen 2 Dateien
- Fehler-Protokoll .\Diagnose\D-BASIC-ERROR-*.log.txt
- Ausgabe (PRINT) .\Diagnose\D-BASIC-RUN-*.log.txt
Tipps für Programmierer
Bei BASIC-Programmen hat der Programmierer alle Möglichkeiten ein Programm undurchsichtig zu gestalten. BASIC wird jedoch dennoch eingesetzt, da die Sprache recht einfach und sicher funktioniert und sich im Nu kleine Programme erstellen lassen. Beachten Sie jedoch einige goldene Regeln der BASIC-Welt.
1. In den ersten Zeilen des Programms sollte eine Liste aller Variable geführt werden, die das Programm verwendet. Dadurch stellen Sie sicher, dass Sub-Module Ihre wichtigen Werte nicht überschreiben dürfen.
REM Variablen, und ihre Verwendung REM A = Druck REM B = Betriebs-Status REM C = privat von Modul "O2" nicht verwenden, usf. REM Z = Laufvariable, freie Verwendung
2. Benutzen Sie für Labels nicht einfach die Namen "Start", "Stop" oder "Schleife", sondern versehen Sie die Namen mit einem Kontext-Hinweis: "O2.Start", oder "Druck.Ende" usf.
3. Bedenken Sie immer, dass Ihre BASIC-Software nur dann nicht von Ihrem Nachfolger gelöscht wird, wenn sie lesbar und einfach geschrieben ist. Vermeiden Sie wildes Hin- und Herspringen. Machen Sie einen PASCAL-Kurs um dann BASIC zu programmieren.
Datenbank-Anbindung mit Kontext-Tabellen
Um auch Listen ausdrucken zu können stehen Ihnen besondere Druckvariable zur Verfügung. Mit Hilfe dieser Varibale können Sie z.B. in einer KFZ-Datenbank von Fahrzeug zu Fahrzeug blättern, bis das Datenbankende erreicht ist.
[??.ERSTER] blättert zum ersten Datensatz [??.N�CHSTER] blättert zum nächsten Datensatz [LISTE-ENDE] zeigt an, dass das Ende der Datenbank erreicht ist. Programmbeispiel zur KFZ-Listenausgabe.
[START-BASIC] PRINT [GW.ERSTER]
"nächstes KFZ" IF [LISTE-ENDE] THEN "Ende" PRINT [GW.Marke/Typ] & [GW.Modell] PRINT [GW.NÄCHSTER]; GOTO "nächstes KFZ" "Ende" PRINT "Ende der Liste erreicht" [ENDE-BASIC]
Datenbank Anbindung über freies SQL
a) Beispiel: Ermitteln der Programmversion
LET V1 = SQL( "SELECT MAX(RID) FROM REVISION" ) LET V1 = MID (V1,"1","1") & "." & MID (V1,"2","3") PRINT "OrgaMon Rev. " & V1
b) Verlags/Lieferantnamen ermitteln
PRINT SQL ( "select SUCHBEGRIFF from PERSON where RID=" & [ARTIKEL.VERLAG_R] )