summaryrefslogtreecommitdiff
path: root/warenhaus/ls-Warenhaus 2
diff options
context:
space:
mode:
Diffstat (limited to 'warenhaus/ls-Warenhaus 2')
-rw-r--r--warenhaus/ls-Warenhaus 21319
1 files changed, 1232 insertions, 87 deletions
diff --git a/warenhaus/ls-Warenhaus 2 b/warenhaus/ls-Warenhaus 2
index 7048aff..f7a9945 100644
--- a/warenhaus/ls-Warenhaus 2
+++ b/warenhaus/ls-Warenhaus 2
@@ -22,91 +22,1236 @@
*)
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{}
+ 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
+