C 64
Grafik

Schwarz auf weiß

Mit den folgenden Änderungen zum Programm »Database« (Sonderheft 7/85) ist es nun auch möglich, Datensätze auf dem Drucker auszugeben. Außerdem können Sie leicht eigene Ideen verwirklichen, zum Beispiel Etikettendruck oder ähnliches.

Um die erforderlichen Änderungen an Database vorzunehmen, gehen Sie bitte wie folgt vor:

  1. Bitte laden Sie das Programm »DBII« (Datenpflege).
  2. Anschließend geben Sie die in Listing 1 enthaltenen Programmzeilen ein. Bei den Zeilen 330 und 3500 müssen die einzelnen Befehle abgekürzt eingegeben werden (siehe auch Anhang D in der Bedienungsanleitung Ihres C 64).
  3. Zum Schluß speichern Sie das geänderte Programm — nachdem Sie die alte Version gelöscht haben — mit »SAVE "DBII", 8« wieder auf Diskette.

Die neuen Kommandos

Neu hinzugekommen sind drei Kommandos im Menüpunkt »Daten ausgeben« (im Teil »Datenpflege«).

Das erste Kommando erreichen Sie durch Drücken der Taste »C«. Mit ihm ist es möglich, den gerade im Speicher befindlichen Datensatz noch einmal einzulesen und auf dem Bildschirm auszugeben. Dabei kann auch zwischenzeitlich in einen anderen Programmteil verzweigt werden.

Ein Beispiel: Sie haben über die Indexsuche einen bestimmten Datensatz selektiert. Nun möchten Sie — aus welchen Gründen auch immer — in den Programmteil »directory ausgeben« verzweigen. Wenn Sie dann anschließend wieder in die Datenausgabe zurückkehren und mit dem zuvor selektierten Datensatz weiterarbeiten wollen, blieb bisher nur die Möglichkeit, diesen nochmals suchen zu lassen. Jetzt drücken Sie einfach die »C«-Taste und der betreffende Datensatz wird wieder in Ihren C 64 geladen und auf dem Bildschirm ausgegeben!

Besonders interessant wird der »C«-Befehl auch im Zusammenhang mit dem zweiten Kommando, das die Ausgabe von Datensätzen auf den Drucker ermöglicht: Durch Drücken der Taste »P« wird die Druckerausgabe ein-, durch Drücken von »O« wieder ausgeschaltet. Außer im Programmteil »Daten ausgeben« kann die Druckerausgabe auch im Hauptmenü (mit denselben Tasten) ein- oder ausgeschaltet werden. Im Hauptmenü wird die eingeschaltete Druckerausgabe durch den Schriftzug »Ausgabe auf Drucker!« (im unteren Bildschirmbereich); im Teil »Daten ausgeben« durch ein »P« in der Kopfzeile (anstelle des»/«nach dem Dateinamen) angezeigt.

Wenn Sie jetzt — bei eingeschalteter Druckerausgabe — einen Datensatz in den Computer laden, so erfolgt die Ausgabe gleichzeitig auf Drucker und Bildschirm! Bei der Druckerausgabe wird dabei jedes Datenfeld in einer neuen Zeile zu Papier gebracht. Am Ende eines Datensatzes werden jeweils zwei Leerzeilen (zur Abtrennung mehrerer Datensätze voneinander) gedruckt.

Um auf den »C«-Befehl zurückzukommen: Wenn Sie sich nicht sicher sind, ob Sie einen bestimmten Datensatz ausdrucken wollen oder nicht, so laden Sie diesen zunächst bei ausgeschalteter Druckerausgabe. Haben Sie sich dann für einen Ausdruck entschieden, schalten Sie jetzt mit »P« die Druckerausgabe ein und drücken anschließend »C« und schon wird der Datensatz ausgedruckt! Danach können Sie mit »O« die Druckerausgabe wieder ausschalten, um nach weiteren Datensätzen zu suchen.

Die Ausgaberoutinen von Database

Wenn Sie selbst Änderungen an Database, speziell an den Ausgaberoutinen, vornehmen wollen, dann werden Ihnen die folgenden Erläuterungen dabei sehr hilfreich sein.

Alle Datensatzausgaben von Database werden zentral von zwei kleinen Unterprogrammen abgewickelt (siehe Listing 2). Dadurch ist es sehr einfach, hier weitgreifende Änderungen vorzunehmen.

Die erste Routine (Zeilen 6355 bis 6397) liest einen Datensatz Datenfeld für Datenfeld in die Variable EG$ ein. Bei einer Datenfeldlänge von mehr als 255 Zeichen wird das Datenfeld in mehreren (bis zu drei) Teilen eingelesen. Ist das Feld zum Beispiel 600 Byte lang, so wird es auf folgende Weise geladen: Zuerst zweimal 255 (= 510) Byte, anschließend die restlichen 90 Byte.

Jedesmal, wenn ein neues Daten(teil)feld in EG$ eingelesen wurde, wird in das zweite Unterprogramm (Zeilen 6415 bis 6478) verzweigt, wo dann die Ausgabe auf dem Bildschirm (oder Drucker) erfolgt.

Diese zweite Routine bietet den besten Ansatzpunkt für Erweiterungen. Wie leicht hier Veränderungen möglich sind, sehen Sie anhand der zusätzlich eingebauten Druckerausgabe.

In Zeile 6415 wird zunächst kontrolliert, ob die Variable XX den Wert 1 enthält. Ist das der Fall, so wird in die Druckerroutine ab Zeile 6475 verzweigt. Ansonsten (und auch nach erfolgter Druckerausgabe) wird mit der alten Routine (zur Bildschirmausgabe) fortgefahren.

Genausogut wie in die Zeile 6475 verzweigt wird, kann natürlich zu jeder beliebigen anderen Stelle gesprungen werden! So wäre es zum Beispiel ohne weiteres denkbar (auch zusätzlich zur gleichzeitig stattfindenden Bildschirm-Druckerausgabe), Datensätze in eine sequentielle Datei schreiben zu lassen, um sie dann an anderer Stelle in einer Textverarbeitung zur Serienbrieferstellung weiterzuverarbeiten.

Das Prinzip zum Schreiben in eine sequentielle Datei ist im Grunde genommen dasselbe wie zur Ausgabe auf den Drucker. Schauen wir uns also die Druckerroutine etwas genauer an.

In Zeile 6475 wird eine Datei auf den Drucker (Geräteadresse 4) eröffnet.

In Zeile 6476 wird durch den Vergleich von S6 und Gl +1 ermittelt, ob es sich bei dem aktuellen Inhalt von EG$ um ein komplettes Datenfeld oder um ein Datenteilfeld handelt. Ist S6 nämlich ungleich G1 +1, dann befindet sich in EG$ ein Datenteilfeld (eines Datensatzes größer als 255 Zeichen). In diesem Fall wird der Wagenrücklauf am Ende des Ausdrucks durch das Semikolon hinter EG$ verhindert. Dadurch wird erreicht, daß das nächste Daten(teil)feld direkt dahinter ausgedruckt wird. Im gegenteiligen Fall, also wenn S6 = Gl + 1, enthält EG$ ein komplettes Datenfeld beziehungsweise das letzte Teilfeld eines größeren Datenfeldes. In diesem Fall wird am Ende des Ausdrucks ein Wagenrücklauf erzeugt.

In Zeile 6478 wird dann die Datei wieder geschlossen und zur Aufrufstelle zurückgekehrt.

Um eine neue Funktion benutzen zu können, muß diese natürlich eingeschaltet (und möglichst auch ausgeschaltet) werden können. Wie das aussehen könnte, sehen Sie in den Zeilen 215 und 216 beziehungsweise 3029 und 3030 (Listing 1). Die Variable EG enthält jeweils den ASC-Code der gedrückten Taste. Entsprechend dieser Taste wird dann die Variable XX, die ja bei der Datensatzausgabe kontrolliert wird, auf 0 oder 1 gesetzt (und eventuell eine Meldung auf dem Bildschirm ausgegeben).

Noch ein Tip: Nähere Informationen zu allen verwendeten Variablen finden Sie in den Tabellen 5 und 6 im Artikel zu Database (Sonderheft 7/85, Seite 94/95). Bei allen Änderungen sollten Sie jedoch folgendes beachten:

Kleinere Ergänzungen, wie zum Beispiel einen Etikettendruck, für denja an sich nur druckerspezifische Steueranweisungen eingefügt werden müssen, können ohne weiteres direkt in die Ausgaberoutine integriert werden. Bei umfangreicheren Erweiterungen sollten Sie allerdings auf einen neuen Programmteil ausweichen, da der für die Variablen zur Verfügung stehende Speicherplatz ohnehin sehr knapp ist und jeder hinzukommende Basictext die Maximalanzahl der Datenfelder weiter herabsetzt.

Zur Erinnerung: Ein zusätzliches Programm kann ohne weiteres in das Gesamtsystem integriert werden, vorausgesetzt es erfüllt zwei Bedingungen: Es ist, zumindest teilweise, ein Basicprogramm, und es ist unter dem Namen »SOFT« auf Diskette gespeichert!

Im Lademenü kann dieses Programm dann über den Menüpunkt »Sonderfunktionen« (»F5«-Taste) aufgerufen werden.

Zum Schluß noch ein Wort zur Druckerausgabe:

Wie Sie sicher schon bemerkt haben, ist bei der Dateneingabe jedes Datenfeld mit einem Sonderzeichen (einem kleinen Punkt) vorbelegt. Wenn Sie bisher ein Datenfeld nicht in seiner ganzen Länge benötigten, konnten Sie den Restbereich getrost mit diesem Zeichen aufgefüllt lassen. Bei der Druckerausgabe wird aber nun natürlich nicht dieses Sonderzeichen, sondern das Originalzeichen (ein Grafikzeichen (CHR$(166)) gedruckt (was nicht gerade zur optischen Aufbesserung des Ausdrucks beiträgt). Um das zu vermeiden, sollten Sie bei der Dateneingabe oder nachträglich über die Änderungsfunktion (dazu drücken Sie bei der Datenausgabe die Taste »R«) alle Restbereiche mit einem Leerzeichen auffüllen.

(Martin Hecht/tr)
182 if xx=1 then ze=21:sp=10:gosub11050:print"{rvon}ausgabe auf drucker!{rvof}"

215 if eg=80 then xx=1:ze=21:sp=10:gosub11050:print"{rvon}ausgabe auf drucker!{rvof}"
216 if eg=79 then xx=0:ze=21:sp=10:gosub11050:print"                    "

330 fors1=20to5step-1:ze=s1:sp=5:gosub11050:printks$(110):nexts1:gosub405:poke2004,k:return

3016 if xx=1 then ze=0:sp==sgnsqrgosub>>050:print"{rvon}p{rvof}";
3025 ifug=1thendc=0:return
3026 gosub11455:ifeg=8thengosub6131:goto3030
3029 if eg=80 then xx=1:ze=0:sp=24:gosub11050:print"{rvon}p{rvof}";
3030 if eg=79 then xx=0:ze=0:sp=24:gosub11050:print"{rvon}/{rvof}";
3031 if eg=67 then gosub 3500
3032 fors1=41to56:iffc%(s1)<>egthennexts1:goto3026

3500 ift3=-1thengosub9782:ze=23:ag$=ks$(52):gosub11585:poke2,1:sys51833:gosub9782:return
3501 gosub 3171:return

6390 close1:gosub9782:dc=1
6391 if xx=1 then open4,4:print#4:print#4:close4
6392 return

6415 if xx=1 then gosub 6475
6416 if s6<>1 then 6435

6475 open4,4:gosub6500
6476 ifs6<>g1+1 then print#4,eg$;:goto6478
6477 print#4,eg$
6478 close4:return
Listing 1. Diese Zeilen müssen Sie zum Programmteil »DBII« zusätzlich eintippen.
6350 rem--- datensatz einlesen ----------------------------------------------
6352 :
6355 gosub 9782:pg=es:gosub6010:ze=23:sp=7:gosub11050:printks$(49)c$c$:s2=0
6356 open1,8,2,dd$(si)+".r,l,"+chr$(254)
6357 print#15,"p"+chr$(2)+chr$(po(1))+chr$(po(2))+chr$(po(3))
6365 fors1=1toaf:g1=int(fd(s1,2)/255):g2=fd(s1,2)-g1*255
6367 fors6=1tog1+1:l1=255-po(3):ifs6<>g1+1thenh4=255:goto6375
6370 h4=g2
6375 ifl1>h4thenqx=h4:gosub6905:gosub6415:po(3)=po(3)+h4:nexts6:nexts1:goto6390
6380 ifl1=h4thenqx=h4:gosub6905:gosub6415:gosub6396:nexts6:nexts1:goto6390
6382 poke2,l1:poke69,90:poke70,215:sys52453:gosub6396:qx=h4-l1:gosub6905:eg$=zw$+eg$:gosub6415
6385 ifh4-l1=254thengosub6396:nexts6:nexts1:goto6390
6387 po(3)=po(3)+h4-l1:nexts6:nexts1
6390 close1:gosub9782:dc=1
6391 if xx=1 then open4,4:print#4:print#4:close4
6392 return
6396 po(3)=1:po(1)=po(1)+1:ifpo(1)=256thenpo(1)=0:po(2)=po(2)+1
6397 print#15,"p"+chr$(2)+chr$(po(1))+chr$(po(2))+chr$(po(3)):return
6400 :
6401 :
6402 :
6405 rem-- daten(teil)feld ausgeben -----------------------------------------
6407 :
6415 if xx=1 then gosub 6475
6416 if s6<>1 then 6435
6417 s2=s2+1:ifs2<=af%(pg)then6435
6420 gosub11243
6425 pg=pg+1:ifaf%(pg)=0then6425
6430 s2=1:gosub6010
6435 ifs6=1theng1=int(fd(s1,2)/255):h1=fd(s1,1)-50176:ze=int(h1/40):sp=h1-40*ze
6445 gosub11050:printeg$
6450 ifs6<>g1+1thenh1=h1+255:ze=int(h1/40):sp=h1-40*ze
6470 ifs1=afands6=g1+1thengosub11243:pg=es:gosub6010
6472 return
6475 open4,4:gosub6500
6476 ifs6<>g1+1 then print#4,eg$;:goto6478
6477 print#4,eg$
6478 close4:return
Listing 2. Dient nur der Erläuterung des Textes und braucht nicht abgetippt zu werden.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →