D - BASIC
Vorwort
D-BASIC ist die Abkürzung für Druckvorlagen 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 ist ein BASIC-Dialekt, der benutzt wird, um bei der Ausgabe von Druckvorlagen noch mehr Flexibilität zu erhalten.
BASIC Einführung
REM mein erstes Programm: PRINT "2"+"2"
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.
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")
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.
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. 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")
INPUT ("Eingabe") stoppt den Programmablauf, und fordert den Benutzer auf, eine Eingabe zu t�tigen.
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"
"Sprungmarke" "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 beliebig hin- und herspringen.
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 '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 "1" initialisiert) FORMULAR Druckausgabe Formular das verwendet werden soll X Offset X der ersten Druckposition Y Offset Y der ersten Druckposition
Besondere Tasten und Symbole
'[' Beginn eines Datenbankfeldes ']' Ende des Datenbankfeldes '#' am Ende der Zeile, verbindet diese Zeile mit der n�chsten, ohne einen Zeilenumbruch zu erzeugen.
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 Labels gearbeitet werden.
Labels
Da es im D-Basic keine Zeilen-Nummern gibt, m�ssen Sprungziele durch sogenannte Labels 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"
Daten-Typen
Der gr��te Unterschied zu Standard-BASIC ist, da� es 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, da� alle konstanten Werte immer als String geschrieben werden m�ssen:
1.2 mu� als "1.2" oder "1,2" geschrieben werden TRUE mu� als "Y" geschrieben werden FALSE mu� 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 Varibale enthalten sein.
REM Fehlerhafte Variable!!! LET GOTO3="2837" IF PRINTIT THEN GOSUB "DruckeZeile"
Arrays bzw. das DIM Statement wird nicht unterst�tzt.
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 LET A="10" GOSUB "Ausgabe" LET A="102" GOSUB "Ausgabe" GOTO "Ende" "Ausgabe" PRINT "Mein Wert ist " & VAL(A,"10","5") RETURN "Ende"
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��t 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 mu� 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 da� 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 mu� 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 da� 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.
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, da� 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, da� 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 �ber 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, da� 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] )