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
|
PACKET isphjdgrundfunktionenDEFINES lieferehalbjahreszeile,lieferehjdgrenzen,
put,putwert,wert,init,halbjahresdatenloeschen,schluesselfuerhjdsetzen,
neueklasseinhalbjahresdateneintragen,:LET maxanzfelder=100;LET punkt=".",
anzkenndat=3;LET null=0,niltext="",blank=" ";INT VAR jgstgrenze;TEXT VAR
halbjahrgrenze;LET maxhalbjahre=18,anzahlhalbjahrevoraktuell=5,
gesamtanzahlhalbjahre=12,laengehalbjahreseintrag=4;TEXT CONST zeilehalbjahre
:="05.105.206.106.207.107.208.108.209.109.2"+
"10.110.211.111.212.112.213.113.2";INT CONST gesamtzeilenlaenge:=
gesamtanzahlhalbjahre*laengehalbjahreseintrag;INT VAR ihalbjahr;ROW
maxhalbjahreSTRUCT (INT vorher,nachher)VAR anzahlhjd;
initialisierehalbjahresdatentabelle;PROC lieferehalbjahreszeile(TEXT VAR
zeile,TEXT CONST hjdkennung):INT VAR subtextbeginn:=pos(zeilehalbjahre,
hjdkennung);INT VAR subtextende;ihalbjahr:=(subtextbeginnDIV
laengehalbjahreseintrag)+1;TEXT VAR blanksvorher:=((anzahlhalbjahrevoraktuell
-anzahlhjd(ihalbjahr).vorher)*laengehalbjahreseintrag)*blank;subtextbeginn:=(
ihalbjahr-anzahlhjd(ihalbjahr).vorher-1)*laengehalbjahreseintrag+1;
subtextende:=(ihalbjahr+anzahlhjd(ihalbjahr).nachher)*laengehalbjahreseintrag
;TEXT VAR interessanterteilderzeilehalbjahre:=subtext(zeilehalbjahre,
subtextbeginn,subtextende);zeile:=text(blanksvorher+
interessanterteilderzeilehalbjahre,gesamtzeilenlaenge).END PROC
lieferehalbjahreszeile;PROC initialisierehalbjahresdatentabelle:anzahlhjd(1).
vorher:=0;anzahlhjd(1).nachher:=1;anzahlhjd(2).vorher:=1;anzahlhjd(2).nachher
:=1;anzahlhjd(3).vorher:=1;anzahlhjd(3).nachher:=1;anzahlhjd(4).vorher:=2;
anzahlhjd(4).nachher:=1;anzahlhjd(5).vorher:=1;anzahlhjd(5).nachher:=1;
anzahlhjd(6).vorher:=2;anzahlhjd(6).nachher:=1;anzahlhjd(7).vorher:=1;
anzahlhjd(7).nachher:=1;anzahlhjd(8).vorher:=2;anzahlhjd(8).nachher:=1;
anzahlhjd(9).vorher:=1;anzahlhjd(9).nachher:=1;anzahlhjd(10).vorher:=2;
anzahlhjd(10).nachher:=1;anzahlhjd(11).vorher:=1;anzahlhjd(11).nachher:=1;
anzahlhjd(12).vorher:=2;anzahlhjd(12).nachher:=6;anzahlhjd(13).vorher:=1;
anzahlhjd(13).nachher:=5;anzahlhjd(14).vorher:=2;anzahlhjd(14).nachher:=4;
anzahlhjd(15).vorher:=2;anzahlhjd(15).nachher:=3;anzahlhjd(16).vorher:=3;
anzahlhjd(16).nachher:=2;anzahlhjd(17).vorher:=4;anzahlhjd(17).nachher:=1;
anzahlhjd(18).vorher:=5;anzahlhjd(18).nachher:=0.END PROC
initialisierehalbjahresdatentabelle;PROC lieferehjdgrenzen(INT VAR anfang,
ende,TEXT CONST hjdkennung):ihalbjahr:=(poshjdkennungDIV
laengehalbjahreseintrag)+1;anfang:=-anzahlhjd(ihalbjahr).vorher;ende:=
anzahlhjd(ihalbjahr).nachher.poshjdkennung:pos(zeilehalbjahre,hjdkennung).
END PROC lieferehjdgrenzen;TEXT PROC wert(INT CONST fnr,posi,laenge):TEXT
VAR teiltext:=subtext(wert(fnr),posi,posi+laenge-1);INT VAR anfang:=pos(
teiltext," ");IF teiltext=laenge*" "THEN teiltext:=""ELSE WHILE anfang>0REP
IF subtext(teiltext,anfang,laenge)=(laenge-anfang+1)*" "THEN teiltext:=text(
teiltext,anfang-1);anfang:=0ELSE anfang:=pos(teiltext," ",anfang+1)FI PER FI
;teiltextEND PROC wert;PROC putwert(INT CONST fnr,TEXT CONST t,INT CONST posi
,laenge):INT VAR i:=length(wert(fnr));TEXT VAR string:=wert(fnr);IF i<posi
THEN IF t<>niltextTHEN stringCAT ((posi-i-1)*" ");stringCAT (text(t,laenge))
FI ELSE replace(string,posi,text(t,laenge))FI ;putwert(fnr,string)END PROC
putwert;PROC put(TAG CONST t,ROW maxanzfelderTEXT VAR pfeld,INT CONST von,bis
):INT VAR i;FOR iFROM vonUPTO bisREP IF fieldexists(t,i)THEN put(t,pfeld(i),i
)FI ;PER ;END PROC put;PROC put(TAG CONST t,ROW maxanzfelderTEXT VAR pfeld,
INT CONST pos):INT VAR i;FOR iFROM posUPTO maxanzfelderREP IF fieldexists(t,i
)THEN put(t,pfeld(i),i)FI ;PER ;END PROC put;PROC init(ROW maxanzfelderTEXT
VAR feld):INT VAR i;FOR iFROM 1UPTO maxanzfelderREP feld(i):=""PER .END PROC
init;PROC halbjahresdatenloeschen(ROW anzkenndatTEXT CONST kenndatum,TEXT
CONST altejgst,neuejgst,neueshalbjahr):BOOL CONST jgsthochgesetzt:=neuejgst>
altejgst;INT VAR loeschevorher,loeschenachher,jgstpos,maxhjdvorherneu,
maxhjdnachherneu;TEXT VAR jgstcathalbjahr:=neuejgst+punkt+neueshalbjahr,
grenzehalbjahr:="";IF neuejgst<>altejgstTHEN
loeschenderhalbjahresdatenvorbereiten;loeschenderhalbjahresdatenFI .
loeschenderhalbjahresdatenvorbereiten:lieferehjdgrenzen(maxhjdvorherneu,
maxhjdnachherneu,jgstcathalbjahr);jgstpos:=pos(zeilehalbjahre,jgstcathalbjahr
);IF jgsthochgesetztTHEN loeschevorher:=((abs(maxhjdvorherneu))*4);
grenzehalbjahr:=subtext(zeilehalbjahre,jgstpos-loeschevorher,jgstpos-
loeschevorher+3);ELSE loeschenachher:=(maxhjdnachherneu*4);grenzehalbjahr:=
subtext(zeilehalbjahre,jgstpos+loeschenachher,jgstpos+loeschenachher+3);FI ;
jgstgrenze:=int(subtext(grenzehalbjahr,1,2));halbjahrgrenze:=subtext(
grenzehalbjahr,4);.loeschenderhalbjahresdaten:IF jgsthochgesetztTHEN
halbjahresdatenloeschen(PROC (INT CONST )pred,kenndatum,halbjahrgrenze,
jgstgrenze,jgsthochgesetzt);ELSE halbjahresdatenloeschen(PROC (INT CONST )
succ,kenndatum,halbjahrgrenze,jgstgrenze,jgsthochgesetzt);FI .END PROC
halbjahresdatenloeschen;PROC halbjahresdatenloeschen(PROC (INT CONST )step,
ROW anzkenndatTEXT CONST kenndatum,TEXT CONST hjgrenze,INT CONST jgstgrenze,
BOOL CONST vorher):hjddatenloeschen(PROC step,kenndatum,dnrhalbjahresdaten,
ixhjdfamrufgebjgsthj,hjgrenze,jgstgrenze,vorher);.END PROC
halbjahresdatenloeschen;PROC hjddatenloeschen(PROC (INT CONST )step,ROW
anzkenndatTEXT CONST kenndatum,INT CONST dateinummer,index,TEXT CONST
hjgrenze,INT CONST jgstgrenze,BOOL CONST vorher):TEXT VAR hj,jg;
schluesselfuerhjdsetzen(dateinummer,kenndatum,hjgrenze,jgstgrenze);hj:=wert(
dateinummer+5);#vorläufig#jg:=wert(dateinummer+6);#vorläufig#search(index,
FALSE );IF dbstatus=0CAND richtigersatz#CAND eigentlichunnötig#THEN #beisuche
TRUE #hj:=wert(dateinummer+5);jg:=wert(dateinummer+6);step(index);IF NOT
vorherCAND dbstatus=okCAND wiederholerTHEN step(index);FI ;loeschschleife;
ELIF dbstatus=okCAND gleicherschuelerTHEN IF vorherTHEN step(index);FI ;
loeschschleifeFI #vorläufig#.wiederholer:gleicherschuelerCAND hj=wert(
dateinummer+5)CAND jg=wert(dateinummer+6).gleicherschueler:kenndatum(1)=wert(
dateinummer+1)CAND kenndatum(2)=wert(dateinummer+2)CAND kenndatum(3)=
datumrekonversion(wert(dateinummer+3)).richtigersatz:#hoffentlichüberflüssig#
gleicherschuelerCAND wert(dateinummer+5)=hjCAND wert(dateinummer+6)=jg.
loeschschleife:WHILE dbstatus=okCAND gleicherschuelerREP delete(dateinummer);
step(index);PER .END PROC hjddatenloeschen;PROC schluesselfuerhjdsetzen(INT
CONST dateinummer,ROW anzkenndatTEXT CONST kenndatum,TEXT CONST
halbjahrgrenze,INT CONST jgstgrenze):TEXT VAR jgsttext:=text(jgstgrenze);
inittupel(dateinummer);putwert(dateinummer+1,kenndatum(1));putwert(
dateinummer+2,kenndatum(2));putwert(dateinummer+3,datumskonversion(kenndatum(
3)));putwert(dateinummer+5,halbjahrgrenze);putwert(dateinummer+6,jgstaufber(
jgsttext)).END PROC schluesselfuerhjdsetzen;PROC schluesselfuerhjdsetzen(INT
CONST dateinummer,ROW anzkenndatTEXT CONST kenndatum,TEXT CONST sj,hj,jgst):
inittupel(dateinummer);putwert(dateinummer+1,kenndatum(1));putwert(
dateinummer+2,kenndatum(2));putwert(dateinummer+3,datumskonversion(kenndatum(
3)));putwert(dateinummer+4,sj);putwert(dateinummer+5,hj);putwert(dateinummer+
6,jgstaufber(jgst)).END PROC schluesselfuerhjdsetzen;PROC
neueklasseinhalbjahresdateneintragen(ROW anzkenndatTEXT CONST kenndatum,TEXT
CONST sj,hj,jgst,neueklasse):halbjahresdatensuchen;IF datenvorhandenTHEN IF
schuelergruppegeaendertTHEN halbjahresdatenaendernFI ;FI .
halbjahresdatensuchen:schluesselfuerhjdsetzen(dnrhalbjahresdaten,kenndatum,sj
,hj,niltext);search(dnrhalbjahresdaten,TRUE );.datenvorhanden:dbstatus=null.
schuelergruppegeaendert:wert(fnrhjdjgst)<>jgstOR wert(fnrhjdkennung)<>
neueklasse.halbjahresdatenaendern:putwert(fnrhjdjgst,jgst);putwert(
fnrhjdkennung,neueklasse);selupdate(dnrhalbjahresdaten);.END PROC
neueklasseinhalbjahresdateneintragen;END PACKET isphjdgrundfunktionen;
|