From afd4c3c448381f6eb706090911a15c162fdaf8af Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sun, 9 Oct 2016 11:28:19 +0200 Subject: Decompress source files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EUMEL’s TEXT dataspaces wastes a lot of storage space. Some files were therefore “compressed” by storing them as a single line, reducing overhead significantly. --- warenhaus/ls-Warenhaus 2 | 1319 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 1232 insertions(+), 87 deletions(-) (limited to 'warenhaus/ls-Warenhaus 2') 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 + -- cgit v1.2.3