diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2019-02-04 13:09:03 +0100 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2019-02-04 13:09:03 +0100 |
commit | 04e68443040c7abad84d66477e98f93bed701760 (patch) | |
tree | 2b6202afae659e773bf6916157d23e83edfa44e3 /app/gs.warenhaus | |
download | eumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.gz eumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.bz2 eumel-src-04e68443040c7abad84d66477e98f93bed701760.zip |
Initial import
Diffstat (limited to 'app/gs.warenhaus')
22 files changed, 3920 insertions, 0 deletions
diff --git a/app/gs.warenhaus/1.01/doc/Anhang Warenhaus b/app/gs.warenhaus/1.01/doc/Anhang Warenhaus new file mode 100644 index 0000000..9388ceb --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/Anhang Warenhaus @@ -0,0 +1,65 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (100)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")##Anhang#off("b")# + +#on("b")##center#Muster für Codekarten#off("b")# + + +-------------------+ + | O O O O O O O O | + | | + | | + | | + | | + | | + | | + | | + | ----------------- | + +-------------------+ + + + + +--------------------+ + | | + | O O O O | + | | + | | + |W A R E N K A R T E | + | | + | | + | Artikel | + | ---------------- | + | | + +--------------------+ + +#page# + + + +------------------------+ + | | + | O O O O O O | + | | + | K U N D E N K A R T E | + | | + | | + | Name | + | ---------------------- | + | | + | | + +------------------------+ + + + + + + diff --git a/app/gs.warenhaus/1.01/doc/Inhalt Warenhaus b/app/gs.warenhaus/1.01/doc/Inhalt Warenhaus new file mode 100644 index 0000000..a9b720d --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/Inhalt Warenhaus @@ -0,0 +1,50 @@ +#limit (11.5)##pagelength (16.5)##pageblock# +#start (1.8,0.0)# +Inhaltsverzeichnis + + +1 Was kann gs-Warenhaus 1-1 + +2 Aufbau von gs-Warenhaus 2-1 + +3 Installation von gs-Warenhaus 3-1 +3.1 Voraussetzungen 3-1 +3.2 Lieferumfang 3-1 +3.3 Installation 3-2 +3.4 Einrichten mehrerer Hauptstellen 3-8 + +4 Anschluß eines Codekartenlesers 4-1 +4.1 Hardware-Voraussetzungen 4-1 +4.2 Verwendung des MUFI 4-2 +4.2.1 Einstellungen am MUFI 4-3 +4.2.2 MUFI im Terminalkanal 4-5 +4.2.3 MUFI als Endgerät 4-6 +4.3 Verwendung des AKTRONIC-Adapters 4-7 +4.4 Konfiguration der seriellen Schnittstelle 4-8 +4.5 Verbindung der Hardware-Komponenten 4-10 + +5 Beschreibung der Menufunktionen 5-1 +5.1 Kurzhinweise zur Bedienung des Menus 5-1 +5.2 Menufunktionen zum Oberbegriff 'Info' 5-4 +5.3 Menufunktionen zum Oberbegriff 'Eingabeart' 5-7 +5.4 Menufunktionen zum Oberbegriff 'Kommandos' 5-9 +5.5 Menufunktionen zum Oberbegriff 'Programme' 5-18 +5.6 Menufunktionen zum Oberbegriff 'Filialdaten' 5-24 +5.7 Menufunktionen zum Oberbegriff 'Archiv' 5-28 + +6 Beschreibung der Programmierschnittstelle 6-1 +6.1 Schreibweisen und Syntaxregeln in GRIN-Programmen 6-4 +6.2 Kontrollstrukturen 6-8 +6.3 Detailbeschreibung der Warenhaus-Grundbefehle 6-13 + +7 Weitere Kommandos (für Systembetreuer) 7-1 + +Anhang: Muster für Codekarten + + + + + + + + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus handbuch.impressum b/app/gs.warenhaus/1.01/doc/gs-Warenhaus handbuch.impressum new file mode 100644 index 0000000..3fbb371 --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus handbuch.impressum @@ -0,0 +1,89 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#gs-Warenhaus + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (4.0)##on("b")# +#center#gs-Warenhaus + + +#center#Benutzerhandbuch + + +#center#Version 1.0 + + +#off("b")##center#copyright +#center#Eva Latta-Weber +#center#Software- und Hardware-Systeme, 1988 +#center#ERGOS GmbH, 1990 +#page# +#block# +#center#____________________________________________________________________________ + + +Copyright: ERGOS GmbH März 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations + systemen, auch auszugsweise, nur mit schriftlicher Einwilligung + der ERGOS GmbH gestattet. + + +#center#____________________________________________________________________________ + +Es kann keine Gewähr übernommen werden, daß das Programm für eine +bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim +Anwender. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und +Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das +Handbuch kann jederzeit ohne Ankündigung geändert werden. + +Texterstellung : Dieser Text wurde mit der ERGOS-L3 Textverarbeitung + erstellt und aufbereitet und auf einem Kyocera Laser + drucker gedruckt. + + + + +#center#___________________________________________________________________________ + + + +Ergonomic Office Software GmbH + +Bergstr. 7 Telefon: (02241) 63075 +5200 Siegburg Teletex: 2627-2241413=ERGOS + Telefax: (02241) 63078 + + +#center#____________________________________________________________________________ + + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus-1 b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-1 new file mode 100644 index 0000000..ca79094 --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-1 @@ -0,0 +1,124 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#gs-warenhaus#right#% + +#end# +#headeven# +%#center#gs-warenhaus + +#end# +#center#1 Was kann gs-Warenhaus + + +Das Programmpaket #on("b")#gs-Warenhaus#off("b")# entstand auf der Grundlage der projekt +orientierten Unterrichtseinheit "WARENHAUS", die vom 'Landesinstitut für Schule +und Weiterbildung' (LSW) in Soest für den Bereich der 'Informations- und +kommunikationstechnologischen Grundbildung' (kurz: GRIN) entwickelt wurde. + +Unter #on("b")#1.1 Thema und Ziele #off("b")# ist in dem zugehörigen Begleitheft folgendes zu +finden: + +#i1#"Die Schülerinnen und Schüler sollen in dieser Unterrichtseinheit die An +wendungen neuer Technologien im Warenhaus kennenlernen und dabei sowohl +die grundlegenden technologischen Zusammenhänge erarbeiten als auch die +Auswirkungen reflektieren, die sich durch ihren Einsatz ergeben. Sie werden +dabei nicht nur die Rolle der Kunden einnehmen, sondern auch die Interessen +der Angestellten und die der Geschäftsleitung in ihre Beurteilung mit einbe +ziehen. + +Diese komplexen Zusammenhänge werden den Schülerinnen und Schülern im 8. +Schuljahr nähergebracht, indem sie veranlaßt werden, in einem Modell-Waren +haus selbst schrittweise das Modell eines Warenwirtschaftssystems aufzubauen +und damit zu arbeiten. + +In diesem Modell-Warenhaus kommt dem Umgang mit dem Computer eine +besondere Bedeutung zu. Mit Hilfe des Rechners, an den ein Codekartenleser +angeschlossen ist, und des zugehörigen Programms werden die wesentlichen +Bestandteile eines modernen Kassensystems abgebildet. + +Mit dem Codekartenleser kann das Merkmal des automatischen Dateneinlesens +vereinfacht dargestellt werden. Programmabläufe, Bildschirmausgaben werden +nicht nur über Tastatureingaben der Benutzer beeinflußt, sondern auch durch +das Lesen verschlüsselter Informationen. Am Beispiel des Lesegerätes wird zum +#page# +einen der Rationalisierungseffekt an der Kasse verdeutlicht, es lassen sich zum +anderen aber auch Fragen der Zugangsberechtigung durch maschinenlesbare +Ausweiskarten ansprechen. + +Das zur Verfügung stehende Programm erlaubt es, daß die Schülerinnen und +Schüler schrittweise die zentralen Funktionen eines modernen Warenwirtschafts +systems kennenlernen. Neben der maschinellen Datenerfassung mit Hilfe des +Lesegeräts und der Decodierung von Informationen sind dies z.B.: + +- automatische Abrechnung, +- Speicherung von Warendaten, +- Kontrolle des Lagerbestandes, +- Informationen über Verkaufszahlen, +- automatische Nachbestellung, +- Speicherung von Kundendaten, +- Zusammenfassung von Informationen aus verschiedenen Filialen, +- Erstellen von Übersichten. + +Die Schülerinnen und Schüler arbeiten dabei mit einer benutzerfreundlichen +Programmierumgebung. Diese bietet einerseits die Möglichkeit, die Befehle direkt +aufzurufen, mit denen alle Funktionen dieses vereinfachten Warenwirtschafts +systems ausgeführt werden können, wie etwa Dateien aufbauen, einkaufen und +Listen erstellen. Andererseits stellt die Programmierumgebung weitere Befehle +zur Verfügung, mit denen einige dieser Funktionen auch 'programmiert' werden +können."#off("b")# + +Soweit zu Thema und Zielen dieser Unterrichtseinheit. Für weitere didaktisch- +methodische Informationen zu dieser Reihe verweisen wir auf das entsprechende +Begleitheft des LSW. +(Vertrieb: Soester Verlagskontor, Jakobistraße 46, 4770 Soest; Bestellnummer 1710) +#page# +Da bei der Software-Entwicklung für GRIN vom LSW das Betriebssystem EUMEL nicht +mit berücksichtigt wird, erscheint es notwendig, durch Eigeninitiativen wenigstens +einige GRIN - Projekte unter EUMEL zur Verfügung zu stellen, um den Schulen, die +mit EUMEL arbeiten, nicht gänzlich den Zugang zu GRIN zu verwehren. + +Das Projekt WARENHAUS bietet sich dabei besonders an, weil die Vernetzungen +innerhalb eines Warenwirtschaftssystems mit einem Mehrplatz-System und der +Möglichkeit der Intertask-Kommunikation wesentlich wirklichkeitsnäher aufzeigbar +sind als mit einem reinen Einzelplatz-System wie z.B. MS DOS, bei dem die +Kommunikation nur über den Transport von Disketten geregelt wird. (Ein Netzwerk +ist in der Software der LSW nicht vorgesehen.) + +#on("b")#gs-Warenhaus#off("b")# umfaßt die wesentlichen Funktionen der vom LSW für MS DOS +erstellten Programmierumgebung WARENHAUS-2. Es ist jedoch keine genaue 'Nach +bildung' dieser Software, sondern eher eine Realisierung des 'Vorbildes' unter +Berücksichtigung der besonderen Gegebenheiten des EUMEL-Systems, wobei sowohl +am äußeren Erscheinungsbild als auch inhaltlich Änderungen und Erweiterungen +vorgenommen wurden. Eingebettet ist #on("b")#gs-Warenhaus#off("b")# in die menüorientierte +Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")#. + +Ein Codekartenleser kann in Verbindung mit einem Interface (z.B. dem MUFI der +Firma BICOS) verwendet werden, ist für die Nutzung des Programmes aber nicht +unbedingt erforderlich. + +Da zur Zeit der Entstehung dieses Programms GRIN an den Schulen noch nicht +etabliert ist und man mit (vorerst) nur einem Projekt dem Ansatz von GRIN sicher +nicht gerecht werden kann, ist #on("b")#gs-Warenhaus#off("b")# flexibel angelegt. Es enthält neben +einer Programmierumgebung, in der die vom LSW für GRIN entwickelten Befehle und +Syntaxregeln benutzt werden, eine weitere, in der in gewohnter ELAN-Syntax ge +arbeitet werden kann, so daß es z.B. ebenfalls für den Unterricht in Klasse 9/10 (für +spezielle Fragestellungen evtl. auch in der Sek. II) verwendbar ist. +#page# +Natürlich ist #on("b")#gs-Warenhaus#off("b")# #i1#kein#off("b")# Verwaltungsprogramm für 'echte' Warenhäuser +oder gar ganze Warenwirtschaftssysteme, es ist vielmehr ein Simulationsprogramm, +das die Vorgänge in solch einem System anhand eines stark vereinfachten Modells +klarmachen soll. Aus diesem Grunde werden Ihnen beim Umgang mit diesem Pro +gramm wahrscheinlich eine ganze Reihe von Erweiterungsmöglichkeiten und +Funktionen einfallen, die das Programm nicht bietet. Denken Sie dabei bitte aber +immer daran, daß #on("b")#gs-Warenhaus#off("b")# in erster Linie für den Einsatz in GRIN oder im +WP-Unterricht konzipiert wurde, vornehmlich also von absoluten 'Anfängern' auf dem +Gebiet des Umgangs mit Rechnern genutzt wird, die von einer zu großen Fülle von +Programmfunktionen nur verwirrt würden. + +Wir werden Ihnen in den folgenden Kapiteln dieses Handbuchs den Umgang mit den +Funktionsangeboten von #on("b")#gs-Warenhaus#off("b")# erklären, auf die Umsetzungsmöglichkeiten +der am Anfang dieses Kapitels erwähnten Ziele im Unterricht gehen wir jedoch nicht +ein. Beschaffen Sie sich dafür bitte das bereits oben angegebene Begleitheft des LSW. + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus-2 b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-2 new file mode 100644 index 0000000..f3f1284 --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-2 @@ -0,0 +1,72 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (5)# +#headodd# +#center#gs-warenhaus#right#% + +#end# +#headeven# +%#center#gs-warenhaus + +#end# +#center##on("b")#2 Aufbau von gs-Warenhaus#off("b")# + +#on("b")#gs-Warenhaus#off("b")# bietet die Möglichkeit, nicht nur #us#ein#use# Warenhaus, sondern eine +Warenhaus-Kette im Modell nachzubilden. Solch eine Warenhauskette besteht hier +stets aus einer #us#Hauptstelle#use# und einer oder mehrerer (bis zu 10) #us#Filialen#use#. Damit die +Filialen auf die zentralen Daten der Warenhauskette zugreifen können, verfügt jede +Hauptstelle über eine #us#Zentrale#use#, die jederzeit angerufen werden kann. Für die +Kommunikation untereinander gehört zu jeder Filiale eine (Filial-) #us#Verwaltung#use#, bei +der die aktuellen Filialdaten erfragt werden können. + + +Realisiert wird dieser Aufbau durch verschiedene Tasks und der Möglichkeit der +Intertask-Kommunikation. Unter einer Task, in der #on("b")#gs-Warenhaus#off("b")# insertiert ist, +können eine oder mehrere Tasks als Hauptstellen angemeldet werden (siehe '3.3 +Installation' und '7 Weitere Kommandos'). So kann man z.B. für verschiedene +Klassen gleichzeitig Warenhausketten einrichten. Zu beachten ist, daß verschiedene +Ketten untereinander völlig unabhängig sind und dadurch #us#nicht#use# miteinander +kommunizieren können. + + +Jede Hauptstellen-Task richtet sich automatisch eine Sohn-Task als Zentrale ein. +Werden nun Sohn-Tasks einer Hauptstellen-Task angemeldet, so werden diese zu +Filialen der entsprechenden Hauptstelle, wobei ihnen automatisch eine Filialnummer +zugeteilt wird, die identisch ist mit der Kanalnummer des benutzten Terminals. +(Steht keine Mehrplatzanlage zur Verfügung, so läßt sich nur #us#eine#use# Filiale einrichten; +die Filialnummer ist dann in der Regel 1.) + + +Die Filial-Tasks ihrerseits legen beim Starten von #on("b")#gs-Warenhaus#off("b")# automatisch jeweils +eine Sohn-Task als (Filial-) Verwaltung an. +#page# +Insgesamt ergibt sich folgender schematischer Aufbau (die Pfeile zeigen die +Kommunikationsmöglichkeiten an): + + +#on("b")# + W A R E N H A U S + / | \ + Hauptstelle A Hauptstelle B Hauptstelle C . . . + + / | \ +Zentrale A Filiale A1 Filiale A2 . . . + ^ + | + | Verwaltg.A1 Verwaltg.A2 . . . + | ^ ^ + | | | + --------------------------- . . . +#off("b")# + + + + + + + + + + + + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus-3 b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-3 new file mode 100644 index 0000000..ffef881 --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-3 @@ -0,0 +1,309 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (7)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#3 Installation von gs-Warenhaus#off("b")# + + +Bevor Sie #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer benutzen können, müssen Sie das +Programm zunächst installieren. Wenn #on("b")#gs-Warenhaus#off("b")# auf Ihrem System schon zur +Verfügung steht, können Sie dieses Kapitel ruhig überspringen. + + + +#on("b")#3.1 Voraussetzungen#off("b")# + +Um #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer betreiben zu können, muß das EUMEL- +Betriebssystem installiert sein. #on("b")#gs-Warenhaus#off("b")# setzt die Multi-User-Version voraus +und ist lauffähig ab Version 1.8.0. #on("b")#gs-Warenhaus#off("b")# setzt weiterhin voraus, daß auf +Ihrem Computer bereits das Programm #on("b")#gs-DIALOG#off("b")# (ab Version 1.1) installiert ist. + + + +#on("b")#3.2 Lieferumfang#off("b")# + +#on("b")#gs-Warenhaus#off("b")# wird auf einer Diskette geliefert, die alle notwendigen Programme +enthält (die Installation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den Inhalt +der Diskette feststellen zu können, starten Sie Ihr System und bringen es dazu, daß +'gib kommando:' erscheint. Dann legen Sie die Diskette ein und geben das +Kommando: + + +#on("b")#archive("gs-Warenhaus"); list(archive); release(archive) <RETURN>#off("b")# +#page# +Anschließend erscheint eine Übersicht der auf dem Archiv vorhandenen Programme. +Folgende Dateinamen sollten sich in der Übersicht befinden: + + "gs-MENUKARTE:Warenhaus" + "gs-Warenhaus 0: ohne Kartenleser" + "gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter" + "gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät" + "gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal" + "--------------------------------------------" + "gs-Warenhaus 1" + "gs-Warenhaus 2" + "gs-Warenhaus 3" + "gs-Warenhaus 4" + "gs-Warenhaus 5" + "gs-Warenhaus/gen" + +Eventuell können noch weitere Namen auf der Diskette vorhanden sein. Wenn Sie den +Inhalt der Diskette kontrolliert haben und diese Dateien auf der Diskette vorhanden +sind, können Sie #on("b")#gs-Warenhaus#off("b")# installieren. + +Sollten Sie statt der Übersicht eine Fehlermeldung erhalten, überprüfen Sie bitte, ob +die Diskette das richtige Format besitzt oder ob Ihr Diskettenlaufwerk Probleme +macht. Sollten dagegen Programme fehlen, so reklamieren Sie die Diskette. + + + +#on("b")#3.3 Installation#off("b")# + +#on("b")#gs-Warenhaus#off("b")# muß in einer Task installiert werden, in der bereits das Programm +#on("b")#gs-DIALOG#off("b")# zur Verfügung steht. Alle Söhne und Enkel der neuen Task können +anschließend das Warenhaus-Modell aufrufen. Richten Sie also eine Task als Sohn +#page# +der Task ein, in der auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir +nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' installiert ist und die neue +Task den Namen 'WARENHAUS' erhalten soll. (Sie können für die Task auch einen +beliebigen anderen Namen wählen): + +#on("b")# + <SV> (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("WARENHAUS","MENU") <RETURN> +#off("b")# + + --> gib kommando: + +(Arbeiten mehrere Personen mit dem Computer, dann ist es sinnvoll, diese Task vor +unbefugtem Zugriff durch ein Passwort zu schützen. Wie das gemacht wird, können +Sie in Ihrem EUMEL-Benutzerhandbuch erfahren.) + +Legen Sie dann die Archivdiskette ein, auf der sich #on("b")#gs-Warenhaus#off("b")# befindet, und +geben Sie die folgenden Kommandos: + +#on("b")# + archive ("gs-Warenhaus") <RETURN> + + fetch (ALL archive, archive) <RETURN> + + release (archive) <RETURN> + + run ("gs-Warenhaus/gen") <RETURN> +#off("b")# + +Sie haben damit das Installationsprogramm gestartet und können die Diskette wieder +aus dem Laufwerk nehmen. (Natürlich können Sie die Dateien auch mit Hilfe von +#on("b")#gs-DIALOG#off("b")# von der Diskette holen. Achten Sie dann bitte darauf, daß sie #on("b")#alle#off("b")# oben +angegebenen Dateien von der Diskette in Ihre Task holen). +#page# +Zunächst werden Sie nun aufgefordert, eine Interface-Anpassung für den Codekarten +leser auszuwählen. Dazu erscheint das folgende Menu auf dem Bildschirm: + ++----------------------------------------------------------------------+ +|center#Auswahl einer Interface-Anpassung für den Codekartenleser | +|center#Wenn kein Kartenleser benutzt wird, <ESC><q> tippen! | +| | +| Auswahl e i n e r Datei durch Ankreuzen | +| | +| ==> � gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter | +| � gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät | +| � gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal | +| | +| | +| | +| | +| Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h> | +| | ++----------------------------------------------------------------------- +Soll kein Kartenleser benutzt werden, tippen Sie einfach <ESC><q>. Sonst fahren +Sie den Pfeil mit den Cursor-Tasten in die gewünschte Zeile und drücken +<RETURN>. Welche der angegebenen Anpassung für welchen Zweck die geeignete +ist, wird in Kapitel 4 ("Anschluß eines Codekartenlesers") genauer beschrieben. + +Daraufhin wird die Installation automatisch durchgeführt. Haben Sie die Anpassung +für den 'AKTRONIC-Adapter' oder für das 'MUFI als Endgerät' ausgewält, so erscheint +nach der Insertierung dieser Datei die Aufforderung + +#center##on("b")#Gib Interface-Kanal:#off("b")# + +Hier muß angegeben werden, an welchen Kanal (serielle Schnittstelle) das Interface +angeschlossen werden soll (vgl. wiederum Kapitel 4). Der Interface-Kanal läßt sich +auch später noch umstellen (vgl. Kapitel 7). + +Wenn der Insertierungs-Vorgang abgeschlossen ist, müssen Sie noch einige Fragen +beantworten: + +#on("b")#Frage 1:#off("b")# #on("b")#Version für GRIN (j/n)?#off("b")# + +Tippen Sie hier ein <j>, so werden später in der Programmierumgebung die +'Soester' Befehle und Syntax-Regeln benutzt, ein <n> liefert die Programmier +umgebung für ELAN. Die Versions-Einstellung kann auch noch später geändert +werden (vgl. Kapitel 7, Befehl 'grin'). + +#on("b")#Frage 2:#off("b")# #on("b")#Soll diese Task Warenhaus-Hauptstelle sein (j/n)?#off("b")# + +Das Tippen von <j> macht Ihre momentan benutzte Task zur (einzigen!) Waren +haus-Hauptstelle; Sie können dann (nach Beantwortung mindestens einer weiteren +Frage, s.u.) in Söhnen dieser Task das Warenhaus-Programm starten. Allerdings ist es +dann nicht mehr möglich, Sohntasks dieser Task zu Hauptstellen zu machen! + +Möchten Sie aber mehrere Hauptstellen (evtl. für verschiedene Lerngruppen) ein +richten, so müssen Sie hier ein <n> tippen. In diesem Fall ist die Installation +zunächst beendet und es erscheint der EUMEL-Eingangsbildschirm. Was Sie dann +noch tun müssen, erfahren Sie in Kapitel 3.4; die folgenden Ausführungen können +Sie überschlagen. + +#on("b")#Frage 3:#off("b")# #on("b")#Mit Direktstart (j/n)?#off("b")# + +Wenn Sie vor dem Benutzer die 'gib kommando:'-Ebene verbergen wollen, können +Sie das System durch Tippen eines <j> so einstellen, daß sich sofort nach Ein +richten einer Sohntask das Menusystem meldet. Für den Anfänger kann das die +Arbeit durchaus erleichtern. Wenn Sie das nicht möchten, tippen Sie hier ein <n>. +Haben Sie die Frage mit <j> beantwortet, so erscheint noch eine (letzte) Abfrage: + +#on("b")#Frage 4:#off("b")# #on("b")#Mit automatischem Löschen (j/n)?#off("b")# + +Durch Tippen eines <j> legen Sie fest, daß in den Sohntasks nach Verlassen des +Menus die jeweilige Task automatisch gelöscht wird. Tippen Sie ein <n>, dann wird +nach Verlassen des Menus angefragt, ob die Task gelöscht werden soll. Wird die Frage +bejaht, wird gelöscht - sonst wird die Task abgekoppelt (break) und kann durch +'continue' wieder angekoppelt werden. + +#on("b")#Anmerkung:#off("b")# In Tasks, in denen Sie die Frage nach dem Direktstart mit <j> beant +wortet haben, sollte nicht das Kommando 'monitor' gegeben werden, da Sie durch +dieses Kommando auch diese Task zu einer Task machen, die sich direkt mit dem +Menu meldet und ggf. bei Verlassen des Menus automatisch gelöscht wird! + + +Nachdem der EUMEL-Eingangsbildschirm zu sehen ist, können Sie nun #on("b")#gs-Waren +haus#off("b")# starten. Nehmen wir an, die Task 'WARENHAUS' sei Hauptstellen-Task. Sie ist +damit automatisch Managertask, Sie können also Sohntasks anmelden: + +#on("b")# + <SV> (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("Test","WARENHAUS") <RETURN> +#off("b")# + +Statt 'Test' können Sie der Sohntask natürlich auch einen beliebigen anderen Namen +geben. Wenn Sie einen Direktstart eingerichtet haben, erscheint nun sofort das +#on("b")#gs-DIALOG#off("b")#-Emblem. + + +------------------------+ + | gs-DIALOG | + +---------------------------+ | + | Version 1.1 | | + +-----------------------------+ | | + | (C) 1987/88 Eva Latta Weber | | | + +-------------------------------+ | |-----+ + | (C) 1988 ERGOS GmbH | | | + | | |---+ + +------------------------------+ | | + | gggggggg ssssssss | |-------+ + | ggg sss sss | | + | ggg sss | --------+ + | ggg gggg ssssssss | + | ggg ggg sss | + | ggg ggg sss | + | gggggggggg sssssssss | + +------------------------------+ + + W A R E N H A U S + + Filiale 1 +#off("b")# +Andernfalls erscheint + +#on("b")# + gib kommando: +#off("b")# + +Mit dem Kommando + + #on("b")#warenhaus <RETURN>#off("b")# + +starten Sie #on("b")#gs-Warenhaus#off("b")# und erhalten zunächst ebenfalls das obige Emblem auf +dem Bildschirm. Links unten sehen Sie, unter welcher Filialnummer diese Task nun +von #on("b")#gs-Warenhaus#off("b")# geführt wird. Diese Nummer ist identisch mit der Kanalnummer, +unter der das EUMEL-System Ihren Arbeitsplatz verwaltet. + +Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu. Wie Sie nun weiter mit +#on("b")#gs-Warenhaus#off("b")# arbeiten können, erfahren Sie in Kapitel 5. + + + +#on("b")#3.4 Einrichten mehrerer Hauptstellen#off("b")# + +Wir gehen hier davon aus, daß Sie die Installation von #on("b")#gs-Warenhaus#off("b")# gemäß den +Beschreibungen in Kapitel 3.3 bereits durchgeführt und dabei die Frage 2 ("Soll diese +Task Warenhaus-Hauptstelle sein (j/n)?") mit 'nein' beantwortet haben. (Falls Sie +Frage 2 mit 'ja' beantwortet haben und nun den Hauptstellen-Status der Task wieder +rückgängig machen wollen, so lesen Sie zunächst in Kapitel 7 nach.) + +Die Task, in der die Installation stattfand (wir nehmen weiterhin an, daß sie den +Namen 'WARENHAUS' hat), wurde automatisch zur Managertask, das heißt, daß +Söhne von ihr eingerichtet werden können. Bevor Sie in diesem Fall das Programm +nutzen können, müssen Sie nun noch mindestens eine Sohntask zur Hauptstelle +machen. Gehen Sie dabei folgendermaßen vor: + +#on("b")# + <SV> (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("Hauptstelle A","WARENHAUS") <RETURN> +#off("b")# + + --> gib kommando: + + +Mit dem Kommando + +#center##on("b")#warenhaus hauptstelle (TRUE) <RETURN>#off("b")# + +wird die Task 'Hauptstelle A' zur Warenhaus-Hauptstelle. + +Zu beantworten sind dabei eine oder zwei Fragen; es sind dieselben, die auftauchen, +wenn bei der Abfrage 'Soll diese Task Warenhaus-Hauptstelle sein (j/n)?' ein <j> +getippt wird. Lesen Sie deshalb nun weiter in Kapitel 3.3 bei der Frage 3: 'Mit Direkt +start (j/n)?'. + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus-4 b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-4 new file mode 100644 index 0000000..2c5d7dc --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-4 @@ -0,0 +1,378 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (11)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center# #on("b")#4 Anschluß eines Codekartenlesers#off("b")# + + +Ein 'echter' Scanner oder Barcodeleser ist als automatisches Lesegerät für den Ein +satz im Unterricht nicht geeignet und kann unter EUMEL/ELAN unseres Wissens nach +auch nicht angesteuert werden. #on("b")#gs-Warenhaus#off("b")# benutzt stattdessen (ebenso wie die +Soester Software) den von der Firma AKTRONIC vertriebenen Codekartenleser für +einfache 8-Bit-Lochkarten (siehe Anhang). + +Die Verwendung eines Codekartenlesers ist für die Bedienung des Programms zwar +nicht unbedingt notwendig, bietet jedoch beim Einsatz von #on("b")#gs-Warenhaus#off("b")# im Unter +richt neben den didaktischen Hintergründen (Modell für Scanner-Kasse) auch noch +mancherlei Vorteile bezüglich des "Datenschutzes" (Änderungen an Kunden- oder +Artikeldaten sowie Zugriffe auf Auskunftsfunktionen nur mit entsprechender Code +karte möglich), so daß sein Anschluß sehr empfohlen werden muß. + +Allerdings ist solch ein Gerät nur mittels eines (relativ teuren) Interface-Systems +anschließbar, dessen Anschaffung sich nur lohnt, wenn das System auch sonst noch +zum Messen, Steuern, Regeln (= "Prozeßdatenverarbeitung", "PDV") im Unterricht +genutzt wird. (#on("b")#ERGOS#off("b")# bietet mit #on("b")#"gs-Prozess"#off("b")# auch ein Programmpaket zur PDV +unter EUMEL/ELAN an!) + + + +#on("b")#4.1 Hardware-Voraussetzungen#off("b")# + +Der Codekartenleser wird an einen Steckplatz des Interface-Systems MODUL-BUS der +Firma AKTRONIC angeschlossen, wobei ein Einzel- oder Mehrfachsteckplatz mit +Kombi- oder E/A-Karte oder eine Compact-Box benutzt werden können. + +Da Eingaben von externen Geräten unter EUMEL in der Regel nur über eine serielle +Schnittstelle möglich sind, benötigt man neben dem Kartenleser und dem MODUL- +#page# +BUS-Steckplatz noch einen 'Adapter', der die parallelen Signale des MODUL-BUS- +Systems in serielle Signale wandelt, die der Computer über eine serielle Schnittstelle +(auch RS232- oder V24-Schnittstelle genannt) empfangen kann. Für erfahrene +Elektronik-Bastler ist das Erstellen solch eines Adapters sicher eine lösbare Aufgabe, +unter den fix und fertig kaufbaren Geräten haben wir allerdings nur zwei geeignete +gefunden: das 'Multifunktionale Interface' (kurz: MUFI) der Firma BICOS und den +'RS232-Adapter für das MODUL-BUS-System' der Firma AKTRONIC. Diese beiden +Geräte werden auch von #on("b")#gs-Warenhaus#off("b")# unterstützt. + +Die erforderliche Hardware-Konstellation stellt sich im Überblick also folgender +maßen dar: + +#on("b")# + Computer <----> Adapter <----> Interface <----> Kartenleser + + (mit se- ('MUFI' ('MODUL- + rieller oder BUS'- + Schnitt- 'AKTRONIC- Steck- + stelle) Adapter') platz) +#off("b")# + + +#on("b")#4.2 Verwendung des MUFI#off("b")# + +Das MUFI ist speziell für die Arbeit in einem Mehrplatz-System entwickelt worden. Es +benötigt keine zusätzliche serielle Schnittstelle am Rechner, sondern kann einfach +zwischen Rechner und Terminal 'in den Terminalkanal gesteckt' werden, sodaß man +von diesem Terminal aus optimal auf das Interface-System zugreifen kann. Im Ideal +fall sollte jeder Arbeitsplatz mit der oben genannten Hardware ausgestattet sein, was +aber momentan sicher nicht für jede Schule finanzierbar ist. Haben Sie zunächst nur +ein (oder wenige) MUFI(s) zur Verfügung und möchten von verschiedenen Terminals +(abwechselnd) auf ein Interface-System zugreifen oder verfügen Sie gar nicht über +ein Terminal, sondern nur über einen Monitor (z.B. bei IBM-Kompatiblen), so +können Sie das MUFI auch 'als Endgerät' an einer separaten seriellen Schnittstelle +nutzen. +#page# +Für den Betrieb in einem Terminalkanal sollte das MUFI über eine sog. "Schnitt +stellen-Automatik" verfügen, die verhindert, daß das MUFI in ausgeschaltetem +Zustand oder mit abgezogenem Netzstecker den Datenfluß vom Rechner zum +Terminal unterbricht. Diese sehr sinnvolle Automatik wird von BICOS #on("b")#nicht#off("b")# +standardmäßig eingebaut. Sie sollten bei eventuellen Bestellungen darauf achten. + + +#on("b")#4.2.1 Einstellungen am MUFI#off("b")# + +Gleichgültig ob Sie das MUFI 'im Terminalkanal' oder 'als Endgerät' benutzen, +müssen Sie zunächst am MUFI einige Einstellungen per DIP-Schalter im Inneren des +MUFI vornehmen. Ziehen Sie dazu aber auf alle Fälle den Stecker aus der Steckdose! +Lösen Sie dann die 4 Schrauben an der Unterseite des Gehäuses, heben das Oberteil +vorsichtig ab und legen es neben das Unterteil, sodaß die Kabelverbindungen +zwischen Unter- und Oberteil nicht belastet werden. + + +---------------------------------------------------+ + | +-------+ +------------+ | + | | | | | +---------+ | + | +-------+ | | | DIP- | | + | +-------+ | | | Schalter| | +Rück- | | | | | +---------+ | Vorder- +seite | +-------+ | | +--------------+ | seite + | +-------+ | SCN68000 | | | | + | | | | | +--------------+ | + | +-------+ | | | + | +-------+ | | | + | | | | | | + | +-------+ +------------+ | + +---------------------------------------------------+ + + + +#center#Abb.1: MUFI geöffnet +#page# +Die kleine Plastikbox mit den DIP-Schaltern trägt die folgende Aufschrift: + +#center##on("b")#O N +#center#1 2 3 4#off("b")# + +Heben Sie den Deckel mit Hilfe eines kleinen Schraubendrehers o.ä. an der rechten +Seite leicht an und klappen Sie ihn nach links um. Sie können nun die 4 DIP- +Schalter sehen. + + +---------------------------------------+ + | +-----+ +-----+ +-----+ +-----+ | + | |+++++| | | | | | | | + | |+++++| | | | | | | | ON + | |+++++| | | | | | | | + | |+++++| | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | |+++++| |+++++| |+++++| | + | | | |+++++| |+++++| |+++++| | + | | | |+++++| |+++++| |+++++| | OFF + | | | |+++++| |+++++| |+++++| | + | +-----+ +-----+ +-----+ +-----+ | + +---------------------------------------+ + + 1 2 3 4 + +#center#Abb.2: Mögliche DIP-Schalter-Stellung beim MUFI + + Dabei haben die DIP-Schalter folgende Bedeutung: + + 1 ON : Modulbusbetrieb + OFF : Parallelportbetrieb + 2 ON : RTS/CTS-Hardware-Handshake + OFF : XON/XOFF-Protokoll + 3 ON : 9600 Baud + OFF : 19200 Baud + 4 ON : Even Parity + OFF : No Parity + +In jedem Fall muß der DIP-Schalter 1 in Stellung #on("b")#ON#off("b")# gebracht werden. +#page# +Wenn Sie das MUFI im Terminalkanal betreiben wollen, müssen Sie die anderen +Einstellungen so vornehmen, daß sie zu der Konfiguration des Terminals passen (vgl. +auch Kapitel 4.4). Beträgt die Übertragungsrate 19200 Baud, so sollten Sie unbedingt +mit dem XON/XOFF-Protokoll arbeiten - es sei denn, das Terminal unterstützt +RTS/CTS! Wenn Sie das MUFI an einer separaten seriellen Schnittstelle als Endgerät +betreiben wollen, #on("b")#muß#off("b")# der Datenaustausch mit dem RTS/CTS-Protokoll abgewickelt +werden (Schalter 2 auf 'ON'!). Vergewissern Sie sich, daß Ihr Schnittstellen-Kabel +auch darauf ausgelegt ist! Nach dieser Einstellung der DIP-Schalter ist das MUFI +betriebsbereit. Fügen Sie die beiden Gehäuseteile wieder zusammen und ver +schrauben Sie sie wieder. + + +#on("b")#4.2.2 MUFI im Terminalkanal#off("b")# + +Um das MUFI in den Terminalkanal einbauen zu können, müssen Sie zunächst am +Terminal die Zuleitung vom Rechner lösen. Auf der Rückseite des MUFIs befinden +sich zwei Stecker, die mit V24/1 und V24/2 bezeichnet sind. Stecken Sie an Stecker +V24/2 das Kabel, das ursprünglich vom Computer zum Terminal führte. Sie +benötigen jetzt noch ein weiteres (kurzes) V24-Kabel, um das MUFI mit dem +Terminal zu verbinden. Dieses wird einerseits auf Stecker V24/1 am MUFI gesteckt +und andererseits auf den Stecker am Terminal, von dem Sie das ursprüngliche Kabel +zwischen Rechner und Terminal abgezogen haben. + + +--------------------------+ + | +----------------------+ | + | | V24/1 V24/2 | | + | | | | | | + | +----|-----------|-----+ | + +------|-----------|-------+ + | | + | | + ZUM <-----+ +-----> ZUM + TERMINAL COMPUTER + + +#center#Abb.3: Einbau des MUFIs in den Terminalkanal +#page# +Die Verschaltung der V24-Kabel ist in der Bedienungsanleitung zum MUFI erläutert, +ggf. können Sie entsprechende Kabel von der Firma BICOS beziehen. + +Wenn alle Kabelverbindungen gesteckt sind, sollten Sie auf alle Fälle erst einmal #on("b")#bei +ausgeschaltetem MUFI#off("b")# prüfen, ob das Terminal sich noch bedienen läßt. Wenn dieses +keine Reaktion mehr zeigt, obwohl es vorher (ohne MUFI) reibungslos funktioniert +hat, dann haben Sie entweder ein MUFI ohne "Schnittstellen-Automatik" vor sich +(vgl. Kapitel 4.2, Seite 15), oder an den Kabelverbindungen stimmt irgendetwas nicht. +In diesem Fall sollten Sie noch einmal alle Anschlüsse und evtl. auch die interne +Verschaltung der Kabel überprüfen. + +Schalten Sie dann das MUFI ein. Bei ebenfalls eingeschaltetem Terminal können nun +einige Zeichen auf dem Bildschirm erscheinen, dieser Effekt ist normal. Funktioniert +Ihr Terminal bei eingeschaltetem MUFI reibungslos, so sind alle Einstellungen richtig +und Sie brauchen erst bei Kapitel 4.5 weiterzulesen. Andernfalls studieren Sie Kapitel +4.4 unter Beachtung von Kapitel 4.2.1! + + +#on("b")#4.2.3 MUFI als Endgerät#off("b")# + +Wenn Sie das MUFI als Endgerät an einer separaten seriellen Schnittstelle betreiben +wollen, dann stecken Sie das vom Computer kommende Kabel auf den mit V24/2 +bezeichneten Stecker des MUFI. + +Damit ein einwandfreier Betrieb gewährleistet ist, sollten Sie einen sog. 'Kurzschluß +stecker' auf den dann freien Stecker V24/1 des MUFIs stecken. Haben Sie einen +solchen nicht zur Hand, können Sie auch zwei provisorische Drahtbrücken einsetzen: +Verbinden Sie mit zwei kleinen Drähten einmal Pin (Öffnung) 2 mit Pin 3 und +außerdem Pin 4 mit Pin 5. + +Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät' unterstützt +standardmäßig nur den Betrieb von #on("b")#einem#off("b")# MUFI als Endgerät. Wie Sie vorgehen +müssen, wenn Sie mehrere MUFIs in dieser Betriebsart benutzen wollen, erfahren Sie +in Kapitel 7. +#page# +#on("b")#4.3 Verwendung des AKTRONIC-Adapters#off("b")# + +Im Gegensatz zum MUFI ist der AKTRONIC-Adapter #on("b")#nicht#off("b")# für den Einbau in einen +Terminalkanal geeignet, sondern kann nur als Endgerät an einer separaten seriellen +Schnittstelle betrieben werden. Bevor Sie den Adapter an eine serielle Schnittstelle an +schließen, sollten Sie noch die eingestellte Baud-Rate überprüfen und gegebenenfalls +neu einstellen. + +Öffnen Sie dazu das Gehäuse des Adapters, indem Sie die vier Schrauben an der +Unterseite lösen. Drehen Sie den Adapter so vor sich, daß die 25-polige D-Sub +miniaturbuchse von Ihnen weg zeigt. Vorn rechts sind dann zwei parallele 8-polige +Pfostensteckerleisten sichtbar. + +#center#25-pol. D-Subminiatur-Stecker + + +---------------+ + | | + +---+ +---+ + | +------+ | + | | | | + | | | | + | | | | + | | | | + | +------+ | + | +------+ | + | | | +-------+ | + | +------+ | | | + | +------+ +-------+ | + | | | +-------+ | + | +------+ | <-|---------Jumperleiste + | +-------+ | + +---+ +---+ + | Baudrate | + +---------------+ + + +#center#Abb.4: AKTRONIC-Adapter geöffmet +#page# +Auf einem Pfostensteckerpaar steckt ein 'Jumper', der gegebenenfalls (passend zu +der Schnittstellen-Konfiguration im Computer, vgl. Kapitel 4.4) umgesteckt werden +muß. + + +---------+ + | ζ ζ | 300 + | ζ ζ | 600 + | ζ ζ | 1200 + | ζ ζ | 2400 + | ζ ζ | 4800 + | ζ ζ | 9600 + Jumper > | ζ ζ | 19200 + | ζ ζ | 38400 + +---------+ + Baudrate + + +#center#Abb.5: Mögliche Jumperposition beim AKTRONIC-Adapter + + +Am Adapter ist ein Kabel mit 25-poligem D-Subminiaturstecker bereits fest montiert. +Sollte der Stecker nicht an Ihren Rechner passen, so müßten Sie ein entsprechendes +Adapterkabel basteln oder kaufen. + +Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter' unterstützt +standardmäßig nur den Betrieb von #on("b")#einem#off("b")# Adapter. Wie Sie vorgehen müssen, wenn +Sie mehrere dieser Adapter benutzen wollen, erfahren Sie in Kapitel 7. + + +#on("b")#4.4 Konfiguration der seriellen Schnittstelle#off("b")# + +Sie müssen nun noch dafür Sorge tragen, daß die Einstellungen am MUFI bzw. am +AKTRONIC-Adapter mit den Einstellungen im Computer übereinstimmen. +#page# +Koppeln Sie dazu die Task 'configurator' an Ihr Terminal an (mit 'continue +("configurator") <RETURN>') und geben Sie dann das Kommando 'configurate +<RETURN>'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt, +ob Sie eine Konfiguration vornehmen wollen. Bei den "interessanten" Kanälen ant +worten Sie mit 'ja' (<j>). Wollen Sie sich nur die aktuelle Konfiguration ansehen, so +beantworten Sie alle weiterhin gestellten Fragen zu diesem Kanal mit 'ja' (<j>), +dann bleibt die aktuelle Einstellung erhalten. (Der Konfigurationsdialog ist im +EUMEL-Systemhandbuch auf den Seiten 6 - 8 detailliert beschrieben.) + +Benutzen Sie ein MUFI, so müssen auf alle Fälle #on("b")#8 Datenbits#off("b")# und #on("b")#1 Stopbit#off("b")# einge +stellt sein und außerdem je nach DIP-Schalter-Stellung im MUFI (vgl. Kapitel 4.2.1) +9600 oder 19200 Baud sowie 'no parity' oder 'even parity'. + +Benutzen Sie das MUFI im Terminalkanal, so müssen Sie bei einer eventuellen +Änderung der Konfiguration an diesen Stellen auch das entsprechende Terminal auf +diese Werte einstellen! + +Bei der Verwendung des MUFIs als Endgerät muß der Kanal, an den das MUFI ange +schlossen wird, darüberhinaus unbedingt auf die Betriebsarten + +#center#transparent und RTS/CTS-Protokoll + +eingestellt werden. + +Verwenden Sie einen AKTRONIC-Adapter, so müssen für den entsprechenden Kanal +folgende Konfigurationsmerkmale eingestellt werden: + +#center#transparent, 8 Bit, 2 Stopbit, #on("b")#kein#off("b")# Protokoll + +Die Baud-Rate ist gemäß der Jumper-Position im Adapter (vgl. Kapitel 4.3) einzu +stellen. + + + +#on("b")#4.5 Verbindung der Hardware-Komponenten#off("b")# + +Der Anschluß des Kartenlesers an den MODUL-BUS-Steckplatz ist denkbar einfach: +Stecken Sie den 8-poligen Platinenstecker des Codekartenlesers in die Buchse des +Digital-Einganges der Steckkarte bzw. Compact-Box und den 3-poligen Platinen +stecker in die passende Spannungsversorgungsbuchse (12 V) am Steckplatz bzw. auf +der Compact-Box, fertig. Bei eingeschalteter Betriebsspannung muß nun der Code +kartenleser beleuchtet sein. (Falls Sie einen Mehrfachsteckplatz benutzen, benötigen +Sie ein passendes Netzteil für diesen Steckplatz! Achten Sie auch darauf, daß in +diesem Fall die Kombi- oder E/A-Karte in Steckplatz (Slot) 1 installiert ist.) + +Nun müssen Sie noch die Verbindung zu dem verwendeten Adapter herstellen. Dabei +ist es gleichgültig, ob Sie eine Compact-Box, einen Einzel- oder einen Mehrfachsteck +platz benutzen, denn alle diese Geräte verfügen über ein Anschlußkabel mit dem +gleichen 25-poligen Stecker. + +Den AKTRONIC-Adapter können Sie damit direkt an den Steckplatz anschließen, +denn er verfügt bereits über eine entsprechende 25-polige Buchse. Hier müssen Sie +dann nur noch die Stromversorgung des Adapters sichern, indem Sie das Kabel mit +dem 3-poligen Platinenstecker in die passende Spannungsversorgungsbuchse (12 V) +am Steckplatz oder auf der Compact-Box stecken. (Damit Codekartenleser und +Adapter hier gleichzeitig versorgt werden können, ist in den Stecker eine Verzweigung +eingebaut.) + +Für das MUFI benötigen Sie ein weiteres Kabel, das an einem Ende einen 36-poligen +Centronics-Stecker besitzt und an dem anderen einen 25-poligen D-Subminiatur +stecker (von der Firma BICOS zu beziehen). + +Zum Ausprobieren des Kartenlesers benutzen Sie am besten die Menupunkte +'Dezimalwert lesen' und 'Bitmuster lesen' unter dem Oberbegriff 'Kommandos' des +Warenhaus-Menus. Eine Beschreibung dieser Punkte finden Sie in Kapitel 5.4. + + + + + + + + + + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus-5 b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-5 new file mode 100644 index 0000000..c1164ad --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-5 @@ -0,0 +1,1468 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (20)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#5 Beschreibung der Menufunktionen#off("b")# + + +Nach Aufruf meldet sich #on("b")#gs-Warenhaus#off("b")# zunächst mit dem #on("b")#gs-DIALOG#off("b")#-Emblem +(vgl. Kapitel 3.3). Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu auf +dem Bildschirm: + + +------------------------------------------------------------------------+ + | WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv| + |------------------------------------------------------------------------| + | | b Befehlsvorrat | | + | | ------------------ | | + | | a Artikeldaten | | + | | k Kundendaten | | + | +--------------------+ | + | | + | | + | | + |------------------------------------------------------------------------+ + | | + | Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> | + +------------------------------------------------------------------------+ + +#off("b")# + + +Bevor wir Ihnen die Bedeutung der einzelnen Menu-Punkte erklären, geben wir erst +noch einige grundsätzliche Hinweise zur Bedienung des Menus für diejenigen Leser, +die im Umgang mit Menus unter #on("b")#gs-DIALOG#off("b")# nicht geübt sind. + + + +#on("b")#5.1 Kurzhinweise zur Bedienung des Menus#off("b")# + +Die Bedienung des Menus ist sehr einfach. Eine ausführliche Beschreibung dazu +finden Sie in den Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle +sollen nur die wesentlichen Bedienungsvorgänge beschrieben werden. +#page# +- Mit der Tastenfolge <ESC><?> können Sie sich Informationen zur Bedienung + des Menusystems in das Menu einblenden lassen + +- Mit den Pfeiltasten <rechts> und <links> können Sie zwischen den "Ober + begriffen" in der Kopfzeile wählen. Der aktuelle Oberbegriff ist jeweils invers + dargestellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich auf diesen invers + dargestellten Oberbegriff. + +- Mit den Pfeiltasten <hoch> und <runter> können Sie zwischen den Menu + funktionen wählen, die Ihnen im aktuellen Pull-Down-Menu zur Auswahl ange + boten werden. Die aktuell angewählte Menufunktion wird jeweils invers darge + stellt. Die Trennlinien, die in einigen Pull-Down-Menus sichtbar sind, dienen nur + der optischen Untergliederung; sie können nicht angewählt werden und werden + deshalb automatisch übersprungen. Die einzelnen Menupunkte sind "zyklisch + miteinander verknüpft", das heißt, man gelangt vom untersten Menupunkt + wieder zum obersten und umgekehrt. Menupunkte, vor denen ein Minuszeichen + steht ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können nicht angewählt + werden und werden einfach übersprungen. + +- Durch Tippen der Fragezeichentaste (<?>) können Sie sich jeweils zur + aktuellen Menufunktion (invers im Pull-Down-Menu) Informationen in das Menu + einblenden lassen. + +- Um eine Menufunktion ausführen zu lassen, bewegen Sie sich mit den Pfeiltasten + auf die gewünschte Menufunktion im aktuellen Pull-Down-Menu und tippen + dann die <RETURN>-Taste. Steht vor dem gewünschten Menupunkt ein + einzelner Buchstabe oder eine Ziffer, so kann durch Tippen der entsprechenden + Taste diese Menufunktion dadurch direkt aufgerufen werden. Sobald eine Menu + funktion aufgerufen worden ist, erscheint davor ein Stern ('*'). Daraus können + Sie entnehmen, daß das System bereits den Auftrag ausführt. + +- An verschiedenen Stellen werden Fragen an Sie gerichtet, die Sie mit 'ja' oder + 'nein' beantworten müssen. Tippen Sie dazu entsprechend der Entscheidung die + Taste <j> (für 'ja') bzw. <n> (für 'nein'). + +- Werden Ihnen vom Menu aus Dateinamen zur Auswahl angeboten, so können Sie + den auf dem Bildschirm sichtbaren Pfeil vor den gewünschten Namen +#page# + positionieren. Mit den Tasten <x> oder <RETURN> können Sie den Namen + ankreuzen. Ist die Auswahl mehrerer Dateinamen möglich, so können Sie den + Vorgang wiederholen. Mit den Tasten <o> oder <RUBOUT> können Sie auch + ein Kreuz vor einem Namen wieder löschen. Daneben gibt es noch einige Tasten + funktionen, die für die Bedienung recht hilfreich sein können. Tippen Sie + während der Auswahl die Fragezeichentaste (<?>), so werden Ihnen alle + Bedienungsmöglichkeiten auf dem Bildschirm angezeigt. Eine Auswahl, in der + mehrere Dateien angekreuzt werden dürfen, wird durch die Tastenfolge + <ESC><q> verlassen. Anschließend wird die eingestellte Operation mit den + angekreuzten Dateien ausgeführt. Sind Sie versehentlich in eine solche Auswahl + gelangt, so können Sie den Vorgang durch die Tastenkombination <ESC><h> + abbrechen. + +- An einigen Stellen werden Sie aufgefordert, eine Eingabe zu machen (z.B. einen + Dateinamen einzugeben). Wird Ihnen hier ein Vorschlag gemacht, den Sie + akzeptieren, so brauchen Sie zur Bestätigung nur die <RETURN>-Taste zu + tippen. Gefällt Ihnen der Vorschlag nicht oder wird Ihnen kein Vorschlag + gemacht, so machen Sie bitte die gewünschte Eingabe. Zum Schreiben stehen + Ihnen alle aus dem Editor bekannten Funktionen zur Verfügung. Mit der Taste + <RUBOUT> können Sie Buchstaben löschen, mit <RUBIN> einfügen. Die + Eingabe wird durch Tippen der <RETURN>-Taste abgeschlossen. Ist der von + Ihnen gewünschte Name schon in Ihrer Task vorhanden und steht in der Fußzeile + der Hinweis 'Zeigen: <ESC><z>', dann können Sie sich auch alle vor + handenen Namen zur Auswahl anbieten lassen und durch Ankreuzen den beab + sichtigten Namen auswählen. + +- Ihnen können auch mehrere Alternativen angeboten werden, zwischen denen Sie + wählen müssen. In der untersten Zeile eines solchen Kastens, in denen Ihnen die + Alternativen auf dem Bildschirm eingeblendet werden, sind die Möglichkeiten + aufgeführt, die darüber beschrieben sind. Mit den Pfeiltasten können sie die + Markierung auf die gewünschte Alternative positionieren und dann durch die + <RETURN>-Taste zur Ausführung bringen. (Manchmal ist das auch durch + Tippen der den Alternativen vorangestellten Buchstaben oder Ziffern möglich). +#page# +- Durch die Tastenfolge <ESC><q> kann das Menu insgesamt verlassen + werden. Damit das nicht versehentlich geschieht, wird jeweils die Frage gestellt, + ob Sie das Menu tatsächlich verlassen wollen. Diese Frage beantworten Sie bitte je + nach Wunsch mit 'ja' oder 'nein' durch Tippen der Tasten <j> bzw. <n>. + + +#on("b")#5.2 Menufunktionen zum Oberbegriff 'Info'#off("b")# + +Das auf dem Bildschirm sichtbare Pull-Down-Menu ist bereits oben abgebildet. + +#on("b")#b Befehlsvorrat#off("b")# + + Mit dieser Funktion können Sie sich die Befehle, die Ihnen von der jeweils + eingestellten Programmierumgebung zur Verfügung gestellt werden, auf dem + Bildschirm anzeigen lassen. Anhand dieser Informationen können Sie auch + feststellen, ob in dem System, das Ihnen zur Verfügung steht, die 'GRIN- + Version' oder die 'ELAN-Version' eingestellt ist. + + Je nach Version gelangen Sie zunächst in eines der folgenden beiden Auswahl + menus: +#on("b")# + GRIN-Version: + + + +-------------------------------------------------+ + | d Datei - Bearbeitung | + | e Einkaufen und Auskunft | + | k Kontroll - Strukturen | + | | + | z Zurück zum Hauptmenü | + | | + | Datei Kaufen/Auskunft Kontroll Zurück | + | | + +-------------------------------------------------+ +#off("b")# +#page# +#on("b")# + ELAN-Version: + + +-------------------------------------------------+ + | d Datei - Bearbeitung | + | e Einkaufen und Auskunft | + | s Sonstige Befehle | + | | + | z Zurück zum Hauptmenü | + | | + | Datei Kaufen/Auskunft Sonstige Zurück | + | | + +-------------------------------------------------+ + +#off("b")# + + Von hier aus können Sie zu jedem dort angegebenen Bereich eine Informa + tionstafel abrufen. + + Aus jeder dieser Tafeln gelangen Sie wieder in die Auswahl zurück. Verlassen + Sie die Auswahl selbst, gelangen Sie zurück ins Ausgangsmenu. + + +#on("b")#a Artikeldaten#off("b")# + + Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über + Aufbau und Umfang der Artikeldaten: +#on("b")# + +-------------------------------------------------------+ + | Ein Satz 'Artikeldaten' besteht aus: | + | | + | Artikelname | + | Preis | + | Mindestbestand | + | Bestand | + | | + | Es können Daten für maximal 15 Artikel gespeichert | + | werden. Die zugehörigen Artikelnummern sind 1...15. | + | | + +-------------------------------------------------------+ + + +#off("b")# + + In allen Filialen müssen zu einer Artikelnummer stets der Artikelname und + Preis identisch sein, Bestand und Mindestbestand können beliebig gewählt + werden. Artikeldateien werden nur in den jeweiligen Filialen gehalten und + nicht in der Zentrale. +#page# + Gegenüber der Soester Warenhaus-Version sind Artikeldaten um den Punkt + 'Mindestbestand' erweitert worden, weil sich damit unserer Meinung nach eine + realistischere Nachbestellung realisieren läßt (vgl. auch Kapitel 5.4, 'Nachbe + stellen'). + + Sollte Ihnen der Umfang des Warensortiments mit maximal 15 verschiedenen + Artikeln sehr gering vorkommen, so denken Sie bitte daran, daß die Artikel + daten an jedem Arbeitsplatz erst einmal eingegeben werden müssen, was bei + Computer-Anfängern recht lange dauert. Außerdem kommt es nur bei einem + genügend kleinen Sortiment zu den methodisch-didaktisch erwünschten + Einkaufshäufungen bei bestimmten Produkten. + + +#on("b")#k Kundendaten#off("b")# + + Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über + Aufbau und Umfang der Kundendaten: +#on("b")# + +----------------------------------------------------------+ + | Nachname | + | Vorname | + | Geschlecht | + | | + | Es können Daten für maxomal 31 Kunden gespeichert | + | werden. Die zugehörigen Kundennummern sind 129...159. | + | | + +----------------------------------------------------------+ +#off("b")# + + Die Zuordnung Kundennummer ---> Kunde muß in allen Filialen gleich sein. + Kundendateien werden von jeder Filiale und von der Zentrale geführt. + + Gegenüber der Soester Warenhaus-Version sind Kundendaten um die Punkte + 'Nachname' und 'Geschlecht' erweitert worden, um dem Begriff Kunden#on("b")#daten#off("b")# + etwas gerechter zu werden. Die maximale Kundenanzahl von 31 entspricht + etwa der Größe einer Klasse. +#page# +#on("b")#5.3 Menufunktionen zum Oberbegriff 'Eingabeart'#off("b")# + +Die Funktionen unter diesem Oberbegriff sind nur dann für Sie interessant, wenn Sie +einen Codekartenleser verwenden. +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|-------------+-----------------+-----------------------------------------| +| | * Anzeigen | | +| | --------------- | | +| | k Kartenleser | | +| | t Tastatur | | +| +-----------------+ | +| | +| | +| +------------------------+ | +| | Die Eingabeart ist auf | | +| | | | +| | Tastatur | | +| | | | +| | eingestellt | | +| +------------------------+ | +|-------------------------------------------------------------------------| +| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> | ++-------------------------------------------------------------------------+ +#off("b")# + +#on("b")#a Anzeigen#off("b")# + + Es wird die momentan eingestellte Eingabeart angezeigt. Möglich sind die + Eingabearten #on("b")#Tastatur#off("b")# und #on("b")#Kartenleser#off("b")#. Die Standardeinstellung ist + 'Tastatur'! + + +#on("b")#k Kartenleser#off("b")# + + Die Eingabeart 'Kartenleser' wird eingestellt. Alle Artikelnummern, Kunden + nummern und sonstige Codenummern (für Auskünfte) können danach nur + über den Kartenleser eingegeben werden. +#page# + Diese Eingabeart kann nur eingestellt werden, wenn ein Kartenleser mit + funktionstüchtigem Interface angeschlossen ist. Sonst erfolgt eine ent + sprechende Fehlermeldung. + + Fehlerfälle: + + - Kein Interface vorhanden! + Ursache: Bei der Installation von #on("b")#gs-Warenhaus#off("b")# wurde angegeben, daß + kein Kartenleser benutzt werden soll. + + - Interface meldet sich nicht! + Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen und + eingeschaltet ist (vgl. Kapitel 4). Notfalls Eingabeart auf + 'Tastatur' schalten; wenn ein MUFI verwendet wird, MUFI aus- + und nach kleiner Pause wieder einschalten; noch einmal die + Eingabe 'Kartenleser' anwählen. + + - TASK für Interface ist besetzt! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter + auftreten.) + Abhilfe: Wenn irgendeine andere Task die Eingabeart 'Kartenleser' ein + gestellt hat, dort auf 'Tastatur' umstellen. + + - Interface-Kanal belegt! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter + auftreten.) + Abhilfe: Feststellen, welche Task an den Interface-Kanal angekoppelt ist + ('taskinfo (2)'), und diese dann abmelden ('break' oder 'end'). + Die Nummer des Interface-Kanals kann mit dem Befehl 'put + (interfacekanal)' erfragt werden. + + - TASK für Interface existiert nicht! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter + auftreten.) + Abhilfe: Task löschen; in der Vatertask das Kommando 'init interface + channel' geben; Task neu anmelden. +#page# +#on("b")#t Tastatur#off("b")# + + Die Eingabeart 'Tastatur' wird eingestellt. Alle Artikelnummern, Kunden + nummern und sonstige Codenummern (für Auskünfte) können danach nur + über die Tastatur eingegeben werden. Ein etwa angeschlossener Codekarten + leser ist bei dieser Einstellung nicht mehr ansprechbar. + + + +#on("b")#5.4 Menufunktionen zum Oberbegriff 'Kommandos'#off("b")# + +Dieses ist das zentrale Menu für den Benutzer von #on("b")#gs-Warenhaus#off("b")#. Unter diesem +Oberbegriff finden Sie alle Funktionen, die notwendig sind, um die Abläufe innerhalb +des Modell-Warenhauses zu simulieren. (Die angebotenen Menufunktionen ent +sprechen etwa den "Direktbefehlen" der Soester Software.) +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|---------------------+-------------------------------+-------------------| +| | w Warendatei bearbeiten | | +| | k Kundendatei bearbeiten | | +| | -------------------------- | | +| | e Einkaufen | | +| | -------------------------- | | +| | a Auskunft einholen | | +| | n Nachbestellen | | +| | -------------------------- | | +| | - Dezimalwert lesen | | +| | - Bitmuster lesen | | +| +-------------------------------+ | +| | +|-------------------------------------------------------------------------| +| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>| ++-------------------------------------------------------------------------+ +#off("b")# + +Wird im Unterricht kein Kartenleser benutzt, so sind die eingegeben Daten völlig +ungeschützt. Vor allem bei der Kundendatei muß sichergestellt werden, daß dort +#page# +keine unsinnigen Eintragungen oder Änderungen vorgenommen werden, da alle +Neueintragungen und Änderungen in dieser Datei auch in der Warenhaus-Zentrale +wirksam werden und von dort aus auf Anfrage jeder Filiale mitgeteilt werden. +Korrekturen können dadurch sehr mühsam werden. Natürlich sind ohne Kartenleser +(und dem damit verbundenen 'Ausweis' Codekarte) auch jederzeit Einkäufe mit jeder +beliebigen Kundennummer möglich. Auch hier sollten Sie etwaigem Mißbrauch +vorbeugen. + + +#on("b")#w Warendatei bearbeiten#off("b")# + + Hiermit kann die Warendatei der Filiale aufgebaut und verändert werden. Der + Bildschirm sieht dabei wie folgt aus: +#on("b")# ++------------------------------------------------------------------------+ +|WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|-----------------------------------+------------------------------------| +| | Artikelnummer : 1 | +| | | +| | | +| | Artikelname : Bier (Kasten)| +| | | +| | Preis : 16.85 | +| | | +| | Mindestbestand : 25 | +| | | +| | Bestand : 20 | +| | | +| | | +| | Alles richtig ? | +| | | +| | Ja Nein | +|-----------------------------------+------------------------------------| +| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> | ++------------------------------------------------------------------------+ +#off("b")# + + Zunächst muß eine Artikelnummer (1...15) eingegeben werden (je nach + Einstellung über die Tastatur oder mittels einer Warenkarte über den Code + kartenleser). Unzulässige Artikelnummern werden dabei nicht akzeptiert. +#page# + Ist unter dieser Nummer bereits ein Artikel gespeichert, so werden die ent + sprechenden Artikeldaten in dem rechten oberen Bildschirmfenster gezeigt + und können dort geändert oder einfach übernommen werden. Gibt es noch + keinen Artikel mit dieser Nummer, so sind neue Artikeldaten einzugeben. + + Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Artikelnummer + die Tastenfolge <ESC><q> gedrückt wird. + + Achten Sie darauf, daß in jeder Filiale der zu einer Artikelnummer gehörige + Artikel stets denselben Artikelnamen und -preis erhält. Bestand und Mindest + bestand können unterschiedlich sein. + + +#on("b")#k Kundendatei bearbeiten#off("b")# + + Hiermit kann die Kundendatei der Filiale aufgebaut und verändert werden. + Ähnlich wie bei der Funktion 'Warendatei bearbeiten' erfolgen die Eingaben im + rechten oberen Bildschirmfenster. + + Zunächst muß eine Kundennummer (129...159) eingegeben werden (je nach + Einstellung über die Tastatur oder mittels einer Kundenkarte über den Code + kartenleser). Unzulässige Kundennummern werden dabei nicht akzeptiert. + + Ist unter dieser Nummer bereits ein Kunde in der Filiale oder in der Zentrale + gespeichert, so werden die entsprechenden Kundendaten in dem rechten + oberen Bildschirmfenster gezeigt und können dort geändert oder einfach über + nommen werden. Gibt es noch keinen Kunden mit dieser Nummer, so sind + neue Kundendaten einzugeben. (Neueingaben und Änderungen werden sofort + der Zentrale, aber nicht automatisch den andern Filialen mitgeteilt!) + + Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Kunden + nummer die Tastenfolge <ESC><q> gedrückt wird. +#page# +#on("b")#e Einkaufen#off("b")# + + Zunächst wird eine Kundennummer (129...159) erfragt. Wird die Nummer + eines Kunden eingegeben, dessen Daten in der Filiale oder Zentrale bereits + gespeichert sind, so erscheint im linken Bildschirmfenster der Rechnungskopf + mit dem Namen des Kunden. Ist unter der Nummer noch kein Kunde einge + tragen oder wird die Eingabe der Kundennummer durch die Tastenfolge + <ESC><q> abgebrochen, so enthält der Rechnungskopf keinen Kunden + namen. + + Das eigentliche Einkaufen erfolgt nun durch die Eingabe von Artikelnummern + (1...15). Der zugehörige Artikelname und der Preis werden daraufhin in die + Rechnung eingetragen. +#on("b")# ++------------------------------------------------------------------------+ +|WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|----------------------------------+-------------------------------------| +| RECHNUNG für Herrn B. Pollok | Artikelnummer : 1 | +| | | +| Bier (Kasten) 16.85 | | +| Tageszeitung 0.80 | | +| Pflaster 2.39 | | +| Mehl 0.79 | | +| Seife 1.80 | | +| Weinbrand 12.75 | | +| Zigaretten 3.80 | | +| Brot 2.29 | | +| Schallplatte 19.90 | | +| Geodreieck 2.35 |-------------------------------------| +| Videokassette 12.75 | Artikelnummer eingeben | +| Schulheft 0.85 | | +| | Stoptaste: <ESC><q> | +|----------------------------------+-------------------------------------| +| Einkaufen | ++------------------------------------------------------------------------+ +#off("b")# | + + Dieser Vorgang wird solange wiederholt, bis die Eingabe einer Artikelnummer + durch Tippen der Tastenfolge <ESC><q> abgebrochen wird. + + Abschließend wird der Rechnungsgesamtbetrag ausgegeben und gefragt, ob die + Rechnung gedruckt werden soll. +#page# +#on("b")#a Auskunft einholen#off("b")# + + Mit Hilfe dieses Kommandos lassen sich nach Einlesen einer Codenummer (je + nach Einstellung über Tastatur oder Codekartenleser) verschiedene Auskünfte + über die gespeicherten Daten abrufen. Es können #on("b")#Einzelauskünfte#off("b")# oder + #on("b")#Listenauskünfte#off("b")# eingeholt werden. Bei Eingabe einer falschen Nummer wird + die Auskunft abgebrochen! + + + #on("b")#Einzelauskünfte:#off("b")# + + Codenummern 1...15 (Artikelnummern): + Die zugehörigen Artikeldaten werden im rechten oberen Bild + schirmfenster angezeigt. + + Codenummern 129...159 (Kundennummern): + Die zugehörigen Kundendaten werden im rechten oberen + Bildschirmfenster angezeigt. + + + #on("b")#Listenauskünfte:#off("b")# + + Hierbei liefern jeweils 3 benachbarte Codenummern von der Art her ähnliche + Auskunfts-Listen, die auf Wunsch auch ausgedruckt werden können. Die + mittlere Nummer bezieht die Auskünfte stets auf die eigene Filiale; die beiden + anderen sind nur effizient, wenn mehrere Filialen angemeldet sind. Dabei + werden bei Eingabe der linken Nummer die jeweiligen Daten #on("b")#aller#off("b")# Filialen + 'aufaddiert' und in #on("b")#einer#off("b")# Gesamtliste ausgegeben. Bei Eingabe der rechten + Nummer hingegen werden die jeweiligen Listen von allen angeschlossenen + Filialen der Reihe nach abgerufen und #on("b")#hintereinander#off("b")# in eine Datei ge + schrieben, sodaß man eine Zusammenstellung der entsprechenden #on("b")#Einzel#off("b")#- + Listen der Filialen erhält: +#page# + Codenummern 66, 67, 68: + Die bisherigen Verkaufszahlen der einzelnen Waren werden + gezeigt; die Listen sind sortiert nach diesen Zahlen ('Ver + kaufs-Hitlisten'). + + Codenummern 73, 74, 75: + Nach Eingabe einer Artikelnummer wird eine Liste aller + Käufer dieses Artikels ausgegeben. + + Codenummern 77, 78, 79: + Diese Codes liefern Kundenlisten der Filialen. + + Codenummern 84, 85, 86: + Nach Eingabe einer Kundennummer wird eine Liste aller von + diesem Kunden gekauften Artikel ausgegeben. + + Codenummern 89, 90, 91: + Diese Codes liefern die Lagerbestandslisten der Filialen. Sollte + sich bei der Auskunft '90' herausstellen, daß der Bestand + mehrerer Artikel unter den Mindestbestand abgesunken ist, ist + es sinnvoll, als nächstes den Menupunkt 'Nachbestellen' + anzuwählen (s.u.). +#page# + Beispiel: Der Code '90' liefert bei entsprechend eingegebener Warendatei + folgende Auskunft: +#on("b")# + +------------------------------------------------------------------------+ + | ............. Auskunft: Filiale 1 ................... Zeile 1 | + | | + | Lagerübersicht: | + | ---------------------------------------------------------------------- | + | ---------------------------------------------------------------------- | + | | Art.Nr.| Artikelname | Preis | Min.Best. | Bestand | | + | ---+---------+------------------+-------------+-----------+----------+ | + | | | | | | | | + | | 1 | Bier (Kasten) | 16.85 | 25 | 19 | | + | | 2 | Tageszeitung | 0.80 | 15 | 16 | | + | | 3 | Pflaster | 2.39 | 14 | 22 | | + | | 4 | Mehl | 0.79 | 32 | 58 | | + | | 5 | Seife | 1.80 | 27 | 49 | | + | | 6 | Weinbrand | 12.75 | 24 | 41 | | + | | 7 | Zigaretten | 4 +------------+--------+ | | + | | 8 | Brot | 2 | Auskunft drucken ?| | | + | | 9 | EMMA | 3 | | | | + | | 10 | Schallplatte | 19 | Ja Nein | | | + | | 11 | Geodreieck | 2 +---------------------+ | | + | | | | | | | + | | | | | | | + | | | | | | | + |----------------------------------------------------------------------- | + | | Ändern: <Pfeile> Bestätigen: <RETURN> | + + -----------------------------------------------------------------------+ + +#off("b")# + + Hinweis: Nur die zu den jeweils mittleren Codenummern gehörigen Aus + kunftsfunktionen arbeiten mit Daten, die in der eigenen Task + gespeichert sind. Bei den übrigen Auskünften müssen Daten aus + anderen Filialverwaltungs-Tasks oder der Zentrale geholt werden, + so daß die Erstellung solch einer Auskunft recht zeitaufwendig ist. + Um zu lange Wartezeiten zu vermeiden, sollten nicht mehrere + Filialen gleichzeitig Auskünfte dieser Art einholen. +#page# +#on("b")#n Nachbestellen#off("b")# + + Auf dem Bildschirm wird eine Bestelliste ausgegeben, die alle Artikel enthält, + deren Bestand innerhalb der Filiale den Mindestbestand unterschritten hat. + + Die Nachbestellung ist so bemessen, daß diese Artikel wieder mit ihrem + doppelten Mindestbestand vorrätig sind. Die neuen Bestände werden auto + matisch in die Warendatei der Filiale eingetragen. + + Auf Wunsch kann die Bestelliste ausgedruckt werden. + + +#on("b")#d Dezimalwert lesen#off("b")# + + Der aktuelle Wert, der vom Codekartenleser gelesen wird, wird (ähnlich wie bei + 'Bitmuster lesen', s.u.) auf dem Bildschirm ausgegeben, bis <ESC><q> + gedrückt wird. Mit Hilfe dieses Kommandos kann man z.B. die Funktion des + Codekartenlesers testen und den Zusammenhang zwischen Bitmuster und + Dezimalwert klären. + + Dieser Menupunkt ist (ebenso wie der nächste) nur dann aufrufbar, wenn + unter #on("b")#Eingabeart#off("b")# der #on("b")#Kartenleser#off("b")# eingestellt ist. + + +#on("b")#b Bitmuster lesen#off("b")# + + Dieser Menupunkt ist nur dann aufrufbar, wenn unter #on("b")#Eingabeart#off("b")# der + #on("b")#Kartenleser#off("b")# eingestellt ist (vgl. Kapitel 5.3). + + Ist das der Fall, so wird hier das aktuelle Bitmuster, das vom Codekartenleser + gelesen wird, auf dem Bildschirm ausgegeben, bis <ESC><q> gedrückt + wird. +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|-----------------------------------+-------------------------------------| +| | | +| | | +| | Bitmuster : 0I00III0 | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | Lesen beenden mit <ESC><q> | +| +-------------------------------------| +| | +| Bitmuster lesen | ++-------------------------------------------------------------------------+ +#off("b")# + + Ein Bitmuster besteht aus 8 Zeichen (z.B. 'OIOOIIIO'). Dabei zeigt jedes 'I' ein + Loch an der entsprechenden Stelle der Codekarte an, die sich gerade im + Kartenlesegerät befindet. Dieses Bitmuster entspricht der Dualzahl 01001110 + (im 'Zweiersystem'); zu ihr gehört die Dezimalzahl +#on("b")# + + 0 * 128 + 1 * 64 + 0 * 32 + 0 * 16 + 1 * 8 + 1 * 4 + 1 * 2 + 0 * 1 = 78. +#off("b")# + + Mit Hilfe dieses Kommandos können Sie z.B. die Funktion des Codekarten + lesers testen. Bei voller Beleuchtung aller 8 Sensoren muß das Bitmuster + 'IIIIIIII' geliefert werden. Decken Sie einige Sensoren mit den Fingern oder + einer Lochkarte ab, so muß sich das Bitmuster auf dem Bildschirm ent + sprechend verändern. Ist das nicht der Fall, so liegt ein Fehler vor. + + Prüfen Sie dann erst einmal, ob der Steckplatz mit Strom versorgt wird (Netz + kabel in der Steckdose? Compact-Box mit Netzteil richtig verbunden?) Ist dort + alles in Ordnung, so könnte der Fehler noch in der Verbindung zum Adapter + liegen. (Steckplatz ordnungsgemäß mit Adapter verbunden? Richtiges Kabel + verwendet?) +#page# + Sollten Sie auf diese Weise nicht zum Erfolg kommen, so verlassen Sie diesen + Menupunkt und wählen noch einmal den Oberbegriff 'Eingabeart' an. Stellen + Sie dort die Eingabeart zunächst auf 'Tastatur um' und dann wieder auf + 'Kartenleser'. Treten hier Fehlermeldungen auf, so lesen Sie in Kapitel 5.3 + nach. Läßt sich die Umstellung dagegen problemlos vornehmen, so müßte nun + auch das 'Bitmuster lesen' wieder funktionieren. + + +#on("b")#5.5 Menufunktionen zum Oberbegriff 'Programme'#off("b")# + +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|---------------------+----------------------+----------------------------| +| | n Neu erstellen | | +| | a Ansehen/Ändern | | +| | ------------------ | | +| | s Starten | | +| | w Wiederholen | | +| | ------------------ | | +| | v Verzeichnis | | +| | ------------------ | | +| | l Löschen | | +| | d Drucken | | +| | ------------------ | | +| | k Kopieren | | +| | u Umbenennen | | +| +----------------------+ | +|-------------------------------------------------------------------------| +| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> | ++-------------------------------------------------------------------------+ +#off("b")# + +#on("b")#n Neu erstellen#off("b")# + + Mit dieser Funktion können Sie eine neue Programmdatei anlegen und + beschreiben. + + Sie werden zunächst nach einem Namen für die #on("b")#neue#off("b")# Programmdatei gefragt. + Geben Sie einen beliebigen Namen (#on("b")#ohne Anführungszeichen (!)#off("b")#) ein und +#page# + schließen Sie die Eingabe durch <RETURN> ab. Daraufhin wird Ihnen auf + dem Bildschirm eine neue Datei zum Beschreiben angeboten. + + Sollte schon eine Programmdatei mit diesem Namen in der Task vorhanden + sein, so werden Sie darauf aufmerksam gemacht. + + Sie können sich während des Schreibens die wichtigsten Tastenfunktionen des + Editors einblenden lassen. Tippen Sie dazu die Tastenfolge <ESC><?>. Es + erscheint dann das folgende Angebot aus dem Sie auswählen können: + +#on("b")# + +-----------------------------------------------------+ + | Der EUMEL - Editor | + | | + | b ... Beschreibung desEditors | + | w ... Wichtige Tasten | + | p ... Positionieren der Schreibmarke | + | k ... Korrigieren im Text (Einfügen/Löschen) | + | m ... Markierte Textpassagen bearbeiten | + | l ... Lernen im Editor | + | a ... Anweisungen im Editor (Kommandodialog) | + | | + | z ... Zurück in den Schreibmodus | + | | + | b w p k m l a z | + | | + +-----------------------------------------------------+ +#off("b")# + Fehlerfälle: + - Eine Programm-Datei mit dem vorgeschlagenen Namen existiert schon. + + +#on("b")#a Ansehen/ändern#off("b")# + + Mit dieser Funktion können Sie sich Dateien, die schon in Ihrer Task + existieren, ansehen oder auch verändern. + + Sie werden zunächst gefragt, ob Sie #on("b")#die zuletzt bearbeitete Programmdatei#off("b")# + ansehen bzw. verändern möchten (sofern Sie schon vorher mit #on("b")#gs-Warenhaus#off("b")# + in der Task gearbeitet haben). +#page# + Bejahen Sie diese Frage, dann wird Ihnen diese Programmdatei zur Bear + beitung angeboten. Verneinen Sie die Frage dagegen, so gelangen Sie in die + 'Auswahl' (d.h es werden Ihnen alle Programmdateien in der Task zur Auswahl + angeboten). Nachdem Sie einen der Namen angekreuzt haben, wird Ihnen die + ausgewählte Programmdatei zur Bearbeitung auf dem Bildschirm angeboten. + + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + + +#on("b")#s Starten#off("b")# + + Mit dieser Menufunktion können Sie ein fertiggestelltes Programm übersetzen + und ausführen lassen. + + Sie werden zunächst gefragt, ob #on("b")#das zuletzt bearbeitete Programm#off("b")# ausgeführt + werden soll. Bejahen Sie die Frage, so wird dieses Programm gestartet; ver + neinen Sie die Frage dagegen, so gelangen Sie in die 'Auswahl'. Nach An + kreuzen des gewünschten Programmnamens wird das ausgewählte Programm + ausgeführt. + + Sind im Programm noch Fehler enthalten, so werden das Programm und die + Fehlermeldungen gleichzeitig auf dem Bildschirm dargestellt (Paralleleditor) + und zur Korrektur angeboten. Für die Programmkorrektur stehen ebenfalls alle + Editorfunktionen zur Verfügung. + + Sollte Ihnen beim Programmieren ein Fehler unterlaufen sein (z.B. eine + Endlosschleife), so kann mit der Tastenfolge <ESC><h> der Programm + ablauf abgebrochen werden ("Notbremse"). +#page# +#on("b")#w Wiederholen#off("b")# + + Mit dieser Funktion können Sie den Ablauf des zuletzt ausgeführten + Programms wiederholen, ohne daß das Programm neu übersetzt wird. + + Beachten Sie aber bitte, daß Veränderungen am Programmtext, die seit dem + letzten Programmlauf vorgenommen wurden, #on("b")#nicht#off("b")# berücksichtigt werden; + dazu muß das Programm erneut mit der Menufunktion 'Starten' übersetzt + werden. + + Ist die Wiederholung eines Programmlaufs nicht möglich, so erfolgt ein Hin + weis darauf. + + +#on("b")#v Verzeichnis#off("b")# + + Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task + vorhandenen Programmdateien verschaffen. + + Nach Aufruf dieser Funktion wird eine Liste der Programmdateien auf dem + Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste selbst + eine Text-Datei ist, kann Sie mit der Tastenkombination <ESC><q> ver + lassen werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen. + Falls nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit + <HOP><runter> und <HOP><hoch> verschieben. + + +#on("b")#Löschen#off("b")# + + Mit dieser Funktion können Sie Programmdateien, die Sie nicht mehr + benötigen, die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien + verschwinden durch diese Funktion unwiederbringlich! + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + <ESC><q> verlassen. +#page# + Für jede einzelne Programmdatei wird noch einmal zur Sicherheit gefragt, ob + sie auch tatsächlich gelöscht werden soll. Zur Bestätigung tippen Sie bitte die + Taste <j> ('ja') - zur Verhinderung <n> ('nein'). + + Fehlerfälle: + - In der Task exsitiert noch keine Programmdatei + + +#on("b")#d Drucken#off("b")# + + Mit dieser Funktion können Sie Programmdateien über einen angeschlossenen + Drucker ausgeben lassen. + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + <ESC><q> verlassen. + + Die angekreuzten Programmdateien werden anschließend zum Drucker ge + schickt. Der Vorgang wird auf dem Bildschirm protokolliert. + + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' betrieben. + - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich + mit einer Codenummer identifizieren. + + +#on("b")#k Kopieren#off("b")# + + Mit dieser Funktion können Sie sich eine Kopie einer bereits in der Task + vorhandenen Programmdatei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich + einen bestimmten 'Stand' aufbewahren wollen oder wenn Sie ein Programm + schreiben wollen, das einem bereits vorhandenen ähnelt. +#page# + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird der angekreuzte Name angezeigt und der Name für die + Kopie erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch + nicht für eine Programmdatei vergeben wurde; ansonsten erfolgt ein Hinweis + darauf und es wird nicht kopiert! + + Da man aber oft für die Kopie einen ähnlichen Namen wie für das Original + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier + funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der + Task. + + +#on("b")#u Umbenennen#off("b")# + + Mit dieser Funktion können Sie einer bereits vorhandenen Programmdatei + einen neuen Namen geben. + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird dieser Name angezeigt und der zukünftige Name für die + Programmdatei erfragt. Es muß ein Name eingetragen werden, der in dieser + Task noch nicht für eine Programmdatei vergeben wurde - ansonsten erfolgt + ein Hinweis darauf und die Programmdatei wird nicht umbenannt! +#page# + Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier + funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der + Task. + + + +#on("b")#5.6 Menufunktionen zum Oberbegriff 'Filialdaten'#off("b")# +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|---------------------------------------+--------------------------+------| +| | e Eintragen/ergänzen | | +| | z Zusammenstellen | | +| | ----------------------- | | +| | v Verzeichnis | | +| | ----------------------- | | +| | l Löschen | | +| | u Umbenennen | | +| +--------------------------+ | +| | +| | +|-------------------------------------------------------------------------| +| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>| ++-------------------------------------------------------------------------+ + +#off("b")# + +#on("b")#e Eintragen/ergänzen#off("b")# + + Mit diesem Menupunkt können Sie Filialdaten-Dateien, die Sie z.B. von der + Vatertask oder von der Diskette geholt haben, in Ihrer Task laden. +#page# + Ihnen werden zunächst alle vorhandenen Filialdaten-Dateien zur Auswahl + angeboten. Anschließend werden die angekreuzten Dateien in der Reihenfolge, + in der sie angekreuzt wurden, zur Filialverwaltung geschickt und die Daten + dort zu den bereits vorhandenen hinzugefügt. Gegebenenfalls wird auch die + zentrale Kundendatei ergänzt. Der Vorgang wird auf dem Bildschirm + protokolliert. + + Beachten Sie bitte, daß in der Filiale etwa vorhandene Daten dadurch nicht + überschrieben, sondern lediglich ergänzt werden. Ein gänzliches Beseitigen von + alten Daten gelingt nur durch Löschen der Filialtask. + + Fehlerfälle: + - In der Task exsitieren noch keine Filialdaten-Dateien. + + +#on("b")#z Zusammenstellen#off("b")# + + Mit dieser Funktion können Sie eine Datei anlegen, in der die aktuell in der + Filiale gehaltenen Daten zusammengestellt werden. Solch eine Datei kann man + sich jedoch nicht ansehen! + + Zunächst wird der Name der Datei erfragt, in die die Filialdaten geschrieben + werden sollen. Danach werden darin die aktuellen Daten gespeichert und es + wird eine 'Vollzugsmeldung' ausgegeben. + + Die Daten können dann später mit Hilfe der Archiv-Funktionen (vgl. Kapitel + 5.7) z.B. auf einer Diskette gespeichert werden, damit Sie beim eventuellen + Löschen der Filialtask nicht verlorengehen. Eine Verwechselung mit + Programmdateien ist nicht möglich, da Namen für Filialdaten-Dateien (intern) + automatisch mit dem Präfix 'Filialdaten:' versehen werden. + + Fehlerfälle: + - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der + Task. +#page# +#on("b")#v Verzeichnis#off("b")# + + Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task + vorhandenen Filialdaten-Dateien verschaffen. + + Nach Aufruf dieser Funktion wird eine Liste der Filialdaten-Dateien auf dem + Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste eine + Text-Datei ist, kann Sie mit der Tastenkombination <ESC><q> verlassen + werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen. Falls + nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit + <HOP><runter> und <HOP><hoch> verschieben. + + +#on("b")#l Löschen#off("b")# + + Mit dieser Funktion können Sie Filialdaten-Dateien, die Sie nicht mehr + benötigen und die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien + verschwinden durch diese Funktion unwiederbringlich! + + Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + <ESC><q> verlassen. + + Für jede einzelne Datei wird nachgefragt, ob sie auch tatsächlich gelöscht + werden soll. Zur Bestätigung tippen Sie bitte die Taste <j> ('ja') - zur Ver + hinderung <n> ('nein'). + + Fehlerfälle: + - In der Task exsitiert noch keine Filialdaten-Datei. +#page# +#on("b")#u Umbenennen#off("b")# + + Mit dieser Funktion können Sie einer bereits vorhandenen Filialdaten-Datei + einen neuen Namen geben. + + Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird dieser Name angezeigt und der zukünftige Name für die + Datei erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch + nicht für eine Filialdaten-Datei vergeben wurde - ansonsten erfolgt ein Hinweis + darauf und die Datei wird nicht umbenannt! + + Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier + funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der + Task. +#page# +#on("b")#5.7 Menufunktionen zum Oberbegriff 'Archiv'#off("b")# +#on("b")# ++--------------------------------------------------------------------------+ +| WARENHAUS: Info Eingabeart Kommandos Programme Filialdaten Archiv | +|---------------------------------------------+------------------------+---| +| | r Reservieren | | +| | - Neue Diskette | | +| | -------------------- | | +| | - Schreiben | | +| | - Checken | | +| | - Kombination | | +| | - Holen/Lesen | | +| | - Löschen | | +| | -------------------- | | +| | - Verzeichnis | | +| | - Drucken | | +| | -------------------- | | +| +-----------------------+ | i Initialisieren | | +| | Dateiaustausch mit: | | z Zieltask einstellen| | +| | Archiv | +------------------------+ | +| | Archivname: | | +| | gs-Warenhaus | | +| +-----------------------+ | +|--------------------------------------------------------------------------| +| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> | ++--------------------------------------------------------------------------+ +#off("b")# + +In diesem Kapitel werden alle die Menufunktionen beschrieben, die Ihnen unter dem +Oberbegriff 'Archiv' im Menu angeboten werden. Mit den Funktionen in diesem Menu +können Sie aber nicht nur Dateien auf dem Archiv behandeln, sondern auch in +anderen Tasks im Multi-User-System oder über das EUMEL-Netz sogar auf anderen +Rechnern! + +Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen haben, sind nicht alle +Funktionen aktivierbar! Um weitere Funktionen zu aktivieren, muß erst einer der +aktivierbaren Menupunkte gewählt werden. + +Bei der Archivbehandlung werden Ihnen jeweils alle in der Task vorhandenen Dateien +zur Auswahl angeboten. Das System unterscheidet nicht von sich aus - wie unter den +#page# +Oberbegriffen 'Programme' und 'Filialdaten' - zwischen Programm- und Filial +daten-Dateien. In den hier gezeigten Listen können Sie aber Filialdaten-Dateien +daran erkennen, daß ihnen das Präfix 'Filialdaten:' vorangestellt ist. + + +#on("b")#r Reservieren#off("b")# (des Archivlaufwerks) + + Im EUMEL-Multi-User-System haben normalerweise mehrere Personen das + Zugriffsrecht auf das Archivlaufwerk. Allerdings muß der Zugriff so geregelt + werden, daß sich die Beteiligten dabei nicht gegenseitig "in die Quere + kommen". Ein Zugriff auf das Archivlaufwerk erfordert zunächst eine An + meldung. Ist diese Anmeldung erfolgt, kann von den anderen Beteiligten so + lange nicht mehr auf das Laufwerk zugegriffen werden, bis es wieder freige + geben worden ist. + + Diese Anmeldung des Archivlaufwerkes erfolgt über die Menufunktion 'r Reser + vieren'. Greift bereits eine andere Task auf das Laufwerk zu, so erhalten Sie + darüber einen Hinweis auf dem Bildschirm. Ansonsten wird an Sie die Frage + gestellt, ob die Diskette eingelegt und das Laufwerk geschlossen ist. + + Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie den alleinigen Zugriff auf + das Laufwerk haben. Deshalb sollten Sie, wenn Sie mit mehreren Personen am + Computer arbeiten, erst zum Zeitpunkt der Fragestellung die Diskette ins Lauf + werk einlegen. + + Nachdem Sie die Diskette eingelegt und die Frage bejaht haben, ermittelt das + System selbständig den Namen der eingelegten Diskette, zeigt den Namen auf + dem Bildschirm (im kleinen Kasten links unten) an und aktiviert die anderen + Menupunkte des Pull-Down-Menus. + + Beim Verlassen des Pull-Down-Menus, wenn eine andere Zieltask eingestellt + wird oder wenn das Menu gänzlich verlassen wird, wird die Reservierung + automatisch aufgehoben! +#page# + Fehlerfälle: + - Das Laufwerk ist von einer anderen Task belegt. + - Die Diskette ist falsch eingelegt oder das Laufwerk ist nicht richtig ge + schlossen. + - Die Diskette ist nicht formatiert bzw. initialisiert. + - Die Diskette kann nicht gelesen werden (keine EUMEL-Diskette, Diskette + hat ein falsches Format, Diskette ist verschmutzt...). + + +#on("b")#n Neue Diskette#off("b")# (anmelden) + + Der Dateiaustausch mit einer Diskette ist nur dann möglich, wenn der im + System eingestellte Diskettenname (auf dem Bildschirm im kleinen Kasten + unten links sichtbar) mit dem tatsächlichen Namen der Diskette überein + stimmt. Nach einem Diskettenwechsel ist das aber in der Regel nicht mehr der + Fall. Greift man dann auf die neu eingelegte Diskette zu, so erscheint die + Fehlermeldung: 'Falscher Archivname! Bitte neue Diskette anmelden!'. + + Das Anmelden einer neuen Diskette - ohne einen neuen Reservierungsvorgang + - wird durch diese Menufunktion ermöglicht. Nach Aktivieren dieses Menu + punktes wird der Name der eingelegten Diskette ermittelt, im System eingestellt + und auf dem Bildschirm angezeigt. + + Im Gegensatz zur Menufunktion 'r Reservieren' greift das System ohne Anfrage + an den Benutzer auf das Archivlaufwerk zu (die Reservierung bleibt ja be + stehen). Ist das Archivlaufwerk reserviert, so ist die Neuanmeldung einer Dis + kette über diese Menufunktion weniger zeitaufwendig. + + Fehlerfälle: + - wie unter 'r Reservieren'. +#page# +#on("b")#s Schreiben#off("b")# (Kopieren) + + Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die + Auswahl durch die Tastenfolge <ESC><q> verlassen, überprüft das System + zunächst, ob die Dateien in der eingestellten Zieltask schon vorhanden sind. Ist + das der Fall, wird erfragt, ob die dort vorhandenen Dateien überschrieben, d.h. + gelöscht werden dürfen (s.u.). Anschließend werden alle angekreuzten Dateien + in der Reihenfolge, in der Sie sie angekreuzt haben, in die eingestellte Zieltask + kopiert. Der Vorgang wird auf dem Bildschirm protokolliert. Die Original + dateien in der eigenen Task bleiben dabei erhalten. + + Wenn in der Zieltask schon eine Datei existiert, die den gleichen Namen hat + wie eine Datei, die Sie dorthin kopieren möchten, so wird angefragt, ob die + vorher schon existierende Datei überschrieben (gelöscht!) werden soll. Bejahen + Sie diese Frage, so wird die bereits in der Zieltask existierende Datei (un + wiederbringlich) gelöscht und die gewünschte Datei dorthin transportiert. Ein + Überschreiben aus Versehen ist nicht möglich, wenn Sie die an Sie gestellte + Frage sorgfältig beantworten. + + Verneinen Sie die Frage, so wird die Datei auch nicht hinübertransportiert! Sie + können die Datei aber umbenennen (Menufunktion 'u Umbenennen' unter + den Oberbegriffen 'Programme' bzw. 'Filialdaten') und anschließend mit + anderem Namen hinüberschreiben. + + Beachten Sie, daß beim Überschreiben einer Datei auf einer Archivdiskette der + Speicherplatz der alten (überschriebenen) Version im allgemeinen nicht + wiederverwendet werden kann. In einem solchen Fall könnte die Diskette voll + geschrieben werden, obwohl eigentlich genügend Platz vorhanden wäre. Zur + Optimierung wird deshalb zuerst überprüft, ob die angekreuzten Dateien + schon in der Zieltask vorhanden sind und löscht diese, wenn Sie Ihr Einver + ständnis geben. Erst anschließend werden die Dateien insgesamt kopiert. +#page# + Normalerweise ist als Zieltask das Archivlaufwerk der eigenen Station einge + stellt. Mit der Menufunktion 'z Zieltask einstellen' kann diese Einstellung aber + verändert werden. + + Fehlerfälle: + - Die Diskette ist falsch eingelegt oder beschädigt. + - Die Diskette kann nicht beschrieben werden (Schreibfehler). + - Die Diskette ist voll. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + + +#on("b")#c Checken#off("b")# + + Diese Menufunktion kann nur ausgeführt werden, wenn der Dateiaustausch + mit einem Archiv(manager) erfolgt - ansonsten ist diese Menufunktion auch + nicht aktivierbar. Die Menufunktion dient dazu, auf Diskette geschriebene + Dateien auf Lesefehler hin zu prüfen. Es empfiehlt sich, diese Prüfroutine auf + neu auf die Diskette geschriebene Dateien anzuwenden. Sehen Sie dazu auch + 'k Kombination'. + + Alle Dateien der eingestellten Zieltask (Archiv) werden zur Auswahl angeboten. + Wenn Sie die Auswahl durch die Tastenfolge <ESC><q> verlassen, werden + alle angekreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, + "gecheckt", d.h. auf Lesefehler hin überprüft. Der Vorgang wird auf dem Bild + schirm protokolliert. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren'. +#page# +#on("b")#k Kombination#off("b")# + + Diese Menufunktion ist eine Kombination aus den beiden Menufunktionen 's + Schreiben' und 'c Checken' (Sehen Sie weitere Informationen auch dort!). + + Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die + Auswahl durch die Tastenfolge <ESC><q> verlassen, werden alle ange + kreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, in die + eingestellte Zieltask kopiert (gegebenenfalls müssen bereits vorhandene + Dateien gleichen Namens in der Zieltask gelöscht werden). Anschließend + werden alle Dateien, die gerade geschrieben wurden, gecheckt, d.h. auf Lese + fehler hin untersucht. Beide Vorgänge werden auf dem Bildschirm + protokolliert. + + Da die 'Check' - Operation nur bei Archivmanagern zulässig ist, ist diese Menu + funktionen ebenfalls nur bei Archivmanagern aktivierbar. Zur Erläuterung + sehen Sie bitte auch unter 'z Zieltask einstellen'. + + +#on("b")#h Holen/Lesen#off("b")# + + Die Menufunktion dient dazu, Dateien, die bereits auf einer Archivdiskette oder + in einer anderen Task existieren, in die eigene Task zu kopieren. + + Alle Dateien der eingestellten Zieltask werden zur Auswahl angeboten. An + schließend werden Kopien der angekreuzten Dateien in der Reihenfolge des + Ankreuzens in die eigene Task geholt. Das Original in der Zieltask bleibt dabei + unverändert! Der Vorgang wird auf dem Bildschirm protokolliert. + + Sind in der eigenen Task schon Dateien mit gleichem Namen vorhanden, so + wird gefragt, ob die 'alten' Dateien überschrieben (gelöscht) werden dürfen. + Nur wenn Sie zustimmen, werden die in Ihrer Task existierenden Dateien + (unwiederbringlich!) gelöscht und Kopien der gleichnamigen Dateien aus der + Zieltask angefertigt. +#page# + Stimmen Sie dem Löschvorgang nicht zu, dann bleiben die bisherigen Dateien + in Ihrer Task erhalten - die Dateien aus der Zieltask werden dann aber auch + nicht in Ihre Task kopiert! Um dennoch die Kopien zu erhalten, können Sie die + namensgleichen Dateien in Ihrer Task umbenennen und dann erst die Dateien + aus der anderen Task anfordern. + + Normalerweise werden die Dateien vom Archiv der eigenen Station geholt. Mit + dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert + werden. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + + +#on("b")#l Löschen#off("b")# + + Die Menufunktion dient dazu, Dateien in der Zieltask (unwiederbringlich!) zu + löschen. Dazu werden alle Dateien der eingestellten Zieltask zur Auswahl ange + boten. Anschließend werden die angekreuzten Dateien in der Reihenfolge ihres + Ankreuzens gelöscht. Zur Sicherheit muß noch einmal für jede einzelne Datei + bestätigt werden, daß sie auch tatsächlich gelöscht werden soll. + + Beachten Sie, daß beim Löschen einer Datei auf einer Archivdiskette der + Speicherplatz im allgemeinen nicht wieder verwendet werden kann. In einem + solchen Fall könnte die Diskette voll geschrieben werden, obwohl eigentlich + genügend Platz vorhanden wäre. Diese Probleme treten bei anderen Tasks, die + keine Archivmanager sind, nicht auf, da deren Speicherplatz intelligenter + verwaltet wird. +#page# + Normalerweise ist als Zieltask das Archiv der eigenen Station eingestellt. Mit + dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert + werden. + + Fehlerfälle: + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + + +#on("b")#v Verzeichnis#off("b")# + + Mit dieser Menufunktion können Sie sich einen Überblick über die in der + Zieltask (z.B. auf dem Archiv) vorhandenen Dateien verschaffen. + + Nach Aufruf der Funktion wird eine Liste der Dateien auf dem Bildschirm + ausgegeben, die sich in der Zieltask (z.B. auf dem Archiv) befinden. Ist die + Zieltask ein Archiv(manager), so wird auch angezeigt, wieviel Platz auf der + Diskette belegt ist. Da die Liste selbst eine Datei ist, kann sie mit der Tasten + kombination <ESC><q> verlassen werden. Falls nicht alle Dateinamen auf + den Bildschirm passen, können Sie das Fenster mit <HOP><hoch> und + <HOP><runter> verschieben. + + Fehlerfälle: + - Sehen Sie unter 'z Zieltask einstellen'. + + +#on("b")#d Drucken#off("b")# + + Das Verzeichnis der Dateien in der Zieltask, das man mit der Menufunktion 'v + Verzeichnis' auf dem Bildschirm angezeigt bekommt, kann mit dieser Menu + funktion ausgedruckt werden. +#page# + Zur Sicherheit wird angefragt, ob wirklich ein solches Dateiverzeichnis der + Zieltask gedruckt werden soll. Bejaht man die Frage, so wird ein Dateiver + zeichnis erstellt und zum Drucker geschickt. + + Fehlerfälle: + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' betrieben. + - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich + mit einer Codenummer identifizieren. + + +#on("b")#i Initialisieren#off("b")# + + Diese Menufunktion gestattet es, frische Disketten zu formatieren, zu initiali + sieren bzw. beschriebene Disketten vollständig zu löschen und ggf. dabei + umzubenennen. Bei Aufruf dieser Menufunktion wird - sofern noch nicht + geschehen - das Archivlaufwerk automatisch reserviert. + + Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, müssen Sie + diese zunächst #on("b")#formatieren#off("b")#. Dabei wird die Diskette auf ein festgelegtes + physikalisches Format eingestellt. Ohne daß diese Operation vorausgegangen + ist, kann eine Diskette weder beschrieben noch gelesen werden. + + Prinzipiell braucht eine Diskette nur ein einziges Mal formatiert zu werden. Sie + können Sie jedoch jederzeit wieder formatieren - z.B. wenn Sie Disketten + haben, von denen Sie nicht genau wissen, für welche Zwecke sie zuvor ver + wendet wurden. + + Wenn Sie diese Menufunktion aktivieren, werden Sie so zunächst gefragt, ob Sie + die Diskette auch formatieren wollen. Bejahen Sie die Frage, so werden Ihnen + mehrere Formate zur Auswahl angeboten: +#page# +#on("b")# + +----------------------------------------+ + | Formatieren einer Diskette | + | | + | Dies sind die möglichen Formate: | + | | + | 1 .... 40 Spur - 360 KB | + | 2 .... 80 Spur - 720 KB | + | 3 .... 5 1/4" - 1,2 MB | + | 4 .... 3 1/2" - 1,4 MB | + | s .... Standard - Format | + | | + | | + | 1 2 3 4 s | + +----------------------------------------+ + +#off("b")# + + Erkundigen Sie sich bei Ihrem Händler, welches Format Sie bei Ihrem Rechner + und den von Ihnen verwendeten Disketten einstellen müssen. Manche Rechner + unterstützen diese Operation innerhalb des EUMEL-Systems auch gar nicht, + das Formatieren muß dann irgendwie anders außerhalb des EUMEL-Systems + geschehen. + + Wenn Sie die Formatierung abgeschlossen oder auch übersprungen haben, + beginnt die eigentliche Initialisierung der Diskette. Dabei wird als erstes der + Archivname auf die Diskette geschrieben. Alle alten Daten, die sich ggf. auf der + Diskette befinden, werden bei diesem Vorgang unwiederbringlich (!) gelöscht. + + Zur Sicherheit überprüft das System in jedem Falle, ob es sich um eine EUMEL + - Diskette handelt, und erfragt Ihr Einverständnis, ob die Diskette wirklich + initialisiert werden soll. Geben Sie hierzu Ihr Einverständnis, dann wird noch + der (neue) Archivname erfragt. Hatte die Diskette schon einen Namen, dann + wird dieser zum Überschreiben angeboten. Wollen Sie den alten Archivnamen + beibehalten, so brauchen Sie nur die <RETURN>-Taste zu tippen, ansonsten + können Sie den Namen auch zuvor verändern oder einen ganz neuen Namen + hinschreiben. Anhand des ausgegebenen Namens können Sie auch über + prüfen, ob Sie die richtige Diskette eingelegt haben. +#page# + Das Initialisieren funktioniert natürlich nur, wenn Sie als Zieltask einen + Archivmanager eingestellt haben - ansonsten ist diese Menufunktion gesperrt + (nicht aktivierbar!). + + Fehlerfälle: + - Formatieren ist nicht auf dem System möglich. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + + +#on("b")#z Zieltask einstellen#off("b")# + + Mit dieser Menufunktion können Sie festlegen, mit welcher Zieltask Sie + kommunizieren, d.h. z.B. Dateien austauschen möchten. Normalerweise ist + hier das Archiv am eigenen Rechner eingestellt. Das wird auch nach Auf + klappen des Pull-Down-Menus im Kasten links unten angezeigt. + + Diese Menufunktion kann im Unterricht z.B. dazu genutzt werden, um fertig + gestellte Hausaufgaben in eine bestimmte Task zu schicken (Vatertask) oder + um von dort z.B. vorgefertigte Programme und/oder Filialdaten-Dateien abzu + holen. + + Sie können aber auch eine andere Task einstellen (z.B. die Vatertask oder die + Task 'PUBLIC'), um mit diesen Dateien auszutauschen oder um sich auch nur + einen Überblick über die dort vorhandenen Dateien zu verschaffen. Wenn Sie + mit Ihrem Rechner in ein EUMEL-Netz integriert sind, können Sie auch auf + Tasks anderer Rechner zugreifen oder auch Disketten von Laufwerken anderer + Rechner einlesen (z.B. wenn Sie Disketten anderer Formate haben, die von + Ihrem Rechner nicht gelesen werden können). + + Dabei werden zwei Anforderungen an die Zieltask gestellt: Sie muß existieren + und bereit für den Dateiaustausch sein, d.h es muß eine Managertask sein, auf + die Sie Zugriff haben. Versuchen Sie auf andere Tasks zuzugreifen, so erhalten + Sie entsprechende (Fehler-)Meldungen. +#page# + Zu beachten ist noch, daß es im EUMEL-System verschiedene Arten von + Managertasks gibt - Archivmanager und normale Dateimanager. Der Unter + schied besteht darin, daß ein Archivmanager vom Benutzer vor dem Zugriff + reserviert werden muß - anschließend hat nur dieser Benutzer (bis zur Aufga + be der Reservierung) ein Zugriffsrecht auf den Manager. Normale Datei + manager können dagegen von mehreren Benutzern in beliebiger Reihenfolge + angesprochen werden. + + Ein Archivmanager kann auch auf bestimmte Diskettenformate spezialisert + sein (z.B. auf das Lesen von DOS-Disketten). Manche Rechner haben auch + mehrere Archivmanager für verschiedene Laufwerke etc. Durch Einstellen + unterschiedlicher Archivmanager können Sie dann auf verschiedenen Lauf + werken archivieren. + + Nach Aktivieren dieses Menupunktes werden Ihnen die folgenden Alternativen + angeboten: +#on("b")# + +-------------------------------------------+ + | Dateiaustausch gewünscht mit: | + | | + | a ... Archiv (Eigene Station) | + | | + | v ... Vatertask | + | | + | p ... 'PUBLIC' (Eigene Station) | + | | + | s ... Sonstige Task | + | | + | Archiv Vatertask PUBLIC Sonstige | + +-------------------------------------------+ +#off("b")# + + Da der Dateiaustausch mit dem Standardarchiv der eigenen Station (Task: + 'ARCHIVE'), mit der Vatertask und der Task 'PUBLIC' recht häufig in Anspruch + genommen wird, sind diese drei Optionen unter den Alternativen direkt ange + geben. Entscheiden Sie sich für eine dieser drei Tasks, so nimmt das System + alle notwendigen Einstellungen vor. Möchten Sie dagegen in Kontakt mit einer +#page# + anderen Task treten, so wählen Sie die Alternative 's ... Sonstige Task'. + In diesem Falle haben Sie noch 3 Angaben zu machen: + + - Zunächst werden Sie nach dem Namen der Zieltask gefragt. Geben Sie den + Namen der Zieltask - ohne Anführungsstriche (!) - ein und schließen Sie + die Eingabe mit der <RETURN>-Taste ab. (Den ausgegebenen Namen der + z.Z. eingestellten Task können Sie dabei verändern bzw. überschreiben.) + + - Dann wird die Nummer der Station im EUMEL-Netz erfragt, auf der sich + die Zieltask befindet. Die Nummer Ihrer Station wird als Vorschlag ausge + geben. Wollen Sie mit einer Task auf Ihrem Rechner kommunizieren, so + brauchen Sie diesen Vorschlag nur durch Drücken der <RETURN>-Taste + bestätigen - ansonsten tragen Sie zuvor die entsprechende Stationsnummer + ein. Ist Ihr Rechner nicht in ein EUMEL-Netz integriert, so wird die + Stationsnummer 0 (Null) ausgegeben. Bitte bestätigen Sie diese Stations + nummer durch Tippen der <RETURN>-Taste. + + - Zum Abschluß müssen Sie noch angeben, ob die eingestellte Zieltask ein + Archivmanager ist oder nicht. + + Das System versucht dann den Kontakt herzustellen. Je nachdem, welche + Einstellung Sie vorgenommen haben, sind bestimmte Funktionen innerhalb + des Menus nicht aktivierbar. Das System läßt nur die Funktionen zu, die + aufgrund Ihrer Einstellungen zulässig sind. + + Im Kasten links unten auf dem Bildschirm wird jeweils angezeigt, welche + Zieltask eingestellt ist. Erscheint in diesem Kasten auch ein Hinweis auf den + Archivnamen, so haben Sie einen Archivmanager eingestellt. Ist dagegen vor + dem Namen der Zieltask noch eine Zahl und ein Schrägstrich angegeben, so + haben Sie eine Zieltask auf einem anderen Rechner eingestellt. + + Bedenken Sie, daß Operationen mit Tasks auf anderen Stationen länger an + dauern können - werden Sie nicht ungeduldig! +#page# + Sie können die Einstellung der Zieltask jederzeit wieder verändern! + + Fehlerfälle: + - Die eingestellte Zieltask existiert nicht. + - Die eingestellte Zieltask existiert zwar, ist aber nicht empfangsbereit, d.h. + ein Zugriff von Ihrer Task aus ist nicht möglich! + - Das Netz ist nicht funktionsbereit (Collector-Task fehlt). + - Die Kommunikation war nicht erfolgreich. + - Die gewünschte Operation kann mit der eingestellten Zieltask nicht ausge + führt werden (Zieltask ist z.B. gar kein Archivmanager - Sie aber ver + suchen, das Laufwerk zu reservieren). + + + + + + + + + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus-6 b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-6 new file mode 100644 index 0000000..3edf312 --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-6 @@ -0,0 +1,589 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (61)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#6 Beschreibung der Programmierschnittstelle#off("b")# + + +In allen GRIN-Projekten soll - zumindest als Erweiterung - der Aspekt des +"algorithmischen Problemlösens" mit in den Unterricht eingebracht werden. Deshalb +ist auch in dem Soester Programm zum Projekt WARENHAUS eine Programmier +schnittstelle realisiert, die es erlaubt, mit Hilfe eines eng begrenzten Befehlssatzes +kleine Programme zur Steuerung der Abläufe im Modell-Warenhaus zu schreiben. + +Wir haben lange überlegt, ob wir diese Programmierschnittstelle überhaupt nach +bilden sollten, weil wir der Meinung sind, daß beim Projekt WARENHAUS das +algorithmische Problemlösen, wenn überhaupt, nur eine sehr untergeordnete Rolle +spielt. Als Randproblematik kann man hier vielleicht untersuchen, wie die Menu- +Funktionen unter dem Oberbegriff 'Kommandos' (vgl. Kapitel 5.4) aufgebaut sind, +und man kann versuchen, diese in eigenen kleinen Programmen nach- oder umzu +bilden. + +Unser zweites Problem war, ob wir uns bei einer eventuellen Nachbildung der +Programmierschnittstelle auch wirklich streng an die Soester Vorgaben halten sollten, +auch wenn sie unseren Vorstellungen und Konzepten teilweise zuwiderlaufen. Eigent +lich sind wir der Meinung, daß uns mit der Programmiersprache ELAN bereits ein +ausgezeichnetes Hilfsmittel zur Verfügung steht, um auch in der Sekundarstufe I in +das algorithmische Problemlösen einzuführen. Gerade das Refinementkonzept - die +Methode der 'schrittweisen Verfeinerung' / der "Modularisierung im Kleinen" - +scheint uns besonders geeignet, typische Denkweisen des algorithmischen Problem +lösens offenzulegen. Lediglich die Konstruktion einer Zählschleife und den Umgang +mit den Fehlermeldungen des ELAN-Compilers halten wir bei Anfängern für etwas +problematisch. + +Wir haben uns deshalb entschlossen, Ihnen die Programmierschnittstelle in zwei +Versionen zur Verfügung zu stellen: In der 'ELAN-Version' können Sie in der üblichen +#page# +ELAN-Umgebung programmieren; das bietet sich z.B. an, wenn Sie #on("b")#gs-Warenhaus#off("b")# +im Wahlpflichtbereich bzw. im Differenzierungsbereich 9/10 einsetzen möchten. Es +ist dann dort nicht nötig, erst eine neue, weniger komfortable "Programmiersprache" +zu erlernen. + +Für den GRIN-Bereich enthält #on("b")#gs-Warenhaus#off("b")# eine weitere Programmierebene +('GRIN-Version'), die an die Soester Vorgaben angelehnt ist, und die es erlaubt, die +dort benutzten Schreibweisen von Befehlen und Kontrollstrukturen zu übernehmen. +Allerdings haben wir dabei eine grundsätzliche Änderung bezüglich der Modularisie +rungsmöglichkeit von 'GRIN-Programmen' vorgenommen, auf die wir in Kapitel 6.1 +näher eingehen werden. + +Ein 'GRIN-Programm' wird bei der Ausführung des Menupunktes 's Starten' (vgl. +Kapitel 5.5) zunächst in ein ELAN-Programm übersetzt und dabei auf formale +Korrektheit überprüft. Werden keine Fehler festgestellt, so wird nun seinerseits das +ELAN-Programm vom Compiler übersetzt und anschließend ausgeführt. Als Benutzer +werden Sie dabei nicht mit Fehlermeldungen des Compilers konfrontiert, da der +#on("b")#gs-Warenhaus#off("b")#-Übersetzer vorher alle formalen Fehler abfängt und zum Korrigieren +anbietet. + +Sollte das System nach erfolgreicher Übersetzung und/oder Compilation bei der +Ausführung des Programms einen Fehler "bemerken" (z.B. falscher Aufruf eines +Befehles), so wird das Programm automatisch abgebrochen und die entsprechende +Fehlermeldung mit der Nummer der Programmzeile, in der der Fehler bemerkt +wurde, im unteren Teil des Bildschirmes in einem 'notebook' gezeigt. Im oberen Teil +wird das Programm zum Verbessern angeboten, wobei der Cursor am Anfang der +fehlerhaften Zeile steht (gilt auch für die 'ELAN-Version'). + +In beiden Versionen der Programmierschnittstelle ist die Schreibweise der Befehle bis +auf die Groß- und Kleinschreibung identisch. Folgende Befehle stehen zu Verfügung: +#page# + GRIN-Version | ELAN-Version +------------------------+------------------------------ + Artikelnummer lesen | artikelnummer lesen + Artikeldaten eingeben | artikeldaten eingeben + Kundennummer lesen | kundennummer lesen + Kundendaten eingeben | kundendaten eingeben + neues Blatt | neues blatt + Rechnungskopf | rechnungskopf + Artikel kaufen | artikel kaufen + Abrechnung | abrechnung + Auskunft | auskunft + Bildschirm neu | bildschirm neu + | nachbestellen + | dezimalwert lesen + | bitmuster lesen + | + + +Die drei letzten Befehle der ELAN-Version haben wir in den GRIN-Befehlssatz nicht +mit aufgenommen, weil wir hier den Befehlssatz möglichst klein (und damit über +sichtlich) halten wollten und diese Befehle bereits unter dem Oberbegriff +'Kommandos' als Menu-Funktionen zur Verfügung stehen. (Ebenso könnte man bei +dem Befehl 'Auskunft' argumentieren. Die entsprechende Menu-Funktion 'Auskunft +einholen' liefert bei jeder Anwahl jedoch immer nur #on("b")#eine#off("b")# Auskunft; in einem +Programm kann man nun die Ausgabe mehrerer Auskünfte hintereinander +realisieren.) + +Die genaue Wirkung der Befehle werden wir in Kapitel 6.3 noch detailliert +beschreiben. Sie entsprechen im wesentlichen den Soester Befehlen, die im +WARENHAUS-Begleitheft des LSW (siehe Anhang) auf den Seiten 99/100 aufgelistet +sind. (Die anderen dort zu findenden Befehle gehören eigentlich nicht in die Befehls +liste der Programmierschnittstelle, weil sie nicht von Programmen aus sondern nur in +einem 'Direktbefehgs-Modus' als Kommando aufrufbar sind! Diese Befehle sind auch +#page# +#on("b")#keine#off("b")# Programmierbefehle im eigentlichen Sinne, sondern entweder "Macros" zum +"Handling" des Warenhausmodells oder Systemkommandos. #on("b")#gs-Warenhaus#off("b")# stellt +diese Befehle unter ähnlichen Namen als Menu-Funktionen zur Verfügung.) + + + +#on("b")#6.1 Schreibweisen und Syntaxregeln in GRIN-Programmen#off("b")# + +Die Regeln, die beim Schreiben eines ELAN-Programms zu beachten sind, werden im +EUMEL/ELAN-Benutzerhandbuch beschrieben; wir werden uns daher hier auf die +GRIN-Version konzentrieren. + +Beginnen wir mit einem Beispiel aus dem WARENHAUS-Begleitheft des LSW. Dort +finden Sie auf Seite 70 (unten) das folgende Programm: + +#on("b")# + PROGRAMM Rechnung schreiben + neues Blatt + Kundennummer lesen + WENN nicht Stoptaste gedrückt + Rechnungskopf + WIEDERHOLE + Artikelnummer lesen + WENN nicht Stoptaste gedrückt + Artikel kaufen + ENDE WENN + BIS Stoptaste gedrückt + Abrechnung + ENDE WENN + ENDE PROGRAMM #off("b")# + +Sie können dieses Programm ohne Änderungen übernehmen und starten, +#on("b")#gs-Warenhaus#off("b")# wird es ohne Beanstandungen ausführen. Bezüglich der Übersicht +lichkeit und des Programmierstils kann man hier sicher geteilter Meinung sein, +darauf gehen wir später noch ein. +#page# +Wir möchten Ihnen zunächst einige Regeln zur Schreibweise und Syntax in 'GRIN- +Programmen' aufzeigen, die sich im obigen Beispiel-Programm beobachten lassen: + +- In jeder Zeile darf nur #on("b")#ein#off("b")# Befehl stehen; Befehgs-Trennzeichen (wie etwa das + Semikolon in ELAN) werden deshalb nicht verwendet. Leerzeichen können + beliebig gesetzt werden, auch leere Zeilen sind zulässig, nicht jedoch + Kommentare. + +- Das Arbeiten mit Variablen (gleich welcher Art) ist #on("b")#nicht#off("b")# möglich; alle Befehle + sind datentypfrei. + +- Schlüsselworte für Kontrollstrukturen (wie z.B. WIEDERHOLE, WENN etc.) + werden in GROSSBUCHSTABEN geschrieben, Ausführungsbefehle und + Bedingungen hingegen klein und gemäß den Regeln der deutschen Sprache mit + großem Anfangsbuchstaben bei Substantiven. Diese Festlegung bezüglich der + Groß- und Kleinschreibung ist bei den von #on("b")#gs-Warenhaus#off("b")# zur Verfügung ge + stellten Befehlen #on("b")#verbindlich#off("b")#, d.h. alle Warenhaus-#on("b")#Grund#off("b")#befehle und Kontroll + strukturen müssen (bis auf Leerzeichen) genauso geschrieben werden, wie sie in + den Kapiteln 6.2 und 6.3 vorgegeben werden! (In der Soester Software können + dagegen Groß- und Kleinbuchstaben beliebig verwendet werden, sodaß dort z.B. + neben 'neues Blatt' auch 'neues blatt', "NEueS BlaTT" u.ä. als identisch ange + sehen werden.) + +- Jedes 'GRIN-Programm' beginnt mit dem 'Schlüsselwort' <PROGRAMM>, + gefolgt von einem Programmnamen, der beliebig gewählt werden kann, jedoch + noch in diese Zeile passen muß. Sinnvoll ist es, hier z.B. den Namen der + Programmdatei einzutragen. + +- Jedes 'GRIN-Programm' endet mit der Zeile <ENDE PROGRAMM>. Nach dieser + Zeile dürfen nur noch leere Zeilen folgen, es sei denn zwischen <PROGRAMM + Programmname> und <ENDE PROGRAMM> wurden Befehle benutzt, die + nicht zum Warenhaus-Grundbefehlssatz gehören. Solche Befehle müssen in einer + 'Befehlserklärung' nach Programmende definiert werden. +#page# +Das obige Programm befriedigt vom äußeren Erscheinungbild her einen PASCAL- +Programmierer wahrscheinlich völlig, einen ELAN-Verwöhnten jedoch sicher nicht. +Die Soester WARENHAUS-Software bietet keinerlei Möglichkeit der Modularisierung +#on("b")#innerhalb#off("b")# eines Programms (Refinement-/Prozedurkonzept o.ä.). Es gibt dort nur die +Möglichkeit, fertiggestellte Programme unter dem Programmnamen dem Basis +befehlssatz "hinzuzufügen" - ein Vorgang, der dem Insertieren unter EUMEL/ELAN +ähnelt. Obwohl es unter EUMEL/ELAN ein leichtes gewesen wäre, diese Möglichkeit +ebenfalls zu realisieren, haben wir davon Abstand genommen, weil auf diese Weise an +jedem Arbeitsplatz eine "eigene" Programmierumgebung entstehen würde. Wir sind +der Meinung, daß für Schüler der Sekundarstufe I eine #on("b")#feste Modellumgebung als +Basis#off("b")# vorhanden sein muß. Außerdem erscheint uns bei der Programmierung "im +Kleinen" die "Bottom-Up"-Technik unangemessen und für den Anfänger viel zu +unübersichtlich zu sein; viel eher wäre hier die "Top-Down"-Methode angebracht. Wir +haben daher die Programmierumgebung in anderer Richtung erweitert und eine +Modularisierungsmöglichkeit realisiert, die dem Refinementkonzept nachempfunden +ist und damit unseren didaktisch-methodischen Vorstellungen viel eher entspricht. + +Bei #on("b")#gs-Warenhaus#off("b")# werden etwa benutzte 'eigene' Befehle #on("b")#innerhalb derselben#off("b")# +Programmdatei 'erklärt' und zwar #on("b")#nach#off("b")# dem Ende des eigentlichen 'Haupt +programms', d.h. also nach der Zeile <ENDE PROGRAMM>. Mit Hilfe dieser Mög +lichkeit könnte das obige Programm besser strukturiert etwa so aussehen: + +#on("b")# + PROGRAMM Rechnung schreiben + neues Blatt + Kundennummer lesen + WENN nicht Stoptaste gedrückt + einkaufen mit Rechnung + ENDE WENN + ENDE PROGRAMM + + einkaufen mit Rechnung: + Rechnungskopf + WIEDERHOLE + Artikelnummer lesen + Artikel eventuell kaufen + BIS Stoptaste gedrückt + Abrechnung +#page# + Artikel eventuell kaufen: + WENN nicht Stoptaste gedrückt + Artikel kaufen + ENDE WENN +#off("b")# + + +Sie sehen, das Programm ist so zwar etwas länger, aber erheblich übersichtlicher +geworden. Für 'neue Befehle' und die zugehörigen 'Befehlserklärungen' gelten +folgende Grundsätze: + +- Die 'Befehlserklärungen' müssen #on("b")#nach#off("b")# <ENDE PROGRAMM> aufgelistet + werden. Die Reihenfolge ist beliebig. + +- Eine 'Befehlserklärung' besteht aus dem zu erklärenden Befehl in (bis auf Leer + zeichen) völlig identischer Schreibweise (!) und einem nachfolgenden Doppel + punkt (:). + +- Ein 'neuer Befehl' darf alle möglichen Zeichen enthalten außer einem Doppel + punkt (:). Außerdem darf solch ein Befehl #on("b")#nicht#off("b")# mit einem 'Schlüsselwort' + beginnen (vgl. Kapitel 6.2). + +- In 'Befehlserklärungen' können neben den Grundbefehlen auch wieder 'neue + Befehle' benutzt werden, die dann wiederum erklärt werden müssen. + +- Befehle dürfen nur #on("b")#einmal#off("b")# erklärt werden, auch wenn sie mehrfach benutzt + werden. + +- Es dürfen nur Befehle erklärt werden, die irgendwo auch wirklich benutzt + werden. + +- Befehlserklärungen sind nur möglich für #on("b")#Ausführungs-Befehle#off("b")#. Es lassen sich + also z.B. keine neuen Bedingungen oder Kontrollstrukturen erklären! + +- Es dürfen innerhalb eines Programms maximal 20 verschiedene 'neue Befehle' + verwendet werden. (Diese Grenze dürfte in Warenhaus-Programmen kaum ein + mal erreicht werden!) +#page# +Formale Verstöße gegen diese Regeln werden bei dem Übersetzungsvorgang sofort +beim Auftauchen des ersten Fehlers zur Korrektur angeboten. Dabei wird in der +oberen Bildschirmhälfte das Programm editiert, wobei der Cursor an den Anfang der +Zeile gesetzt wird, in der sich der (erste) Fehler befindet. In der unteren Bildschirm +hälfte wird über den Paralleleditor in einem 'notebook' die Art des Fehlers mit An +gabe der Zeilennummer genauer beschrieben. + +In der Regel wird hier nur auf #on("b")#einen#off("b")# (nämlich den ersten auftauchenden) Fehler +hingewiesen, so daß Sie das Programm evtl. mehrfach starten müssen, bis alle Fehler +erkannt und beseitigt sind. Manchmal tauchen im Fehler-'notebook' aber auch +mehrere Fehlermeldungen auf (z.B. wenn 'neue Befehle' nicht erklärt oder erklärte +Befehle nicht benutzt wurden). In Extremfällen kann es dabei dazu kommen, daß +nicht mehr das ganze Fehler-'notebook' auf dem Bildschirm sichtbar ist. In diesem +Fall können Sie mit der Tastenfolge <ESC><w> den Cursor zwischen den beiden +Bildschirmhälften hin- und herschalten und mit den Pfeiltasten evtl. nicht-sichtbare +Teile des 'notebooks' oder der Programmdatei auf den Bildschirm holen. (Für +genauere Informationen über den Umgang mit dem EUMEL-Editor lesen Sie bitte im +EUMEL-Benutzerhandbuch nach.) + + +#on("b")#6.2 Kontrollstrukturen#off("b")# + +Sowohl in ELAN-Programmen, als auch in GRIN-Programmen werden Kontroll +strukturen durch 'Schlüsselworte' gekennzeichnet, die grundsätzlich in +GROSSBUCHSTABEN geschrieben werden müssen, um sie deutlich gegenüber Aus +führungsbefehlen und Bedingungen abzuheben. In GRIN-Programmen gibt es +Schlüsselworte für den Anfang und das Ende eines Programms sowie für Schleifen +und einseitige Abfragen. Wir notieren hier nur die in GRIN-Programmen möglichen +Kontrollstrukturen und geben, wenn vorhanden, die zugehörige ELAN-Übersetzung in +Klammern an. + + +#on("b")#Programm-Anfang/Ende:#off("b")# + + #on("b")#PROGRAMM#off("b")# <Programmname> + <Anweisung 1> + <Anweisung 2> + . + . + #on("b")#ENDE PROGRAMM#off("b")# + + +Jedes GRIN-(Haupt-)Programm beginnt mit dem Schlüsselwort 'PROGRAMM', gefolgt +von einem frei wählbaren Programmnamen, der jedoch in dieselbe Zeile passen +muß. Die Zeile 'ENDE PROGRAMM' zeigt das Ende eines GRIN-(Haupt-)Programms +an. Sowohl 'PROGRAMM', als auch 'ENDE PROGRAMM' dürfen in einer Programm +datei nur #on("b")#einmal#off("b")# verwendet werden. Entsprechende Schlüsselworte in ELAN- +Programmen gibt es nicht. + + +#on("b")#Schleifen:#off("b")# + +Schleifen müssen innerhalb des Hauptprogramms oder der Befehlserklärung, in der +sie geöffnet werden, auch wieder geschlossen werden. Schachtelungen sind zwar +zulässig, sollten aber aus Gründen der Übersichtlichkeit vermieden werden. Soll +dennoch innerhalb einer Schleife eine weitere Schleife verwendet werden, so sollte die +innere Schleife über einen 'neuen Befehl' in eine Befehlserklärung 'ausgelagert' +werden. Folgende Schleifenarten sind möglich: + +a) Zählschleife: + + #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")# (ELAN: INT VAR i; + <Anweisung 1> FOR i FROM 1 UPTO n REPEAT + <Anweisung 2> . + . . + . . + #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden <n> - mal ausgeführt. + + +b) Schleife mit Ausgangsbedingung: + + + #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT + <Anweisung 1> . + <Anweisung 2> . + . . + . . + #on("b")#BIS#off("b")# <Bedingung> UNTIL bedingung END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden mindestens einmal ausgeführt und +dann solange wiederholt, bis die Bedingung erfüllt ist. Bei der Programmierung ist +darauf zu achten, daß durch die Anweisungen die Bedingung erfüllt werden kann, +denn sonst ist das Resultat eine 'Endlosschleife', deren Ausführung nur durch einen +totalen Programmabbruch (<ESC><h>) beendet werden kann. + + +c) Zählschleife mit Ausgangsbedingung: + + + #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")# (ELAN: INT VAR i; + <Anweisung 1> FOR i FROM 1 UPTO n REPEAT + <Anweisung 2> . + . . + . . + #on("b")#BIS#off("b")# <Bedingung> UNTIL bedingung END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden <n>-mal ausgeführt. Im Gegensatz +zur reinen Zählschleife können die Wiederholungen jedoch vorzeitig abgebrochen +werden, nämlich dann, wenn nach irgendeinem Schleifendurchlauf die Bedingung +erfüllt ist. + + +d) Endlosschleife: + + + #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT + <Anweisung 1> . + <Anweisung 2> . + . . + . . + #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden immer wieder ausgeführt. Da keine +begrenzte Anzahl von Durchläufen und auch keine Abbruchbedingung angegeben ist, +kann diese Schleife nur durch einen totalen Programmabbruch (<ESC><h>) +beendet werden. + +(Die Schleifenarten c) und d) sind in der Soester WARENHAUS-Software nicht vor + handen, ergaben sich bei der Konstruktion des #on("b")#gs-Warenhaus#off("b")#-Übersetzers wegen + der analogen Strukturen in ELAN jedoch quasi "von selbst", so daß wir sie auch + zugelassen haben. Schleifen mit Eingangsbedingung (ELAN: WHILE bedingung + REPEAT ... END REPEAT) sind für GRIN-Programme jedoch nicht realisiert.) + + +#on("b")#Einseitige Abfragen:#off("b")# + + + #on("b")#WENN#off("b")# <Bedingung> (ELAN: IF bedingung + <Anweisung 1> THEN anweisung 1; + <Anweisung 2> anweisung 2; + . . + . . + #on("b")#ENDE WENN#off("b")# END IF) + + +Die Anweisungen werden nur ausgeführt, wenn die Bedingung erfüllt ist. (Eine Ent +sprechung zu der in ELAN möglichen 'zweiseitigen Abfrage' (IF ... THEN ... ELSE ... +END IF) gibt es in der GRIN-Version nicht!) + +Eine im Hauptprogramm oder in einer Befehlserklärung begonnene Abfrage ('WENN +...') muß auch im selben Programmteil wieder beendet werden. Ähnlich wie bei +Schleifen ist die Schachtelung von Abfragen innerhalb des Hauptprogramms oder +einer Befehlserklärung zwar zulässig, führt aber zu unübersichtlichen Programmen. +Auch hier sollte man innerhalb einer Abfrage eventuell notwendige weitere Abfragen +durch 'neue Befehle' in Befehlserklärungen auslagern. + + +#on("b")#Zulässige Bedingungen:#off("b")# + +#on("b")#Stoptaste gedrückt#off("b")# (ELAN: stoptaste gedrückt) + + Die Bedingung ist erfüllt (d.h. liefert den Wert 'wahr'), wenn während des bis + herigen Programmablaufs die Tastenfolge <ESC><q> getippt worden ist; + sonst ist sie nicht erfüllt (Wahrheitswert 'falsch'). (Das Tippen von <ESC><q> + beim Verlassen einer Datei hat jedoch #on("b")#keinen#off("b")# Einfluß auf den Wahrheitswert der + Bedingung!) + + Bei jeder Ausführung der Befehle 'Artikelnummer lesen', 'Kundennummer lesen' + und 'Auskunft' wird der Wahrheitswert der Bedingung zunächst immer auf + 'falsch' gesetzt (siehe 6.3), so daß die Abfrage der Bedingung nach einem dieser + Befehle nur dann 'wahr' liefert, wenn #on("b")#während#off("b")# oder #on("b")#nach#off("b")# der letztmaligen Aus + führung eines der drei Befehle <ESC><q> getippt wurde; ein etwa vorher + erfolgtes Tippen dieser Tastenfolge ist somit wirkungslos! + + +#on("b")#nicht Stoptaste gedrückt#off("b")# (ELAN: NOT stoptaste gedrückt) + + Dieses ist das logische Gegenteil von 'Stoptaste gedrückt': 'nicht Stoptaste ge + drückt' ist erfüllt, wenn 'Stoptaste gedrückt' #on("b")#nicht#off("b")# erfüllt ist und umgekehrt. + +Um Probleme bei der Arbeit mit Terminals zu vermeiden, die nicht über den +deutschen Zeichensatz verfügen (Umlaute!), ist bei beiden Bedingungen auch die +Schreibweise 'gedrueckt' erlaubt. + + + +#on("b")#6.3 Detailbeschreibung der Warenhaus-Grundbefehle#off("b")# + +Wie bereits in 6.1 erwähnt, ist die im folgenden vorgegebene Schreibweise der Grund +befehle bezüglich Groß- und Kleinschreibung verbindlich; Leerzeichen dagegen +können beliebig eingefügt oder auch weggelassen werden. Fett gedruckt steht immer +der GRIN-Befehl, in Klammern dahinter der zugehörige ELAN-Befehl. + + +#on("b")#Artikelnummer lesen#off("b")# (ELAN: artikelnummer lesen) + + - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf + 'falsch' gesetzt. + - Der Benutzer wird aufgefordert, eine Artikelnummer einzugeben. Je nach + Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein + tippen einer Zahl über die Tastatur oder durch Einschieben einer Warenkarte + in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu + schließen. Akzeptiert werden nur Werte von 1 bis 15, ansonsten erfolgt eine + Warnung, und die Eingabe wird wiederholt. + - Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen + werden, ohne daß eine Artikelnummer eingelesen wird. In diesem Falle wird + der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst + bleibt der Wert auf 'falsch'. + - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des + gesamten Programms abgebrochen. + + +#on("b")#Artikeldaten eingeben#off("b")# (ELAN: artikeldaten eingeben) + + - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen wurde, + ansonsten erfolgt eine entsprechende Fehlermeldung. + - Die Angaben zu einem Artikel (Name, Preis, Mindestbestand, Bestand) können + eingegeben bzw. verändert werden. + - Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q> + abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung + 'Stoptaste gedrückt' auf 'wahr' gesetzt. + - Nach Abschluß der Eingaben werden die Artikeldaten in der Filial-Verwaltung + gespeichert, worauf auch kurz hingewiesen wird. + - Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die + Ausführung des gesamten Programms abgebrochen. + + +#on("b")#Kundennummer lesen#off("b")# (ELAN: kundennummer lesen) + + - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf + 'falsch' gesetzt. + - Der Benutzer wird aufgefordert, eine Kundennummer einzugeben. Je nach + Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein + tippen einer Zahl über die Tastatur oder durch Einschieben einer Kundenkarte + in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu + schließen. Akzeptiert werden nur Werte von 129 bis 159, ansonsten erfolgt eine + Warnung, und die Eingabe wird wiederholt. + - Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen + werden, ohne daß eine Kundennummer eingelesen wird. In diesem Falle wird + der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst + bleibt der Wert auf 'falsch'. + - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des + gesamten Programms abgebrochen. + + +#on("b")#Kundendaten eingeben#off("b")# (ELAN: kundendaten eingeben) + + - Der Befehl setzt voraus, daß zuvor eine Kundennummer eingelesen wurde, + ansonsten erfolgt eine entsprechende Fehlermeldung. + - Die Angaben zu einem Kunden (Name, Vorname, Geschlecht) können einge + geben bzw. verändert werden. + - Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q> + abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung + 'Stoptaste gedrückt' auf 'wahr' gesetzt. + - Nach Abschluß der Eingaben werden die Kundendaten sowohl in der Filial- + Verwaltung als auch in der Zentrale gespeichert, worauf auch kurz hingewiesen + wird. + - Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die + Ausführung des gesamten Programms abgebrochen. + + +#on("b")#neues Blatt#off("b")# (ELAN: neues blatt) + + - Das Rechnungsfenster auf dem Bildschirm wird gelöscht. + - Für die Ausgabe der nächsten Rechnung auf dem Drucker wird eine neue + Rechnungsdatei bereitgestellt. + + +#on("b")#Rechnungskopf#off("b")# (ELAN: rechnungskopf) + + - Ein Rechnungskopf wird auf dem Bildschirm ausgegeben. Falls zuvor eine + Kundenummer eingelesen worden ist, unter der bereits Kundendaten einge + geben wurden, erscheint der Name des betreffenden Kunden im Rechnungs + kopf. + - Der Rechnungskopf wird für einen eventuellen späteren Ausdruck in die + Rechnungsdatei geschrieben. + + +#on("b")#Artikel kaufen#off("b")# (ELAN: artikel kaufen) + + - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen worden ist, + ansonsten erfolgt eine entsprechende Fehlermeldung. + - Artikelname und -preis werden auf den Bildschirm und in die Rechnungsdatei + geschrieben. + - Der Kauf wird intern in den entsprechenden Filial-Dateien registriert. + + +#on("b")#Abrechnung#off("b")# (ELAN: abrechnung) + + - Die Preise der gekauften Artikel werden addiert. + - Die Summe wird auf dem Bildschirm angezeigt und in die Rechnungsdatei + geschrieben. + - Der Benutzer wird gefragt, ob die Rechnung ausgedruckt werden soll. + + +#on("b")#Auskunft#off("b")# (ELAN: auskunft) + + - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf + 'falsch' gesetzt. + - Der Benutzer wird aufgefordert, eine Codenummer einzugeben. Je nach Ein + stellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Eintippen + einer Zahl über die Tastatur oder durch Einschieben einer Codekarte in das + Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzuschließen. + Akzeptiert werden nur zulässige Werte, ansonsten erfolgt eine Warnung, und + die Eingabe wird wiederholt. Die Bedeutungen der einzelnen Auskunftscodes + sind in Kapitel 5.4 unter der Menufunktion 'Auskunft einholen' beschrieben. + - Durch Tippen der Tastenfolge <ESC><q> kann der Befehl abgebrochen + werden, ohne daß eine Codenummer eingelesen wird. In diesem Falle wird der + Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst + bleibt der Wert auf 'falsch'. + - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des + gesamten Programms abgebrochen. + + +#on("b")#Bildschirm neu#off("b")# (ELAN: bildschirm neu) + + - Der Programm-Eingangsbildschirm wird neu aufgebaut. Der Befehl wird + benötigt, wenn die Fenstereinteilung auf dem Bildschirm wiederhergestellt + werden soll (z.B. nach Ausgabe einer Liste bei dem Befehl 'Auskunft'). + - Der Befehl wird beim Starten eines GRIN-Programms automatisch ausgeführt; + bei ELAN-Programmen wird er automatisch am Anfang eines jeden Programms + eingefügt, wenn das Programm nicht mit diesem Befehl beginnt. + + +Neben diesen Befehlen stehen für ELAN-Programme noch drei weitere zur Verfügung, +die nicht zum GRIN-Befehlssatz gehören: + + nachbestellen, + dezimalwert lesen, + bitmuster lesen. + +Diese Befehle entsprechen in ihrer Wirkung den gleichnamigen Menufunktionen +unter dem Oberbegriff 'Kommandos', die in Kapitel 5.4 beschrieben sind. + + + diff --git a/app/gs.warenhaus/1.01/doc/gs-Warenhaus-7 b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-7 new file mode 100644 index 0000000..3a55dfe --- /dev/null +++ b/app/gs.warenhaus/1.01/doc/gs-Warenhaus-7 @@ -0,0 +1,235 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (69)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#7 Weitere Kommandos (für Systembetreuer)#off("b")# + + +Wenn Sie #on("b")#gs-Warenhaus#off("b")# installiert haben und mit dem Aufbau des Systems nach +der automatischen Generierung zufrieden sind, dann ist dieses Kapitel nicht wichtig +für Sie. Wir erklären Ihnen hier die Befehle, mit denen Sie die Einstellungen, die bei +der Installation vorgenommen wurden, auch nachträglich noch ändern können. +Beachten Sie bitte, daß aus Sicherheitsgründen eine Einstellungs#on("b")#änderung#off("b")# i.a. nur in +der Task möglich ist, in der die entsprechende Einstellung vorgenommen wurde, es +sei denn, dort wurde eine Einstellung gänzlich aufgehoben. Außerdem werden Ein +stellungsänderungen stets nur an Sohntasks weitergegeben ("vererbt"), die #on("b")#nach#off("b")# der +Änderung angemeldet werden! + +Die Standard-Installation sieht z.B. nur die Einrichtung #on("b")#einer#off("b")# Warenhaus-Hauptstelle +vor. Wenn Sie tatsächlich nur eine Hauptstelle eingerichtet haben, nun aber doch +mehrere Hauptstellen (für verschiedene Lerngruppen) betreiben wollen, so brauchen +Sie das Programm nicht erneut zu insertieren! Machen Sie besser in der bisherigen +Hauptstellen-Task den Hauptstellenstatus mit dem Kommando 'warenhaus haupt +stelle (FALSE)' rückgängig und richten Sie in Sohntasks mit dem Kommando 'waren +haus hauptstelle (TRUE)' wieder neue Hauptstellen ein. Außerdem können Sie in +Hauptstellen-Tasks die Version für die Programmierschnittstelle umstellen ('grin +(TRUE)' bzw. 'grin (FALSE)'). + +Ähnlich verhält es sich mit dem Betrieb eines Adapters für das Kartenleser-Interface. +Auch hier ist die Standard-Einstellung u.U. nur für den Betrieb #on("b")#eines#off("b")# Adapters ausge +legt. Möchten Sie mehrere Kartenleser anschließen, so sind bei der Verwendung von +MUFIs im Terminalkanal keine Änderungen nötig, da hier jede Filialtask sowieso nur +auf das MUFI zugreifen kann, das in den Kanal des Terminals geschaltet ist, an das +die Task gekoppelt ist. Möchten Sie jedoch mehrere Kartenleser über Adapter an +separaten seriellen Schnittstellen ansprechen, so müssen Sie dem System mehrere +Kanalnummern mitteilen, die für verschiedene Filialtasks ja durchaus unterschied +lich sein können. Am geschicktesten erscheint es in diesem Fall, unter einer Haupt +stelle mehrere "Zwischentasks" einzurichten, in diesen jeweils die Interface- +Kanalnummern festzulegen und die Filialtasks als Söhne dieser "Zwischentasks" +anzumelden. Benennen Sie die "Zwischentasks" so, daß die eingestellte Kanal +nummer aus dem Namen ersichtlich ist, so ist gleich bei der Anmeldung einer Filial +task klar, welcher Kartenleser von dieser Task aus angesprochen werden kann. + +Um diesen Aufbau zu realisieren, sollten Sie zunächst in der entsprechenden Haupt +stellentask einen etwa eingerichteten Direktstart mit dem Kommando 'warenhaus +direktstart (FALSE)' aufheben. Ebenfalls in der Hauptstellentask wird dann mit dem +Kommando 'init interface channel' eine etwa vorhandene Kanaleinstellung gelöscht, +wenn Sie bei der Aufforderung 'Gib Interface-Kanal:' eine '0' eingeben. Nun richten +Sie für jeden vorhandenen Adapter (natürlich müssen auch entsprechend viele freie +serielle Schnittstellen zur Verfügung stehen!) eine "Zwischentask" als Sohn der +Hauptstellentask ein (z.B. 'Kanal 5', 'Kanal 6' etc.) und geben dort jeweils wieder das +Kommando 'init interface channel'. Bei der Abfrage 'Gib Interface-Kanal:' geben Sie +dann die entsprechende Kanalnummer ein (in unserem Beispiel 5 oder 6 etc.). Alle +Söhne der Zwischentask 'Kanal 5' z.B. können dann (abwechselnd) den Kartenleser +benutzen, der an den Adapter an Kanal 5 angeschlossen ist. In diesen Zwischentasks +können Sie, wenn Sie möchten, mit dem Kommando 'warenhaus direktstart (TRUE)' +einen Direktstart für die neu anzumeldenden Sohntasks (Filialen) einrichten. +Ansonsten wird #on("b")#gs-Warenhaus#off("b")# in den Sohntasks aus der 'gib Kommando' - Ebene +mit dem Befehl 'warenhaus' gestartet (vgl. Kapitel 3.3). + +Sollten Sie beim Betrieb eines Codekartenlesers feststellen, daß die Wartezeit beim +Einlesen einer Codekarte zu kurz oder zu lang ist, so können Sie auch diese ändern. +Da die Wartezeit durch eine Schleife realisiert ist, in der laufend Werte vom Interface +gelesen werden, ist sie abhängig von der Geschwindigkeit des verwendeten Rechners +und von der gewählten Interface-Anpassung. Die Veränderung der Wartezeit erfolgt +mit dem Kommando 'eingabesicherheit (n)', wobei n eine 'Integer'-Zahl sein muß. +Bei sehr langsamen Systemen hat sich ein Wert von 3 als sinnvoll herausgestellt; bei +schnellen Rechnern muß n etwa 10 oder noch größer sein. Ermitteln Sie den für +Ihren Rechner geeigneten Wert bitte durch Ausprobieren. (Standardmäßig eingestellt +ist n = 5.) + +Mit Hilfe von drei Informationsprozeduren können Sie Informationen über den +Systemzustand einholen: 'put (hauptstellenname)' liefert den Namen der zu +ständigen Hauptstellen-Task, 'put (interface anpassung)' zeigt den Namen der bei +der Installation gewählten Interfaceanpassung für den Kartenleser, und 'put (inter +face channel)' liefert die Nummer des Kanals, über den ein Interface an separater +serieller Schnittstelle angesprochen wird. + + + +#on("b")#Detailbeschreibung der Befehle#off("b")#: + + +#on("b")#PROC eingabesicherheit (INT CONST n):#off("b")# + + - stellt die Wartezeit beim Einlesen einer Artikel-, Kunden- oder Auskunfts + codenummer in Abhängigkeit vom Absolutbetrag von n ein. Bei langsamen + Rechnern sollte abs(n) klein (ca. 3), bei schnellen Rechnern größer (ca. 10) + sein. + - Standardeinstellung ist 5. + - Der Befehl kann in jeder Task gegeben werden, in der #on("b")#gs-Warenhaus#off("b")# + insertiert ist. + + +#on("b")#PROC grin (BOOL CONST entscheidung):#off("b")# + + - ist nur in Hauptstellentasks aufrufbar und in Tasks, die keiner Hauptstellen + task untergeordnet sind. + - stellt die Version für die Programmierschnittstelle gemäß der 'entscheidung' + ein: + TRUE ---> GRIN-Version, FALSE ---> ELAN-Version. + + Fehlerfälle: + - Dieser Befehl darf nur von der Task '...' aus gegeben werden! + + +#on("b")#TEXT PROC hauptstellenname:#off("b")# + + - liefert den Namen der zuständigen Hauptstellentask. + - liefert 'niltext' (""), wenn in diesem Zweig des Taskbaumes noch keine + Hauptstelle existiert; es ist dann kein Warenhaus-Betrieb möglich! (vgl. + 'PROC warenhaus hauptstelle') + + +#on("b")#PROC init interfacechannel:#off("b")# + + - initialisiert eine unbenannte Sohntask ("-") zum Ansprechen des Interface + systems über eine separate serielle Schnittstelle und existiert deshalb nur bei + den Anpassungen für 'MUFI als Endgerät' und 'AKTRONIK-Adapter'. + - erfragt zunächst eine Kanalnummer ('Gib Interface-Kanal:'); zulässig sind + Eingaben von 0 bis 24. + - löscht eine evtl. bereits vorhandene unbenannte Sohntask ("-"). + - richtet bei Eingabe einer Kanalnummer > 0 eine neue unbenannte Sohntask + ein und sperrt dieses Kommando für Sohntasks, die danach angemeldet + werden. + - hebt eine etwa gesetzte Sperrung bei Eingabe von 0 als Kanalnummer wieder + auf. + + Fehlerfälle: + - Dieses Kommando kann nur von der Task '...' aus gegeben werden! + - Unzulässige Kanalnummer! + + +#on("b")#TEXT PROC interface anpassung:#off("b")# + + - liefert den Namen der bei der Installation ausgewählten Anpassung. Möglich + sind zur Zeit: + + "ohne Kartenleser", + "mit Kartenleser an AKTRONIC-Adapter", + "mit Kartenleser an MUFI als Endgerät", + "mit Kartenleser an MUFI im Terminalkanal". + + +#on("b")#INT PROC interface channel:#off("b")# + + - existiert nur bei den Anpassungen für den AKTRONIC-Adapter und MUFI als + Endgerät. + - liefert die Kanalnummer der seriellen Schnittstelle, über die das Interface + system angesprochen wird. + - wird der Wert 0 geliefert, so kann in der Task keine Eingabe über einen + Kartenleser erfolgen (siehe 'PROC init interfacechannel'). + + +#on("b")#PROC warenhaus:#off("b")# + + - ist nicht in Hauptstellentasks aufrufbar. + - startet #on("b")#gs-Warenhaus#off("b")# aus der 'gib Kommando' - Ebene oder wird bei einge + richtetem Direktstart automatisch aufgerufen. + - richtet eine Sohntask als Filialverwaltung ein und kennzeichnet damit die + eigene Task für das System als 'aktive' Filiale. Der Name dieser Sohntask + enthält den Namen der zuständigen Hauptstellentask und die Filialnummer, + unter der die Filiale geführt wird. Diese Filialnummer ist identisch mit der + Kanalnummer des angekoppelten Terminals. + - löscht die Filialverwaltungstask, wenn das Warenhaus-Menu geregelt mit + <ESC><q> verlassen wird. Zu Kollisionen bezüglich der Filialnummer + kann es somit nur kommen, wenn an einem Arbeitsplatz das WARENHAUS- + Menu ungeregelt verlassen wird (z.B. durch Tippen der SV-Taste) und dann + an demselben Arbeitsplatz eine neue Filiale angemeldet werden soll. In + diesem Fall erhält die neue Task #on("b")#keine#off("b")# Filialverwaltung als Sohntask und ist + damit für den Warenhaus-Betrieb nicht brauchbar. Deshalb wird hier nach + Ausgabe einer Fehlermeldung sofort gefragt, ob die Task gelöscht werden soll. + + Fehlerfälle: + - Dieser Befehl darf nur von Söhnen dieser Task aus gegeben werden! + - Keine uebergeordnete Task ist 'warenhaus hauptstelle'! + - Filiale <n> ist bereits besetzt durch TASK '...'! + Es ist so kein geregelter Warenhaus-Betrieb möglich! + + +#on("b")#PROC warenhaus direktstart (BOOL CONST entscheidung):#off("b")# + + - richtet gemäß dem Wahrheitswert der 'entscheidung' einen Direktstart ein + oder hebt ihn wieder auf. + Hat 'entscheidung' den Wert 'TRUE', so wird ein Direktstart eingerichtet. Es + erscheint zunächst die Frage 'Mit automatischem Löschen (j/n)?'. Durch den + Direktstart gelangt man beim Anmelden einer Sohntask nicht in die 'gib + Kommando' - Ebene, sondern sofort in das WARENHAUS-Menu. Wird die + obige Frage mit <j> beantwortet, so werden Sohntasks nach dem Ausstieg + aus dem WARENHAUS-Menu sofort gelöscht; andernfalls wird erst noch ge + fragt, ob gelöscht werden soll. Bei Verneinung erfolgt ein 'break'. Die Ein + richtung eines Direktstarts wird vom System vermerkt und der Befehl darauf + hin in allen untergeordneten Tasks gesperrt. Sowohl der Direktstart als auch + die Sperrung sind nur wirksam für Sohntasks, die #on("b")#nach#off("b")# Ausführung dieses + Befehls angemeldet werden. + Hat 'entscheidung' den Wert 'FALSE', so wird ein etwa eingerichteter Direkt + start und die damit verbundene Sperrung des Befehls für neue Sohntasks + wieder aufgehoben. Die Aufhebung ist nur möglich in der Task, von der aus + der Direktstart eingerichtet wurde. + + Fehlerfälle: + - Der Direktstart kann nur aus der Task '...' geaendert werden! + + +#on("b")#PROC warenhaus hauptstelle (BOOL CONST entscheidung):#off("b")# + + - macht je nach Wahrheitswert der 'entscheidung' eine Task zur Hauptstellen + task ('TRUE') bzw. hebt diesen Status wieder auf ('FALSE'). Eine Task kann + nur Hauptstelle werden, wenn noch keine übergeordnete Task Hauptstelle ist. + Der Hauptstellenstatus kann danach auch nur in dieser Task wieder aufge + hoben werden. + - löscht bei der Einrichtung der Hauptstelle eine etwa bereits vorhandene + "Zentrale" und richtet automatisch eine neue "Zentrale" in Form einer Sohn + task ein, die den Namen der Vatertask mit dem Zusatz ".Zentrale" erhält und + in der später die zentrale Kundendatei gespeichert wird. Bei Aufhebung des + Hauptstellenstatus wird diese Task wieder gelöscht. + - fragt bei Einrichtung der Hauptstelle nach, ob ein Direktstart eingerichtet + werden soll ('Mit Direktstart (j/n)?') und ruft die Prozedur 'warenhaus + direktstart' entsprechend auf. + - Hebt bei Löschen des Hauptstellenstatus einen in der Task etwa einge + richteten Direktstart automatisch auf. + + Fehlerfälle: + - Hauptstelle ist bereits die Task '...'! + - Dieses Kommando darf nur in der Task '...' gegeben werden! + + diff --git a/app/gs.warenhaus/1.01/source-disk b/app/gs.warenhaus/1.01/source-disk new file mode 100644 index 0000000..74c6338 --- /dev/null +++ b/app/gs.warenhaus/1.01/source-disk @@ -0,0 +1 @@ +informatikpaket/08_gs.warenhaus.img diff --git a/app/gs.warenhaus/1.01/src/ls-MENUKARTE:Warenhaus b/app/gs.warenhaus/1.01/src/ls-MENUKARTE:Warenhaus Binary files differnew file mode 100644 index 0000000..414470a --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-MENUKARTE:Warenhaus diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter new file mode 100644 index 0000000..36de5ef --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter @@ -0,0 +1,36 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 0 ** + ** ** + ** Anpassung für Kartenleser an AKTRONIC-Adapter ** + ** ** + ** Version 1.01 ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 0 DEFINES + interface anpassung,{} oeffne interface,{} schliesse interface,{} wert von interface,{} pressed key,{}(* --------------------------- *){} kanalkoppler,{} interfacechannel,{} init interfacechannel:{}TEXT CONST interface anpassung :: "mit Kartenleser an AKTRONIC-Adapter";{}LET max channel = 24,{} initcode = 26,{} endcode = 27,{} read code = 28;{}INT CONST nicht initialisiert code :: -3,{} interface error code :: -4,{} + kanal besetzt code :: -5;{}INT VAR interfacekanal :: 0;{}TEXT VAR puffer :: "";{}TASK VAR hardwaremanager :: niltask,{} interface task :: niltask,{} absender;{}DATASPACE VAR ds :: nilspace;{}INT PROC interfacechannel:{} interfacekanal{}END PROC interfacechannel;{}PROC oeffne interface (INT VAR status):{} puffer := "";{} forget (ds); ds := nilspace;{} pingpong (interfacetask, init code, ds, status);{} IF status > 0 THEN status DECR maxint FI;{} + forget (ds); ds := nilspace{}END PROC oeffne interface;{}INT PROC wert von interface:{} INT VAR wert;{} puffer CAT incharety (1);{} call (interface task, read code, ds, wert);{} wert.{}END PROC wert von interface;{}PROC schliesse interface:{} forget (ds); ds := nilspace;{} send (interface task, end code, ds);{} forget (ds); ds := nilspace{}END PROC schliesse interface;{}TEXT PROC pressed key:{} IF puffer = ""{} THEN incharety{} ELSE erstes pufferzeichen{} FI.{} erstes pufferzeichen:{} + TEXT VAR zeichen :: puffer SUB 1;{} puffer := subtext (puffer, 2);{} zeichen.{}END PROC pressed key;{}TEXT PROC pressed key (INT CONST warten):{} IF puffer = ""{} THEN incharety (warten){} ELSE erstes pufferzeichen{} FI.{} erstes pufferzeichen:{} TEXT VAR zeichen :: puffer SUB 1;{} puffer := subtext (puffer, 2);{} zeichen.{}END PROC pressed key;{}(*************************************************************************){}PROC kanalkoppler:{} enable stop;{} IF name (myself) <> "-"{} + THEN errorstop ("Unzulässiges Kommando!"){} ELSE warte auf anrufe{} FI.{} warte auf anrufe:{} INT VAR codenummer, antwort;{} disable stop;{} REP wait (ds, codenummer, absender);{} reagiere auf anruf;{} loesche ggf fehlerzustand{} PER.{} reagiere auf anruf:{} IF codenummer = initcode{} THEN kopple an interface;{} IF interface ist betriebsbereit{} THEN bearbeite weitere auftraege{} ELSE gib negative rueckmeldung{} + FI;{} gib kanal frei{} ELSE send (absender, nicht initialisiert code, ds){} FI.{} loesche ggf fehlerzustand:{} IF is error{} THEN clear error{} FI.{} kopple an interface:{} IF task (interfacekanal) <> niltask AND task (interfacekanal) <> myself{} THEN antwort := kanal besetzt code;{} ELSE continue (interfacekanal);{} teste interface{} FI.{} teste interface:{} leere puffer;{} out (""240"");{} IF incharety (1) <> ""{} THEN antwort := 0;{} + out (""176""){} ELSE antwort := interface error code{} FI.{} leere puffer:{} REP UNTIL incharety = "" PER.{} interface ist betriebsbereit: antwort = 0.{} gib negative rueckmeldung: send (absender, antwort, ds).{} gib kanal frei: break (quiet).{} ende: out (""176"").{} bearbeite weitere auftraege:{} REP pingpong (absender, antwort, ds, codenummer);{} IF codenummer = read code{} THEN hole wert von interface{} + ELIF codenummer < 0{} THEN send (absender, codenummer, ds);{} codenummer := endcode{} ELSE antwort := 0{} FI{} UNTIL codenummer = endcode PER;{} ende.{} hole wert von interface:{} out (""211"");{} antwort := code (incharety (1)).{}END PROC kanalkoppler;{}PROC init interfacechannel:{} teste auf zulaessigkeit;{} loesche interfacetask;{} erfrage interface kanal;{} generiere ggf neue interfacetask.{} teste auf zulaessigkeit:{} + enable stop;{} IF hardwaremanager <> niltask AND hardwaremanager <> myself{} THEN errorstop ("Dieses Kommando kann nur von der Task '" +{} name (hardwaremanager) + "' aus gegeben werden!"){} ELSE hardwaremanager := myself{} FI.{} loesche interfacetask:{} disable stop;{} end (interfacetask);{} IF is error THEN clear error FI;{} enable stop.{} generiere ggf neue interfacetask:{} IF interface kanal = 0{} THEN interface task := niltask;{} hardwaremanager := niltask{} + ELSE begin (PROC kanalkoppler, interface task);{} hardwaremanager := myself{} FI.{} erfrage interfacekanal:{} INT VAR kanalnummer;{} put ("Gib Interface - Kanal:");{} get (kanalnummer);{} set interfacechannel (kanalnummer).{}END PROC init interfacechannel;{}PROC set interface channel (INT CONST channel number):{} IF channel number < 0 OR channel number > max channel{} THEN errorstop ("Unzulässige Kanalnummer"){} ELSE interfacekanal := channel number{} FI{}END PROC set interface channel;{} +BOOL OP <> (TASK CONST t1, t2):{} NOT (t1 = t2){}END OP <>;{}init interfacechannel{}END PACKET ls warenhaus 0{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an MUFI als Endgerät b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an MUFI als Endgerät new file mode 100644 index 0000000..f108f7b --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an MUFI als Endgerät @@ -0,0 +1,36 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 0 ** + ** ** + ** Anpassung für Kartenleser an MUFI als Endgerät ** + ** ** + ** Version 1.01 ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 0 DEFINES + interface anpassung,{} oeffne interface,{} schliesse interface,{} wert von interface,{} pressed key,{}(* --------------------------- *){} kanalkoppler,{} interfacechannel,{} init interfacechannel:{}TEXT CONST interface anpassung :: "mit Kartenleser an MUFI als Endgerät";{}LET mufikennung = ""27""27"",{} max channel = 24,{} initcode = 26,{} endcode = 27,{} read code = 28;{}INT CONST nicht initialisiert code :: -3,{} interface error code :: -4,{} + kanal besetzt code :: -5;{}INT VAR interfacekanal :: 2;{}TEXT VAR puffer :: "";{}TASK VAR hardwaremanager :: niltask,{} interface task :: niltask,{} absender;{}DATASPACE VAR ds :: nilspace;{}INT PROC interfacechannel:{} interfacekanal{}END PROC interfacechannel;{}PROC oeffne interface (INT VAR status):{} puffer := "";{} forget (ds); ds := nilspace;{} pingpong (interfacetask, init code, ds, status);{} IF status > 0 THEN status DECR maxint FI;{} + forget (ds); ds := nilspace{}END PROC oeffne interface;{}INT PROC wert von interface:{} INT VAR wert;{} puffer CAT incharety (1);{} call (interface task, read code, ds, wert);{} wert.{}END PROC wert von interface;{}PROC schliesse interface:{} forget (ds); ds := nilspace;{} send (interface task, end code, ds);{} forget (ds); ds := nilspace{}END PROC schliesse interface;{}TEXT PROC pressed key:{} IF puffer = ""{} THEN incharety{} ELSE erstes pufferzeichen{} FI.{} erstes pufferzeichen:{} + TEXT VAR zeichen :: puffer SUB 1;{} puffer := subtext (puffer, 2);{} zeichen.{}END PROC pressed key;{}TEXT PROC pressed key (INT CONST warten):{} IF puffer = ""{} THEN incharety (warten){} ELSE erstes pufferzeichen{} FI.{} erstes pufferzeichen:{} TEXT VAR zeichen :: puffer SUB 1;{} puffer := subtext (puffer, 2);{} zeichen.{}END PROC pressed key;{}(*************************************************************************){}PROC kanalkoppler:{} enable stop;{} IF name (myself) <> "-"{} + THEN errorstop ("Unzulässiges Kommando!"){} ELSE warte auf anrufe{} FI.{} warte auf anrufe:{} INT VAR codenummer, antwort;{} disable stop;{} REP wait (ds, codenummer, absender);{} reagiere auf anruf;{} loesche ggf fehlerzustand{} PER.{} reagiere auf anruf:{} IF codenummer = initcode{} THEN kopple an interface;{} IF interface ist betriebsbereit{} THEN bearbeite weitere auftraege{} ELSE gib negative rueckmeldung{} + FI;{} gib kanal frei{} ELSE send (absender, nicht initialisiert code, ds){} FI.{} loesche ggf fehlerzustand:{} IF is error{} THEN clear error{} FI.{} kopple an interface:{} IF task (interfacekanal) <> niltask AND task (interfacekanal) <> myself{} THEN antwort := kanal besetzt code;{} ELSE continue (interfacekanal);{} teste interface{} FI.{} teste interface:{} leere puffer;{} out (mufikennung + "10");{} fange status;{} IF status = mufikennung + "00"{} + THEN antwort := 0;{} out (mufikennung + "1A18"22""){} ELSE antwort := interface error code{} FI.{} leere puffer:{} REP UNTIL incharety = "" PER.{} fange status:{} INT VAR zaehler;{} TEXT VAR status :: "";{} FOR zaehler FROM 1 UPTO 4 REP{} status CAT incharety (1){} PER.{} interface ist betriebsbereit: antwort = 0.{} gib negative rueckmeldung: send (absender, antwort, ds).{} gib kanal frei: break (quiet).{} ende: out (""25"").{} + bearbeite weitere auftraege:{} REP pingpong (absender, antwort, ds, codenummer);{} IF codenummer = read code{} THEN hole wert von interface{} ELIF codenummer < 0{} THEN send (absender, codenummer, ds);{} codenummer := endcode{} ELSE antwort := 0{} FI{} UNTIL codenummer = endcode PER;{} ende.{} hole wert von interface:{} out (""76"");{} antwort := code (incharety (1)).{}END PROC kanalkoppler;{}PROC init interfacechannel:{} + teste auf zulaessigkeit;{} loesche interfacetask;{} erfrage interface kanal;{} generiere ggf neue interfacetask.{} teste auf zulaessigkeit:{} enable stop;{} IF hardwaremanager <> niltask AND hardwaremanager <> myself{} THEN errorstop ("Dieses Kommando kann nur von der Task '" +{} name (hardwaremanager) + "' aus gegeben werden!"){} FI.{} loesche interfacetask:{} disable stop;{} end (interfacetask);{} IF is error THEN clear error FI;{} enable stop.{} generiere ggf neue interfacetask:{} + IF interface kanal = 0{} THEN interface task := niltask;{} hardwaremanager := niltask{} ELSE begin (PROC kanalkoppler, interface task);{} hardwaremanager := myself{} FI.{} erfrage interfacekanal:{} INT VAR kanalnummer;{} put ("Gib Interface - Kanal:");{} get (kanalnummer);{} set interfacechannel (kanalnummer).{}END PROC init interfacechannel;{}PROC set interface channel (INT CONST channel number):{} IF channel number < 0 OR channel number > max channel{} THEN errorstop ("Unzulässige Kanalnummer!"){} + ELSE interface kanal := channel number{} FI{}END PROC set interface channel;{}BOOL OP <> (TASK CONST t1, t2):{} NOT (t1 = t2){}END OP <>;{}init interfacechannel{}END PACKET ls warenhaus 0{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal new file mode 100644 index 0000000..30c69da --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal @@ -0,0 +1,30 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 0 ** + ** ** + ** Anpassung für Kartenleser an MUFI im Terminalkanal ** + ** ** + ** Version 1.01 ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 0 DEFINES + interface anpassung,{} oeffne interface,{} schliesse interface,{} wert von interface,{} pressed key:{}TEXT CONST interface anpassung :: "mit Kartenleser an MUFI im Terminalkanal";{}LET mufikennung = ""31""31"";{}INT CONST interface error code :: -4;{}TEXT CONST readcode :: mufikennung + "4C";{}TEXT VAR puffer :: "";{}PROC oeffne interface (INT VAR status):{} cursor (2,24);{} warte etwas;{} leere eingangspuffer;{} out (""27""27"10");{} fange antwort;{} IF antwort = ""27""27"00"{} + THEN status := 0;{} out (""27""27"1C" + hex (mufikennung)){} ELSE status := interface error code{} FI.{} warte etwas:{} pause (1); pause (1); pause (1); pause (1); pause (1).{} leere eingangspuffer:{} puffer := "";{} REP UNTIL incharety = "" PER.{} fange antwort:{} TEXT VAR antwort :: incharety (1);{} INT VAR i;{} FOR i FROM 1 UPTO 3 REP{} antwort CAT incharety (1){} PER.{}END PROC oeffne interface;{}INT PROC wert von interface:{} puffer CAT incharety (1);{} + out (readcode);{} fange mufikennung;{} dezimalwert (incharety (1), incharety (1)).{} fange mufikennung:{} REP puffer CAT incharety{} UNTIL pos (puffer, mufikennung) > 0 PER;{} change (puffer, mufikennung, "").{}END PROC wert von interface;{}PROC schliesse interface:{} cursor (2,24);{} out (mufikennung + "1C" + hex (""27""27"")){}END PROC schliesse interface;{}TEXT PROC pressed key:{} IF puffer = ""{} THEN incharety{} ELSE erstes pufferzeichen{} FI.{} erstes pufferzeichen:{} + TEXT VAR zeichen :: puffer SUB 1;{} puffer := subtext (puffer, 2);{} zeichen.{}END PROC pressed key;{}TEXT PROC pressed key (INT CONST warten):{} IF puffer = ""{} THEN incharety (warten){} ELSE erstes pufferzeichen{} FI.{} erstes pufferzeichen:{} TEXT VAR zeichen :: puffer SUB 1;{} puffer := subtext (puffer, 2);{} zeichen.{}END PROC pressed key;{}INT PROC dezimalwert (TEXT CONST zeichen 1, zeichen 2):{} 16 * pos (hexzeichen, zeichen 1) + pos (hexzeichen, zeichen 2).{} + hexzeichen: "123456789ABCDEF".{}END PROC dezimalwert;{}TEXT PROC hex (TEXT CONST zwei zeichen):{} hex (code (zwei zeichen SUB 1)) + hex (code (zwei zeichen SUB 2)){}END PROC hex;{}TEXT PROC hex (INT CONST wert):{} (hexzeichen SUB (wert DIV 16 + 1)) + (hexzeichen SUB (wert MOD 16 + 1)).{} hexzeichen: "0123456789ABCDEF".{}END PROC hex{}END PACKET ls warenhaus 0{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: ohne Kartenleser b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: ohne Kartenleser new file mode 100644 index 0000000..4912d64 --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 0: ohne Kartenleser @@ -0,0 +1,27 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 0 ** + ** ** + ** Anpassung für den Betrieb ohne Kartenleser ** + ** ** + ** Version 1.01 ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 0 DEFINES + interface anpassung,{} oeffne interface,{} schliesse interface,{} wert von interface,{} pressed key:{}TEXT CONST interface anpassung :: "ohne Kartenleser";{}PROC oeffne interface (INT VAR test):{} test := -6{}END PROC oeffne interface;{}PROC schliesse interface:{}END PROC schliesse interface;{}INT PROC wert von interface:{} INT VAR wert :: 0;{} wert{}END PROC wert von interface;{}TEXT PROC pressed key:{} incharety{}END PROC pressed key;{}TEXT PROC pressed key (INT CONST warten):{} + incharety (warten){}END PROC pressed key;{}END PACKET ls warenhaus 0{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 1 b/app/gs.warenhaus/1.01/src/ls-Warenhaus 1 new file mode 100644 index 0000000..81fd8ee --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 1 @@ -0,0 +1,37 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 1 ** + ** ** + ** Version 1.01 ** + ** ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET monitor alt DEFINES original monitor: + PROC original monitor:{} monitor{} END PROC originalmonitor{}END PACKET monitor alt;{}PACKET ls warenhaus 1 DEFINES{} zentrale,{} monitor,{} warenhaus direktstart,{} warenhaus hauptstelle,{} hauptstellenname:{}LET max kundenzahl = 31,{} min kundennummer = 129,{} kundendatei holen code = 100,{} kundendatei ergaenzen code = 200;{}TYPE KUNDENDATEN = STRUCT (TEXT nachname, vorname, geschlecht),{} KUNDENDATEI = ROW max kundenzahl KUNDENDATEN;{}{} +BOUND KUNDENDATEN VAR kundendaten;{}BOUND KUNDENDATEI VAR bound kundendatei;{}KUNDENDATEI VAR kundendatei;{}DATASPACE VAR ds;{}TASK VAR absender,{} zentraltask :: niltask,{} hauptstelle :: niltask,{} direktstartmanager :: niltask;{}BOOL VAR mit direktstart :: FALSE,{} mit loeschen :: FALSE;{}INT VAR codenummer;{}PROC zentrale:{} enable stop;{} IF pos (name (myself), ".Zentrale") = 0{} THEN errorstop ("Unzulaessiger Befehl!"){}{} + FI;{} disable stop;{} REP wait (ds, codenummer, absender);{} bearbeite auftrag;{} send (absender, codenummer, ds);{} IF is error THEN clear error FI{} PER.{} bearbeite auftrag:{} IF codenummer = kundendatei holen code{} THEN hole kundendatei{} ELIF codenummer = kundendatei ergaenzen code{} THEN ergaenze kundendatei{} ELIF codenummer >= min kundennummer{} THEN lies kundendaten{} ELSE speichere kundendaten{} FI.{}END PROC zentrale;{}{} +PROC hole kundendatei:{} bound kundendatei := ds;{} bound kundendatei := kundendatei{}END PROC hole kundendatei;{}PROC ergaenze kundendatei:{} INT VAR kundennummer;{} bound kundendatei := ds;{} FOR kundennummer FROM 1 UPTO max kundenzahl REP{} IF kundendatei [kundennummer].nachname = ""{} THEN kundendatei [kundennummer] := bound kundendatei [kundennummer]{} FI{} PER;{} init ds{}END PROC ergaenze kundendatei;{}PROC lies kundendaten:{} kundendaten := ds;{} kundendaten := kundendatei [platznummer].{}{} + platznummer: codenummer - min kundennummer + 1.{}END PROC lies kundendaten;{}PROC speichere kundendaten:{} kundendaten := ds;{} kundendatei [codenummer] := kundendaten;{} init ds{}END PROC speichere kundendaten;{}PROC warenhaus hauptstelle (BOOL CONST task soll hauptstelle sein):{} enable stop;{} IF task soll hauptstelle sein{} THEN mache task zur hauptstelle{} ELSE mache hauptstellenstatus rueckgaengig{} FI.{} mache task zur hauptstelle:{} sei eine hauptstelle;{} line (2);{}{} + IF NOT mit direktstart CAND yes ("Mit Direktstart"){} THEN warenhaus direktstart (TRUE){} ELSE global manager{} FI{}END PROC warenhaus hauptstelle;{}PROC sei eine hauptstelle:{} IF NOT (hauptstelle = niltask OR hauptstelle = myself){} THEN errorstop ("Hauptstelle ist bereits die Task '" +{} name (hauptstelle) + "'!"){} FI;{} disable stop;{} end (zentraltask);{} IF is error THEN clear error FI;{} enable stop;{} hauptstelle := niltask;{} begin (name (myself) + ".Zentrale", PROC zentrale, zentraltask);{}{} + hauptstelle := myself{}END PROC sei eine hauptstelle;{}PROC mache hauptstellenstatus rueckgaengig:{} IF NOT (hauptstelle = niltask OR hauptstelle = myself){} THEN errorstop ("Dieses Kommando darf nur in der Task '" +{} name (hauptstelle) + " gegeben werden!"){} FI;{} disable stop;{} end (zentraltask);{} IF is error THEN clear error FI;{} enable stop;{} hauptstelle := niltask;{} warenhaus direktstart (FALSE){}END PROC mache hauptstellenstatus rueckgaengig;{}PROC warenhaus direktstart (BOOL CONST wahl):{}{} + pruefe zulaessigkeit;{} mit direktstart := wahl;{} IF mit direktstart{} THEN direktstartmanager := myself;{} mit loeschen := yes ("Mit automatischem Löschen"){} ELSE direktstartmanager := niltask{} FI;{} global manager.{} pruefe zulaessigkeit:{} enable stop;{} IF NOT (direktstartmanager = niltask OR direktstartmanager = myself){} THEN errorstop ("Der Direktstart kann nur aus der Task '" +{} name (direktstartmanager) + "'geaendert werden!"){}{} + FI.{}END PROC warenhaus direktstart;{}TEXT PROC hauptstellenname:{} name (hauptstelle){}END PROC hauptstellenname;{}PROC monitor:{} IF mit direktstart{} THEN warenhaus monitor{} ELSE original monitor{} FI{}END PROC monitor;{}PROC warenhausmonitor:{} disable stop;{} INT VAR previous heapsize := heap size;{} REP command dialogue (TRUE);{} sysin (""); sysout ("");{} cry if not enough storage;{} reset dialog; erase menunotice;{} do ("warenhaus");{} IF is error{}{} + THEN clear error{} ELSE sitzungsende{} FI{} PER.{} sitzungsende:{} collect heap garbage if necessary;{} page;{} IF mit loeschen{} THEN break; end (myself){} ELSE end; break{} FI.{} collect heap garbage if necessary:{} IF heap size > previous heapsize + 10{} THEN collect heap garbage;{} previous heapsize := heap size{} FI.{} cry if not enough storage:{} INT VAR size, used;{} storage (size, used);{} IF used > size{} THEN out (""7"Speicher Engpass! Dateien loeschen!"13""10""){}{} + FI.{}END PROC warenhausmonitor;{}OP := (KUNDENDATEN VAR ziel, KUNDENDATEN CONST quelle):{} CONCR (ziel) := CONCR (quelle){}END OP :=;{}OP := (KUNDENDATEI VAR ziel, KUNDENDATEI CONST quelle):{} CONCR (ziel) := CONCR (quelle){}END OP :=;{}PROC init ds:{} forget (ds); ds := nilspace{}END PROC init ds;{}PROC initialisiere kundendatei:{} KUNDENDATEN CONST leer :: KUNDENDATEN : ("", "", "");{} INT VAR nr;{} FOR nr FROM 1 UPTO max kundenzahl REP{} kundendatei [nr] := leer{} PER{}END PROC initialisiere kundendatei;{}{} +initialisiere kundendatei{}END PACKET ls warenhaus 1{}{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 2 b/app/gs.warenhaus/1.01/src/ls-Warenhaus 2 new file mode 100644 index 0000000..7048aff --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 2 @@ -0,0 +1,112 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 2 ** + ** ** + ** Version 1.01 ** + ** ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 2 DEFINES + max artikelzahl,{} max kundenzahl,{} min kundennummer,{} max kundennummer,{} min artikelnummer,{} max artikelnummer,{} filialverwaltung,{} initialisiere verwaltung,{} hole artikeldaten,{} speichere artikeldaten,{} registriere verkauf,{} hole kundendaten,{} speichere kundendaten,{} sichere filialdaten,{} lade filialdaten,{} hole bestelliste,{} hole auskunft ein:{}LET max filialen = 10,{} max artikel = 15,{} + max kunden = 31,{} min kundennr = 129,{} max kundennr = 159,{} min artikelnr = 1,{} max artikelnr = 15;{}LET zentrale kundendatei holen code = 100,{} zentrale kundendatei ergaenzen code = 200,{} filialdaten holen code = 201,{} filialdaten ergaenzen code = 202;{}INT CONST max artikelzahl :: max artikel,{} max kundenzahl :: max kunden,{} min kundennummer :: min kundennr,{} max kundennummer :: max kundennr,{} + min artikelnummer :: min artikelnr,{} max artikelnummer :: max artikelnr;{}TYPE ARTIKELDATEN = STRUCT (TEXT artikelname, REAL preis,{} INT mindestbestand, bestand),{} KUNDENDATEN = STRUCT (TEXT nachname, vorname, geschlecht),{} WARENDATEI = ROW max artikel ARTIKELDATEN,{} KUNDENDATEI = ROW max kunden KUNDENDATEN,{} EINKAUFSDATEI = ROW max kunden ROW max artikel INT,{} VERKAUFSDATEI = ROW max artikel INT,{} FILIALDATEN = STRUCT (WARENDATEI waren, KUNDENDATEI kunden,{} + EINKAUFSDATEI einkaeufe,{} VERKAUFSDATEI hitliste);{}KUNDENDATEI VAR kunde;{}WARENDATEI VAR artikel;{}EINKAUFSDATEI VAR einkaufsdatei;{}VERKAUFSDATEI VAR verkaufszahl;{}DATASPACE VAR ds;{}INT VAR codenummer, reply code;{}TASK VAR zentrale, verwaltung, absender;{}TEXT VAR hauptstelle :: "",{} filialnummer :: "0",{} filialverwaltungsname :: "";{}PROC filialverwaltung:{} enable stop;{} + IF pos (name (myself), ".Filialverwaltung") = 0{} THEN errorstop ("Unzulaessiger Befehl!"){} FI;{} disable stop;{} REP wait (ds, codenummer, absender);{} bearbeite auftrag;{} send (absender, 0, ds);{} IF is error THEN clear error FI{} PER.{} bearbeite auftrag:{} IF codenummer <= max artikel{} THEN artikeldaten speichern{} ELIF codenummer <= max kundennr{} THEN kauf registrieren{} ELIF codenummer <= max kundennr + max kunden{} THEN kundendaten speichern{} + ELIF codenummer = filialdaten holen code{} THEN filialdaten holen{} ELIF codenummer = filialdaten ergaenzen code{} THEN filialdaten ergaenzen; init ds{} ELIF codenummer = 256{} THEN sperre task{} FI.{} sperre task:{} call (absender, 256, ds, codenummer).{}END PROC filialverwaltung;{}PROC artikeldaten speichern:{} BOUND ARTIKELDATEN VAR artikeldaten :: ds;{} artikel [codenummer] := artikeldaten;{} init ds{}END PROC artikeldaten speichern;{}PROC kauf registrieren:{} + artikelnummer aus ds lesen;{} artikel [artikelnummer].bestand DECR 1;{} verkaufszahl [artikelnummer] INCR 1;{} IF kundennummer > 0{} THEN einkaufsdatei [kundennummer][artikelnummer] INCR 1{} FI.{} artikelnummer aus ds lesen:{} BOUND INT VAR nummer :: ds;{} INT CONST artikelnummer :: nummer,{} kundennummer :: codenummer - min kundennr + 1;{} init ds{}END PROC kauf registrieren;{}PROC kundendaten speichern:{} BOUND KUNDENDATEN VAR kundendaten :: ds;{} kunde [codenummer - min kundennr - max kunden + 1] := kundendaten{} +END PROC kundendaten speichern;{}PROC filialdaten holen:{} init ds;{} BOUND FILIALDATEN VAR filialdaten :: ds;{} CONCR (filialdaten.waren) := CONCR (artikel);{} CONCR (filialdaten.kunden) := CONCR (kunde);{} CONCR (filialdaten.einkaeufe) := CONCR (einkaufsdatei);{} CONCR (filialdaten.hitliste) := CONCR (verkaufszahl){}END PROC filialdaten holen;{}PROC filialdaten ergaenzen:{} BOUND FILIALDATEN VAR neue daten :: ds;{} INT VAR kundennummer, artikelnummer;{} ergaenze artikeldatei und verkaufszahlen;{} + ergaenze kundendatei;{} ergaenze einkaufsdatei.{} ergaenze artikeldatei und verkaufszahlen:{} FOR artikelnummer FROM 1 UPTO max artikel REP{} verkaufszahl [artikelnummer] INCR neue daten.hitliste [artikelnummer];{} IF artikel [artikelnummer].artikelname = ""{} THEN artikel [artikelnummer] := neue daten.waren [artikelnummer]{} FI{} PER.{} ergaenze kundendatei:{} FOR kundennummer FROM 1 UPTO max kunden REP{} IF kunde [kundennummer].nachname = ""{} THEN kunde [kundennummer] := neue daten.kunden [kundennummer]{} + FI{} PER.{} ergaenze einkaufsdatei:{} FOR kundennummer FROM 1 UPTO max kunden REP{} FOR artikelnummer FROM 1 UPTO max artikel REP{} einkaufsdatei [kundennummer][artikelnummer]{} INCR neue daten.einkaeufe [kundennummer][artikelnummer]{} PER{} PER.{}END PROC filialdaten ergaenzen;{}OP := (ARTIKELDATEN VAR ziel, ARTIKELDATEN CONST quelle):{} CONCR (ziel) := CONCR (quelle){}END OP :=;{}OP := (KUNDENDATEN VAR ziel, KUNDENDATEN CONST quelle):{} CONCR (ziel) := CONCR (quelle){} +END OP :=;{}PROC init ds:{} forget (ds); ds := nilspace{}END PROC init ds;{}(************************************************************************){}PROC initialisiere verwaltung:{} hauptstelle := hauptstellenname;{} zentrale := task (hauptstelle + ".Zentrale");{} filialnummer := text (channel (myself));{} filialverwaltungsname := hauptstellenname + ".Filialverwaltung ";{} begin (filialverwaltungsname + filialnummer,{} PROC filialverwaltung, verwaltung){}END PROC initialisiere verwaltung;{} +PROC hole artikeldaten (INT CONST artikelnummer,{} TEXT VAR name, REAL VAR preis,{} INT VAR mindestbestand, bestand):{} enable stop;{} pruefe artikelnummer;{} hole daten.{} pruefe artikelnummer:{} INT CONST artikelindex :: artikelnummer - min artikelnr + 1;{} IF artikelindex < 1 OR artikelindex > max artikel{} THEN errorstop ("Unzulässige Artikelnummer!"){} FI.{} hole daten:{} name := artikel [artikelindex].artikelname;{} + preis := artikel [artikelindex].preis;{} mindestbestand := artikel [artikelindex].mindestbestand;{} bestand := artikel [artikelindex].bestand.{}END PROC hole artikeldaten;{}PROC speichere artikeldaten (INT CONST artikelnummer,{} TEXT CONST name, REAL CONST preis,{} INT CONST mindestbestand, bestand):{} enable stop;{} pruefe artikelnummer;{} speichere daten;{} schicke kopie an verwaltung.{} pruefe artikelnummer:{} + INT CONST artikelindex :: artikelnummer - min artikelnr + 1;{} IF artikelindex < 1 OR artikelindex > max artikel{} THEN errorstop ("Unzulässige Artikelnummer!"){} FI.{} speichere daten:{} artikel [artikelindex].artikelname := name;{} artikel [artikelindex].preis := preis;{} artikel [artikelindex].mindestbestand:= mindestbestand;{} artikel [artikelindex].bestand := bestand.{} schicke kopie an verwaltung:{} init ds;{} BOUND ARTIKELDATEN VAR artikeldaten :: ds;{} + artikeldaten := artikel [artikelindex];{} call (verwaltung, artikelindex, ds, reply code).{}END PROC speichere artikeldaten;{}PROC registriere verkauf (INT CONST kundennummer, artikelnummer):{} enable stop;{} pruefe daten;{} speichere daten;{} schicke kopie zur verwaltung.{} pruefe daten:{} INT VAR kundenindex :: kundennummer - min kundennr + 1,{} artikelindex :: artikelnummer - min artikelnr + 1;{} IF kundenindex < 0 OR kundenindex > max kunden{} THEN errorstop ("Unzulässige Kundennummer!"){} + ELIF artikelindex < 1 OR artikelindex > max artikel{} THEN errorstop ("Unzulässige Artikelnummer!"){} FI.{} speichere daten:{} IF artikel [artikelindex].bestand > 0{} THEN artikel [artikelindex].bestand DECR 1;{} verkaufszahl [artikelindex] INCR 1;{} IF kundenindex > 0{} THEN trage evtl in einkaufsdatei ein{} FI FI.{} trage evtl in einkaufsdatei ein:{} IF kunde [kundenindex].nachname = ""{} THEN kundenindex := 0{} ELSE einkaufsdatei [kundenindex][artikelindex] INCR 1{} + FI.{} schicke kopie zur verwaltung:{} init ds;{} BOUND INT VAR nummer :: ds;{} nummer := artikelindex;{} call (verwaltung, kundenindex + min kundennr - 1, ds, reply code).{}END PROC registriere verkauf;{}PROC hole kundendaten (INT CONST kundennummer,{} TEXT VAR nachname, vorname, geschlecht):{} enable stop;{} pruefe kundennummer;{} rufe zentrale an;{} uebergib die zentraldaten;{} IF aenderungen vorhanden{} THEN aktualisiere filialdaten{} FI;{} forget (ds).{} + pruefe kundennummer:{} INT CONST index :: kundennummer - min kundennr + 1;{} IF index < 1 OR index > max kunden{} THEN errorstop ("Unzulässige Kundennummer!"){} FI.{} rufe zentrale an:{} init ds;{} call (zentrale, kundennummer, ds, reply code).{} aenderungen vorhanden:{} (kunde [index].nachname <> nachname ) OR{} (kunde [index].vorname <> vorname ) OR{} (kunde [index].geschlecht <> geschlecht).{} aktualisiere filialdaten:{} kunde [index] := daten von zentrale;{} + call (verwaltung, kundennummer + max kunden, ds, reply code).{} uebergib die zentraldaten:{} BOUND KUNDENDATEN VAR daten von zentrale :: ds;{} nachname := daten von zentrale.nachname;{} vorname := daten von zentrale.vorname;{} geschlecht := daten von zentrale.geschlecht.{}END PROC hole kundendaten;{}PROC speichere kundendaten(INT CONST kundennummer,{} TEXT CONST nachname, vorname, geschlecht):{} enable stop;{} pruefe kundennummer;{} IF kundendaten geaendert{} + THEN speichere daten;{} schicke kopie an verwaltung und zentrale{} FI.{} pruefe kundennummer:{} IF kundennummer < min kundennr OR kundennummer > max kundennr{} THEN errorstop ("Unzulässige Kundennummer!"){} FI.{} kundendaten geaendert:{} INT CONST index :: kundennummer - min kundennr + 1;{} nachname <> kunde [index].nachname OR{} vorname <> kunde [index].vorname OR{} geschlecht <> kunde [index].geschlecht.{} speichere daten:{} kunde [index].nachname := nachname;{} + kunde [index].vorname := vorname;{} kunde [index].geschlecht := geschlecht.{} schicke kopie an verwaltung und zentrale:{} init ds;{} BOUND KUNDENDATEN VAR kundendaten :: ds;{} kundendaten := kunde [index];{} call (verwaltung, kundennummer + max kunden, ds, reply code);{} call (zentrale, kundennummer - min kundennr + 1, ds, reply code);{} forget (ds).{}END PROC speichere kundendaten;{}PROC sichere filialdaten (TEXT CONST name):{} enable stop;{} filialdaten holen;{} + type (ds, 1951);{} forget (name, quiet);{} copy (ds, name);{} forget (ds){}END PROC sichere filialdaten;{}PROC lade filialdaten (TEXT CONST name):{} enable stop;{} forget (ds);{} ds := old (name);{} IF type (ds) = 1951{} THEN filialdaten ergaenzen;{} kopie an verwaltung schicken;{} kopie der kundendatei an zentrale schicken{} ELSE errorstop ("'" + name + "' enthält keine Filialdaten!"){} FI.{} kopie an verwaltung schicken:{} call (verwaltung, filialdaten ergaenzen code, ds, reply code).{} + kopie der kundendatei an zentrale schicken:{} BOUND KUNDENDATEI VAR kundendatei :: ds;{} CONCR (CONCR (kundendatei)) := CONCR (kunde);{} call (zentrale, zentrale kundendatei ergaenzen code, ds, reply code).{}END PROC lade filialdaten;{}PROC hole bestelliste (FILE VAR f):{} bereite datei vor;{} schreibe daten in datei.{} bereite datei vor:{} forget("Nachbestellung",quiet);{} f := sequential file (output, "Nachbestellung");{} line (f);{} write (f, " Nachbestellungen für " +{} + invers ("Filiale " + filialnummer)+":");{} line;{} write (f, " ==================================================");{} line (f, 2);{} write (f, " | Art.Nr. | Artikelname | Anzahl |");{} line (f);{} write (f, " +----------+-------------------------+-----------+");{} line (f).{} schreibe daten in datei:{} INT VAR artikelnummer;{} FOR artikelnummer FROM 1 UPTO max artikel REP{} IF artikel[artikelnummer].bestand{} + < artikel[artikelnummer].mindestbestand{} THEN bestelle artikel nach{} FI{} PER;{} write (f, " +----------+-------------------------+-----------+");{} line (f).{} bestelle artikel nach:{} write (f, " | " + wirkliche artikelnummer + " | "{} + text (artikel [artikelnummer].artikelname, 23) + " | "{} + text (nachzubestellende anzahl, 6) + " |");{} line (f);{} artikel [artikelnummer].bestand{} := 2 * artikel [artikelnummer].mindestbestand.{} + wirkliche artikelnummer:{} text (artikelnummer + min artikelnr - 1, 5).{} nachzubestellende anzahl:{} 2 * artikel [artikelnummer].mindestbestand{} - artikel [artikelnummer].bestand.{}END PROC hole bestelliste;{}PROC hole auskunft ein (INT CONST codenummer, artikel oder kundennummer,{} FILE VAR f):{} enable stop;{} hauptstelle := hauptstellenname;{} SELECT codenummer OF CASE 66 : hitliste von zentrale (f){} CASE 67 : hitliste von filiale (f){} + CASE 68 : hitlisten aller filialen (f){} (* --------------------------------------------- *){} CASE 73 : artikelkaeuferliste von zentrale{} (artikel oder kundennummer, f){} CASE 74 : artikelkaeuferliste von filiale{} (artikel oder kundennummer, f){} CASE 75 : artikelkaeuferlisten aller filialen{} (artikel oder kundennummer, f){} + (* --------------------------------------------- *){} CASE 77 : kundenliste von zentrale (f){} CASE 78 : kundenliste von filiale (f){} CASE 79 : kundenlisten aller filialen (f){} (* --------------------------------------------- *){} CASE 84 : kundeneinkaufsliste von zentrale{} (artikel oder kundennummer, f){} CASE 85 : kundeneinkaufsliste von filiale{} + (artikel oder kundennummer, f){} CASE 86 : kundeneinkaufslisten aller filialen{} (artikel oder kundennummer, f){} (* --------------------------------------------- *){} CASE 89 : lageruebersicht von zentrale (f){} CASE 90 : lageruebersicht von filiale (f){} CASE 91 : lageruebersichten aller filialen (f){} (* --------------------------------------------- *){} + OTHERWISE errorstop ("Unzulässige Code - Nummer bei Auskunft!"){} END SELECT{}END PROC hole auskunft ein;{}PROC hitliste von zentrale (FILE VAR f):{} INT VAR filialnr;{} beginne mit eigener filiale;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} IF filialnr <> int (filialnummer) CAND{} exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} schreibe daten in zentralliste{} + FI{} PER;{} werte zentralliste aus.{} beginne mit eigener filiale:{} WARENDATEI VAR zentrale warendatei;{} CONCR (zentrale warendatei) := CONCR (artikel);{} VERKAUFSDATEI VAR zentrale verkaufsdatei;{} CONCR (zentrale verkaufsdatei) := CONCR (verkaufszahl).{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code);{} BOUND FILIALDATEN VAR aktuelle daten :: ds.{} schreibe daten in zentralliste:{} INT VAR i;{} + FOR i FROM 1 UPTO max artikel REP{} IF zentrale warendatei [i].artikelname = ""{} THEN zentrale warendatei [i] := aktuelle daten.waren [i]{} FI;{} zentrale verkaufsdatei [i] INCR aktuelle daten.hitliste [i]{} PER.{} werte zentralliste aus:{} forget (ds);{} forget ("Auskunft: Zentrale", quiet);{} f := sequential file (output, "Auskunft: Zentrale");{} line (f);{} write (f, " Zentrale Warenliste, geordnet nach Verkaufszahlen:");{} sortiere (zentrale warendatei, zentrale verkaufsdatei);{} + fuelle (f, zentrale warendatei, zentrale verkaufsdatei).{}END PROC hitliste von zentrale;{}PROC hitliste von filiale (FILE VAR f):{} bereite auskunftsdatei vor;{} kopiere artikeldatei und verkaufsdatei;{} sortiere (hilfsdatei artikel, hilfsdatei verkaufszahlen);{} fuelle (f,hilfsdatei artikel, hilfsdatei verkaufszahlen).{} kopiere artikeldatei und verkaufsdatei:{} WARENDATEI VAR hilfsdatei artikel;{} CONCR (hilfsdatei artikel) := CONCR (artikel);{} VERKAUFSDATEI VAR hilfsdatei verkaufszahlen;{} + CONCR (hilfsdatei verkaufszahlen) := CONCR (verkaufszahl).{} bereite auskunftsdatei vor:{} forget ("Auskunft: Filiale " + filialnummer, quiet);{} f := sequential file (output, "Auskunft: Filiale " + filialnummer);{} line (f);{} write (f, " Warenliste, geordnet nach Verkaufszahlen:").{}END PROC hitliste von filiale;{}PROC hitlisten aller filialen (FILE VAR f):{} WARENDATEI VAR aktuelle warendatei;{} VERKAUFSDATEI VAR aktuelle verkaufsdatei;{} INT VAR filialnr;{} + bereite auskunftsdatei vor;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} IF filialnr = int (filialnummer){} THEN nimm eigene daten{} ELIF exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} arbeite mit diesen daten{} FI{} PER;{} forget (ds).{} bereite auskunftsdatei vor:{} forget ("Auskunft: Alle Filialen", quiet);{} f := sequential file (output, "Auskunft: Alle Filialen");{} + line (f).{} nimm eigene daten:{} CONCR (aktuelle warendatei) := CONCR (artikel);{} CONCR (aktuelle verkaufsdatei) := CONCR (verkaufszahl);{} sortiere und fuelle.{} sortiere und fuelle:{} write (f, " Warenliste von " + invers ("Filiale " + text (filialnr)){} + ", geordnet nach Verkaufszahlen:");{} sortiere (aktuelle warendatei, aktuelle verkaufsdatei);{} fuelle (f,aktuelle warendatei, aktuelle verkaufsdatei).{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code);{} + BOUND FILIALDATEN VAR aktuelle daten :: ds.{} arbeite mit diesen daten:{} CONCR (aktuelle warendatei) := CONCR (aktuelle daten.waren);{} CONCR (aktuelle verkaufsdatei) := CONCR (aktuelle daten.hitliste);{} sortiere und fuelle.{}END PROC hitlisten aller filialen;{}PROC sortiere (WARENDATEI VAR warendatei, VERKAUFSDATEI VAR stueckzahl):{} INT VAR i,j;{} FOR i FROM 1 UPTO max artikel - 1 REP{} FOR j FROM i + 1 UPTO max artikel REP{} IF stueckzahl [i] < stueckzahl [j]{} THEN vertausche{} + FI{} PER PER.{} vertausche:{} INT CONST hilfsint :: stueckzahl [i];{} ARTIKELDATEN CONST hilfsartikel :: warendatei [i];{} stueckzahl [i] := stueckzahl [j];{} warendatei [i] := warendatei [j];{} stueckzahl [j] := hilfsint;{} warendatei [j] := hilfsartikel.{}END PROC sortiere;{}PROC fuelle (FILE VAR f, WARENDATEI VAR warendat, VERKAUFSDATEI VAR anzahl):{} INT VAR nummer, platz :: 0;{} bereite datei vor;{} schreibe daten in datei.{}bereite datei vor:{} line (f);{} write(f," ============================================================");{} + line (f,2);{} write(f," | Platz | Verk.Anzahl | Artikelname | Preis |");{} line (f);{} write(f," +-------+-------------+------------------------+-----------+");{} line (f).{}schreibe daten in datei:{} FOR nummer FROM 1 UPTO max artikel REP{} IF warendat [nummer].artikelname <> ""{} THEN schreibe in datei; line (f){} FI{} PER;{} write(f," +-------+-------------+------------------------+-----------+");{} line (f,3).{}schreibe in datei:{} platz INCR 1;{} write (f, " |" + text (platz, 5) + " |"{} + + text (anzahl [nummer], 9) + " | "{} + text (warendat [nummer].artikelname, 22) + " | "{} + text (warendat [nummer].preis,8,2) + " |").{}END PROC fuelle;{}PROC artikelkaeuferliste von zentrale (INT CONST artikelnummer, FILE VAR f):{} INT VAR filialnr;{} pruefe artikelnummer;{} beginne mit eigener filiale;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} + IF filialnr <> int (filialnummer) CAND{} exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} schreibe daten in zentralliste{} FI{} PER;{} werte zentralliste aus.{} pruefe artikelnummer:{} INT CONST artikelindex :: artikelnummer - min artikelnr + 1;{} IF artikelindex < 1 OR artikelindex > max artikel{} THEN errorstop ("Unzulässige Artikelnummer!"){} FI.{} beginne mit eigener filiale:{} TEXT VAR aktueller artikelname :: artikel [artikelindex].artikelname;{} + KUNDENDATEI VAR hilfsdatei;{} CONCR (hilfsdatei) := CONCR (kunde);{} ROW max kunden INT VAR kaeufe;{} INT VAR i;{} FOR i FROM 1 UPTO max kunden REP{} kaeufe [i] := einkaufsdatei [i][artikelindex]{} PER.{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code).{} schreibe daten in zentralliste:{} BOUND FILIALDATEN VAR aktuelle daten :: ds;{} IF aktueller artikelname = ""{} THEN aktueller artikelname{} + := aktuelle daten.waren [artikelindex].artikelname{} FI;{} FOR i FROM 1 UPTO max kunden REP{} kaeufe [i] INCR aktuelle daten.einkaeufe [i][artikelindex];{} IF hilfsdatei [i].nachname = ""{} THEN hilfsdatei [i] := aktuelle daten.kunden [i]{} FI{} PER.{} werte zentralliste aus:{} forget (ds);{} forget ("Auskunft: Zentrale", quiet);{} f := sequential file (output, "Auskunft: Zentrale");{} line (f);{} IF aktueller artikelname = ""{} THEN write (f, " Der Artikel Nr. " + text (artikelindex){} + + " wird in keiner Filiale geführt.");{} line (f);{} write(f,{} " ============================================================");{} line (f,3);{} ELSE write (f, " Gesamtkäuferliste des Artikels "{} + invers (aktueller artikelname) + ":");{} fuelle (f, hilfsdatei, kaeufe){} FI.{}END PROC artikelkaeuferliste von zentrale;{}PROC artikelkaeuferliste von filiale (INT CONST artikelnummer, FILE VAR f):{} + pruefe artikelnummer;{} kopiere einkaufszahlen in hilfsliste;{} erstelle filialliste.{} pruefe artikelnummer:{} INT CONST artikelindex :: artikelnummer - min artikelnr + 1;{} IF artikelindex < 1 OR artikelindex > max artikel{} THEN errorstop ("Unzulässige Artikelnummer!"){} FI.{} kopiere einkaufszahlen in hilfsliste:{} ROW max kunden INT VAR kaeufe;{} INT VAR i;{} FOR i FROM 1 UPTO max kunden REP{} kaeufe [i] := einkaufsdatei [i][artikelindex]{} PER.{} erstelle filialliste:{} + forget ("Auskunft: Filiale " + filialnummer, quiet);{} f := sequential file (output, "Auskunft: Filiale " + filialnummer);{} line (f);{} IF artikel [artikelindex].artikelname = ""{} THEN write (f, " Der Artikel Nr. " + text (artikelindex){} + " wird in dieser Filiale nicht geführt.");{} line (f);{} write(f,{} " ============================================================");{} line (f,3);{} ELSE write (f, " Käufer des Artikels "{} + + invers (artikel [artikelindex].artikelname){} + ":");{} fuelle (f, kunde, kaeufe){} FI.{}END PROC artikelkaeuferliste von filiale;{}PROC artikelkaeuferlisten aller filialen(INT CONST artikelnummer,FILE VAR f):{} INT VAR i, filialnr;{} ROW max kunden INT VAR kaeufe;{} pruefe artikelnummer;{} bereite datei vor;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} + IF filialnr = int (filialnummer){} THEN kopiere eigene einkaufszahlen in hilfsliste;{} schreibe eigene daten in auskunftsdatei{} ELIF exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} schreibe daten in auskunftsdatei{} FI{} PER;{} forget (ds).{} pruefe artikelnummer:{} INT CONST artikelindex :: artikelnummer - min artikelnr + 1;{} IF artikelindex < 1 OR artikelindex > max artikel{} THEN errorstop ("Unzulässige Artikelnummer!"){} + FI.{} bereite datei vor:{} forget ("Auskunft: Alle Filialen", quiet);{} f := sequential file (output, "Auskunft: Alle Filialen");{} line (f).{} kopiere eigene einkaufszahlen in hilfsliste:{} FOR i FROM 1 UPTO max kunden REP{} kaeufe [i] := einkaufsdatei [i][artikelindex]{} PER.{} schreibe eigene daten in auskunftsdatei:{} IF artikel [artikelindex].artikelname = ""{} THEN write (f, " Der Artikel Nr. " + text (artikelindex){} + " wird in "{} + + invers ("Filiale " + filialnummer){} + " nicht geführt.");{} line (f);{} write(f,{} " ============================================================");{} line (f,3){} ELSE write (f, " Käufer des Artikels '"{} + artikel [artikelindex].artikelname{} + "' in " + invers ("Filiale " + filialnummer) + ":");{} fuelle(f, kunde, kaeufe){} FI.{} hole daten dieser filiale:{} + init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code);{} BOUND FILIALDATEN VAR aktuelle daten :: ds;{} TEXT CONST aktueller artikelname{} := aktuelle daten.waren [artikelindex].artikelname{} FOR i FROM 1 UPTO max kunden REP{} kaeufe [i] := aktuelle daten.einkaeufe [i][artikelindex];{} PER.{} schreibe daten in auskunftsdatei:{} IF aktueller artikelname = ""{} THEN write (f, " Der Artikel Nr. " + text (artikelindex){} + + " wird in "{} + invers ("Filiale " + text (filialnr)){} + " nicht geführt.");{} line (f);{} write(f,{} " ============================================================");{} line (f,3){} ELSE write (f, " Käufer des Artikels '"{} + aktueller artikelname{} + "' in " + invers ("Filiale " + text(filialnr)) + ":");{} fuelle(f, aktuelle daten.kunden, kaeufe){} + FI.{}END PROC artikelkaeuferlisten aller filialen;{}PROC fuelle (FILE VAR f, KUNDENDATEI CONST kundenliste,{} ROW max kunden INT CONST einkaufszahlen):{} INT VAR kundennummer;{} bereite datei vor;{} schreibe daten in datei.{}bereite datei vor:{} line (f);{} write(f," ============================================================");{} line (f, 2);{} write(f," | Anzahl | Nachname, Vorname | Geschlecht |");{} line (f);{} write(f," +--------+------------------------------------+------------+");{} + line (f).{}schreibe daten in datei:{} FOR kundennummer FROM 1 UPTO max kunden REP{} IF einkaufszahlen [kundennummer] > 0{} THEN schreibe in datei; line (f);{} FI{} PER;{} write(f," +--------+------------------------------------+------------+");{} line (f, 3).{}schreibe in datei:{} write(f," |" + text(einkaufszahlen [kundennummer], 5) + " | "{} + text(kundenliste [kundennummer].nachname + ",", 17) + " "{} + text(kundenliste [kundennummer].vorname, 16) + " | ");{} + IF kundenliste [kundennummer].geschlecht = "m"{} THEN write (f, " männlich |"){} ELIF kundenliste [kundennummer].geschlecht = "w"{} THEN write (f, " weiblich |"){} ELSE write (f, " |"){} FI.{}END PROC fuelle;{}PROC kundenliste von zentrale (FILE VAR f):{} hole kundenliste von zentrale;{} bereite datei vor;{} schreibe daten in datei.{} hole kundenliste von zentrale:{} init ds;{} call (zentrale, zentrale kundendatei holen code, ds, reply code);{} BOUND KUNDENDATEI VAR zentrale kundenliste :: ds.{} + bereite datei vor:{} forget ("Auskunft: Zentrale", quiet);{} f := sequential file (output, "Auskunft: Zentrale");{} line (f);{} write (f, " Zentrale Kundenliste:").{} schreibe daten in datei:{} fuelle (f, zentrale kundenliste);{} forget (ds).{}END PROC kundenliste von zentrale;{}PROC kundenliste von filiale (FILE VAR f):{} bereite datei vor;{} schreibe daten in datei.{} bereite datei vor:{} forget ("Auskunft: Filiale " + filialnummer, quiet);{} f := sequential file (output, "Auskunft: Filiale " + filialnummer);{} + line (f);{} write (f," Kundenliste:").{} schreibe daten in datei:{} fuelle (f, kunde).{}END PROC kundenliste von filiale;{}PROC kundenlisten aller filialen (FILE VAR f):{} INT VAR filialnr;{} bereite datei vor;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} IF filialnr = int (filialnummer){} THEN schreibe eigene daten in auskunftsdatei{} ELIF exists task (aktuelle verwaltung){} + THEN hole daten dieser filiale;{} schreibe daten dieser filiale in auskunftsdatei{} FI{} PER.{} bereite datei vor:{} forget ("Auskunft: Alle Filialen", quiet);{} f := sequential file (output, "Auskunft: Alle Filialen");{} line (f).{} schreibe eigene daten in auskunftsdatei:{} schreibe ueberschrift;{} fuelle (f, kunde).{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code);{} BOUND FILIALDATEN VAR aktuelle filialdaten :: ds.{} + schreibe daten dieser filiale in auskunftsdatei:{} schreibe ueberschrift;{} fuelle (f, aktuelle filialdaten.kunden).{} schreibe ueberschrift:{} write (f, " Kundenliste für " +{} invers ("Filiale " + text (filialnr)) + ":").{}END PROC kundenlisten aller filialen;{}PROC fuelle (FILE VAR f, KUNDENDATEI VAR kundendatei):{} INT VAR kundennummer;{} bereite datei vor;{} schreibe daten in datei.{}bereite datei vor:{} line (f);{} write(f," ============================================================");{} + line (f,2);{} write(f," | Kun.Nr.| Nachname, Vorname | Geschlecht |");{} line (f);{} write(f," +--------+------------------------------------+------------+");{} line (f).{}schreibe daten in datei:{} FOR kundennummer FROM 1 UPTO max kunden REP{} IF kundendatei [kundennummer].nachname <> ""{} THEN schreibe in datei; line (f){} FI{} PER;{} write(f," +--------+------------------------------------+------------+");{} line (f, 3).{}schreibe in datei:{} write (f, " |" + text (kundennummer + min kundennummer - 1, 6) + " | "{} + + text (kundendatei [kundennummer].nachname + ",", 17) + " "{} + text (kundendatei [kundennummer].vorname, 16) + " | ");{} IF kundendatei [kundennummer].geschlecht = "m"{} THEN write (f, " männlich |"){} ELIF kundendatei [kundennummer].geschlecht = "w"{} THEN write (f, " weiblich |"){} ELSE write (f, " |"){} FI.{}END PROC fuelle;{}PROC kundeneinkaufsliste von zentrale (INT CONST kundennummer, FILE VAR f):{} INT VAR filialnr;{} + pruefe kundennummer;{} beginne mit eigener filiale;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} IF filialnr <> int (filialnummer) CAND{} exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} schreibe daten in zentralliste{} FI{} PER;{} werte zentralliste aus.{} pruefe kundennummer:{} INT CONST kundenindex :: kundennummer - min kundennr + 1;{} + IF kundenindex < 1 OR kundenindex > max kunden{} THEN errorstop ("Unzulässige Kundennummer!"){} FI.{} beginne mit eigener filiale:{} KUNDENDATEN VAR aktueller kunde :: kunde [kundenindex];{} WARENDATEI VAR hilfsdatei;{} CONCR (hilfsdatei) := CONCR (artikel);{} ROW max artikel INT VAR kaeufe;{} INT VAR i;{} FOR i FROM 1 UPTO max artikel REP{} kaeufe [i] := einkaufsdatei [kundenindex][i]{} PER.{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code).{} + schreibe daten in zentralliste:{} BOUND FILIALDATEN VAR aktuelle daten :: ds;{} IF aktueller kunde.nachname = ""{} THEN aktueller kunde := aktuelle daten.kunden [kundenindex]{} FI;{} FOR i FROM 1 UPTO max artikel REP{} kaeufe [i] INCR aktuelle daten.einkaeufe [kundenindex][i];{} IF hilfsdatei [i].artikelname = ""{} THEN hilfsdatei [i] := aktuelle daten.waren [i]{} FI{} PER.{} werte zentralliste aus:{} forget (ds);{} forget ("Auskunft: Zentrale", quiet);{} + f := sequential file (output, "Auskunft: Zentrale");{} line (f);{} IF aktueller kunde.nachname = ""{} THEN write (f, " Ein Kunde mit Nr. " + text (kundenindex){} + " ist in keiner Filiale bekannt.");{} line (f);{} write(f,{} " ============================================================");{} line (f,3);{} ELSE write (f, " Gesamteinkaufsliste " + anrede{} + invers (aktueller kundenname) + ":");{} + fuelle (f, hilfsdatei, kaeufe){} FI.{} anrede:{} IF aktueller kunde.geschlecht = "m"{} THEN "des Kunden "{} ELIF aktueller kunde.geschlecht = "w"{} THEN "der Kundin "{} ELSE "von "{} FI.{} aktueller kundenname:{} (aktueller kunde.vorname SUB 1) + ". " + aktueller kunde.nachname.{}END PROC kundeneinkaufsliste von zentrale;{}PROC kundeneinkaufsliste von filiale (INT CONST kundennummer, FILE VAR f):{} pruefe kundennummer;{} erstelle filialliste.{} + pruefe kundennummer:{} INT CONST kundenindex :: kundennummer - min kundennr + 1;{} IF kundenindex < 1 OR kundenindex > max kunden{} THEN errorstop ("Unzulässige Kundennummer!"){} FI.{} erstelle filialliste:{} forget ("Auskunft: Filiale " + filialnummer, quiet);{} f := sequential file (output, "Auskunft: Filiale " + filialnummer);{} line (f);{} IF kunde [kundenindex].nachname = ""{} THEN schicke leere liste zurueck{} ELSE schreibe dateikopf;{} fuelle (f, artikel, einkaufsdatei [kundenindex]){} + FI.{} schicke leere liste zurueck:{} write (f," Ein Kunde mit Nr. " + text (kundennummer) + " ist in "{} + "dieser Filiale nicht bekannt.");{} line (f);{} write (f,{} " ============================================================");{} line (f,3).{} schreibe dateikopf:{} write (f, " Einkaufsliste " + anrede +{} invers ((kunde [kundenindex].vorname SUB 1) + ". " +{} kunde [kundenindex].nachname) + ":").{} anrede:{} IF kunde [kundenindex].geschlecht = "m"{} + THEN "des Kunden "{} ELIF kunde [kundenindex].geschlecht = "w"{} THEN "der Kundin "{} ELSE "von "{} FI.{}END PROC kundeneinkaufsliste von filiale;{}PROC kundeneinkaufslisten aller filialen (INT CONST kundennummer,FILE VAR f):{} INT VAR filialnr;{} pruefe kundennummer;{} bereite datei vor;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} IF filialnr = int (filialnummer){} + THEN schreibe eigene daten in auskunftsdatei{} ELIF exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} schreibe daten in auskunftsdatei{} FI{} PER;{} forget (ds).{} pruefe kundennummer:{} INT CONST kundenindex :: kundennummer - min kundennr + 1;{} IF kundenindex < 1 OR kundenindex > max kunden{} THEN errorstop ("Unzulässige Kundennummer!"){} FI.{} bereite datei vor:{} forget ("Auskunft: Alle Filialen", quiet);{} f := sequential file (output, "Auskunft: Alle Filialen");{} + line (f).{} schreibe eigene daten in auskunftsdatei:{} IF kunde [kundenindex].nachname = ""{} THEN write (f," Ein Kunde mit Nr. " + text (kundennummer){} + " ist in " + invers ("Filiale " + filialnummer){} + " nicht bekannt.");{} line (f);{} write(f,{} " ============================================================");{} line (f,3){} ELSE write (f, " Einkaufsliste " + anrede hier +{} (kunde [kundenindex].vorname SUB 1) + ". " +{} + kunde [kundenindex].nachname +{} " in " + invers ("Filiale " + filialnummer) + ":");{} fuelle (f, artikel, einkaufsdatei [kundenindex]){} FI.{} anrede hier:{} IF kunde [kundenindex].geschlecht = "m"{} THEN "des Kunden "{} ELIF kunde [kundenindex].geschlecht = "w"{} THEN "der Kundin "{} ELSE "von "{} FI.{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code);{} + BOUND FILIALDATEN VAR aktuelle daten :: ds;{} KUNDENDATEN CONST aktueller kunde := aktuelle daten.kunden [kundenindex].{} schreibe daten in auskunftsdatei:{} IF aktueller kunde.nachname = ""{} THEN write (f," Ein Kunde mit Nr. " + text (kundennummer){} + " ist in " + invers ("Filiale " + text (filialnr)){} + " nicht bekannt.");{} line (f);{} write(f,{} " ============================================================");{} + line (f,3){} ELSE write (f, " Einkaufsliste " + anrede +{} (aktueller kunde.vorname SUB 1) + ". " +{} aktueller kunde.nachname +{} " in " + invers ("Filiale " + text (filialnr)) + ":");{} fuelle (f, aktuelle daten.waren,{} aktuelle daten.einkaeufe [kundenindex]){} FI.{} anrede:{} IF aktueller kunde.geschlecht = "m"{} THEN "des Kunden "{} ELIF aktueller kunde.geschlecht = "w"{} + THEN "der Kundin "{} ELSE "von "{} FI.{}END PROC kundeneinkaufslisten aller filialen;{}PROC fuelle (FILE VAR f, WARENDATEI CONST warendatei,{} ROW max artikel INT CONST einkaufszahlen):{} INT VAR artikelnummer;{} REAL VAR gesamtpreis, summe :: 0.0;{} bereite datei vor;{} schreibe daten in datei.{}bereite datei vor:{} line (f);{} write(f," ============================================================");{} line (f,2);{} write(f," | Art.Nr.| Artikelname | Anzahl | Preis | Gesamt |");{} + line (f);{} write(f," +--------+-------------------+--------+---------+----------+");{} line (f).{}schreibe daten in datei:{} FOR artikelnummer FROM 1 UPTO max artikel REP{} IF einkaufszahlen [artikelnummer] > 0{} THEN schreibe in datei; line (f){} FI{} PER;{} write(f," +--------+-------------------+--------+---------+----------+");{} line (f);{} write(f," Summe: " +{} text (summe,8,2));{} + line (f, 3).{}schreibe in datei:{} gesamtpreis := real (einkaufszahlen [artikelnummer]) *{} warendatei [artikelnummer].preis;{} summe INCR gesamtpreis;{} write (f," |" + text(artikelnummer,5) + " | "{} + text(warendatei [artikelnummer].artikelname,17) + " | "{} + text(einkaufszahlen [artikelnummer],4) + " |"{} + text(warendatei [artikelnummer].preis,7,2) + " |"{} + text(gesamtpreis,8,2) + " |").{} +END PROC fuelle;{}PROC lageruebersicht von zentrale (FILE VAR f):{} INT VAR filialnr;{} beginne mit eigener filiale;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} IF filialnr <> int (filialnummer) CAND{} exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} schreibe daten in zentralliste{} FI{} PER;{} werte zentralliste aus.{} beginne mit eigener filiale:{} + WARENDATEI VAR hilfsdatei;{} CONCR (hilfsdatei) := CONCR (artikel).{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code).{} schreibe daten in zentralliste:{} BOUND FILIALDATEN VAR aktuelle daten :: ds;{} INT VAR i;{} FOR i FROM 1 UPTO max artikel REP{} IF hilfsdatei [i].artikelname = ""{} THEN hilfsdatei [i] := aktuelle daten.waren [i]{} ELSE hilfsdatei [i].mindestbestand INCR aktuell.mindestbestand;{} + hilfsdatei [i].bestand INCR aktuell.bestand{} FI{} PER.{} aktuell: aktuelle daten.waren [i].{} werte zentralliste aus:{} forget (ds);{} forget ("Auskunft: Zentrale", quiet);{} f := sequential file (output, "Auskunft: Zentrale");{} line (f);{} write (f, " Zentrale Lagerübersicht:");{} fuelle (f, hilfsdatei).{}END PROC lageruebersicht von zentrale;{}PROC lageruebersicht von filiale (FILE VAR f):{} forget ("Auskunft: Filiale " + filialnummer, quiet);{} + f := sequential file (output, "Auskunft: Filiale " + filialnummer);{} schreibe dateikopf;{} fuelle (f, artikel).{} schreibe dateikopf:{} line (f);{} write (f, " Lagerübersicht:").{}END PROC lageruebersicht von filiale;{}PROC lageruebersichten aller filialen (FILE VAR f):{} INT VAR filialnr;{} bereite datei vor;{} FOR filialnr FROM 1 UPTO max filialen REP{} TEXT CONST aktuelle verwaltung ::{} hauptstelle + ".Filialverwaltung " + text (filialnr);{} IF filialnr = int (filialnummer){} + THEN schreibe eigene daten in auskunftsdatei{} ELIF exists task (aktuelle verwaltung){} THEN hole daten dieser filiale;{} schreibe daten in auskunftsdatei{} FI{} PER;{} forget (ds).{} bereite datei vor:{} forget ("Auskunft: Alle Filialen", quiet);{} f := sequential file (output, "Auskunft: Alle Filialen").{} schreibe eigene daten in auskunftsdatei:{} line (f);{} write (f, " Lagerübersicht für " +{} invers ("Filiale " + filialnummer) + ":");{} + fuelle (f, artikel).{} hole daten dieser filiale:{} init ds;{} call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code);{} BOUND FILIALDATEN VAR aktuelle daten :: ds.{} schreibe daten in auskunftsdatei:{} line (f);{} write (f, " Lagerübersicht für " +{} invers ("Filiale " + text (filialnr)) + ":");{} fuelle (f, aktuelle daten.waren).{}END PROC lageruebersichten aller filialen;{}PROC fuelle (FILE VAR f, WARENDATEI CONST warendatei):{} INT VAR artikelnummer;{} + bereite datei vor;{} schreibe daten in datei.{}bereite datei vor:{} line (f);{} write(f," ============================================================");{} line (f,2);{} write(f," | Art.Nr.| Artikelname | Preis | Min.Best.| Bestand |");{} line (f);{} write(f," +--------+-------------------+--------+----------+---------+");{} line (f).{}schreibe daten in datei:{} FOR artikelnummer FROM 1 UPTO max artikel REP{} IF warendatei[artikelnummer].artikelname <> ""{} THEN schreibe in datei; line (f){} + FI{} PER;{} write(f," +--------+-------------------+--------+----------+---------+");{} line (f, 3).{}schreibe in datei:{} write (f, " |" + text(artikelnummer,5) + " | "{} + text(warendatei[artikelnummer].artikelname,17) + " |"{} + text(warendatei[artikelnummer].preis,7,2) + " | "{} + text(warendatei[artikelnummer].mindestbestand,6)+" | "{} + text(warendatei[artikelnummer].bestand,6) + " |").{}END PROC fuelle;{} +PROC initialisiere dateien:{} INT VAR kundennummer, artikelnummer;{} FOR kundennummer FROM 1 UPTO max kunden REP{} kunde [kundennummer].nachname := "";{} kunde [kundennummer].vorname := "";{} kunde [kundennummer].geschlecht := ""{} PER;{} FOR artikelnummer FROM 1 UPTO max artikel REP{} verkaufszahl [artikelnummer] := 0;{} artikel [artikelnummer].mindestbestand := 0;{} artikel [artikelnummer].bestand := 0;{} artikel [artikelnummer].artikelname := "";{} + artikel [artikelnummer].preis := 0.0;{} FOR kundennummer FROM 1 UPTO max kunden REP{} einkaufsdatei[kundennummer][artikelnummer] := 0{} PER;{} PER{}END PROC initialisiere dateien;{}initialisiere dateien{}END PACKET ls warenhaus 2{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 3 b/app/gs.warenhaus/1.01/src/ls-Warenhaus 3 new file mode 100644 index 0000000..3473e0f --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 3 @@ -0,0 +1,82 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 3 ** + ** ** + ** Version 1.01 ** + ** ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 3 DEFINES + artikelnummer lesen,{} artikeldaten eingeben,{} kundennummer lesen,{} kundendaten eingeben,{} neues blatt,{} rechnungskopf,{} artikel kaufen,{} abrechnung,{} nachbestellen,{} auskunft,{} stoptaste gedrueckt,{} stoptaste gedrückt,{} dezimalwert lesen,{} bitmuster lesen,{} bildschirm neu,{}(* ------------------------------ *){} tastatureingabe,{} eingabesicherheit,{} eingabe mit codekartenleser,{} + cursor w3 1 1:{}LET esc = ""27"",{} stopzeichen = "q",{} abbruchzeichen = "h";{}WINDOW VAR w1 :: window (43, 3, 36, 16),{} w2 :: window (43, 20, 36, 3),{} w3k :: window ( 2, 4, 40, 3),{} w3 :: window ( 2, 7, 40, 16),{} w4 :: window ( 8, 4, 66, 18);{}BOOL VAR ende gewuenscht := FALSE,{} artikelnummer ist eingelesen := FALSE,{} kundennummer ist eingelesen := FALSE,{} codekartenleser aktiviert := FALSE,{} + auf neuem blatt := TRUE;{}INT VAR artikelnummer :: 0,{} mindestbestand :: 0,{} bestand :: 0,{} kundennummer :: 0,{} sicherheit :: 5;{}TEXT VAR artikelname :: "",{} nachname :: "",{} vorname :: "",{} geschlecht :: "",{} ueberschrift :: " RECHNUNG",{} hilfstext, exit char;{}REAL VAR preis :: 0.0,{} summe :: 0.0;{}PROC eingabesicherheit (INT CONST wert):{} + sicherheit := abs (wert){}END PROC eingabesicherheit;{}PROC cursor w3 1 1:{} cursor (w1, 1, 1);{} cursor (w2, 1, 1);{} cursor (w3, 1, 1);{} cursor (w3k, 1, 1);{} forget ("WARENHAUS:Rechnung", quiet);{} setze variable in anfangszustand{}END PROC cursor w3 1 1;{}PROC setze variable in anfangszustand:{} ende gewuenscht := FALSE;{} artikelnummer ist eingelesen := FALSE;{} kundennummer ist eingelesen := FALSE;{} artikelnummer := 0;{} mindestbestand := 0;{} bestand := 0;{} + kundennummer := 0;{} artikelname := "";{} nachname := "";{} vorname := "";{} geschlecht := "";{} ueberschrift := " RECHNUNG";{} preis := 0.0;{} summe := 0.0{}END PROC setze variable in anfangszustand;{}PROC bildschirm neu:{} cursor off;{} pruefe abbruch;{} cursor (w1, 1, 1);{} cursor (w2, 1, 1);{} cursor (w3, 1, 1);{} cursor (w3k,1, 1);{} auf neuem blatt := TRUE;{} page;{} out ("WARENHAUS: Info Eingabeart Kommandos "15"Programme "14" " +{} + "Filialdaten Archiv"); line;{} out (ecke oben links + (40 * waagerecht) + balken oben{} + (36 * waagerecht) + ecke oben rechts);{} INT VAR zeile;{} FOR zeile FROM 3 UPTO 22 REP{} cursor ( 1, zeile); out (senkrecht);{} cursor (42, zeile); out (senkrecht);{} cursor (79, zeile); out (senkrecht){} PER;{} cursor (1, 23);{} out (ecke unten links + (40 * waagerecht) + balken unten{} + (36 * waagerecht) + ecke unten rechts);{} + cursor (42, 19);{} out (balken links + (36 * waagerecht) + balken rechts);{} cursor (2, 24);{} out ("Programmabbruch: <ESC><" + abbruchzeichen + ">");{} cursor on{}END PROC bildschirm neu;{}PROC pruefe abbruch:{} IF pressed key = esc{} THEN pruefe weiter{} FI.{} pruefe weiter:{} TEXT VAR naechstes zeichen :: pressed key (20);{} IF naechstes zeichen = stopzeichen{} THEN ende gewuenscht := TRUE{} ELIF naechstes zeichen = abbruch zeichen{} + THEN setze variable in anfangszustand;{} cursor off;{} errorstop (1951, "Programm - Abbruch durch <ESC><"{} + abbruchzeichen + ">"){} FI{}END PROC pruefe abbruch;{}PROC regeneriere w2:{} cursor (42, 19);{} out (ecke oben links + (36 * waagerecht));{} INT VAR zeile;{} FOR zeile FROM 20 UPTO 22 REP{} cursor (42, zeile); out (senkrecht);{} PER;{} cursor (42, 23); out (balken unten);{} page (w2){} +END PROC regeneriere w2;{}PROC fenster putzen:{} page (w1);{} page (w2){}END PROC fenster putzen;{}PROC lies nummer ein (INT VAR nummer):{} line (w2, 2);{} out (w2, " Stoptaste: <ESC><" + stopzeichen + ">");{} hilfstext := text (nummer);{} REP cursor (w1, 19, 2);{} editget (w1, hilfstext, 4, 4, "", stopzeichen + abbruchzeichen,{} exit char);{} pruefe exit char;{} change all (hilfstext, " ", ""){} UNTIL hilfstext >= "0" AND hilfstext <= "9999" PER;{} + nummer := int (hilfstext).{} pruefe exit char:{} IF exit char = esc + stopzeichen{} THEN ende gewuenscht := TRUE;{} cursor off; fenster putzen; cursor on;{} nummer := 0;{} LEAVE lies nummer ein{} ELIF exit char = esc + abbruchzeichen{} THEN setze variable in anfangszustand;{} errorstop (1951, "Progamm - Abbruch durch <ESC><"{} + abbruchzeichen + ">"){} ELSE ende gewuenscht := FALSE{} FI.{} +END PROC lies nummer ein;{}PROC lies artikelnummer ein:{} page (w2);{} cursor (w1, 2, 2);{} out (w1, "Artikelnummer : ");{} IF codekartenleser aktiviert{} THEN artikelnummer := gesicherter wert von interface{} (min artikelnummer , max artikelnummer, "Warenkarte"){} ELSE artikelnummer von tastatur lesen{} FI;{} IF ende gewuenscht{} THEN artikelnummer ist eingelesen := FALSE{} ELSE artikelnummer ist eingelesen := TRUE{} + FI.{} artikelnummer von tastatur lesen:{} cursor on;{} REP out (w2, " Artikelnummer eingeben");{} lies nummer ein (artikelnummer);{} UNTIL ende gewuenscht COR artikelnummer zulaessig PER.{} artikelnummer zulaessig:{} IF (artikelnummer < min artikelnummer OR{} artikelnummer > max artikelnummer){} THEN page (w2); out (""7"");{} out (w2, " Unzulässige Artikelnummer!");{} line (w2, 2);{} out (w2, " Bitte irgendeine Taste tippen!");{} + pause; page (w2);{} FALSE{} ELSE TRUE{} FI.{}END PROC lies artikelnummer ein;{}PROC artikelnummer lesen:{} pruefe abbruch;{} lies artikelnummer ein;{} IF artikelnummer ist eingelesen{} THEN hole artikeldaten (artikelnummer, artikelname, preis,{} mindestbestand, bestand){} FI{}END PROC artikelnummer lesen;{}PROC kundennummer lesen:{} pruefe abbruch;{} lies kundennummer ein;{} IF kundennummer ist eingelesen{} THEN hole kundendaten (kundennummer, nachname, vorname, geschlecht){} + FI{}END PROC kundennummer lesen;{}PROC lies kundennummer ein:{} page (w2);{} cursor (w1, 2, 2);{} out (w1, "Kundennummer : ");{} IF codekartenleser aktiviert{} THEN kundennummer := gesicherter wert von interface{} (min kundennummer , max kundennummer, "Kundenkarte"){} ELSE kundennummer von tastatur lesen{} FI;{} IF ende gewuenscht{} THEN kundennummer ist eingelesen := FALSE{} ELSE kundennummer ist eingelesen := TRUE{} FI.{} kundennummer von tastatur lesen:{} + cursor on;{} REP out (w2, " Kundennummer eingeben");{} lies nummer ein (kundennummer){} UNTIL ende gewuenscht COR kundennummer zulaessig PER.{} kundennummer zulaessig:{} IF (kundennummer < min kundennummer OR{} kundennummer > max kundennummer){} THEN page (w2); out (""7"");{} out (w2, " Unzulässige Kundennummer!");{} line (w2, 2);{} out (w2, " Bitte irgendeine Taste tippen!");{} pause; page (w2);{} FALSE{} + ELSE TRUE{} FI.{}END PROC lies kundennummer ein;{}PROC zeige artikeldaten:{} cursor (w1, 2, 6);{} out (w1, "Artikelname : " + text (artikelname, 16));{} cursor (w1, 2, 8);{} out (w1, "Preis : " + text preis + " ");{} cursor (w1, 2, 10);{} out (w1, "Mindestbestand : " + text (mindestbestand) + " ");{} cursor (w1, 2, 12);{} out (w1, "Bestand : " + text (bestand) + " ").{} text preis:{} TEXT VAR hilfe :: text (preis, min (8, pos(text(preis),".")+2), 2);{} + change (hilfe, " ", "0");{} hilfe.{}END PROC zeige artikeldaten;{}PROC zeige kundendaten:{} cursor (w1, 2, 6);{} out (w1, "Nachname : " + text (nachname, 16));{} cursor (w1, 2, 8);{} out (w1, "Vorname : " + text (vorname , 16));{} cursor (w1, 2, 10);{} out (w1, "Geschlecht : " + geschlecht + " ");{}END PROC zeige kundendaten;{}PROC artikeldaten speichern:{} pruefe abbruch;{} page (w2); line (w2);{} out (w2, " Artikeldaten werden gespeichert") ;{} + speichere artikeldaten (artikelnummer, artikelname, preis,{} mindestbestand, bestand);{} pause (10);{} IF codekartenleser aktiviert{} THEN lasse karte entfernen (FALSE){} FI{}END PROC artikeldaten speichern;{}PROC kundendaten speichern:{} pruefe abbruch;{} page (w2); line (w2);{} out (w2, " Kundendaten werden gespeichert") ;{} speichere kundendaten (kundennummer, nachname,vorname, geschlecht);{} pause (10);{} IF codekartenleser aktiviert{} THEN lasse karte entfernen (FALSE){} + FI{}END PROC kundendaten speichern;{}BOOL PROC stoptaste gedrueckt:{} pruefe abbruch;{} ende gewuenscht{}END PROC stoptaste gedrueckt;{}BOOL PROC stoptaste gedrückt:{} stoptaste gedrueckt{}END PROC stoptaste gedrückt;{}PROC neues blatt:{} pruefe abbruch;{} page (w3k);{} page (w3);{} auf neuem blatt := TRUE;{} forget ("WARENHAUS:Rechnung", quiet){}END PROC neues blatt;{}PROC nachbestellen:{} pruefe abbruch;{} FILE VAR f;{} warten in w2;{} hole bestelliste (f);{} pruefe abbruch;{} cursor (2,24);{} + out ("Weiter mit <ESC><q>; Cursor bewegen: <Pfeile>");{} cursor on;{} show (w4, f);{} cursor off;{} cursor (1, 24); out (""5"");{} WINDOW VAR w :: window(45,18,25,3);{} outframe (w);{} IF yes (w, "Bestelliste drucken", FALSE){} THEN drucke (headline (f)){} FI;{} cursor on;{} forget (headline (f), quiet){}END PROC nachbestellen;{}PROC warten in w2:{} cursor off;{} page (w2);{} line (w2);{} out (w2, " Bitte warten!");{} cursor on{}END PROC warten in w2;{}PROC codenummer von tastatur lesen (INT VAR codenummer):{} + codenummer := 0;{} out (w2, " Codenummer eingeben");{} cursor on;{} lies nummer ein (codenummer){}END PROC codenummer von tastatur lesen;{}PROC auskunft:{} pruefe abbruch;{} FILE VAR f;{} INT VAR codenummer :: 0;{} cursor (w1, 2, 2);{} out (w1, "Codenummer : ");{} page (w2);{} IF codekartenleser aktiviert{} THEN codenummer := gesicherter wert von interface (0,254, "Codekarte");{} lasse karte entfernen (FALSE){} ELSE codenummer von tastatur lesen (codenummer){} + FI;{} IF ende gewuenscht THEN LEAVE auskunft FI;{} SELECT codenummer OF CASE 66, 67, 68 : hitliste{} CASE 73, 74, 75 : kaeuferliste{} CASE 77, 78, 79 : kundenliste{} CASE 84, 85, 86 : einkaufsliste{} CASE 89, 90, 91 : lageruebersicht{} OTHERWISE teste auf artikel oder kundennummer{} END SELECT;{} IF codekartenleser aktiviert CAND wert von interface <> 255{} THEN karte entfernen{} FI.{} karte entfernen:{} + SELECT codenummer OF{} CASE 66, 67, 68, 73, 74, 75, 77, 78, 79, 84, 85, 86, 89, 90,{} 91: lasse karte entfernen (TRUE){} OTHERWISE lasse karte entfernen (FALSE){} END SELECT.{} teste auf artikel oder kundennummer:{} IF codenummer >= min artikelnummer AND codenummer <= max artikelnummer{} THEN gib auskunft ueber artikeldaten{} ELIF codenummer >= min kundennummer AND codenummer <= max kundennummer{} THEN gib auskunft ueber kundendaten{} ELSE unzulaessige codenummer{} + FI.{} unzulaessige codenummer:{} out (10 * ""7"");{} page (w2);{} out (w2, " Unzulässige Codenummer !!!");{} line (w2, 2);{} out (w2, " Bitte irgendeine Taste tippen!");{} pause;{} page (w2).{} gib auskunft ueber artikeldaten:{} hole artikeldaten (codenummer, artikelname, preis,{} mindestbestand, bestand);{} zeige artikeldaten;{} artikelnummer ist eingelesen := FALSE;{} stop w2;{} page (w1).{} gib auskunft ueber kundendaten:{} hole kundendaten (codenummer, nachname, vorname, geschlecht);{} + zeige kundendaten;{} kundennummer ist eingelesen := FALSE;{} stop w2;{} page (w1).{} hitliste:{} warten in w2;{} hole auskunft ein (codenummer, 0, f);{} zeige f.{} kundenliste:{} warten in w2;{} hole auskunft ein (codenummer, 0, f);{} zeige f.{} zeige f:{} pruefe abbruch;{} cursor (2, 24);{} out ("Weiter mit <ESC><q>; Cursor bewegen: <Pfeile>");{} show (w4, f);{} cursor (1, 24); out (""5"");{} evtl drucken.{} lageruebersicht:{} warten in w2;{} + hole auskunft ein (codenummer, 0, f);{} zeige f.{} kaeuferliste:{} lies artikelnummer ein;{} IF artikelnummer ist eingelesen{} THEN artikelnummer ist eingelesen := FALSE;{} warten in w2;{} hole auskunft ein (codenummer, artikelnummer, f);{} zeige f{} FI.{} einkaufsliste:{} lies kundennummer ein;{} IF kundennummer ist eingelesen{} THEN kundennummer ist eingelesen := FALSE;{} warten in w2;{} hole auskunft ein (codenummer, kundennummer, f);{} + zeige f{} FI.{} evtl drucken:{} WINDOW VAR w :: window(46,18,22,3);{} cursor off;{} outframe (w);{} IF yes (w, "Auskunft drucken", FALSE){} THEN drucke (headline (f)){} FI;{} cursor on;{} forget (headline (f), quiet).{}END PROC auskunft;{}PROC rechnungskopf:{} pruefe abbruch;{} IF kundennummer ist eingelesen AND nachname <> ""{} THEN ueberschrift := " RECHNUNG für " + anrede + (vorname SUB 1) +{} ". " + text (nachname, 10){} ELSE ueberschrift := " RECHNUNG"{} + FI;{} summe := 0.0;{} schreibe ueberschrift auf bildschirm;{} schreibe in rechnungsdatei;{} IF codekartenleser aktiviert{} THEN lasse karte entfernen (FALSE){} FI.{} schreibe in rechnungsdatei:{} sysout ("WARENHAUS:Rechnung");{} line;{} put (ueberschrift);{} line;{} put (" ==================================");{} line (2);{} sysout ("").{} anrede:{} IF geschlecht = "m"{} THEN "Herrn "{} ELIF geschlecht = "w"{} THEN "Frau "{} ELSE ""{} + FI.{}END PROC rechnungskopf;{}PROC schreibe ueberschrift auf bildschirm:{} INT VAR spalte, zeile;{} get cursor (w3, spalte, zeile);{} IF zeile = 1{} THEN auf neuem blatt := TRUE;{} schreibe in w3k{} ELSE auf neuem blatt := FALSE;{} schreibe in w3{} FI.{} schreibe in w3:{} IF remaining lines (w3) < 7{} THEN page (w3);{} page (w3k);{} auf neuem blatt := TRUE;{} schreibe in w3k{} ELSE line (w3);{} out (w3, ueberschrift);{} + line (w3);{} out (w3, " ==================================");{} line (w3, 2){} FI.{} schreibe in w3k:{} out (w3k, ueberschrift);{} line (w3k);{} out (w3k, " ==================================").{}END PROC schreibe ueberschrift auf bildschirm;{}PROC artikel kaufen:{} pruefe abbruch;{} IF artikelnummer ist eingelesen{} THEN kauf registrieren{} ELSE setze variable in anfangszustand;{} errorstop ("Es ist keine Artikelnummer eingelesen worden!"){} + FI;{} IF codekartenleser aktiviert{} THEN lasse karte entfernen (FALSE){} FI.{} kauf registrieren:{} artikelnummer ist eingelesen := FALSE;{} IF bestand > 0{} THEN artikel auf rechnung setzen;{} registrieren{} ELSE page (w2); out (""7"");{} IF artikelname = ""{} THEN out (w2, " Artikel hier nicht erhältlich!"){} ELSE out (w2, " Der Artikel ist ausverkauft!"){} FI;{} line (w2, 2);{} out (w2, " Weiter durch Tippen einer Taste");{} + pause{} FI.{} registrieren:{} IF kundennummer ist eingelesen{} THEN registriere verkauf (kundennummer, artikelnummer){} ELSE registriere verkauf (min kundennummer - 1, artikelnummer){} FI.{} artikel auf rechnung setzen:{} summe INCR preis;{} IF remaining lines (w3) < 3{} THEN beginne wieder oben{} FI;{} out (w3, " " + text (artikelname, 15) + text (preis, 12, 2));{} line (w3);{} sysout ("WARENHAUS:Rechnung");{} put (" " + text (artikelname, 15) + text preis);{} + line;{} sysout ("").{} beginne wieder oben:{} IF auf neuem blatt{} THEN page (w3){} ELSE schreibe ueberschrift auf bildschirm{} FI.{} text preis:{} TEXT VAR hilfe :: text (preis, 12, 2);{} INT VAR vor punkt :: pos (hilfe, ".") - 1;{} IF (hilfe SUB vor punkt) = " "{} THEN change (hilfe, vor punkt, vor punkt, "0"){} FI;{} hilfe.{}END PROC artikel kaufen;{}PROC abrechnung:{} pruefe abbruch;{} schreibe summe auf bildschirm;{} + schreibe summe in rechnungsdatei;{} setze variable zurueck;{} frage ob drucken;{} IF codekartenleser aktiviert{} THEN lasse karte entfernen (FALSE){} FI.{} schreibe summe auf bildschirm:{} IF remaining lines (w3) < 2{} THEN beginne wieder oben{} FI;{} put (w3, " -------------");{} line (w3);{} put (w3, " Summe " + text (summe, 12, 2));{} line (w3).{} beginne wieder oben:{} IF auf neuem blatt{} THEN page (w3){} ELSE schreibe ueberschrift auf bildschirm{} + FI.{} schreibe summe in rechnungsdatei:{} sysout ("WARENHAUS:Rechnung");{} put (" -------------");{} line;{} put (" Summe " + text (summe, 12, 2));{} line;{} sysout ("").{} setze variable zurueck:{} BOOL VAR alter wert :: ende gewuenscht;{} setze variable in anfangszustand;{} ende gewuenscht := alter wert.{} frage ob drucken:{} IF yes (w2, "Rechnung drucken", FALSE){} THEN cursor (3, 22);{} disable stop;{} print ("WARENHAUS:Rechnung");{} + IF is error THEN clear error FI;{} enable stop{} FI.{}END PROC abrechnung;{}PROC artikeldaten eingeben:{} pruefe abbruch;{} IF artikelnummer ist eingelesen{} THEN lies artikeldaten ein;{} artikeldaten speichern{} ELSE setze variable in anfangszustand;{} errorstop ("Es ist keine Artikelnummer eingelesen worden!"){} FI.{} lies artikeldaten ein:{} zeige artikeldaten;{} IF artikelname <> ""{} THEN vielleicht schon fertig{} ELSE page (w2){} + FI;{} REP line (w2);{} put (w2, " Artikeldaten eingeben");{} eingabe{} UNTIL yes (w2, "Alles richtig", TRUE){} PER;{} artikelnummer ist eingelesen := FALSE.{} vielleicht schon fertig:{} IF yes (w2, "Alles richtig", TRUE){} THEN artikelnummer ist eingelesen := FALSE;{} IF codekartenleser aktiviert{} THEN lasse karte entfernen (FALSE){} FI;{} LEAVE artikeldaten eingeben{} FI.{} eingabe:{} name holen;{} + preis holen;{} mindestbestand holen;{} bestand holen.{} name holen:{} REP cursor (w1, 19, 6);{} editget (w1, artikelname, 80, 80, "", abbruchzeichen + stopzeichen,{} exit char);{} teste auf abbruch{} UNTIL artikelname <> "" PER.{} preis holen:{} hilfstext := text (preis, pos(text(preis),".") + 2, 2);{} change (hilfstext, " ", "0");{} REP cursor (w1, 19, 8);{} editget (w1, hilfstext, 8, 8, "", abbruch zeichen + stopzeichen,{} + exit char);{} change (hilfstext, ",", ".");{} preis := round (real (hilfstext), 2);{} teste auf abbruch{} UNTIL preis >= 0.0 PER.{} mindestbestand holen:{} hilfstext := text (mindestbestand);{} REP cursor (w1, 19, 10);{} editget (w1, hilfstext, 4, 4, "", abbruch zeichen + stopzeichen,{} exit char);{} mindestbestand := int (hilfstext);{} teste auf abbruch{} UNTIL mindestbestand >= 0 PER.{} + bestand holen:{} hilfstext := text (bestand);{} REP cursor (w1, 19, 12);{} editget (w1, hilfstext, 4, 4, "", abbruch zeichen + stopzeichen,{} exit char);{} bestand := int (hilfstext);{} teste auf abbruch{} UNTIL bestand >= 0 PER.{} teste auf abbruch:{} IF exit char = esc + stopzeichen{} THEN ende gewuenscht := TRUE{} ELIF exit char = esc + abbruchzeichen{} THEN setze variable in anfangszustand;{} errorstop (1951, "Programm - Abbruch durch <ESC><"{} + + abbruchzeichen + ">"){} FI.{}END PROC artikeldaten eingeben;{}PROC kundendaten eingeben:{} IF kundennummer ist eingelesen{} THEN lies kundendaten ein;{} kundendaten speichern{} ELSE setze variable in anfangszustand;{} errorstop ("Es ist keine Kundennummer eingelesen worden!"){} FI.{} lies kundendaten ein:{} zeige kundendaten;{} IF nachname <> ""{} THEN vielleicht schon fertig{} ELSE page (w2){} FI;{} REP line (w2);{} + put (w2, " Kundendaten eingeben");{} eingabe{} UNTIL yes (w2, "Alles richtig", TRUE) PER;{} kundennummer ist eingelesen := FALSE.{} vielleicht schon fertig:{} IF yes (w2, "Alles richtig", TRUE){} THEN kundennummer ist eingelesen := FALSE;{} IF codekartenleser aktiviert{} THEN lasse karte entfernen (FALSE){} FI;{} LEAVE kundendaten eingeben{} FI.{} eingabe:{} nachname holen;{} vorname holen;{} geschlecht holen.{} + nachname holen:{} REP cursor (w1, 19, 6);{} editget (w1, nachname, 80, 80, "", abbruch zeichen + stopzeichen,{} exit char);{} teste auf abbruch{} UNTIL nachname <> "" PER.{} vorname holen:{} REP cursor (w1, 19, 8);{} editget (w1, vorname, 80, 80, "", abbruch zeichen + stopzeichen,{} exit char);{} teste auf abbruch{} UNTIL vorname <> "" PER.{} geschlecht holen:{} REP cursor (w1, 19, 10);{} + editget (w1, geschlecht, 9, 9, "", abbruchzeichen + stopzeichen,{} exit char);{} geschlecht := geschlecht SUB 1;{} teste auf abbruch{} UNTIL geschlecht = "m" OR geschlecht = "w" PER.{} teste auf abbruch:{} IF exit char = esc + stopzeichen{} THEN ende gewuenscht := TRUE{} ELIF exit char = esc + abbruchzeichen{} THEN setze variable in anfangszustand;{} errorstop (1951, "Programm - Abbruch durch <ESC><"{} + + abbruchzeichen + ">"){} FI.{}END PROC kundendaten eingeben;{}PROC drucke (TEXT CONST name):{} TEXT VAR zeile;{} FILE VAR f :: sequential file (modify, name);{} to line (f, 1);{} insert record (f);{} write record (f, "#center#" + name);{} down (f);{} insert record (f);{} down (f);{} WHILE NOT eof (f) REP{} read record (f, zeile);{} IF pos (zeile, ""15"") > 0{} THEN change (zeile, ""15"", "#on(""r"")#");{} change (zeile, ""14"", "#off(""r"")#");{} + write record (f, zeile){} FI;{} down (f){} PER;{} cursor (3, 22);{} print (name){}END PROC drucke;{}PROC stop w2:{} cursor off;{} page (w2);{} out (w2," Zum Weitermachen bitte");line(w2);{} out (w2," irgendeine Taste tippen!");{} pause;{} page (w2);{} cursor on{}END PROC stop w2;{}BOOL PROC yes (WINDOW VAR w, TEXT CONST frage, BOOL CONST default):{} BOOL VAR antwort :: default;{} TEXT VAR taste;{} INT CONST ja pos :: (areaxsize (w) - 9) DIV 2;{} cursor off;{} cursor (42,24); out ("Ändern: <Pfeile> Bestätigen: <RETURN>");{} + page (w);{} out (w, center (w, frage + " ?"));{} cursor (w, ja pos, 3);{} IF default{} THEN out (w, ""15"Ja "14" Nein ");{} cursor (w, ja pos, 3){} ELSE out (w, " Ja "15"Nein "14"");{} cursor (w, ja pos + 5, 3){} FI;{} tastendruck auswerten;{} page (w);{} cursor (42,24); out (""5"");{} cursor on;{} antwort.{} tastendruck auswerten:{} REP inchar (taste);{} SELECT code (taste) OF CASE 2, 8 : position aendern{} CASE 13 : LEAVE tastendruck auswerten{} + CASE 74, 106 : antwort := TRUE; (*Jj*){} LEAVE tastendruck auswerten{} CASE 78, 110 : antwort := FALSE; (*Nn*){} LEAVE tastendruck auswerten{} OTHERWISE out (""7"") END SELECT{} PER.{} position aendern:{} IF antwort THEN antwort := FALSE;{} cursor (w, ja pos, 3);{} out (w, " Ja "15"Nein "14"");{} + cursor (w, ja pos + 5, 3){} ELSE antwort := TRUE;{} cursor (w, ja pos, 3);{} out (w, ""15"Ja "14" Nein ");{} cursor (w, ja pos, 3){} FI.{}END PROC yes;{}PROC tastatureingabe (BOOL CONST erwuenscht, INT VAR rueckmeldung):{} IF erwuenscht{} THEN rueckmeldung := 0;{} codekartenleser aktiviert := FALSE;{} schliesse interface{} ELSE oeffne interface (rueckmeldung);{} IF rueckmeldung >= 0{} + THEN codekartenleser aktiviert := TRUE{} ELSE codekartenleser aktiviert := FALSE{} FI{} FI{}END PROC tastatureingabe;{}BOOL PROC eingabe mit codekartenleser:{} codekartenleser aktiviert{}END PROC eingabe mit codekartenleser;{}PROC dezimalwert lesen:{} pruefe abbruch;{} IF codekartenleser aktiviert{} THEN interfacewerte zeigen{} ELSE setze variable in anfangszustand;{} errorstop ("Eingabeart ist auf Tastatur eingestellt!"){} FI.{} interfacewerte zeigen:{} + cursor off;{} fenster putzen;{} line (w1, 4); line (w2);{} out (w1, " Dezimalwert :");{} out (w2, " Lesen beenden mit <ESC><q>");{} ende gewuenscht := FALSE;{} REP pruefe abbruch;{} cursor (w1, 17, 5);{} out (w1, text (wert von interface, 3)){} UNTIL ende gewuenscht PER;{} page (w2); cursor (w1, 1, 5); out (" ");{} cursor on.{}END PROC dezimalwert lesen;{}PROC bitmuster lesen:{} pruefe abbruch;{} IF codekartenleser aktiviert{} + THEN interfacewerte zeigen{} ELSE setze variable in anfangszustand;{} errorstop ("Eingabeart ist auf Tastatur eingestellt!"){} FI.{} interfacewerte zeigen:{} cursor off;{} fenster putzen;{} line (w1, 4); line (w2);{} out (w1, " Bitmuster :");{} out (w2, " Lesen beenden mit <ESC><q>");{} ende gewuenscht := FALSE;{} REP pruefe abbruch;{} cursor (w1, 16, 5);{} out (w1, bitmuster (wert von interface)){} UNTIL ende gewuenscht PER;{} page (w2); cursor (w1, 1, 5); out (" ");{} + cursor on.{}END PROC bitmuster lesen;{}TEXT PROC bitmuster (INT CONST wert):{} INT VAR bitnr;{} TEXT VAR muster :: "";{} FOR bitnr FROM 7 DOWNTO 0 REP{} IF bit (wert, bitnr){} THEN muster CAT "I"{} ELSE muster CAT "O"{} FI{} PER;{} muster{}END PROC bitmuster;{}PROC lasse karte entfernen (BOOL CONST mit rahmen):{} IF wert von interface <> 255{} THEN cursor off;{} IF mit rahmen THEN regeneriere w2 ELSE page (w2) FI;{} line (w2);{} out (w2, " Bitte Karte entfernen");{} + REP pruefe abbruch{} UNTIL (wert von interface = 255) OR ende gewuenscht PER;{} cursor on{} FI{}END PROC lasse karte entfernen;{}INT PROC gesicherter wert von interface (INT CONST von, bis,{} TEXT CONST kartenart):{} INT VAR wert, zaehler;{} ende gewuenscht := FALSE;{} cursor off;{} REP out (w2, " Bitte " + kartenart + " einschieben");{} line (w2, 2);{} out (w2, " Stoptaste: <ESC><" + stopzeichen + ">");{} cursor (79, 24);{} + gesicherten wert einlesen;{} cursor (w1, 19, 2);{} out (w1, text (wert, 3));{} IF wert < von OR wert > bis{} THEN warnung{} FI{} UNTIL wert >= von AND wert <= bis PER;{} cursor on;{} wert.{} gesicherten wert einlesen:{} REP zaehler := 0;{} warte auf karte;{} wert := wert von interface;{} lies wert{} UNTIL wert gesichert AND wert <> 255 PER.{} warte auf karte:{} REP beachte esc q{} UNTIL wert von interface <> 255 PER.{} beachte esc q:{} + pruefe abbruch;{} IF ende gewuenscht{} THEN cursor on;{} LEAVE gesicherter wert von interface WITH 0{} FI.{} lies wert:{} REP beachte esc q;{} IF wert = wert von interface{} THEN zaehler INCR 1{} ELSE LEAVE lies wert{} FI{} UNTIL wert gesichert PER.{} wert gesichert: zaehler = sicherheit.{} warnung:{} page (w2); out (""7"");{} out (w2, " Dies ist keine " + kartenart + "!");{} line (w2, 2);{} out (w2, " Bitte Karte entfernen");{} + REP beachte esc q{} UNTIL wert von interface = 255 PER;{} page (w2).{}END PROC gesicherter wert von interface{}END PACKET ls warenhaus 3{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 4 b/app/gs.warenhaus/1.01/src/ls-Warenhaus 4 new file mode 100644 index 0000000..a19a6d6 --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 4 @@ -0,0 +1,48 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 4 ** + ** ** + ** Version 1.01 ** + ** ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 4 DEFINES + uebersetze:{}TYPE VOKABEL = STRUCT (TEXT grin, elan),{} REFINEMENT = STRUCT (TEXT name, INT aufruf);{}LET befehlsanzahl = 10,{} max refinements = 20,{} max offene strukturen = 10,{} schleife = 1,{} abfrage = 2;{}ROW befehlsanzahl VOKABEL CONST befehl :: ROW befehlsanzahl VOKABEL :{} (VOKABEL : ("Artikelnummerlesen", "artikelnummer lesen"),{} VOKABEL : ("Artikeldateneingeben", "artikeldaten eingeben"),{} VOKABEL : ("Kundennummerlesen", "kundennummer lesen"),{}{} + VOKABEL : ("Kundendateneingeben", "kundendaten eingeben"),{} VOKABEL : ("Rechnungskopf", "rechnungskopf"),{} VOKABEL : ("Artikelkaufen", "artikel kaufen"),{} VOKABEL : ("Abrechnung", "abrechnung"),{} VOKABEL : ("Auskunft", "auskunft"),{} VOKABEL : ("neuesBlatt", "neues blatt"),{} VOKABEL : ("Bildschirmneu", "bildschirm neu"));{}ROW max refinements REFINEMENT VAR refinement;{}ROW max offene strukturen INT VAR offene struktur;{}{} +INT VAR zeilennummer, erster fehler;{}OP := (VOKABEL VAR links, VOKABEL CONST rechts):{} CONCR (links) := CONCR (rechts){}END OP :=;{}PROC uebersetze (TEXT CONST dateiname):{}forget ("elanprogramm", quiet);{}FILE VAR quelle :: sequential file (input, dateiname),{} ziel :: sequential file (output, "elanprogramm");{}suche programmanfang;{}WHILE NOT (eof (quelle) OR anything noted) REP{} bearbeite zeile{}PER;{}IF NOT anything noted{} THEN abschlusspruefung{}FI;{}IF anything noted{} THEN quelle := sequential file (modify, dateiname);{}{} + to line (quelle, erster fehler);{} col (1);{} noteedit (quelle);{} errorstop (""){}FI.{}abschlusspruefung:{} IF anzahl refinements > 0{} THEN pruefe refinementliste{} ELSE pruefe programmende{} FI.{}pruefe programmende:{} IF programmende fehlt{} THEN zeilennummer INCR 1;{} fehler (16){} FI.{}pruefe refinementliste:{} zeilennummer INCR 1;{} pruefe auf offene schleife oder abfrage;{} put (ziel, "END PROC refinement " + text (letztes refinement));{}{} + FOR index FROM 1 UPTO anzahl refinements REP{} IF refinement [index].aufruf > 0{} THEN zeilennummer := refinement [index].aufruf;{} fehler (25){} ELIF refinement [index].aufruf < 0{} THEN zeilennummer := - refinement [index].aufruf;{} fehler (26){} FI{} PER.{}suche programmanfang:{} TEXT VAR restzeile, zeile :: "";{} BOOL VAR programmende fehlt := FALSE,{} refinement muss folgen := FALSE;{} INT VAR anzahl refinements := 0,{} letztes refinement := 0,{}{} + letzte geoeffnete := 0,{} index;{} zeilennummer := 0;{} erster fehler := 0;{} WHILE NOT eof (quelle) AND zeile = "" REP{} getline (quelle, zeile);{} zeile := compress (zeile);{} zeilennummer INCR 1;{} cout (zeilennummer);{} IF zeile = "" THEN line (ziel) FI;{} PER;{} put (ziel, "bildschirm neu;");{} IF zeile = "" THEN LEAVE uebersetze{} ELIF pos (zeile, "PROGRAMM") = 1{} THEN programmende fehlt := TRUE{} ELSE fehler (1){} FI.{}bearbeite zeile:{}{} + zeilennummer INCR 1;{} cout (zeilennummer);{} getline (quelle, zeile);{} zeile := compress (zeile);{} change all (zeile, " ", "");{} IF zeile = ""{} THEN line (ziel){} ELSE analysiere und uebersetze{} FI.{}analysiere und uebersetze:{} IF refinement muss folgen{} THEN erstes refinement{} ELSE pruefe zunaechst auf schluesselworte;{} durchsuche befehlsliste{} FI.{}erstes refinement:{} IF pos (zeile, ":") = 0{} THEN fehler (19){} ELIF pos (zeile, ":") < length (zeile){}{} + THEN fehler (20){} ELIF (pos (zeile, "PROGRAMM") = 1) OR{} (pos (zeile, "ENDE") = 1) OR{} (pos (zeile, "WIEDERHOLE") = 1) OR{} (pos (zeile, "BIS") = 1) OR{} (pos (zeile, "WENN") = 1){} THEN fehler (21){} ELIF (zeile = "Stoptastegedrückt:") OR{} (zeile = "nichtStoptastegedrückt:") OR{} (zeile = "Stoptastegedrueckt:") OR{} (zeile = "nichtStoptastegedrueckt:"){} THEN fehler (22){} ELSE refinement muss folgen := FALSE;{}{} + line (ziel);{} trage befehlsdefinition ein{} FI.{}trage befehlsdefinition ein:{} change (zeile, ":", "");{} FOR index FROM 1 UPTO anzahl refinements REP{} IF refinement [index].name = zeile{} THEN pruefe aufruf; LEAVE trage befehlsdefinition ein{} FI{} PER;{} anzahl refinements INCR 1;{} IF anzahl refinements > max refinements{} THEN fehler (24){} ELSE refinement [anzahl refinements].name := zeile;{} refinement [anzahl refinements].aufruf := - zeilennummer;{}{} + letztes refinement := anzahl refinements;{} line (ziel);{} put (ziel, "PROC refinement " + text (anzahl refinements) + ":"){} FI.{}pruefe aufruf:{} IF refinement [index].aufruf > 0{} THEN refinement [index].aufruf := 0;{} line (ziel);{} put (ziel, "PROC refinement " + text (index) + ":");{} letztes refinement := index{} ELSE fehler (23){} FI.{}pruefe zunaechst auf schluesselworte:{} IF pos (zeile, "WIEDERHOLE") = 1{} THEN oeffne schleife; LEAVE analysiere und uebersetze{}{} + ELIF pos (zeile, "WENN") = 1{} THEN oeffne if; LEAVE analysiere und uebersetze{} ELIF pos (zeile, "BIS") = 1{} THEN schliesse mit until; LEAVE analysiere und uebersetze{} ELIF pos (zeile, "ENDE") = 1{} THEN schliesse; LEAVE analysiere und uebersetze{} ELIF pos (zeile, "PROGRAMM") = 1{} THEN fehler (18); LEAVE analysiere und uebersetze{} FI.{}oeffne schleife:{} IF letzte geoeffnete = max offene strukturen{} THEN fehler (2){} ELSE letzte geoeffnete INCR 1;{} offene struktur [letzte geoeffnete] := schleife;{}{} + analysiere schleifenart{} FI.{}analysiere schleifenart:{} IF zeile = "WIEDERHOLE"{} THEN line (ziel); put (ziel, "REPEAT"){} ELSE es muss eine zaehlschleife sein{} FI.{}es muss eine zaehlschleife sein:{} restzeile := subtext (zeile, 11);{} INT VAR malpos := pos (restzeile, "MAL");{} IF malpos > 0{} THEN zaehlschleife{} ELSE fehler (3){} FI.{}zaehlschleife:{} IF length (restzeile) > malpos + 2{} THEN fehler (4){} ELSE bestimme anzahl der wiederholungen{} FI.{}{} +bestimme anzahl der wiederholungen:{} INT VAR wdh := int (subtext (restzeile, 1, malpos - 1));{} IF last conversion ok{} THEN line (ziel);{} put (ziel, "INT VAR index" + text (zeilennummer) +{} "; FOR index" + text (zeilennummer) +{} " FROM 1 UPTO " + text (wdh) + " REPEAT"){} ELSE fehler (5){} FI.{}oeffne if:{} IF letzte geoeffnete = max offene strukturen{} THEN fehler (6){} ELSE letzte geoeffnete INCR 1;{} offene struktur [letzte geoeffnete] := abfrage;{}{} + uebersetze abfrage{} FI.{}uebersetze abfrage:{} restzeile := subtext (zeile, 5);{} IF (restzeile = "Stoptastegedrückt") OR{} (restzeile = "Stoptastegedrueckt"){} THEN line (ziel); put (ziel, "IF stoptaste gedrueckt THEN"){} ELIF (restzeile = "nichtStoptastegedrückt") OR{} (restzeile = "nichtStoptastegedrueckt"){} THEN line (ziel); put (ziel, "IF NOT stoptaste gedrueckt THEN"){} ELIF restzeile = ""{} THEN fehler (7){} ELSE fehler (8){} FI.{}schliesse mit until:{}{} + teste ob als letztes schleife offen;{} letzte geoeffnete DECR 1;{} restzeile := subtext (zeile, 4);{} IF (restzeile = "Stoptastegedrückt") OR{} (restzeile = "Stoptastegedrueckt"){} THEN line (ziel);{} put (ziel, "UNTIL stoptaste gedrueckt END REPEAT;");{} ELIF (restzeile = "nichtStoptastegedrückt") OR{} (restzeile = "nichtStoptastegedrueckt"){} THEN line (ziel);{} put (ziel, "UNTIL NOT stoptaste gedrueckt END REPEAT;");{} ELIF restzeile = ""{}{} + THEN fehler (9){} ELSE fehler (8){} FI.{}schliesse:{} restzeile := subtext (zeile, 5);{} IF restzeile = "WIEDERHOLE"{} THEN schliesse schleife{} ELIF restzeile = "WENN"{} THEN schliesse if{} ELIF restzeile = "PROGRAMM"{} THEN programmende{} ELSE fehler (10){} FI.{}schliesse schleife:{} teste ob als letztes schleife offen;{} letzte geoeffnete DECR 1;{} line (ziel); put (ziel, "END REPEAT;").{}teste ob als letztes schleife offen:{} IF letzte geoeffnete = 0{} THEN fehler (11);{}{} + LEAVE bearbeite zeile{} ELIF offene struktur [letzte geoeffnete] = abfrage{} THEN fehler (12){} FI.{}schliesse if:{} teste ob als letztes abfrage offen;{} line (ziel); put (ziel, "END IF;");{} letzte geoeffnete DECR 1.{}teste ob als letztes abfrage offen:{} IF letzte geoeffnete = 0{} THEN fehler (13);{} LEAVE bearbeite zeile{} ELIF offene struktur [letzte geoeffnete] = schleife{} THEN fehler (14){} FI.{}programmende:{} IF programmende fehlt{} THEN programmende fehlt := FALSE;{}{} + refinement muss folgen := TRUE{} ELSE fehler (17);{} LEAVE programmende{} FI;{} pruefe auf offene schleife oder abfrage.{}pruefe auf offene schleife oder abfrage:{} IF letzte geoeffnete = 0{} THEN alles okay{} ELIF offene struktur [letzte geoeffnete] = schleife{} THEN fehler (14){} ELSE fehler (12){} FI.{} alles okay: .{}durchsuche befehlsliste:{} IF pos (zeile, ":") > 0{} THEN auf refinementdefinition pruefen{} ELSE befehl suchen{} FI.{}befehl suchen:{}{} + BOOL VAR gefunden := FALSE;{} INT VAR i;{} verhindere bedingung;{} FOR i FROM 1 UPTO befehlsanzahl REP{} IF befehl [i].grin = zeile{} THEN gefunden := TRUE;{} line (ziel);{} put (ziel, befehl [i].elan + ";"){} FI{} UNTIL gefunden PER;{} IF NOT gefunden{} THEN trage in refinementliste ein{} FI.{}auf refinementdefinition pruefen:{} IF pos (zeile, ":") < length (zeile){} THEN fehler (20){} ELIF programmende fehlt{} THEN fehler (16){} ELIF (zeile = "Stoptastegedrückt:") OR{}{} + (zeile = "nichtStoptastegedrückt:") OR{} (zeile = "Stoptastegedrueckt:") OR{} (zeile = "nichtStoptastegedrueckt:"){} THEN fehler (22){} ELSE pruefe auf offene schleife oder abfrage;{} put (ziel, "END PROC refinement " + text (letztes refinement){} + ";");{} trage befehlsdefinition ein{} FI.{}trage in refinementliste ein:{} FOR index FROM 1 UPTO anzahl refinements REP{} IF refinement [index].name = zeile{}{} + THEN trage evtl aufruf ein;{} LEAVE trage in refinementliste ein{} FI{} PER;{} anzahl refinements INCR 1;{} IF anzahl refinements > max refinements{} THEN fehler (24){} ELSE refinement [anzahl refinements].name := zeile;{} refinement [anzahl refinements].aufruf := zeilennummer;{} line (ziel);{} put (ziel, "refinement " + text (anzahl refinements) + ";"){} FI.{}trage evtl aufruf ein:{} line (ziel);{} put (ziel, "refinement " + text (index) + ";");{}{} + IF refinement [index].aufruf < 0{} THEN refinement [index].aufruf := 0{} FI.{}verhindere bedingung:{} IF (zeile = "Stoptastegedrückt") OR (zeile = "nichtStoptastegedrückt") OR{} (zeile = "Stoptastegedrueckt") OR (zeile = "nichtStoptastegedrueckt"){} THEN fehler (15);{} LEAVE bearbeite zeile{} FI.{}END PROC uebersetze;{}PROC fehler (INT CONST fehlernr):{} noteline;{} note ("FEHLER in Zeile " + text (zeilennummer) + ": ");{} noteline;{} note (" " + anwendungstext (fehlernr + 20));{}{} + noteline;{} IF erster fehler = 0{} THEN erster fehler := zeilennummer{} FI{}END PROC fehler{}END PACKET ls warenhaus 4{}{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus 5 b/app/gs.warenhaus/1.01/src/ls-Warenhaus 5 new file mode 100644 index 0000000..6b05bad --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus 5 @@ -0,0 +1,103 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus 5 ** + ** ** + ** Version 1.01 ** + ** ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +PACKET ls warenhaus 5 DEFINES + warenhaus,{} grin,{} direktbefehl 1,{} direktbefehl 2,{} direktbefehl 3,{} direktbefehl 4,{} direktbefehl 5,{} direktbefehl 6,{} direktbefehl 7,{} warenhausbefehle zeigen,{} eingabe grundeinstellung,{} tastatur einstellen,{} kartenleser einstellen,{} evtl d und b sperren,{} loesche zwischenraum,{} eingabeart anzeigen,{} filialdaten zusammenstellen,{} filialdaten eintragen,{} filialdaten verzeichnis,{} + filialdaten umbenennen,{} filialdaten loeschen,{} warenhausprogramme verzeichnis,{} warenhausprogramm neu erstellen,{} warenhausprogramm ansehen,{} warenhausprogramm kopieren,{} warenhausprogramm umbenennen,{} warenhausprogramme loeschen,{} warenhausprogramme drucken,{} warenhausprogramm starten,{} warenhausprogramm wiederholen:{}LET menukarte = "ls-MENUKARTE:Warenhaus",{} praefix = "Filialdaten:",{} filialdatentyp = 1951,{} + niltext = "",{} maxlaenge = 45,{} maxnamenslaenge = 35;{}TEXT VAR filialdatenname :: "",{} programmname :: "";{}INT VAR fehlerzeile :: 0;{}BOOL VAR grin version :: FALSE,{} noch kein programm gelaufen :: TRUE,{} bildschirm neu eingesetzt :: FALSE;{}WINDOW VAR w :: window (1, 3, 79, 19);{}INITFLAG VAR in this task :: FALSE;{}PROC warenhausbefehle zeigen:{} TEXT VAR info, liste, tasten;{} INT VAR grinoffset;{} + IF grin version{} THEN grinbefehle{} ELSE elanbefehle{} FI;{} REP{} INT VAR auswahl := menualternative (info, liste, tasten, 5, FALSE);{} SELECT auswahl OF{} CASE 1, 101, 105 : menuinfo (anwendungstext (1 + grinoffset)){} CASE 2, 102, 106 : menuinfo (anwendungstext (2 + grinoffset)){} CASE 3, 103, 107 : menuinfo (anwendungstext (3 + grinoffset)){} END SELECT{} UNTIL auswahl = 4 OR auswahl = 104 OR auswahl = 108 PER.{} grinbefehle:{} grinoffset := 13;{} info := " "15"Info zu den Programmierbefehlen "14""13""13""{} + + " d Datei - Bearbeitung "13""{} + " e Einkaufen und Auskunft "13""{} + " k Kontroll - Strukturen "13""13""{} + " z Zurück zum Hauptmenü ";{} liste := "Datei"13"Kaufen/Auskunft"13"Kontroll"13"Zurück";{} tasten := "dekzDEKZ".{} elanbefehle:{} grinoffset := 0;{} info := " "15"Info zu den Programmierbefehlen "14""13""13""{} + " d Datei - Bearbeitung "13""{} + + " e Einkaufen und Auskunft "13""{} + " s Sonstige Befehle "13""13""{} + " z Zurück zum Hauptmenü ";{} liste := "Datei"13"Kaufen/Auskunft"13"Sonstige"13"Zurück";{} tasten := "deszDESZ".{}END PROC warenhausbefehle zeigen;{}PROC eingabe grundeinstellung:{} INT VAR dummy;{} IF eingabe mit codekartenleser{} THEN tastatureingabe (TRUE, dummy){} FI{}END PROC eingabe grundeinstellung;{}PROC tastatur einstellen:{} + eingabe grundeinstellung;{} menuinfo (anwendungstext (6), 4){}END PROC tastatur einstellen;{}PROC kartenleser einstellen:{} INT VAR ergebnis;{} IF eingabe mit codekartenleser{} THEN tastatureingabe (TRUE, ergebnis){} FI;{} pause (10);{} tastatureingabe (FALSE, ergebnis);{} IF ergebnis < 0{} THEN menuinfo (anwendungstext (7 - ergebnis), 5){} ELSE menuinfo (anwendungstext (7), 4){} FI{}END PROC kartenleser einstellen;{}PROC loesche zwischenraum:{} INT VAR zeile;{} cursor (1, 2); out (79 * waagerecht + " ");{} + FOR zeile FROM 3 UPTO 22 REP{} cursor (1, zeile); out (""5"");{} PER;{} cursor (1, 23); out (79 * waagerecht + " ");{} cursor (1, 24); out (""5"");{}END PROC loesche zwischenraum;{}PROC ergaenze bildschirm:{} cursor ( 1, 2); out (ecke oben links);{} cursor (42, 2); out (balken oben);{} cursor (80, 2); out (ecke oben rechts);{} INT VAR zeile;{} FOR zeile FROM 3 UPTO 22 REP{} cursor ( 1, zeile); out (senkrecht);{} cursor (42, zeile); out (senkrecht);{} cursor (80, zeile); out (senkrecht){} + PER;{} cursor ( 1, 23); out (ecke unten links);{} cursor (42, 23); out (balken unten);{} cursor (80, 23); out (ecke unten rechts);{} cursor (42, 19);{} out (balken links + (37 * waagerecht) + balken rechts);{} cursor w3 1 1{}END PROC ergaenze bildschirm;{}PROC zweite zeile:{} cursor (1, 2); out (79 * waagerecht + " "){}END PROC zweite zeile;{}PROC evtl d und b sperren:{} IF eingabe mit codekartenleser{} THEN activate ( 9);{} activate (10){} ELSE deactivate ( 9);{} deactivate (10){} + FI{}END PROC evtl d und b sperren;{}PROC direktbefehl 1:{} disable stop;{} warendatei bearbeiten;{} cursor off;{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE zweite zeile;{} menu bildschirm{} FI;{} enable stop{}END PROC direktbefehl 1;{}PROC warendatei bearbeiten:{} enable stop;{} loesche zwischenraum;{} ergaenze bildschirm;{} cursor (2, 24); out (invers ("Warendatei bearbeiten"));{} REP artikelnummer lesen;{} + IF NOT stoptaste gedrueckt{} THEN artikeldaten eingeben{} FI{} UNTIL stoptaste gedrueckt PER{}END PROC warendatei bearbeiten;{}PROC direktbefehl 2:{} disable stop;{} kundendatei bearbeiten;{} cursor off;{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE zweite zeile;{} menu bildschirm{} FI;{} enable stop{}END PROC direktbefehl 2;{}PROC kundendatei bearbeiten:{} enable stop;{} loesche zwischenraum;{} + ergaenze bildschirm;{} cursor (2, 24); out (invers ("Kundendatei bearbeiten"));{} REP kundennummer lesen;{} IF NOT stoptaste gedrueckt{} THEN kundendaten eingeben{} FI{} UNTIL stoptaste gedrueckt PER{}END PROC kundendatei bearbeiten;{}PROC direktbefehl 3:{} disable stop;{} einkaufen gehen;{} cursor off;{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE zweite zeile;{} menu bildschirm{} + FI;{} enable stop{}END PROC direktbefehl 3;{}PROC einkaufen gehen:{} enable stop;{} loesche zwischenraum;{} ergaenze bildschirm;{} cursor (2, 24); out (invers ("Einkaufen"));{} forget ("WARENHAUS:Rechnung", quiet);{} kundennummer lesen;{} rechnungskopf;{} REP einkaufen{} UNTIL stoptaste gedrueckt PER;{} abrechnung;{} forget ("WARENHAUS:Rechnung", quiet).{} einkaufen:{} artikelnummer lesen;{} IF NOT stoptaste gedrueckt{} THEN artikel kaufen{} FI.{}END PROC einkaufen gehen;{} +PROC direktbefehl 4:{} disable stop;{} auskunft einholen;{} cursor off;{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE zweite zeile;{} menu bildschirm{} FI;{} enable stop{}END PROC direktbefehl 4;{}PROC auskunft einholen:{} enable stop;{} loesche zwischenraum;{} ergaenze bildschirm;{} cursor (2, 24); out (invers ("Auskunft"));{} auskunft{}END PROC auskunft einholen;{}PROC direktbefehl 5:{} disable stop;{} + ware nachbestellen;{} cursor off;{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE zweite zeile;{} menu bildschirm{} FI;{} enable stop{}END PROC direktbefehl 5;{}PROC ware nachbestellen:{} enable stop;{} loesche zwischenraum;{} ergaenze bildschirm;{} cursor (2, 24); out (invers ("Nachbestellen"));{} nachbestellen{}END PROC ware nachbestellen;{}PROC direktbefehl 6:{} disable stop;{} dezimalwerte von interface lesen;{} + cursor off;{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE zweite zeile;{} menu bildschirm{} FI;{} enable stop{}END PROC direktbefehl 6;{}PROC dezimalwerte von interface lesen:{} enable stop;{} loesche zwischenraum;{} ergaenze bildschirm;{} cursor (2, 24); out (invers ("Dezimalwert lesen"));{} dezimalwert lesen{}END PROC dezimalwerte von interface lesen;{}PROC direktbefehl 7:{} disable stop;{} + bitmuster von interface lesen;{} cursor off;{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE zweite zeile;{} menu bildschirm{} FI;{} enable stop{}END PROC direktbefehl 7;{}PROC bitmuster von interface lesen:{} enable stop;{} loesche zwischenraum;{} ergaenze bildschirm;{} cursor (2, 24); out (invers ("Bitmuster lesen"));{} bitmuster lesen{}END PROC bitmuster von interface lesen;{}PROC eingabeart anzeigen:{} + IF eingabe mit codekartenleser{} THEN menuinfo (anwendungstext (7), 4){} ELSE menuinfo (anwendungstext (6), 4){} FI{}END PROC eingabeart anzeigen;{}PROC warenhaus:{} BOOL VAR am ende loeschen :: TRUE;{} pruefe zulaessigkeit;{} installiere menukarte mit anfangsbild;{} initialisiere warenhaus;{} handle menu ("WARENHAUS");{} IF am ende loeschen{} THEN sperre verwaltungstask;{} end (task (verwaltung)){} FI.{} installiere menukarte mit anfangsbild:{} install menu (menukarte, TRUE);{} + cursor off;{} cursor (17, 20);{} out (" W A R E N H A U S ");{} cursor (21, 22);{} out (invers("Filiale " + text (channel (myself))));{} cursor (79, 24);{} pause (10).{} sperre verwaltungstask:{} DATASPACE VAR ds;{} INT VAR dummy;{} forget (ds); ds := nilspace;{} call (task (verwaltung), 256, ds, dummy).{} pruefe zulaessigkeit:{} IF hauptstellenname = ""{} THEN line;{} putline ("Keine uebergeordnete Task ist 'warenhaus hauptstelle'!");{} end; LEAVE warenhaus{} + ELIF name (myself) = hauptstellenname{} THEN errorstop ("Dieser Befehl darf nur von Söhnen dieser "{} + "Task aus gegeben werden!");{} LEAVE warenhaus{} FI.{} initialisiere warenhaus:{} TEXT CONST verwaltung :: hauptstellenname + ".Filialverwaltung "{} + text (channel (myself));{} IF NOT exists task (verwaltung){} THEN initialisiere verwaltung{} ELSE biete evtl loeschen an{} FI;{} IF NOT initialized (in this task){} + THEN filialdatenname := "";{} programmname := ""{} FI;{} noch kein programm gelaufen := TRUE.{} biete evtl loeschen an:{} access catalogue;{} IF NOT (father (task (verwaltung)) = myself){} THEN fehlermeldung;{} line;{} end;{} am ende loeschen := FALSE{} FI.{} fehlermeldung:{} cursor (1, 22);{} putline ("Filiale " + text (channel (myself)) +{} " ist bereits besetzt durch TASK '"{} + name (father (task (verwaltung))) + "'!");{} + putline ("Es ist so kein geregelter Warenhaus-Betrieb moeglich!").{}END PROC warenhaus;{}PROC grin (BOOL CONST entscheidung):{} enable stop;{} IF hauptstellenname = "" OR hauptstellenname = name (myself){} THEN grin version := entscheidung{} ELSE errorstop ("Dieser Befehl darf nur von der Task '" +{} hauptstellenname + "' aus gegeben werden!"){} FI;{} bildschirm neu eingesetzt := FALSE{}END PROC grin;{}PROC filialdaten verzeichnis:{} disable stop;{} THESAURUS VAR filialdaten ::{} + ohne praefix (infix namen (ALL myself, praefix, filialdatentyp), praefix);{} forget ("Verzeichnis der Filialdaten-Dateien", quiet);{} FILE VAR f ::{} sequential file (output, "Verzeichnis der Filialdaten-Dateien");{} f FILLBY filialdaten;{} modify (f);{} to line (f, 1); insert record (f);{} menufootnote ("Verlassen: <ESC> <q>");{} cursor on;{} show (w, f);{} cursor off;{} forget ("Verzeichnis der Filialdaten-Dateien", quiet);{} IF is error{} THEN regenerate menuscreen;{} out (""7"");{} + menuinfo (" " + invers ("FEHLER: " + errormessage));{} clear error{} ELSE menu bildschirm{} FI;{} enable stop{}END PROC filialdaten verzeichnis;{}PROC warenhausprogramme verzeichnis:{} disable stop;{} forget ("Verzeichnis der Programme", quiet);{} THESAURUS VAR programme ::{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp);{} IF exists ("WARENHAUS:Rechnung"){} THEN programme := programme - "WARENHAUS:Rechnung"{} FI;{} FILE VAR f ::{} sequential file (output, "Verzeichnis der Programme");{} + f FILLBY programme;{} modify (f);{} to line (f, 1); insert record (f);{} menufootnote ("Verlassen: <ESC> <q>");{} cursor on;{} show (w, f);{} cursor off;{} forget ("Verzeichnis der Programme", quiet);{} IF is error{} THEN regenerate menuscreen;{} out (""7"");{} menuinfo (" " + invers ("FEHLER: " + errormessage));{} clear error{} ELSE menu bildschirm{} FI;{} enable stop{}END PROC warenhausprogramme verzeichnis;{}PROC filialdaten zusammenstellen:{} hole filialdatenname;{} + kontrolliere den filialdatennamen;{} disable stop;{} sichere filialdaten (praefix + filialdatenname);{} IF is error{} THEN out (""7"");{} menuinfo (" " + invers ("FEHLER: " + errormessage));{} clear error{} ELSE bestaetige{} FI;{} enable stop.{} hole filialdatenname:{} filialdatenname := menuanswer (ausgabe, filialdatenname, 5).{} ausgabe:{} center (maxlaenge, invers ("Filialdaten zusammenstellen")) + ""13""13""{} + " Bitte den Namen für die Filialdaten "13""13"".{} + kontrolliere den filialdatennamen:{} IF filialdatenname = niltext{} THEN enable stop; LEAVE filialdaten zusammenstellen{} ELIF length (filialdatenname) > maxnamenslaenge{} THEN meckere zu langen namen an;{} filialdatenname := niltext;{} enable stop; LEAVE filialdaten zusammenstellen{} ELIF exists (praefix + filialdatenname){} THEN meckere existierenden filialdatennamen an;{} enable stop; LEAVE filialdaten zusammenstellen{} + FI.{} bestaetige:{} menuinfo (" "15"Bestätigung "14" "13""13"" +{} " Die Filialdaten wurden von der "13"" +{} " Verwaltung unter dem gewünschten "13"" +{} " Namen zusammengestellt. "13"" , 3).{}END PROC filialdaten zusammenstellen;{}PROC warenhausprogramm neu erstellen:{} hole programmname;{} kontrolliere den programmnamen;{} command dialogue (FALSE);{} cursor on;{} disable stop;{} stdinfoedit (programmname, 3);{} + cursor off;{} command dialogue (TRUE);{} IF is error{} THEN regenerate menuscreen;{} out (""7"");{} menuinfo (" " + invers (errormessage));{} clear error{} ELSE menu bildschirm{} FI;{} enable stop.{} hole programmname:{} programmname := "";{} programmname := menuanswer (ausgabe, programmname, 5).{} ausgabe:{} center (maxlaenge, invers ("Programm neu erstellen")) + ""13""13""{} + " Bitte den Namen für das Programm "13""13"".{} kontrolliere den programmnamen:{} + IF programmname = niltext{} THEN LEAVE warenhausprogramm neu erstellen{} ELIF length (programmname) > maxnamenslaenge{} THEN meckere zu langen namen an;{} programmname := niltext;{} LEAVE warenhausprogramm neu erstellen{} ELIF exists (programmname){} THEN meckere existierendes programm an;{} LEAVE warenhausprogramm neu erstellen{} FI.{}END PROC warenhausprogramm neu erstellen;{}PROC warenhausprogramm ansehen:{} IF programmname <> niltext CAND exists (programmname){} + THEN frage nach diesem programm{} ELSE lasse programm auswaehlen{} FI;{} cursor on;{} disable stop;{} stdinfoedit (programmname, 3);{} cursor off;{} IF is error{} THEN regenerate menuscreen;{} out (""7"");{} menuinfo (" " + invers ("FEHLER: " + errormessage));{} clear error{} ELSE menu bildschirm{} FI;{} enable stop.{} frage nach diesem programm:{} IF menuno (ueberschrift + " Zuletzt bearbeitetes Programm: " + name{} + " Soll mit diesem Programm gearbeitet werden", 5){} + THEN lasse programm auswaehlen{} FI.{} ueberschrift:{} center (maxlaenge, invers ("Programm ansehen/ändern")) + ""13""13"".{} name:{} ""13""13" " + invers (programmname) + ""13""13"".{} lasse programm auswaehlen:{} THESAURUS VAR verfuegbare ::{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp);{} IF exists ("WARENHAUS:Rechnung"){} THEN verfuegbare := verfuegbare - "WARENHAUS:Rechnung"{} FI;{} IF NOT not empty (verfuegbare){} THEN noch kein programm;{} + LEAVE warenhausprogramm ansehen{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} programmname := menuone (verfuegbare, "Programm ansehen/ändern",{} "Bitte das gewünschte Programm ankreuzen!",{} FALSE);{} IF programmname = niltext{} THEN menu bildschirm;{} LEAVE warenhausprogramm ansehen{} FI.{}END PROC warenhausprogramm ansehen;{}PROC filialdaten eintragen:{} lasse filialdaten auswaehlen;{} + trage filialdaten ein;{} menu bildschirm.{} lasse filialdaten auswaehlen:{} THESAURUS VAR verfuegbare ::{} ohne praefix (infix namen (ALL myself,praefix,filialdatentyp),praefix);{} IF NOT not empty (verfuegbare){} THEN noch keine filialdaten;{} LEAVE filialdaten eintragen{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} verfuegbare := menusome (verfuegbare, bezeichnung,{} "Bitte die Filialdaten ankreuzen, die eingetragen werden sollen!", FALSE).{} trage filialdaten ein:{} + show menuwindow;{} steige ggf bei leerem thesaurus aus;{} menuwindowout (menuwindowcenter (invers (bezeichnung)));{} menuwindowline (2);{} command dialogue (FALSE);{} fuehre einzelne operationen aus;{} command dialogue (TRUE);{} schlage ggf neue seite auf;{} menuwindowout (schlussbemerkung);{} menuwindowstop.{} bezeichnung:{} "Filialdaten eintragen/ergänzen".{} schlussbemerkung:{} " Alle ausgewählten Filialdaten wurden eingetragen!".{} fuehre einzelne operationen aus:{} + INT VAR k;{} FOR k FROM 1 UPTO highest entry (verfuegbare) REP{} IF name (verfuegbare, k) <> ""{} THEN disable stop;{} menuwindowout ( " Filialdaten """ + name (verfuegbare, k){} + """ werden eingetragen!");{} menuwindowline;{} lade filialdaten (praefix + name (verfuegbare, k));{} fehlerbehandlung{} FI{} PER.{} steige ggf bei leerem thesaurus aus:{} IF NOT not empty (verfuegbare){} + THEN menuwindowline (2);{} menuwindowout (" Es wurde keine Filialdaten-Datei ausgewählt!");{} menuwindowstop;{} menu bildschirm;{} LEAVE filialdaten eintragen{} FI.{} schlage ggf neue seite auf:{} IF remaining menuwindowlines < 7{} THEN menuwindowpage; menuwindowline{} ELSE menuwindowline (2){} FI.{} fehlerbehandlung:{} IF is error{} THEN regenerate menuscreen; out (""7"");{} menuinfo (" " + invers (errormessage));{} + clear error; enable stop;{} LEAVE filialdaten eintragen{} ELSE enable stop{} FI.{}END PROC filialdaten eintragen;{}PROC warenhausprogramme drucken:{} lasse programme auswaehlen;{} drucke programme;{} menu bildschirm.{} lasse programme auswaehlen:{} THESAURUS VAR verfuegbare ::{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp);{} IF exists ("WARENHAUS:Rechnung"){} THEN verfuegbare := verfuegbare - "WARENHAUS:Rechnung"{} FI;{} IF NOT not empty (verfuegbare){} + THEN noch kein programm;{} LEAVE warenhausprogramme drucken{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} verfuegbare := menusome (verfuegbare, "Programme drucken",{} "Bitte die Programme ankreuzen, die gedruckt werden sollen!",{} FALSE).{} drucke programme:{} show menuwindow;{} steige ggf bei leerem thesaurus aus;{} menuwindowout (menuwindowcenter (invers ("Programme drucken")));{} menuwindowline (2);{} command dialogue (FALSE);{} + fuehre einzelne operationen aus;{} command dialogue (TRUE);{} schlage ggf neue seite auf;{} menuwindowout (" Alle ausgewählten Programme wurden gedruckt!");{} menuwindowstop.{} fuehre einzelne operationen aus:{} INT VAR k;{} FOR k FROM 1 UPTO highest entry (verfuegbare) REP{} IF name (verfuegbare, k) <> ""{} THEN disable stop;{} menuwindowout ( " """ + name (verfuegbare, k) +{} """ wird gedruckt!");{} menuwindowline;{} + print (name (verfuegbare, k));{} fehlerbehandlung{} FI{} PER.{} steige ggf bei leerem thesaurus aus:{} IF NOT not empty (verfuegbare){} THEN menuwindowline (2);{} menuwindowout (" Es wurde kein Programm ausgewählt!");{} menuwindowstop;{} menu bildschirm;{} LEAVE warenhausprogramme drucken{} FI.{} schlage ggf neue seite auf:{} IF remaining menuwindowlines < 7{} THEN menuwindowpage; menuwindowline{} + ELSE menuwindowline (2){} FI.{} fehlerbehandlung:{} IF is error{} THEN regenerate menuscreen; out (""7"");{} menuinfo (" " + invers (errormessage));{} clear error; enable stop;{} LEAVE warenhausprogramme drucken{} ELSE enable stop{} FI.{}END PROC warenhausprogramme drucken;{}PROC warenhausprogramm kopieren:{} ermittle alten programmnamen;{} erfrage neuen programmnamen;{} kopiere ggf das programm.{} ermittle alten programmnamen:{} IF NOT not empty (bestand){} + THEN noch kein programm;{} LEAVE warenhausprogramm kopieren{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} TEXT VAR alter name := menuone ( bestand, "Programm kopieren",{} "Bitte das Programm ankreuzen, das kopiert werden soll!",FALSE);{} menu bildschirm;{} IF alter name = niltext{} THEN LEAVE warenhausprogramm kopieren{} FI.{} bestand:{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp){} - "WARENHAUS:Rechnung".{} + erfrage neuen programmnamen:{} TEXT VAR neuer name :: menuanswer (ausgabe, alter name, 5).{} ausgabe:{} ueberschrift + " Name des 'alten' Programms: " + bisheriger name{} + " Bitte den Namen für die Kopie: ".{} ueberschrift:{} center (maxlaenge, invers ("Programm kopieren")) + ""13""13"".{} bisheriger name:{} ""13""13" " + invers (alter name) + ""13""13"".{} kopiere ggf das programm:{} IF neuer name = niltext{} THEN menuinfo (" " + invers ("Der gewünschte Name ist unzulässig!"));{} + LEAVE warenhausprogramm kopieren{} ELIF exists (neuer name){} THEN mache vorwurf;{} LEAVE warenhausprogramm kopieren{} ELSE copy (alter name, neuer name){} FI.{} mache vorwurf:{} menuinfo (" " + invers ("Ein Programm mit diesem Namen gibt es bereits!")).{}END PROC warenhausprogramm kopieren;{}PROC filialdaten umbenennen:{} ermittle alten filialdatennamen;{} erfrage neuen filialdatennamen;{} benenne ggf die filialdaten um.{} ermittle alten filialdatennamen:{} + IF NOT not empty (bestand){} THEN noch keine filialdaten;{} LEAVE filialdaten umbenennen{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} TEXT VAR alter name := menuone ( bestand, text1, text2, FALSE);{} menu bildschirm;{} IF alter name = niltext{} THEN LEAVE filialdaten umbenennen{} FI.{} bestand:{} ohne praefix (infix namen (ALL myself, praefix, filialdatentyp), praefix).{} text1: "Filialdaten umbenennen".{} text2:{} "Bitte die Filialdaten-Datei ankreuzen, die umbenannt werden soll!" .{} + erfrage neuen filialdatennamen:{} TEXT VAR neuer name :: menuanswer (ausgabe, alter name, 5).{} ausgabe:{} ueberschrift + hinweis auf alt + bisheriger name + aufforderung.{} ueberschrift:{} center (maxlaenge, invers ("Filialdaten umbenennen")) + ""13""13"".{} hinweis auf alt:{} " Bisheriger Filialdaten-Name: ".{} bisheriger name:{} ""13""13" " + invers (alter name) + ""13""13"".{} aufforderung:{} " Zukünftiger Filialdaten-Name: ".{} benenne ggf die filialdaten um:{} IF neuer name = niltext{} + THEN menuinfo (" " + invers ("Der gewünschte Name ist unzulässig!"));{} LEAVE filialdaten umbenennen{} ELIF exists (praefix + neuer name){} THEN menuinfo (" " + invers("Filialdaten mit diesem Namen gibt es bereits!"));{} LEAVE filialdaten umbenennen{} ELSE rename (praefix + alter name, praefix + neuer name);{} filialdatenname := neuer name{} FI.{}END PROC filialdaten umbenennen;{}PROC warenhausprogramm umbenennen:{} ermittle alten programmnamen;{} + erfrage neuen programmnamen;{} benenne ggf das programm um.{} ermittle alten programmnamen:{} IF NOT not empty (bestand){} THEN noch kein programm;{} LEAVE warenhausprogramm umbenennen{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} TEXT VAR alter name := menuone ( bestand, "Programm umbenennen",{} "Bitte das Programm ankreuzen, das umbenannt werden soll!", FALSE);{} menu bildschirm;{} IF alter name = niltext{} THEN LEAVE warenhausprogramm umbenennen{} + FI.{} bestand:{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp){} - "WARENHAUS:Rechnung".{} erfrage neuen programmnamen:{} TEXT VAR neuer name :: menuanswer (ausgabe, alter name, 5).{} ausgabe:{} ueberschrift + " Bisheriger Programmname: " + bisheriger name{} + " Zukünftiger Programmname: ".{} ueberschrift:{} center (maxlaenge, invers ("Programm umbenennen")) + ""13""13"".{} bisheriger name:{} ""13""13" " + invers (alter name) + ""13""13"".{} + benenne ggf das programm um:{} IF neuer name = niltext{} THEN menuinfo (" " + invers ("Der gewünschte Name ist unzulässig!"));{} LEAVE warenhausprogramm umbenennen{} ELIF exists (neuer name){} THEN mache vorwurf;{} LEAVE warenhausprogramm umbenennen{} ELSE rename (alter name, neuer name);{} programmname := neuer name{} FI.{} mache vorwurf:{} menuinfo (" " + invers ("Ein Programm mit diesem Namen gibt es bereits!")).{}END PROC warenhausprogramm umbenennen;{} +PROC filialdaten loeschen:{} lasse filialdaten auswaehlen;{} loesche filialdaten;{} menu bildschirm.{} lasse filialdaten auswaehlen:{} THESAURUS VAR verfuegbare ::{} ohne praefix (infix namen (ALL myself, praefix, filialdatentyp), praefix);{} IF NOT not empty (verfuegbare){} THEN noch keine filialdaten;{} LEAVE filialdaten loeschen{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} verfuegbare := menusome (verfuegbare, "Filialdaten-Dateien löschen",{} "Bitte alle Dateien ankreuzen, die gelöscht werden sollen!", FALSE).{} + loesche filialdaten:{} show menuwindow;{} steige ggf bei leerem thesaurus aus;{} menuwindowout (menuwindowcenter (invers ("Filialdaten-Dateien löschen")));{} menuwindowline (2);{} command dialogue (FALSE);{} fuehre einzelne operationen aus;{} command dialogue (TRUE);{} schlage ggf neue seite auf;{} menuwindowout (" Alle ausgewählten Dateien wurden gelöscht!");{} menuwindowstop.{} fuehre einzelne operationen aus:{} INT VAR k;{} FOR k FROM 1 UPTO highest entry (verfuegbare) REP{} + IF name (verfuegbare, k) <> ""{} THEN disable stop;{} IF menuwindowyes (" """ + name (verfuegbare, k){} + """ löschen"){} THEN forget (praefix + name (verfuegbare, k), quiet){} FI;{} fehlerbehandlung{} FI{} PER;{} filialdatenname := "".{} steige ggf bei leerem thesaurus aus:{} IF NOT not empty (verfuegbare){} THEN menuwindowline (2);{} menuwindowout (" Es wurde keine Filialdaten-Datei ausgewählt!");{} + menuwindowstop;{} menu bildschirm;{} LEAVE filialdaten loeschen{} FI.{} schlage ggf neue seite auf:{} IF remaining menuwindowlines < 7{} THEN menuwindowpage; menuwindowline{} ELSE menuwindowline (2){} FI.{} fehlerbehandlung:{} IF is error{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage));{} clear error; enable stop;{} LEAVE filialdaten loeschen{} ELSE enable stop{} FI.{} +END PROC filialdaten loeschen;{}PROC warenhausprogramme loeschen:{} lasse programme auswaehlen;{} loesche programme;{} menu bildschirm.{} lasse programme auswaehlen:{} THESAURUS VAR verfuegbare ::{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp);{} IF exists ("WARENHAUS:Rechnung"){} THEN verfuegbare := verfuegbare - "WARENHAUS:Rechnung"{} FI;{} IF NOT not empty (verfuegbare){} THEN noch kein programm;{} LEAVE warenhausprogramme loeschen{} + ELSE biete auswahl an{} FI.{} biete auswahl an:{} verfuegbare := menusome (verfuegbare, "Programm löschen",{} "Bitte alle Programme ankreuzen, die gelöscht werden sollen!", FALSE).{} loesche programme:{} show menuwindow;{} steige ggf bei leerem thesaurus aus;{} menuwindowout (menuwindowcenter (invers ("Programme löschen")));{} menuwindowline (2);{} command dialogue (FALSE);{} fuehre einzelne operationen aus;{} command dialogue (TRUE);{} schlage ggf neue seite auf;{} + menuwindowout (" Alle ausgewählten Programme wurden gelöscht!");{} menuwindowstop.{} fuehre einzelne operationen aus:{} INT VAR k;{} FOR k FROM 1 UPTO highest entry (verfuegbare) REP{} IF name (verfuegbare, k) <> ""{} THEN disable stop;{} IF menuwindowyes (" """ + name (verfuegbare, k) + """ löschen"){} THEN forget (name (verfuegbare, k), quiet){} FI;{} fehlerbehandlung{} FI{} PER;{} programmname := "".{} + steige ggf bei leerem thesaurus aus:{} IF NOT not empty (verfuegbare){} THEN menuwindowline (2);{} menuwindowout (" Es wurde kein Programm ausgewählt!");{} menuwindowstop;{} menu bildschirm;{} LEAVE warenhausprogramme loeschen{} FI.{} schlage ggf neue seite auf:{} IF remaining menuwindowlines < 7{} THEN menuwindowpage; menuwindowline{} ELSE menuwindowline (2){} FI.{} fehlerbehandlung:{} IF is error{} THEN regenerate menuscreen; out (""7"");{} + menuinfo (" " + invers (errormessage));{} clear error; enable stop;{} LEAVE warenhausprogramme loeschen{} ELSE enable stop{} FI.{}END PROC warenhausprogramme loeschen;{}PROC warenhausprogramm starten:{} IF grin version{} THEN warenhausprogramm uebersetzen und starten{} ELSE warenhausprogramm direkt starten{} FI{}END PROC warenhausprogramm starten;{}PROC warenhausprogramm direkt starten:{} programmname ermitteln;{} bildschirm neu eingesetzt := FALSE;{} + untersuche programmdatei auf bildschirm neu;{} cursor w3 1 1;{} cursor (1, 24); out(""5"Das Programm wird übersetzt. Zeilen-Nr.: ");{} cursor on;{} check on;{} warnings off;{} disable stop;{} run (programmname);{} noch kein programm gelaufen := FALSE;{} IF bildschirm neu eingesetzt{} THEN entferne befehl aus programmdatei{} FI;{} cursor off;{} fehlerbehandlung;{} cursor (2,23); out ((40 * waagerecht) + balken unten + (36 * waagerecht));{} cursor (2,24);{} out ("Das Programm ist beendet. " +{} + "Zum Weitermachen bitte irgendeine Taste tippen!");{} pause;{} regenerate menuscreen.{} fehlerbehandlung:{} IF is error{} THEN fehler ggf melden{} ELSE enable stop{} FI.{} fehler ggf melden:{} IF errormessage = ""{} THEN regenerate menuscreen{} ELSE fehler melden{} FI;{} clear error; enable stop;{} LEAVE warenhausprogramm direkt starten.{} fehler melden:{} out (""7"");{} IF errorcode = 1 OR errorcode = 1951{} THEN regenerate menuscreen;{} + menuinfo (" " + invers (errormessage)){} ELSE programm mit fehler zeigen;{} regenerate menuscreen{} FI.{} programmname ermitteln:{} IF programmname <> niltext CAND exists (programmname){} THEN frage nach diesem programm{} ELSE lasse programm auswaehlen{} FI.{} frage nach diesem programm:{} IF menuno (ueberschrift + " Zuletzt bearbeitetes Programm: " +{} name + " Soll mit diesem Programm gearbeitet werden", 5){} THEN lasse programm auswaehlen{} + FI.{} ueberschrift:{} center (maxlaenge, invers ("Programm starten")) + ""13""13"".{} name:{} ""13""13" " + invers (programmname) + ""13""13"".{} lasse programm auswaehlen:{} THESAURUS VAR verfuegbare ::{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp);{} IF exists ("WARENHAUS:Rechnung"){} THEN verfuegbare := verfuegbare - "WARENHAUS:Rechnung"{} FI;{} IF NOT not empty (verfuegbare){} THEN noch kein programm;{} LEAVE warenhausprogramm direkt starten{} + ELSE biete auswahl an{} FI.{} biete auswahl an:{} programmname := menuone (verfuegbare, "Programm starten",{} "Bitte das gewünschte Programm ankreuzen!", FALSE);{} menubildschirm;{} menufootnote ("");{} IF programmname = niltext{} THEN LEAVE warenhaus programm direkt starten{} FI.{} untersuche programmdatei auf bildschirm neu:{} FILE VAR a :: sequential file (modify, programmname);{} TEXT VAR zeile;{} to line (a, 1);{} REP{} read record (a, zeile);{} + IF NOT eof (a) THEN down (a) FI{} UNTIL zeile <> "" OR eof (a) PER;{} change all (zeile, " ", "");{} IF pos (zeile, "bildschirmneu") = 0{} THEN setze befehl in datei ein{} FI.{} setze befehl in datei ein:{} to line (a, 1);{} zeile := "bildschirm neu; (* ergänzt *)";{} insert record (a);{} write record (a, zeile);{} bildschirm neu eingesetzt := TRUE.{} entferne befehl aus programmdatei:{} FILE VAR b :: sequential file (modify, programmname);{} to line (b, 1);{} + REP{} read record (b, zeile);{} IF NOT eof (b) THEN down (b) FI{} UNTIL zeile <> "" OR eof (b) PER;{} change all (zeile, " ", "");{} IF pos (zeile, "bildschirmneu;(*ergänzt*)") > 0{} THEN up (b); delete record (b){} FI.{}END PROC warenhausprogramm direkt starten;{}PROC warenhausprogramm uebersetzen und starten:{} programmname ermitteln;{} cursor w3 1 1;{} cursor (1, 24); out(""5"Das Programm wird übersetzt. Zeilen-Nr.: ");{} cursor on;{} disable stop;{} uebersetze (programmname);{} + IF NOT is error{} THEN check on;{} warnings off;{} run ("elanprogramm");{} noch kein programm gelaufen := FALSE{} FI;{} forget ("elanprogramm", quiet);{} cursor off;{} fehlerbehandlung;{} cursor (2,23); out ((40 * waagerecht) + balken unten + (36 * waagerecht));{} cursor (2,24);{} out ("Das Programm ist beendet. " +{} "Zum Weitermachen bitte irgendeine Taste tippen!");{} pause;{} regenerate menuscreen.{} fehlerbehandlung:{} IF is error{} THEN fehler ggf melden{} + ELSE enable stop{} FI.{} fehler ggf melden:{} IF errormessage = ""{} THEN regenerate menuscreen{} ELSE fehler melden{} FI;{} clear error; enable stop;{} LEAVE warenhausprogramm uebersetzen und starten.{} fehler melden:{} out (""7"");{} IF errorcode = 1 OR errorcode = 1951{} THEN regenerate menuscreen;{} menuinfo (" " + invers (errormessage)){} ELSE programm mit fehler zeigen ;{} regenerate menuscreen{} FI.{} programmname ermitteln:{} + IF programmname <> niltext CAND exists (programmname){} THEN frage nach diesem programm{} ELSE lasse programm auswaehlen{} FI.{} frage nach diesem programm:{} IF menuno (ueberschrift + " Zuletzt bearbeitetes Programm: " +{} name + " Soll mit diesem Programm gearbeitet werden", 5){} THEN lasse programm auswaehlen{} FI.{} ueberschrift:{} center (maxlaenge, invers ("Programm starten")) + ""13""13"".{} name:{} ""13""13" " + invers (programmname) + ""13""13"".{} + lasse programm auswaehlen:{} THESAURUS VAR verfuegbare ::{} ALL myself - infix namen (ALL myself, praefix, filialdatentyp);{} IF exists ("WARENHAUS:Rechnung"){} THEN verfuegbare := verfuegbare - "WARENHAUS:Rechnung"{} FI;{} IF NOT not empty (verfuegbare){} THEN noch kein programm;{} LEAVE warenhausprogramm uebersetzen und starten{} ELSE biete auswahl an{} FI.{} biete auswahl an:{} programmname := menuone (verfuegbare, "Programm starten",{} + "Bitte das gewünschte Programm ankreuzen!", FALSE);{} menubildschirm;{} menufootnote ("");{} IF programmname = niltext{} THEN LEAVE warenhaus programm uebersetzen und starten{} FI.{}END PROC warenhausprogramm uebersetzen und starten;{}PROC programm mit fehler zeigen:{} IF exists (programmname){} THEN noteline;{} note (fehlermeldung mit zeilennummer);{} INT VAR i; FOR i FROM 1 UPTO 9 REP noteline PER;{} note (invers ("Verlassen: <ESC><q>"));{} + FILE VAR f :: sequential file (modify, programmname);{} to line (f, max (1, fehlerzeile));{} col (1);{} clear error;{} cursor on;{} noteedit (f);{} cursor off{} ELSE menuinfo (invers (fehlermeldung mit zeilennummer)){} FI{}END PROC programm mit fehler zeigen;{}PROC warenhausprogramm wiederholen:{} cursor on;{} disable stop;{} IF noch kein programm gelaufen{} THEN errorstop ("'run again' nicht moeglich"){} ELSE runagain{} FI;{} + cursor off;{} fehlerbehandlung;{} cursor (2,23); out ((40 * waagerecht) + balken unten + (36 * waagerecht));{} cursor (2,24);{} out ("Das Programm ist beendet. " +{} "Zum Weitermachen bitte irgendeine Taste tippen!");{} pause;{} regenerate menuscreen.{}fehlerbehandlung:{} IF is error{} THEN regenerate menuscreen;{} fehler melden;{} clear error; enable stop;{} LEAVE warenhausprogramm wiederholen{} ELSE enable stop{} FI.{} fehler melden:{} + out (""7"");{} IF errorcode = 1 OR errorcode = 1951{} THEN menuinfo (" " + invers (errormessage)){} ELIF errormessage = "'run again' nicht moeglich"{} THEN menuinfo (" " + invers ("Wiederholung nicht möglich!")){} ELSE menuinfo (" " + invers (fehlermeldung mit zeilennummer)){} FI{}END PROC warenhausprogramm wiederholen;{}TEXT PROC fehlermeldung mit zeilennummer:{} TEXT VAR meldung :: "FEHLER: " + errormessage;{} fuege ggf fehlerzeile an;{} IF length (meldung) < 70{} + THEN meldung{} ELSE subtext (meldung, 1, 69){} FI.{} fuege ggf fehlerzeile an:{} fehlerzeile := errorline;{} IF errorline < 1{} THEN LEAVE fuege ggf fehlerzeile an{} ELIF bildschirm neu eingesetzt{} THEN meldung CAT " (bei Zeile " + text (errorline - 1) + ")"{} ELSE meldung CAT " (bei Zeile " + text (errorline) + ")"{} FI.{}END PROC fehlermeldung mit zeilennummer;{}PROC meckere zu langen namen an:{} menuinfo (" " + invers ("Hier dürfen Namen höchstens "{} + + text (max namenslaenge){} + " Zeichen lang sein!")){}END PROC meckere zu langen namen an;{}PROC meckere existierenden filialdatennamen an:{} menuinfo (" " + invers ("Filialdaten mit diesem Namen gibt es bereits!")){}END PROC meckere existierenden filialdatennamen an;{}PROC meckere existierendes programm an:{} menuinfo (" " + invers ("Ein Programm mit diesem Namen gibt es bereits!")){}END PROC meckere existierendes programm an;{}PROC noch keine filialdaten:{} menuinfo (" " + invers ("Es existiert noch keine Filialdaten-Datei!")){} +END PROC noch keine filialdaten;{}PROC noch kein programm:{} menuinfo (" " + invers ("Es existiert noch kein Programm!")){}END PROC noch kein programm;{}PROC menu bildschirm:{} cursor (1, 2);{} out (5 * waagerecht);{} cursor (1, 3);{} out (""4"");{} cursor (1, 23);{} out (79 * waagerecht);{} refresh submenu{}END PROC menu bildschirm{}END PACKET ls warenhaus 5{} + diff --git a/app/gs.warenhaus/1.01/src/ls-Warenhaus-gen b/app/gs.warenhaus/1.01/src/ls-Warenhaus-gen new file mode 100644 index 0000000..f4bd77f --- /dev/null +++ b/app/gs.warenhaus/1.01/src/ls-Warenhaus-gen @@ -0,0 +1,29 @@ +(* + + ********************************************************** + ********************************************************** + ** ** + ** ls-Warenhaus/gen ** + ** ** + ** Version 1.01 ** + ** ** + ** ** + ** (Stand: 30.08.89) ** + ** ** + ** ** + ** ** + ** Autor: Bruno Pollok, Bielefeld ** + ** ** + ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** + ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** + ** ** + ********************************************************** + ********************************************************** + + *) +LET kartenleserkennung = "ls-Warenhaus 0: mit Kartenleser"; +baue bildschirm auf;{}schicke menukarte ab;{}erfrage anpassung;{}check off;{}warnings off;{}insertiere (anpassung);{}loesche alle anpassungen;{}insertiere ("ls-Warenhaus 1");{}insertiere ("ls-Warenhaus 2");{}insertiere ("ls-Warenhaus 3");{}insertiere ("ls-Warenhaus 4");{}insertiere ("ls-Warenhaus 5");{}check on;{}frage nach grin;{}frage nach hauptstelle.{}baue bildschirm auf:{} page;{} cursor (18, 1);{} out (invers ("ls-Warenhaus : Automatische Generierung"));{} line (3).{}erfrage anpassung:{} + WINDOW VAR w :: window (1, 1, 79, 24);{} TEXT VAR anpassung :: boxone (w, alle kartenleser,{} "Auswahl einer Interface - Anpassung für den Codekartenleser",{} "Wenn kein Kartenleser benutzt wird, <ESC><q> tippen!", FALSE);{} IF anpassung = ""{} THEN anpassung := "ls-Warenhaus 0: ohne Kartenleser"{} FI;{} baue bildschirm auf.{}alle kartenleser:{} infix namen (ALL myself, kartenleserkennung).{}loesche alle anpassungen:{} command dialogue (FALSE);{} forget (infixnamen (ALL myself, "ls-Warenhaus 0"));{} + forget ("--------------------------------------------------------",quiet);{} command dialogue (TRUE).{}schicke menukarte ab:{} command dialogue (FALSE);{} save ("ls-MENUKARTE:Warenhaus", /"ls-MENUKARTEN");{} command dialogue (TRUE);{} forget ("ls-MENUKARTE:Warenhaus", quiet);{} forget ("ls-Warenhaus/gen", quiet).{}frage nach grin:{} line;{} IF yes ("Version für GRIN"){} THEN do ("grin (TRUE)"){} ELSE do ("grin (FALSE)"){} FI.{}frage nach hauptstelle:{} line (2);{} IF yes ("Soll diese Task Warenhaus - Hauptstelle sein"){} + THEN do ("warenhaus hauptstelle (TRUE)"){} ELSE global manager{} FI.{};{}PROC insertiere (TEXT CONST dateiname):{} INT VAR s, z;{} out ("'" + dateiname + "'");{} get cursor (s, z);{} out (" wird insertiert. ");{} insert (dateiname);{} forget (dateiname, quiet);{} cursor (s, z);{} out (""4"") ;{} line{}END PROC insertiere{} + |