diff options
Diffstat (limited to 'warenhaus/ls-Warenhaus 2')
-rw-r--r-- | warenhaus/ls-Warenhaus 2 | 1257 |
1 files changed, 0 insertions, 1257 deletions
diff --git a/warenhaus/ls-Warenhaus 2 b/warenhaus/ls-Warenhaus 2 deleted file mode 100644 index f7a9945..0000000 --- a/warenhaus/ls-Warenhaus 2 +++ /dev/null @@ -1,1257 +0,0 @@ -(* - - ********************************************************** - ********************************************************** - ** ** - ** 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 - - |