PACKET druckenDEFINES statdrucken:LET statistikdatei="STATISTIK.", statistikserver="statistik server",erstedruckdatei="liste.1",druckdatei= "liste.",maxstatistiken=200,statistikvorzeilen=3,niltext="",space=" ",quote= """",edittasten="vr",statistiktext="Statistik Nr. ",stichtagtext="Stichtag: " ,definitiontext="Definition der Statistik Nr. ",groessetext= "Größe: Zeilen, Spalten",tabellentext= "Feld Z / Sp Art Länge Definition",tabellenlinie= "----+--------+----+------+----------",tabelleleer= " ",prozenttext=" %",meldungzusatz="+",mgibtesnicht =477,fstatnr=2,fmini=3,fstd=4,fscreen=5,fprinter=6,tsenkrecht=":",twaagerecht ="-",tkreuz="+",tschraeg="/",pruefeimintervall=3,pruefenureinkreuz=5, minspaltenbreite=4,maxspalten=50,KONST =STRUCT (BOOL def,TEXT maske,INT mvorbereiten,mdrucken,mnichtdrucken);KONST VAR druck;BOOL VAR ausgabebildschirm,ausgabeminimal;TEXT VAR druckstatistik;ROW maxspaltenINT VAR breiten;INT VAR zeilen,spalten,felder;FILE VAR stat;PROC statdrucken( BOOL CONST defdrucken,INT CONST was):INT VAR status:=0;IF defdruckenTHEN druck:=KONST :(TRUE ,"mst statistik drucken",484,498,499);ELSE druck:=KONST : (FALSE ,"mst statistik ausgeben",481,482,483);FI ;SELECT wasOF CASE 1: druckenexecCASE 2:druckenlistezeigenCASE 3:druckenlisteexecCASE 4:ausdrucken; enter(1)CASE 5:ausdrucken;leave(2)CASE 6:nichtdrucken;enter(1);CASE 7: nichtdrucken;leave(2);END SELECT .druckenexec:standardpruefe( pruefeimintervall,fstatnr,1,maxstatistiken,niltext,status);IF NOT alleeingabenkorrektTHEN leave(1);ELIF NOT exists(gewaehltestatistik,task( statistikserver))THEN standardmeldung(mgibtesnicht,standardmaskenfeld(2)+ meldungzusatz);infeld(fstatnr);leave(1);ELSE drucken(text(int( standardmaskenfeld(fstatnr))));IF NOT ausgabebildschirmTHEN leave(1);FI ;FI . gewaehltestatistik:statistikdatei+text(int(standardmaskenfeld(fstatnr))). druckenlistezeigen:status:=0;IF alleeingabenkorrektTHEN statlistezeigen(int( standardmaskenfeld(fstatnr)));ELSE leave(1);FI .druckenlisteexec:IF ausgabebildschirmTHEN statlistebearbeiten(druck.maske);IF statlisteeintrag> niltextTHEN drucken(statlisteeintrag);ELSE leave(2);FI ;ELSE statlistebearbeiten(druck.maske);WHILE statlisteeintrag>niltextREP drucken( statlisteeintrag);statlistebearbeiten(druck.maske);PER ;leave(2);FI . alleeingabenkorrekt:IF status=0THEN standardpruefe(pruefenureinkreuz,fmini, fstd,0,niltext,status);FI ;IF druck.defTHEN ausgabebildschirm:= standardmaskenfeld(fmini)<>niltext;ELSE IF status=0THEN standardpruefe( pruefenureinkreuz,fscreen,fprinter,0,niltext,status);FI ;ausgabeminimal:= standardmaskenfeld(fmini)<>niltext;ausgabebildschirm:=standardmaskenfeld( fscreen)<>niltext;FI ;IF status>0THEN infeld(status)FI ;status=0.ausdrucken: standardmeldung(druck.mdrucken,druckstatistik+meldungzusatz); druckdateibehandeln(PROC (TEXT CONST )print);druckdateibehandeln(PROC (TEXT CONST )forget).nichtdrucken:infeld(fstatnr);standardmaskenfeld(niltext, fstatnr);standardmeldung(druck.mnichtdrucken,druckstatistik+meldungzusatz); druckdateibehandeln(PROC (TEXT CONST )forget).END PROC statdrucken;PROC drucken(TEXT CONST statistiknummer):statistiknummerIN fstatnr;infeld(fstatnr) ;standardmaskenfeld(niltext,fstatnr);erstellediedruckdatei;IF ausgabebildschirmTHEN druckstatistik:=statistiknummer;standardmeldung(niltext ,meldungzusatz);zeigedatei(erstedruckdatei,edittasten);ELSE standardmeldung( druck.mdrucken,statistiknummer+meldungzusatz);druckdateibehandeln(PROC (TEXT CONST )print);druckdateibehandeln(PROC (TEXT CONST )forget);FI . erstellediedruckdatei:standardmeldung(druck.mvorbereiten,statistiknummer+ meldungzusatz+meldungzusatz);druckdateibehandeln(PROC (TEXT CONST )forget); statistikladen(statistiknummer);druckvorbereiten;IF druck.defTHEN druckestatdef(statistiknummer);ELSE druckestatistik(statistiknummer);FI ; drucknachbereitenohneausdrucken;forget(statistikdatei+statistiknummer,quiet). END PROC drucken;PROC druckestatistik(TEXT CONST statistiknummer):TEXT VAR kopf1,kopf2,linie,dateizeile;BOOL VAR inhalt;INT VAR gedrucktespalten:=0, spaltendieseseite:=0,aktspalte,aktzeile,aktbreite,zeilenbisseitenende, gedrucktefelder:=0;seitenkopffestlegen;evtlspaltenbreitenverkuerzen;REP ermittlespaltendieseseite;druckeallezeilenbiszudieserspalte;gedrucktespalten INCR spaltendieseseite;UNTIL gedrucktespalten=spaltenPER .seitenkopffestlegen :toline(stat,1);readrecord(stat,kopf1);kopf1:=statistiktext+statistiknummer+ space+kopf1;toline(stat,statistikvorzeilen);readrecord(stat,kopf2);kopf2:= compress(kopf2);IF kopf2>niltextTHEN kopf2:=stichtagtext+kopf2FI ;inhalt:= kopf2>niltext;setzemitseitennummern(FALSE );initdruckkopf(kopf1,kopf2). evtlspaltenbreitenverkuerzen:IF ausgabeminimalTHEN FOR aktspalteFROM 1UPTO spaltenREP breiten[aktspalte]:=minspaltenbreite;PER FI . ermittlespaltendieseseite:initspalten;setzespaltentrenner(tsenkrecht); setzespaltenbreite(2);aktbreite:=3;spaltendieseseite:=0;REP spaltendieseseite INCR 1;aktbreiteINCR breiten[letztespalte];aktbreiteINCR 1;setzespaltenbreite (breiten[letztespalte]);UNTIL letztespalte>=spaltenCOR aktbreite+breiten[ letztespalte+1]>=druckbreitePER .letztespalte:gedrucktespalten+ spaltendieseseite.druckeallezeilenbiszudieserspalte:aktzeile:=0;erzeugelinie; WHILE aktzeile=benoetigtezeilenREP aktzeileINCR 1;einezeileschreiben; IF aktzeileMOD 2=0THEN gibstandaus(statistiknummer,gedrucktefelder,felder); FI ;UNTIL aktzeile>=zeilenPER ;seitenwechsel.anzahlkopfzeilen:IF inhaltTHEN 2 ELSE 1FI .benoetigtezeilen:IF ausgabeminimalTHEN 1ELSE 2FI . spaltenkopfschreiben:spaltenweise(niltext);FOR aktspalteFROM gedrucktespalten +1UPTO letztespalteREP spaltenweise(text(aktspalte,3));PER ; druckzeileschreiben(zeile+tsenkrecht);zeilenbisseitenendeDECR 1. einezeileschreiben:IF NOT ausgabeminimalTHEN druckzeileschreiben(linie); zeilenbisseitenendeDECR 1;FI ;spaltenweise(text(aktzeile,2));FOR aktspalte FROM gedrucktespalten+1UPTO letztespalteREP tragefeldinhalteinPER ; gedrucktefelderINCR spaltendieseseite;druckzeileschreiben(zeile+tsenkrecht); zeilenbisseitenendeDECR 1.tragefeldinhaltein:toline(stat,((aktzeile-1)* spalten)+aktspalte+3);readrecord(stat,dateizeile);IF (dateizeileSUB 5)="t" THEN dateizeile:=subtext(dateizeile,7,length(dateizeile)-1);changeall( dateizeile,quote+quote,quote);spaltenweise(dateizeile);ELIF inhaltTHEN spaltenweise(subtext(dateizeile,1,4));ELSE spaltenweise(niltext);FI .END PROC druckestatistik;PROC druckestatdef(TEXT CONST statistiknummer):TEXT VAR kopfname,kopfgroesse,kopflinie,dateizeile;INT VAR zeilenbisseitenende,aktfeld :=0,deffeldbreite,benoetigtezeilen,zeilenende;seitenkopffestlegen; tabellefestlegen;liesnaechstesfeld;REP druckeeineseiteUNTIL aktfeld>felder PER .seitenkopffestlegen:toline(stat,1);readrecord(stat,kopfname);kopfgroesse :=groessetext;replace(kopfgroesse,8,text(zeilen,2));replace(kopfgroesse,19, text(spalten,2));setzemitseitennummern(FALSE );initdruckkopf(definitiontext+ statistiknummer,kopfname).tabellefestlegen:kopflinie:=tabellenlinie;WHILE length(kopflinie)=benoetigtezeilenREP schreibedasfeld;IF aktfeldMOD 15=0 THEN gibstandaus(statistiknummer,aktfeld,felder);FI ;liesnaechstesfeld;UNTIL aktfeld>felderPER ;seitenwechsel.anzahlkopfzeilen:IF kopfname=niltextTHEN 1 ELSE 2FI .tabellenkopfschreiben:IF aktfeld<=1THEN druckzeileschreiben( kopfgroesse);druckzeileschreiben(niltext);zeilenbisseitenendeDECR 2;FI ; druckzeileschreiben(tabellentext);druckzeileschreiben(kopflinie); zeilenbisseitenendeDECR 2.liesnaechstesfeld:aktfeldINCR 1;IF aktfeld<=felder THEN toline(stat,aktfeld+3);readrecord(stat,dateizeile);spaltenweise(text( aktfeld,4));spaltenweise(zeileundspalte);spaltenweise(space+space+(dateizeile SUB 5));spaltenweise(text(breiten[aktspalte],5));benoetigtezeilen:=1;IF length(dateizeile)-5>deffeldbreiteTHEN zaehlebenoetigtezeilenFI ;FI . zeileundspalte:text(aktzeile,3)+tschraeg+text(aktspalte,3).aktzeile:(aktfeld- 1)DIV spalten+1.aktspalte:(aktfeld-1)MOD spalten+1.zaehlebenoetigtezeilen: zeilenende:=5+deffeldbreite;gehezurueckzumwortende(dateizeile,zeilenende); WHILE zeilenendespaceAND (dateizeile SUB (zeilenende+1))=space.hieristeinsamesquote:naechsteszeichen:=pos( dateizeile,"!","�",zeilenende+1);naechsteszeichen>0CAND (dateizeileSUB naechsteszeichen)=quote.END PROC gehezurueckzumwortende;PROC gibstandaus( TEXT CONST nummer,INT CONST wert,hundert):disablestop;INT VAR proz:=(wert*100 )DIV hundert;IF iserrorTHEN clearerror;proz:=int((real(wert)*100.0)/real( hundert));FI ;standardmeldung(druck.mvorbereiten,nummer+meldungzusatz+text( proz)+prozenttext+meldungzusatz);END PROC gibstandaus;PROC statistikladen( TEXT CONST statnummer):TEXT VAR dummy;INT VAR spaltenzaehler;forget( statistikdatei+statnummer,quiet);fetch(statistikdatei+statnummer,task( statistikserver));stat:=sequentialfile(input,statistikdatei+statnummer); getline(stat,dummy);get(stat,zeilen);get(stat,spalten);FOR spaltenzaehler FROM 1UPTO spaltenREP get(stat,breiten[spaltenzaehler]);PER ;modify(stat); felder:=zeilen*spalten;END PROC statistikladen;PROC druckdateibehandeln(PROC (TEXT CONST )machwas):INT VAR i;TEXT VAR name;commanddialogue(FALSE );get(all ,name,i);WHILE i>0REP IF subtext(name,1,length(druckdatei))=druckdateiTHEN machwas(name);FI ;get(all,name,i);PER ;commanddialogue(TRUE ).END PROC druckdateibehandeln;END PACKET drucken;