summaryrefslogtreecommitdiff
path: root/app/schulis/2.2.1/src/5.erstellen
blob: 902729d029ef5fdf5186a411fd8eecd4328661e8 (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
PACKET erstellenDEFINES staterstellen:LET datenbasisname="STATISTIK.basis",
statistikdatei="STATISTIK.",statistikserver="statistik server",maskeerstellen
="mst statistik erstellen",niltext="",space=" ",meldungzusatz="+",spaces=
"          ",sjoker="*",squote="""",sklammerzu=")",adate=2,erstedatenzeile=2,
defvorzeilen=3,fstatnr=2,fstichtag=3,datepos=14,mkeinebasis=471,mzahleingeben
=53,mgibtesnicht=477,mstatprozent=479,mstaterstellt=480,ogleich=1,ogroesser=2
,okleiner=3,ogroessergleich=4,okleinergleich=5,oungleich=6,oenthalten=7,olike
=8,maxvergleiche=25,ende=0,VERGLEICH =STRUCT (BOOL kursvergleich,INT operator
,von,bis,INT undvergleich,odervergleich,INT zweiterkursvergleich,TEXT text);
ROW maxvergleicheVERGLEICH VAR vergleiche;INT VAR anzahlvergleiche,verglpos;
TEXT VAR vergl,basiszeile;PROC staterstellen(INT CONST was):SELECT wasOF 
CASE 1:erstellenstartprocCASE 2:erstellenexecCASE 3:statlistezeigen(int(
standardmaskenfeld(fstatnr)))CASE 4:erstellenlisteexecEND SELECT .
erstellenstartproc:standardstartproc(maskeerstellen);statdatenbasisermitteln(
fstichtag);standardnproc.erstellenexec:IF NOT statdatenbasisvorhandenTHEN 
standardmeldung(mkeinebasis,niltext);ELIF int(standardmaskenfeld(fstatnr))<=0
THEN standardmaskenfeld(niltext,fstatnr);standardmeldung(mzahleingeben,
niltext);ELSE holedatenbasis;erstellen(standardmaskenfeld(fstatnr));
loeschedatenbasis;FI ;leave(1).erstellenlisteexec:statlistebearbeiten(
maskeerstellen);statdatenbasisermitteln(fstichtag);standardfelderausgeben;IF 
NOT statdatenbasisvorhandenTHEN standardmeldung(mkeinebasis,niltext);ELSE 
holedatenbasis;WHILE statlisteeintrag>niltextREP erstellen(statlisteeintrag);
statlistebearbeiten(maskeerstellen);PER ;loeschedatenbasis;FI ;
standardmaskenfeld(niltext,fstatnr);leave(2).END PROC staterstellen;PROC 
erstellen(TEXT CONST statistiknummer):BOOL VAR abbruch:=FALSE ;IF NOT exists(
gewaehltestatistik,task(statistikserver))THEN standardmeldung(mgibtesnicht,
statistiknummer+meldungzusatz);ELSE erstellestatistik;FI .erstellestatistik:
statistiknummerIN fstatnr;standardmaskenfeld(niltext,fstatnr);standardmeldung
(mstaterstellt,statistiknummer+meldungzusatz+"wird"+meldungzusatz);forget(
gewaehltestatistik,quiet);fetch(gewaehltestatistik,task(statistikserver));
fuelleallefelderaus;IF abbruchTHEN standardmeldung(mstaterstellt,
statistiknummer+meldungzusatz+"nicht"+meldungzusatz);ELSE commanddialogue(
FALSE );save(gewaehltestatistik,task(statistikserver));commanddialogue(TRUE )
;standardmeldung(mstaterstellt,statistiknummer+meldungzusatz+
standardmaskenfeld(fstichtag)+meldungzusatz);FI ;forget(gewaehltestatistik,
quiet).fuelleallefelderaus:FILE VAR basis:=sequentialfile(modify,
datenbasisname),stat:=sequentialfile(modify,gewaehltestatistik);INT VAR 
aktfeld,bearbeitetefelder:=0,felder:=lines(stat)-defvorzeilen;TEXT VAR 
dateizeile;fuellebedingungfelder;fuellesummenfelder;toline(stat,defvorzeilen)
;writerecord(stat,subtext(standardmaskenfeld(fstichtag),datepos)).
fuellebedingungfelder:toline(stat,defvorzeilen+1);col(stat,1);WHILE NOT eof(
stat)REP readrecord(stat,dateizeile);SELECT pos("bst",dateizeileSUB 5)OF 
CASE 1:wertebedingungausCASE 2:replace(dateizeile,1,"    ")OTHERWISE 
bearbeitetefelderINCR 1END SELECT ;writerecord(stat,dateizeile);down(stat);
UNTIL abbruchPER .fuellesummenfelder:toline(stat,defvorzeilen+1);WHILE NOT 
eof(stat)REP readrecord(stat,dateizeile);IF (dateizeileSUB 5)="s"THEN 
wertesummeausFI ;writerecord(stat,dateizeile);down(stat);UNTIL abbruchPER .
wertebedingungaus:replace(dateizeile,1,text(anzahlschueler(basis,subtext(
dateizeile,6)),4));gibprozentmeldungaus.wertesummeaus:aktfeld:=lineno(stat);
replace(dateizeile,1,text(summe(stat,subtext(dateizeile,6)),4));toline(stat,
aktfeld);gibprozentmeldungaus.gibprozentmeldungaus:bearbeitetefelderINCR 1;
disablestop;INT VAR proz:=(bearbeitetefelder*100)DIV felder;IF iserrorTHEN 
clearerror;proz:=int((real(bearbeitetefelder)*100.0)/real(felder));FI ;
enablestop;standardmeldung(mstatprozent,statistiknummer+meldungzusatz+text(
proz)+meldungzusatz);.gewaehltestatistik:statistikdatei+statistiknummer.END 
PROC erstellen;PROC holedatenbasis:forget(datenbasisname,quiet);fetch(
datenbasisname,task(statistikserver));END PROC holedatenbasis;PROC 
loeschedatenbasis:forget(datenbasisname,quiet);END PROC loeschedatenbasis;
INT PROC summe(FILE VAR stat,TEXT CONST formel):INT VAR summe:=0,posi:=1,
feldnr,faktor;REP faktor:=pos("+-",formelSUB posi);IF faktor>0THEN posiINCR 2
;FI ;feldnr:=int(subtext(formel,posi+1,posi+4));toline(stat,feldnr+3);IF 
faktor=2THEN summeDECR int(subtext(stat,1,4));ELSE summeINCR int(subtext(stat
,1,4));FI ;posi:=pos(formel,space,posi)+1;UNTIL posi<=1PER ;max(summe,0).END 
PROC summe;INT PROC anzahlschueler(FILE VAR basis,TEXT CONST bedingung):INT 
VAR erstervergleich,anzahl;liesallevergleiche;zaehledieschueler;anzahl.
liesallevergleiche:anzahlvergleiche:=0;verglpos:=1;vergl:=bedingung;
erstervergleich:=liesvergleich.zaehledieschueler:anzahl:=0;toline(basis,
erstedatenzeile);col(basis,1);WHILE NOT eof(basis)REP readrecord(basis,
basiszeile);IF vergleichpositiv(erstervergleich)THEN anzahlINCR 1;FI ;down(
basis);PER .END PROC anzahlschueler;INT PROC liesvergleich:INT VAR wurzel,
knoten;BOOL VAR opand;wurzel:=naechstervergleich;verglposINCR 1;WHILE 
nochmehrvergleicheREP liesboolop;knoten:=naechstervergleich;IF opandTHEN 
verknuepfeand(wurzel,knoten);ELSE verknuepfeor(wurzel,knoten);FI ;verglpos
INCR 1;PER ;wurzel.naechstervergleich:SELECT pos("(mk",verglSUB verglpos)OF 
CASE 1:behandleklammerCASE 2:liesmerkmalCASE 3:lieskursOTHERWISE errorstop(
"unzulässiger Vergleich");0END SELECT .behandleklammer:verglposINCR 1;
liesvergleich.nochmehrvergleiche:(verglSUB verglpos-1)<>sklammerzuAND 
verglpos<length(vergl).liesboolop:SELECT pos(vergl," ",verglpos)-verglposOF 
CASE 2:verglposINCR 3;opand:=FALSE ;CASE 4:verglposINCR 5;opand:=FALSE ;
OTHERWISE verglposINCR 4;opand:=TRUE ;END SELECT .END PROC liesvergleich;INT 
PROC liesmerkmal:INT VAR merkmal:=int(subtext(vergl,verglpos+1,verglpos+2)),
operator:=pos("=><",verglSUB verglpos+4)+pos(".=>",verglSUB verglpos+5),von,
bis,jokerpos;TEXT VAR vergltext:=niltext;IF operator>okleinerTHEN verglpos
INCR 7;ELSE verglposINCR 6;FI ;IF (verglSUB verglpos)=sjokerTHEN operator:=
ogroesser;vergltext:=subtext(spaces,1,statfeldlaenge(merkmal));verglposINCR 1
;ELSE liestext(vergltext);FI ;erzeugemerkmalvergleich.erzeugemerkmalvergleich
:von:=statfeldpos(merkmal);bis:=von-1+statfeldlaenge(merkmal);jokerpos:=pos(
vergltext,sjoker);IF jokerpos>0THEN aenderevergleichsmerkmale;ELIF 
statfeldart(merkmal)=adateTHEN vergltext:=vergleichbaresdatum(vergltext);FI ;
anzahlvergleicheINCR 1;vergleiche[anzahlvergleiche]:=VERGLEICH :(FALSE ,
operator,von,bis,ende,ende,ende,vergltext);anzahlvergleiche.
aenderevergleichsmerkmale:IF jokerpos=1AND pos(vergltext,sjoker,2)=length(
vergltext)THEN operator:=oenthalten;vergltext:=subtext(vergltext,2,length(
vergltext)-1);ELIF pos(vergltext,sjoker,jokerpos+1)>0THEN operator:=olike;
ELIF jokerpos=1THEN vergltext:=subtext(vergltext,2);vonINCR (bis-von-length(
vergltext)+1);ELIF jokerpos=length(vergltext)THEN vergltext:=subtext(
vergltext,1,length(vergltext)-1);bisDECR (bis-von-length(vergltext)+1);ELSE 
operator:=olike;FI .END PROC liesmerkmal;PROC liestext(TEXT VAR vergltext):
INT VAR beginn;verglposINCR 1;REP beginn:=verglpos;verglpos:=pos(vergl,squote
,beginn+1);vergltextCAT subtext(vergl,beginn,verglpos-1);verglposINCR 1;
UNTIL (verglSUB verglpos)<>squotePER END PROC liestext;INT PROC lieskurs:
TEXT VAR vergl1:=niltext,vergl2:=niltext;INT VAR von1:=1,bis1:=0,von2,bis2,
teilfeld,operator:=ogleich;BOOL VAR zweivergleiche:=FALSE ;ROW 4INT CONST 
laenge:=ROW 4INT :(2,2,4,1);verglposINCR 6;FOR teilfeldFROM 1UPTO 4REP 
liesnaechstenteiltext;PER ;erzeugekursvergleich.liesnaechstenteiltext:
verglposINCR 1;IF (verglSUB verglpos)=sjokerTHEN verglposINCR 1;
leererteiltext;ELIF zweivergleicheTHEN liestext(vergl2);bis2INCR laenge[
teilfeld];ELSE liestext(vergl1);bis1INCR laenge[teilfeld];FI .leererteiltext:
IF zweivergleicheTHEN IF von2>bis2THEN von2INCR laenge[teilfeld];bis2INCR 
laenge[teilfeld];FI ;ELIF von1>bis1THEN von1INCR laenge[teilfeld];bis1INCR 
laenge[teilfeld];ELSE zweivergleiche:=TRUE ;von2:=bis1+laenge[teilfeld]+1;
bis2:=bis1+laenge[teilfeld];FI .erzeugekursvergleich:IF von1>bis1THEN 
operator:=ogroesser;ELIF zweivergleicheAND von2>bis2THEN zweivergleiche:=
FALSE ;FI ;anzahlvergleicheINCR 1;vergleiche[anzahlvergleiche]:=VERGLEICH :(
TRUE ,operator,von1,bis1,ende,ende,evtlvergl2,vergl1);IF zweivergleicheTHEN 
anzahlvergleicheINCR 1;vergleiche[anzahlvergleiche]:=VERGLEICH :(TRUE ,
ogleich,von2,bis2,ende,ende,ende,vergl2);anzahlvergleiche-1ELSE 
anzahlvergleicheFI .evtlvergl2:IF zweivergleicheTHEN anzahlvergleiche+1ELSE 
endeFI .END PROC lieskurs;PROC verknuepfeand(INT CONST wurzel,knoten):IF 
vergleiche[wurzel].undvergleich<>endeTHEN verknuepfeand(vergleiche[wurzel].
undvergleich,knoten);ELIF wurzel<>knotenTHEN vergleiche[wurzel].undvergleich
:=knoten;FI ;IF vergleiche[wurzel].odervergleich<>endeTHEN verknuepfeand(
vergleiche[wurzel].odervergleich,knoten);FI ;END PROC verknuepfeand;PROC 
verknuepfeor(INT CONST wurzel,knoten):IF vergleiche[wurzel].odervergleich=
endeTHEN vergleiche[wurzel].odervergleich:=knotenELSE verknuepfeor(vergleiche
[wurzel].odervergleich,knoten);FI ;END PROC verknuepfeor;BOOL PROC 
vergleichpositiv(INT CONST wurzel):(wurzelbedingungerfuelltCAND 
undbedingungenerfuellt)COR oderbedingungenerfuellt.undbedingungenerfuellt:(v.
undvergleich=endeOR vergleichpositiv(v.undvergleich)).oderbedingungenerfuellt
:(v.odervergleich<>endeAND vergleichpositiv(v.odervergleich)).
wurzelbedingungerfuellt:IF v.kursvergleichTHEN kursvergleichpositiv(wurzel)
ELSE SELECT v.operatorOF CASE ogleich:basistext=v.textCASE ogroesser:
basistext>v.textCASE okleiner:basistext<v.textCASE ogroessergleich:basistext
>=v.textCASE okleinergleich:basistext<=v.textCASE oungleich:basistext<>v.text
CASE oenthalten:pos(basistext,v.text)>0OTHERWISE basistextLIKE v.textEND 
SELECT FI .basistext:subtext(basiszeile,v.von,v.bis).v:vergleiche[wurzel].
END PROC vergleichpositiv;BOOL PROC kursvergleichpositiv(INT CONST wurzel):
INT VAR kurspos:=122;IF v.operator=ogroesserTHEN stellefestobkursebelegtELSE 
REP kurspos:=pos(basiszeile,v.text,kurspos+1);UNTIL kurspos=0COR (
kursposstimmtCAND zweitervergleichok)PER ;kurspos>0FI .
stellefestobkursebelegt:pos(basiszeile,"!","�",kurspos+1)>0.kursposstimmt:((
kurspos-6)MOD 9)=v.von-1.zweitervergleichok:v.zweiterkursvergleich=endeCOR v2
.text=subtext(basiszeile,beginn+v2.von,beginn+v2.bis).v:vergleiche[wurzel].v2
:vergleiche[v.zweiterkursvergleich].beginn:kurspos-v.von.END PROC 
kursvergleichpositiv;END PACKET erstellen;