summaryrefslogtreecommitdiff
path: root/app/schulis/2.2.1/src/5.drucken
blob: 9b775ff208535b51061e70d176ed35ab8c69ef29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
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<zeilenREP druckeeineseitebiszudieserspaltePER .erzeugelinie:
linie:=twaagerecht+twaagerecht+tkreuz;FOR aktspalteFROM gedrucktespalten+1
UPTO letztespalteREP linieCAT (breiten[aktspalte]*twaagerecht);linieCAT 
tkreuz;PER .druckeeineseitebiszudieserspalte:zeilenbisseitenende:=drucklaenge
(anzahlkopfzeilen);druckkopfschreiben;spaltenkopfschreiben;WHILE 
zeilenbisseitenende>=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)<druckbreiteREP kopflinieCAT twaagerecht;PER ;initspalten;
setzespaltentrenner(tsenkrecht);setzespaltenbreite(4);setzespaltenbreite(8);
setzespaltenbreite(4);setzespaltenbreite(6);deffeldbreite:=druckbreite-length
(tabelleleer).druckeeineseite:zeilenbisseitenende:=drucklaenge(
anzahlkopfzeilen);druckkopfschreiben;tabellenkopfschreiben;WHILE 
zeilenbisseitenende>=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 zeilenende<length(dateizeile)REP benoetigtezeilenINCR 1;
gehezurueckzumwortende(dateizeile,zeilenende);zeilenendeINCR deffeldbreite+1;
PER .schreibedasfeld:zeilenende:=5+deffeldbreite;gehezurueckzumwortende(
dateizeile,zeilenende);druckzeileschreiben(zeile+tsenkrecht+space+subtext(
dateizeile,6,zeilenende));zeilenbisseitenendeDECR 1;WHILE zeilenende<length(
dateizeile)REP dateizeile:=subtext(dateizeile,zeilenende+2);zeilenende:=
deffeldbreite;gehezurueckzumwortende(dateizeile,zeilenende);
druckzeileschreiben(tabelleleer+subtext(dateizeile,1,zeilenende));
zeilenbisseitenendeDECR 1;PER .END PROC druckestatdef;PROC 
gehezurueckzumwortende(TEXT CONST dateizeile,INT VAR zeilenende):INT VAR 
naechsteszeichen;IF zeilenende<length(dateizeile)CAND NOT amwortendeTHEN REP 
findewortende;UNTIL NOT hieristeinsamesquotePER ;zeilenende:=max(15,
zeilenende);FI .findewortende:REP zeilenendeDECR 1;UNTIL amwortendeOR 
zeilenende<1PER .amwortende:(dateizeileSUB zeilenende)<>spaceAND (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;