(* ********************************************************** ********************************************************** ** ** ** ls-Warenhaus 2 ** ** ** ** Version 1.01 ** ** ** ** ** ** (Stand: 30.08.89) ** ** ** ** ** ** ** ** Autor: Bruno Pollok, Bielefeld ** ** ** ** Copyright (C) 1988 Eva Latta-Weber, Bielefeld ** ** Copyright (C) 1990 ERGOS GmbH, Siegburg ** ** ** ********************************************************** ********************************************************** *) PACKET ls warenhaus 2 DEFINES max artikelzahl, max kundenzahl, min kundennummer, max kundennummer, min artikelnummer, max artikelnummer, filialverwaltung, initialisiere verwaltung, hole artikeldaten, speichere artikeldaten, registriere verkauf, hole kundendaten, speichere kundendaten, sichere filialdaten, lade filialdaten, hole bestelliste, hole auskunft ein: LET max filialen = 10, max artikel = 15, max kunden = 31, min kundennr = 129, max kundennr = 159, min artikelnr = 1, max artikelnr = 15; LET zentrale kundendatei holen code = 100, zentrale kundendatei ergaenzen code = 200, filialdaten holen code = 201, filialdaten ergaenzen code = 202; INT CONST max artikelzahl :: max artikel, max kundenzahl :: max kunden, min kundennummer :: min kundennr, max kundennummer :: max kundennr, min artikelnummer :: min artikelnr, max artikelnummer :: max artikelnr; TYPE ARTIKELDATEN = STRUCT (TEXT artikelname, REAL preis, INT mindestbestand, bestand), KUNDENDATEN = STRUCT (TEXT nachname, vorname, geschlecht), WARENDATEI = ROW max artikel ARTIKELDATEN, KUNDENDATEI = ROW max kunden KUNDENDATEN, EINKAUFSDATEI = ROW max kunden ROW max artikel INT, VERKAUFSDATEI = ROW max artikel INT, FILIALDATEN = STRUCT (WARENDATEI waren, KUNDENDATEI kunden, EINKAUFSDATEI einkaeufe, VERKAUFSDATEI hitliste); KUNDENDATEI VAR kunde; WARENDATEI VAR artikel; EINKAUFSDATEI VAR einkaufsdatei; VERKAUFSDATEI VAR verkaufszahl; DATASPACE VAR ds; INT VAR codenummer, reply code; TASK VAR zentrale, verwaltung, absender; TEXT VAR hauptstelle :: "", filialnummer :: "0", filialverwaltungsname :: ""; PROC filialverwaltung: enable stop; IF pos (name (myself), ".Filialverwaltung") = 0 THEN errorstop ("Unzulaessiger Befehl!") FI; disable stop; REP wait (ds, codenummer, absender); bearbeite auftrag; send (absender, 0, ds); IF is error THEN clear error FI PER. bearbeite auftrag: IF codenummer <= max artikel THEN artikeldaten speichern ELIF codenummer <= max kundennr THEN kauf registrieren ELIF codenummer <= max kundennr + max kunden THEN kundendaten speichern ELIF codenummer = filialdaten holen code THEN filialdaten holen ELIF codenummer = filialdaten ergaenzen code THEN filialdaten ergaenzen; init ds ELIF codenummer = 256 THEN sperre task FI. sperre task: call (absender, 256, ds, codenummer). END PROC filialverwaltung; PROC artikeldaten speichern: BOUND ARTIKELDATEN VAR artikeldaten :: ds; artikel [codenummer] := artikeldaten; init ds END PROC artikeldaten speichern; PROC kauf registrieren: artikelnummer aus ds lesen; artikel [artikelnummer].bestand DECR 1; verkaufszahl [artikelnummer] INCR 1; IF kundennummer > 0 THEN einkaufsdatei [kundennummer][artikelnummer] INCR 1 FI. artikelnummer aus ds lesen: BOUND INT VAR nummer :: ds; INT CONST artikelnummer :: nummer, kundennummer :: codenummer - min kundennr + 1; init ds END PROC kauf registrieren; PROC kundendaten speichern: BOUND KUNDENDATEN VAR kundendaten :: ds; kunde [codenummer - min kundennr - max kunden + 1] := kundendaten END PROC kundendaten speichern; PROC filialdaten holen: init ds; BOUND FILIALDATEN VAR filialdaten :: ds; CONCR (filialdaten.waren) := CONCR (artikel); CONCR (filialdaten.kunden) := CONCR (kunde); CONCR (filialdaten.einkaeufe) := CONCR (einkaufsdatei); CONCR (filialdaten.hitliste) := CONCR (verkaufszahl) END PROC filialdaten holen; PROC filialdaten ergaenzen: BOUND FILIALDATEN VAR neue daten :: ds; INT VAR kundennummer, artikelnummer; ergaenze artikeldatei und verkaufszahlen; ergaenze kundendatei; ergaenze einkaufsdatei. ergaenze artikeldatei und verkaufszahlen: FOR artikelnummer FROM 1 UPTO max artikel REP verkaufszahl [artikelnummer] INCR neue daten.hitliste [artikelnummer]; IF artikel [artikelnummer].artikelname = "" THEN artikel [artikelnummer] := neue daten.waren [artikelnummer] FI PER. ergaenze kundendatei: FOR kundennummer FROM 1 UPTO max kunden REP IF kunde [kundennummer].nachname = "" THEN kunde [kundennummer] := neue daten.kunden [kundennummer] FI PER. ergaenze einkaufsdatei: FOR kundennummer FROM 1 UPTO max kunden REP FOR artikelnummer FROM 1 UPTO max artikel REP einkaufsdatei [kundennummer][artikelnummer] INCR neue daten.einkaeufe [kundennummer][artikelnummer] PER PER. END PROC filialdaten ergaenzen; OP := (ARTIKELDATEN VAR ziel, ARTIKELDATEN CONST quelle): CONCR (ziel) := CONCR (quelle) END OP :=; OP := (KUNDENDATEN VAR ziel, KUNDENDATEN CONST quelle): CONCR (ziel) := CONCR (quelle) END OP :=; PROC init ds: forget (ds); ds := nilspace END PROC init ds; (************************************************************************) PROC initialisiere verwaltung: hauptstelle := hauptstellenname; zentrale := task (hauptstelle + ".Zentrale"); filialnummer := text (channel (myself)); filialverwaltungsname := hauptstellenname + ".Filialverwaltung "; begin (filialverwaltungsname + filialnummer, PROC filialverwaltung, verwaltung) END PROC initialisiere verwaltung; PROC hole artikeldaten (INT CONST artikelnummer, TEXT VAR name, REAL VAR preis, INT VAR mindestbestand, bestand): enable stop; pruefe artikelnummer; hole daten. pruefe artikelnummer: INT CONST artikelindex :: artikelnummer - min artikelnr + 1; IF artikelindex < 1 OR artikelindex > max artikel THEN errorstop ("Unzulässige Artikelnummer!") FI. hole daten: name := artikel [artikelindex].artikelname; preis := artikel [artikelindex].preis; mindestbestand := artikel [artikelindex].mindestbestand; bestand := artikel [artikelindex].bestand. END PROC hole artikeldaten; PROC speichere artikeldaten (INT CONST artikelnummer, TEXT CONST name, REAL CONST preis, INT CONST mindestbestand, bestand): enable stop; pruefe artikelnummer; speichere daten; schicke kopie an verwaltung. pruefe artikelnummer: INT CONST artikelindex :: artikelnummer - min artikelnr + 1; IF artikelindex < 1 OR artikelindex > max artikel THEN errorstop ("Unzulässige Artikelnummer!") FI. speichere daten: artikel [artikelindex].artikelname := name; artikel [artikelindex].preis := preis; artikel [artikelindex].mindestbestand:= mindestbestand; artikel [artikelindex].bestand := bestand. schicke kopie an verwaltung: init ds; BOUND ARTIKELDATEN VAR artikeldaten :: ds; artikeldaten := artikel [artikelindex]; call (verwaltung, artikelindex, ds, reply code). END PROC speichere artikeldaten; PROC registriere verkauf (INT CONST kundennummer, artikelnummer): enable stop; pruefe daten; speichere daten; schicke kopie zur verwaltung. pruefe daten: INT VAR kundenindex :: kundennummer - min kundennr + 1, artikelindex :: artikelnummer - min artikelnr + 1; IF kundenindex < 0 OR kundenindex > max kunden THEN errorstop ("Unzulässige Kundennummer!") ELIF artikelindex < 1 OR artikelindex > max artikel THEN errorstop ("Unzulässige Artikelnummer!") FI. speichere daten: IF artikel [artikelindex].bestand > 0 THEN artikel [artikelindex].bestand DECR 1; verkaufszahl [artikelindex] INCR 1; IF kundenindex > 0 THEN trage evtl in einkaufsdatei ein FI FI. trage evtl in einkaufsdatei ein: IF kunde [kundenindex].nachname = "" THEN kundenindex := 0 ELSE einkaufsdatei [kundenindex][artikelindex] INCR 1 FI. schicke kopie zur verwaltung: init ds; BOUND INT VAR nummer :: ds; nummer := artikelindex; call (verwaltung, kundenindex + min kundennr - 1, ds, reply code). END PROC registriere verkauf; PROC hole kundendaten (INT CONST kundennummer, TEXT VAR nachname, vorname, geschlecht): enable stop; pruefe kundennummer; rufe zentrale an; uebergib die zentraldaten; IF aenderungen vorhanden THEN aktualisiere filialdaten FI; forget (ds). pruefe kundennummer: INT CONST index :: kundennummer - min kundennr + 1; IF index < 1 OR index > max kunden THEN errorstop ("Unzulässige Kundennummer!") FI. rufe zentrale an: init ds; call (zentrale, kundennummer, ds, reply code). aenderungen vorhanden: (kunde [index].nachname <> nachname ) OR (kunde [index].vorname <> vorname ) OR (kunde [index].geschlecht <> geschlecht). aktualisiere filialdaten: kunde [index] := daten von zentrale; call (verwaltung, kundennummer + max kunden, ds, reply code). uebergib die zentraldaten: BOUND KUNDENDATEN VAR daten von zentrale :: ds; nachname := daten von zentrale.nachname; vorname := daten von zentrale.vorname; geschlecht := daten von zentrale.geschlecht. END PROC hole kundendaten; PROC speichere kundendaten(INT CONST kundennummer, TEXT CONST nachname, vorname, geschlecht): enable stop; pruefe kundennummer; IF kundendaten geaendert THEN speichere daten; schicke kopie an verwaltung und zentrale FI. pruefe kundennummer: IF kundennummer < min kundennr OR kundennummer > max kundennr THEN errorstop ("Unzulässige Kundennummer!") FI. kundendaten geaendert: INT CONST index :: kundennummer - min kundennr + 1; nachname <> kunde [index].nachname OR vorname <> kunde [index].vorname OR geschlecht <> kunde [index].geschlecht. speichere daten: kunde [index].nachname := nachname; kunde [index].vorname := vorname; kunde [index].geschlecht := geschlecht. schicke kopie an verwaltung und zentrale: init ds; BOUND KUNDENDATEN VAR kundendaten :: ds; kundendaten := kunde [index]; call (verwaltung, kundennummer + max kunden, ds, reply code); call (zentrale, kundennummer - min kundennr + 1, ds, reply code); forget (ds). END PROC speichere kundendaten; PROC sichere filialdaten (TEXT CONST name): enable stop; filialdaten holen; type (ds, 1951); forget (name, quiet); copy (ds, name); forget (ds) END PROC sichere filialdaten; PROC lade filialdaten (TEXT CONST name): enable stop; forget (ds); ds := old (name); IF type (ds) = 1951 THEN filialdaten ergaenzen; kopie an verwaltung schicken; kopie der kundendatei an zentrale schicken ELSE errorstop ("'" + name + "' enthält keine Filialdaten!") FI. kopie an verwaltung schicken: call (verwaltung, filialdaten ergaenzen code, ds, reply code). kopie der kundendatei an zentrale schicken: BOUND KUNDENDATEI VAR kundendatei :: ds; CONCR (CONCR (kundendatei)) := CONCR (kunde); call (zentrale, zentrale kundendatei ergaenzen code, ds, reply code). END PROC lade filialdaten; PROC hole bestelliste (FILE VAR f): bereite datei vor; schreibe daten in datei. bereite datei vor: forget("Nachbestellung",quiet); f := sequential file (output, "Nachbestellung"); line (f); write (f, " Nachbestellungen für " + invers ("Filiale " + filialnummer)+":"); line; write (f, " =================================================="); line (f, 2); write (f, " | Art.Nr. | Artikelname | Anzahl |"); line (f); write (f, " +----------+-------------------------+-----------+"); line (f). schreibe daten in datei: INT VAR artikelnummer; FOR artikelnummer FROM 1 UPTO max artikel REP IF artikel[artikelnummer].bestand < artikel[artikelnummer].mindestbestand THEN bestelle artikel nach FI PER; write (f, " +----------+-------------------------+-----------+"); line (f). bestelle artikel nach: write (f, " | " + wirkliche artikelnummer + " | " + text (artikel [artikelnummer].artikelname, 23) + " | " + text (nachzubestellende anzahl, 6) + " |"); line (f); artikel [artikelnummer].bestand := 2 * artikel [artikelnummer].mindestbestand. wirkliche artikelnummer: text (artikelnummer + min artikelnr - 1, 5). nachzubestellende anzahl: 2 * artikel [artikelnummer].mindestbestand - artikel [artikelnummer].bestand. END PROC hole bestelliste; PROC hole auskunft ein (INT CONST codenummer, artikel oder kundennummer, FILE VAR f): enable stop; hauptstelle := hauptstellenname; SELECT codenummer OF CASE 66 : hitliste von zentrale (f) CASE 67 : hitliste von filiale (f) CASE 68 : hitlisten aller filialen (f) (* --------------------------------------------- *) CASE 73 : artikelkaeuferliste von zentrale (artikel oder kundennummer, f) CASE 74 : artikelkaeuferliste von filiale (artikel oder kundennummer, f) CASE 75 : artikelkaeuferlisten aller filialen (artikel oder kundennummer, f) (* --------------------------------------------- *) CASE 77 : kundenliste von zentrale (f) CASE 78 : kundenliste von filiale (f) CASE 79 : kundenlisten aller filialen (f) (* --------------------------------------------- *) CASE 84 : kundeneinkaufsliste von zentrale (artikel oder kundennummer, f) CASE 85 : kundeneinkaufsliste von filiale (artikel oder kundennummer, f) CASE 86 : kundeneinkaufslisten aller filialen (artikel oder kundennummer, f) (* --------------------------------------------- *) CASE 89 : lageruebersicht von zentrale (f) CASE 90 : lageruebersicht von filiale (f) CASE 91 : lageruebersichten aller filialen (f) (* --------------------------------------------- *) OTHERWISE errorstop ("Unzulässige Code - Nummer bei Auskunft!") END SELECT END PROC hole auskunft ein; PROC hitliste von zentrale (FILE VAR f): INT VAR filialnr; beginne mit eigener filiale; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr <> int (filialnummer) CAND exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten in zentralliste FI PER; werte zentralliste aus. beginne mit eigener filiale: WARENDATEI VAR zentrale warendatei; CONCR (zentrale warendatei) := CONCR (artikel); VERKAUFSDATEI VAR zentrale verkaufsdatei; CONCR (zentrale verkaufsdatei) := CONCR (verkaufszahl). hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code); BOUND FILIALDATEN VAR aktuelle daten :: ds. schreibe daten in zentralliste: INT VAR i; FOR i FROM 1 UPTO max artikel REP IF zentrale warendatei [i].artikelname = "" THEN zentrale warendatei [i] := aktuelle daten.waren [i] FI; zentrale verkaufsdatei [i] INCR aktuelle daten.hitliste [i] PER. werte zentralliste aus: forget (ds); forget ("Auskunft: Zentrale", quiet); f := sequential file (output, "Auskunft: Zentrale"); line (f); write (f, " Zentrale Warenliste, geordnet nach Verkaufszahlen:"); sortiere (zentrale warendatei, zentrale verkaufsdatei); fuelle (f, zentrale warendatei, zentrale verkaufsdatei). END PROC hitliste von zentrale; PROC hitliste von filiale (FILE VAR f): bereite auskunftsdatei vor; kopiere artikeldatei und verkaufsdatei; sortiere (hilfsdatei artikel, hilfsdatei verkaufszahlen); fuelle (f,hilfsdatei artikel, hilfsdatei verkaufszahlen). kopiere artikeldatei und verkaufsdatei: WARENDATEI VAR hilfsdatei artikel; CONCR (hilfsdatei artikel) := CONCR (artikel); VERKAUFSDATEI VAR hilfsdatei verkaufszahlen; CONCR (hilfsdatei verkaufszahlen) := CONCR (verkaufszahl). bereite auskunftsdatei vor: forget ("Auskunft: Filiale " + filialnummer, quiet); f := sequential file (output, "Auskunft: Filiale " + filialnummer); line (f); write (f, " Warenliste, geordnet nach Verkaufszahlen:"). END PROC hitliste von filiale; PROC hitlisten aller filialen (FILE VAR f): WARENDATEI VAR aktuelle warendatei; VERKAUFSDATEI VAR aktuelle verkaufsdatei; INT VAR filialnr; bereite auskunftsdatei vor; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr = int (filialnummer) THEN nimm eigene daten ELIF exists task (aktuelle verwaltung) THEN hole daten dieser filiale; arbeite mit diesen daten FI PER; forget (ds). bereite auskunftsdatei vor: forget ("Auskunft: Alle Filialen", quiet); f := sequential file (output, "Auskunft: Alle Filialen"); line (f). nimm eigene daten: CONCR (aktuelle warendatei) := CONCR (artikel); CONCR (aktuelle verkaufsdatei) := CONCR (verkaufszahl); sortiere und fuelle. sortiere und fuelle: write (f, " Warenliste von " + invers ("Filiale " + text (filialnr)) + ", geordnet nach Verkaufszahlen:"); sortiere (aktuelle warendatei, aktuelle verkaufsdatei); fuelle (f,aktuelle warendatei, aktuelle verkaufsdatei). hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code); BOUND FILIALDATEN VAR aktuelle daten :: ds. arbeite mit diesen daten: CONCR (aktuelle warendatei) := CONCR (aktuelle daten.waren); CONCR (aktuelle verkaufsdatei) := CONCR (aktuelle daten.hitliste); sortiere und fuelle. END PROC hitlisten aller filialen; PROC sortiere (WARENDATEI VAR warendatei, VERKAUFSDATEI VAR stueckzahl): INT VAR i,j; FOR i FROM 1 UPTO max artikel - 1 REP FOR j FROM i + 1 UPTO max artikel REP IF stueckzahl [i] < stueckzahl [j] THEN vertausche FI PER PER. vertausche: INT CONST hilfsint :: stueckzahl [i]; ARTIKELDATEN CONST hilfsartikel :: warendatei [i]; stueckzahl [i] := stueckzahl [j]; warendatei [i] := warendatei [j]; stueckzahl [j] := hilfsint; warendatei [j] := hilfsartikel. END PROC sortiere; PROC fuelle (FILE VAR f, WARENDATEI VAR warendat, VERKAUFSDATEI VAR anzahl): INT VAR nummer, platz :: 0; bereite datei vor; schreibe daten in datei. bereite datei vor: line (f); write(f," ============================================================"); line (f,2); write(f," | Platz | Verk.Anzahl | Artikelname | Preis |"); line (f); write(f," +-------+-------------+------------------------+-----------+"); line (f). schreibe daten in datei: FOR nummer FROM 1 UPTO max artikel REP IF warendat [nummer].artikelname <> "" THEN schreibe in datei; line (f) FI PER; write(f," +-------+-------------+------------------------+-----------+"); line (f,3). schreibe in datei: platz INCR 1; write (f, " |" + text (platz, 5) + " |" + text (anzahl [nummer], 9) + " | " + text (warendat [nummer].artikelname, 22) + " | " + text (warendat [nummer].preis,8,2) + " |"). END PROC fuelle; PROC artikelkaeuferliste von zentrale (INT CONST artikelnummer, FILE VAR f): INT VAR filialnr; pruefe artikelnummer; beginne mit eigener filiale; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr <> int (filialnummer) CAND exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten in zentralliste FI PER; werte zentralliste aus. pruefe artikelnummer: INT CONST artikelindex :: artikelnummer - min artikelnr + 1; IF artikelindex < 1 OR artikelindex > max artikel THEN errorstop ("Unzulässige Artikelnummer!") FI. beginne mit eigener filiale: TEXT VAR aktueller artikelname :: artikel [artikelindex].artikelname; KUNDENDATEI VAR hilfsdatei; CONCR (hilfsdatei) := CONCR (kunde); ROW max kunden INT VAR kaeufe; INT VAR i; FOR i FROM 1 UPTO max kunden REP kaeufe [i] := einkaufsdatei [i][artikelindex] PER. hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code). schreibe daten in zentralliste: BOUND FILIALDATEN VAR aktuelle daten :: ds; IF aktueller artikelname = "" THEN aktueller artikelname := aktuelle daten.waren [artikelindex].artikelname FI; FOR i FROM 1 UPTO max kunden REP kaeufe [i] INCR aktuelle daten.einkaeufe [i][artikelindex]; IF hilfsdatei [i].nachname = "" THEN hilfsdatei [i] := aktuelle daten.kunden [i] FI PER. werte zentralliste aus: forget (ds); forget ("Auskunft: Zentrale", quiet); f := sequential file (output, "Auskunft: Zentrale"); line (f); IF aktueller artikelname = "" THEN write (f, " Der Artikel Nr. " + text (artikelindex) + " wird in keiner Filiale geführt."); line (f); write(f, " ============================================================"); line (f,3); ELSE write (f, " Gesamtkäuferliste des Artikels " + invers (aktueller artikelname) + ":"); fuelle (f, hilfsdatei, kaeufe) FI. END PROC artikelkaeuferliste von zentrale; PROC artikelkaeuferliste von filiale (INT CONST artikelnummer, FILE VAR f): pruefe artikelnummer; kopiere einkaufszahlen in hilfsliste; erstelle filialliste. pruefe artikelnummer: INT CONST artikelindex :: artikelnummer - min artikelnr + 1; IF artikelindex < 1 OR artikelindex > max artikel THEN errorstop ("Unzulässige Artikelnummer!") FI. kopiere einkaufszahlen in hilfsliste: ROW max kunden INT VAR kaeufe; INT VAR i; FOR i FROM 1 UPTO max kunden REP kaeufe [i] := einkaufsdatei [i][artikelindex] PER. erstelle filialliste: forget ("Auskunft: Filiale " + filialnummer, quiet); f := sequential file (output, "Auskunft: Filiale " + filialnummer); line (f); IF artikel [artikelindex].artikelname = "" THEN write (f, " Der Artikel Nr. " + text (artikelindex) + " wird in dieser Filiale nicht geführt."); line (f); write(f, " ============================================================"); line (f,3); ELSE write (f, " Käufer des Artikels " + invers (artikel [artikelindex].artikelname) + ":"); fuelle (f, kunde, kaeufe) FI. END PROC artikelkaeuferliste von filiale; PROC artikelkaeuferlisten aller filialen(INT CONST artikelnummer,FILE VAR f): INT VAR i, filialnr; ROW max kunden INT VAR kaeufe; pruefe artikelnummer; bereite datei vor; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr = int (filialnummer) THEN kopiere eigene einkaufszahlen in hilfsliste; schreibe eigene daten in auskunftsdatei ELIF exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten in auskunftsdatei FI PER; forget (ds). pruefe artikelnummer: INT CONST artikelindex :: artikelnummer - min artikelnr + 1; IF artikelindex < 1 OR artikelindex > max artikel THEN errorstop ("Unzulässige Artikelnummer!") FI. bereite datei vor: forget ("Auskunft: Alle Filialen", quiet); f := sequential file (output, "Auskunft: Alle Filialen"); line (f). kopiere eigene einkaufszahlen in hilfsliste: FOR i FROM 1 UPTO max kunden REP kaeufe [i] := einkaufsdatei [i][artikelindex] PER. schreibe eigene daten in auskunftsdatei: IF artikel [artikelindex].artikelname = "" THEN write (f, " Der Artikel Nr. " + text (artikelindex) + " wird in " + invers ("Filiale " + filialnummer) + " nicht geführt."); line (f); write(f, " ============================================================"); line (f,3) ELSE write (f, " Käufer des Artikels '" + artikel [artikelindex].artikelname + "' in " + invers ("Filiale " + filialnummer) + ":"); fuelle(f, kunde, kaeufe) FI. hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code); BOUND FILIALDATEN VAR aktuelle daten :: ds; TEXT CONST aktueller artikelname := aktuelle daten.waren [artikelindex].artikelname FOR i FROM 1 UPTO max kunden REP kaeufe [i] := aktuelle daten.einkaeufe [i][artikelindex]; PER. schreibe daten in auskunftsdatei: IF aktueller artikelname = "" THEN write (f, " Der Artikel Nr. " + text (artikelindex) + " wird in " + invers ("Filiale " + text (filialnr)) + " nicht geführt."); line (f); write(f, " ============================================================"); line (f,3) ELSE write (f, " Käufer des Artikels '" + aktueller artikelname + "' in " + invers ("Filiale " + text(filialnr)) + ":"); fuelle(f, aktuelle daten.kunden, kaeufe) FI. END PROC artikelkaeuferlisten aller filialen; PROC fuelle (FILE VAR f, KUNDENDATEI CONST kundenliste, ROW max kunden INT CONST einkaufszahlen): INT VAR kundennummer; bereite datei vor; schreibe daten in datei. bereite datei vor: line (f); write(f," ============================================================"); line (f, 2); write(f," | Anzahl | Nachname, Vorname | Geschlecht |"); line (f); write(f," +--------+------------------------------------+------------+"); line (f). schreibe daten in datei: FOR kundennummer FROM 1 UPTO max kunden REP IF einkaufszahlen [kundennummer] > 0 THEN schreibe in datei; line (f); FI PER; write(f," +--------+------------------------------------+------------+"); line (f, 3). schreibe in datei: write(f," |" + text(einkaufszahlen [kundennummer], 5) + " | " + text(kundenliste [kundennummer].nachname + ",", 17) + " " + text(kundenliste [kundennummer].vorname, 16) + " | "); IF kundenliste [kundennummer].geschlecht = "m" THEN write (f, " männlich |") ELIF kundenliste [kundennummer].geschlecht = "w" THEN write (f, " weiblich |") ELSE write (f, " |") FI. END PROC fuelle; PROC kundenliste von zentrale (FILE VAR f): hole kundenliste von zentrale; bereite datei vor; schreibe daten in datei. hole kundenliste von zentrale: init ds; call (zentrale, zentrale kundendatei holen code, ds, reply code); BOUND KUNDENDATEI VAR zentrale kundenliste :: ds. bereite datei vor: forget ("Auskunft: Zentrale", quiet); f := sequential file (output, "Auskunft: Zentrale"); line (f); write (f, " Zentrale Kundenliste:"). schreibe daten in datei: fuelle (f, zentrale kundenliste); forget (ds). END PROC kundenliste von zentrale; PROC kundenliste von filiale (FILE VAR f): bereite datei vor; schreibe daten in datei. bereite datei vor: forget ("Auskunft: Filiale " + filialnummer, quiet); f := sequential file (output, "Auskunft: Filiale " + filialnummer); line (f); write (f," Kundenliste:"). schreibe daten in datei: fuelle (f, kunde). END PROC kundenliste von filiale; PROC kundenlisten aller filialen (FILE VAR f): INT VAR filialnr; bereite datei vor; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr = int (filialnummer) THEN schreibe eigene daten in auskunftsdatei ELIF exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten dieser filiale in auskunftsdatei FI PER. bereite datei vor: forget ("Auskunft: Alle Filialen", quiet); f := sequential file (output, "Auskunft: Alle Filialen"); line (f). schreibe eigene daten in auskunftsdatei: schreibe ueberschrift; fuelle (f, kunde). hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code); BOUND FILIALDATEN VAR aktuelle filialdaten :: ds. schreibe daten dieser filiale in auskunftsdatei: schreibe ueberschrift; fuelle (f, aktuelle filialdaten.kunden). schreibe ueberschrift: write (f, " Kundenliste für " + invers ("Filiale " + text (filialnr)) + ":"). END PROC kundenlisten aller filialen; PROC fuelle (FILE VAR f, KUNDENDATEI VAR kundendatei): INT VAR kundennummer; bereite datei vor; schreibe daten in datei. bereite datei vor: line (f); write(f," ============================================================"); line (f,2); write(f," | Kun.Nr.| Nachname, Vorname | Geschlecht |"); line (f); write(f," +--------+------------------------------------+------------+"); line (f). schreibe daten in datei: FOR kundennummer FROM 1 UPTO max kunden REP IF kundendatei [kundennummer].nachname <> "" THEN schreibe in datei; line (f) FI PER; write(f," +--------+------------------------------------+------------+"); line (f, 3). schreibe in datei: write (f, " |" + text (kundennummer + min kundennummer - 1, 6) + " | " + text (kundendatei [kundennummer].nachname + ",", 17) + " " + text (kundendatei [kundennummer].vorname, 16) + " | "); IF kundendatei [kundennummer].geschlecht = "m" THEN write (f, " männlich |") ELIF kundendatei [kundennummer].geschlecht = "w" THEN write (f, " weiblich |") ELSE write (f, " |") FI. END PROC fuelle; PROC kundeneinkaufsliste von zentrale (INT CONST kundennummer, FILE VAR f): INT VAR filialnr; pruefe kundennummer; beginne mit eigener filiale; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr <> int (filialnummer) CAND exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten in zentralliste FI PER; werte zentralliste aus. pruefe kundennummer: INT CONST kundenindex :: kundennummer - min kundennr + 1; IF kundenindex < 1 OR kundenindex > max kunden THEN errorstop ("Unzulässige Kundennummer!") FI. beginne mit eigener filiale: KUNDENDATEN VAR aktueller kunde :: kunde [kundenindex]; WARENDATEI VAR hilfsdatei; CONCR (hilfsdatei) := CONCR (artikel); ROW max artikel INT VAR kaeufe; INT VAR i; FOR i FROM 1 UPTO max artikel REP kaeufe [i] := einkaufsdatei [kundenindex][i] PER. hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code). schreibe daten in zentralliste: BOUND FILIALDATEN VAR aktuelle daten :: ds; IF aktueller kunde.nachname = "" THEN aktueller kunde := aktuelle daten.kunden [kundenindex] FI; FOR i FROM 1 UPTO max artikel REP kaeufe [i] INCR aktuelle daten.einkaeufe [kundenindex][i]; IF hilfsdatei [i].artikelname = "" THEN hilfsdatei [i] := aktuelle daten.waren [i] FI PER. werte zentralliste aus: forget (ds); forget ("Auskunft: Zentrale", quiet); f := sequential file (output, "Auskunft: Zentrale"); line (f); IF aktueller kunde.nachname = "" THEN write (f, " Ein Kunde mit Nr. " + text (kundenindex) + " ist in keiner Filiale bekannt."); line (f); write(f, " ============================================================"); line (f,3); ELSE write (f, " Gesamteinkaufsliste " + anrede + invers (aktueller kundenname) + ":"); fuelle (f, hilfsdatei, kaeufe) FI. anrede: IF aktueller kunde.geschlecht = "m" THEN "des Kunden " ELIF aktueller kunde.geschlecht = "w" THEN "der Kundin " ELSE "von " FI. aktueller kundenname: (aktueller kunde.vorname SUB 1) + ". " + aktueller kunde.nachname. END PROC kundeneinkaufsliste von zentrale; PROC kundeneinkaufsliste von filiale (INT CONST kundennummer, FILE VAR f): pruefe kundennummer; erstelle filialliste. pruefe kundennummer: INT CONST kundenindex :: kundennummer - min kundennr + 1; IF kundenindex < 1 OR kundenindex > max kunden THEN errorstop ("Unzulässige Kundennummer!") FI. erstelle filialliste: forget ("Auskunft: Filiale " + filialnummer, quiet); f := sequential file (output, "Auskunft: Filiale " + filialnummer); line (f); IF kunde [kundenindex].nachname = "" THEN schicke leere liste zurueck ELSE schreibe dateikopf; fuelle (f, artikel, einkaufsdatei [kundenindex]) FI. schicke leere liste zurueck: write (f," Ein Kunde mit Nr. " + text (kundennummer) + " ist in " + "dieser Filiale nicht bekannt."); line (f); write (f, " ============================================================"); line (f,3). schreibe dateikopf: write (f, " Einkaufsliste " + anrede + invers ((kunde [kundenindex].vorname SUB 1) + ". " + kunde [kundenindex].nachname) + ":"). anrede: IF kunde [kundenindex].geschlecht = "m" THEN "des Kunden " ELIF kunde [kundenindex].geschlecht = "w" THEN "der Kundin " ELSE "von " FI. END PROC kundeneinkaufsliste von filiale; PROC kundeneinkaufslisten aller filialen (INT CONST kundennummer,FILE VAR f): INT VAR filialnr; pruefe kundennummer; bereite datei vor; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr = int (filialnummer) THEN schreibe eigene daten in auskunftsdatei ELIF exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten in auskunftsdatei FI PER; forget (ds). pruefe kundennummer: INT CONST kundenindex :: kundennummer - min kundennr + 1; IF kundenindex < 1 OR kundenindex > max kunden THEN errorstop ("Unzulässige Kundennummer!") FI. bereite datei vor: forget ("Auskunft: Alle Filialen", quiet); f := sequential file (output, "Auskunft: Alle Filialen"); line (f). schreibe eigene daten in auskunftsdatei: IF kunde [kundenindex].nachname = "" THEN write (f," Ein Kunde mit Nr. " + text (kundennummer) + " ist in " + invers ("Filiale " + filialnummer) + " nicht bekannt."); line (f); write(f, " ============================================================"); line (f,3) ELSE write (f, " Einkaufsliste " + anrede hier + (kunde [kundenindex].vorname SUB 1) + ". " + kunde [kundenindex].nachname + " in " + invers ("Filiale " + filialnummer) + ":"); fuelle (f, artikel, einkaufsdatei [kundenindex]) FI. anrede hier: IF kunde [kundenindex].geschlecht = "m" THEN "des Kunden " ELIF kunde [kundenindex].geschlecht = "w" THEN "der Kundin " ELSE "von " FI. hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code); BOUND FILIALDATEN VAR aktuelle daten :: ds; KUNDENDATEN CONST aktueller kunde := aktuelle daten.kunden [kundenindex]. schreibe daten in auskunftsdatei: IF aktueller kunde.nachname = "" THEN write (f," Ein Kunde mit Nr. " + text (kundennummer) + " ist in " + invers ("Filiale " + text (filialnr)) + " nicht bekannt."); line (f); write(f, " ============================================================"); line (f,3) ELSE write (f, " Einkaufsliste " + anrede + (aktueller kunde.vorname SUB 1) + ". " + aktueller kunde.nachname + " in " + invers ("Filiale " + text (filialnr)) + ":"); fuelle (f, aktuelle daten.waren, aktuelle daten.einkaeufe [kundenindex]) FI. anrede: IF aktueller kunde.geschlecht = "m" THEN "des Kunden " ELIF aktueller kunde.geschlecht = "w" THEN "der Kundin " ELSE "von " FI. END PROC kundeneinkaufslisten aller filialen; PROC fuelle (FILE VAR f, WARENDATEI CONST warendatei, ROW max artikel INT CONST einkaufszahlen): INT VAR artikelnummer; REAL VAR gesamtpreis, summe :: 0.0; bereite datei vor; schreibe daten in datei. bereite datei vor: line (f); write(f," ============================================================"); line (f,2); write(f," | Art.Nr.| Artikelname | Anzahl | Preis | Gesamt |"); line (f); write(f," +--------+-------------------+--------+---------+----------+"); line (f). schreibe daten in datei: FOR artikelnummer FROM 1 UPTO max artikel REP IF einkaufszahlen [artikelnummer] > 0 THEN schreibe in datei; line (f) FI PER; write(f," +--------+-------------------+--------+---------+----------+"); line (f); write(f," Summe: " + text (summe,8,2)); line (f, 3). schreibe in datei: gesamtpreis := real (einkaufszahlen [artikelnummer]) * warendatei [artikelnummer].preis; summe INCR gesamtpreis; write (f," |" + text(artikelnummer,5) + " | " + text(warendatei [artikelnummer].artikelname,17) + " | " + text(einkaufszahlen [artikelnummer],4) + " |" + text(warendatei [artikelnummer].preis,7,2) + " |" + text(gesamtpreis,8,2) + " |"). END PROC fuelle; PROC lageruebersicht von zentrale (FILE VAR f): INT VAR filialnr; beginne mit eigener filiale; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr <> int (filialnummer) CAND exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten in zentralliste FI PER; werte zentralliste aus. beginne mit eigener filiale: WARENDATEI VAR hilfsdatei; CONCR (hilfsdatei) := CONCR (artikel). hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code). schreibe daten in zentralliste: BOUND FILIALDATEN VAR aktuelle daten :: ds; INT VAR i; FOR i FROM 1 UPTO max artikel REP IF hilfsdatei [i].artikelname = "" THEN hilfsdatei [i] := aktuelle daten.waren [i] ELSE hilfsdatei [i].mindestbestand INCR aktuell.mindestbestand; hilfsdatei [i].bestand INCR aktuell.bestand FI PER. aktuell: aktuelle daten.waren [i]. werte zentralliste aus: forget (ds); forget ("Auskunft: Zentrale", quiet); f := sequential file (output, "Auskunft: Zentrale"); line (f); write (f, " Zentrale Lagerübersicht:"); fuelle (f, hilfsdatei). END PROC lageruebersicht von zentrale; PROC lageruebersicht von filiale (FILE VAR f): forget ("Auskunft: Filiale " + filialnummer, quiet); f := sequential file (output, "Auskunft: Filiale " + filialnummer); schreibe dateikopf; fuelle (f, artikel). schreibe dateikopf: line (f); write (f, " Lagerübersicht:"). END PROC lageruebersicht von filiale; PROC lageruebersichten aller filialen (FILE VAR f): INT VAR filialnr; bereite datei vor; FOR filialnr FROM 1 UPTO max filialen REP TEXT CONST aktuelle verwaltung :: hauptstelle + ".Filialverwaltung " + text (filialnr); IF filialnr = int (filialnummer) THEN schreibe eigene daten in auskunftsdatei ELIF exists task (aktuelle verwaltung) THEN hole daten dieser filiale; schreibe daten in auskunftsdatei FI PER; forget (ds). bereite datei vor: forget ("Auskunft: Alle Filialen", quiet); f := sequential file (output, "Auskunft: Alle Filialen"). schreibe eigene daten in auskunftsdatei: line (f); write (f, " Lagerübersicht für " + invers ("Filiale " + filialnummer) + ":"); fuelle (f, artikel). hole daten dieser filiale: init ds; call (task(aktuelle verwaltung), filialdaten holen code, ds, reply code); BOUND FILIALDATEN VAR aktuelle daten :: ds. schreibe daten in auskunftsdatei: line (f); write (f, " Lagerübersicht für " + invers ("Filiale " + text (filialnr)) + ":"); fuelle (f, aktuelle daten.waren). END PROC lageruebersichten aller filialen; PROC fuelle (FILE VAR f, WARENDATEI CONST warendatei): INT VAR artikelnummer; bereite datei vor; schreibe daten in datei. bereite datei vor: line (f); write(f," ============================================================"); line (f,2); write(f," | Art.Nr.| Artikelname | Preis | Min.Best.| Bestand |"); line (f); write(f," +--------+-------------------+--------+----------+---------+"); line (f). schreibe daten in datei: FOR artikelnummer FROM 1 UPTO max artikel REP IF warendatei[artikelnummer].artikelname <> "" THEN schreibe in datei; line (f) FI PER; write(f," +--------+-------------------+--------+----------+---------+"); line (f, 3). schreibe in datei: write (f, " |" + text(artikelnummer,5) + " | " + text(warendatei[artikelnummer].artikelname,17) + " |" + text(warendatei[artikelnummer].preis,7,2) + " | " + text(warendatei[artikelnummer].mindestbestand,6)+" | " + text(warendatei[artikelnummer].bestand,6) + " |"). END PROC fuelle; PROC initialisiere dateien: INT VAR kundennummer, artikelnummer; FOR kundennummer FROM 1 UPTO max kunden REP kunde [kundennummer].nachname := ""; kunde [kundennummer].vorname := ""; kunde [kundennummer].geschlecht := "" PER; FOR artikelnummer FROM 1 UPTO max artikel REP verkaufszahl [artikelnummer] := 0; artikel [artikelnummer].mindestbestand := 0; artikel [artikelnummer].bestand := 0; artikel [artikelnummer].artikelname := ""; artikel [artikelnummer].preis := 0.0; FOR kundennummer FROM 1 UPTO max kunden REP einkaufsdatei[kundennummer][artikelnummer] := 0 PER; PER END PROC initialisiere dateien; initialisiere dateien END PACKET ls warenhaus 2