summaryrefslogtreecommitdiff
path: root/app/schulis/2.2.1/src/6.ida.check
blob: 34d76167a82fbbc5ec0cf6ff62c9a0fede8a646e (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
154
155
156
157
158
159
160
161
162
PACKET ispidacheckDEFINES fehlerinformular,formfehlermelden,
fehlerindruckvariable,ausdruckwardruckvariable:LET okkenner="k",kennnormal=
"+",kennauffaellig="#",linkeklammer="<",rechteklammer=">";FILE VAR formtext;
TEXT VAR zeile:="",blockstruktur:="",zugriffsreihenfolge:="";INT VAR errormld
:=0,errorline:=0;BOOL VAR fehlerfrei;LET mldplatzhalter=230,mldschachtelung=
231,mldtextkosmetik=232,mldnichtverfuegbar=233,mldregelunbekannt=234,
mldvarunbekannt=235,mldfeldunbekannt=236,mlddateiunbekannt=237,
mldmussleitobjekt=238,laengeblockkey=6,kzkosmetik="#";LET mldkeinevar=239,
mldvarfehler=240,mldkeinbegrenzer=241,mldtypkonflikt=242,mldkeinezeichenkette
=243,mldrestunbekannt=244,mldklammerfehlt=245;LET parametergrenze="%",
parametertrennzeichen="#",otherwise="*",textbegrenzer="""";BOOL VAR 
wardruckvar:=TRUE ;PROC fehlersetzen(INT CONST nr):errormld:=nr;errorline:=
max(lineno(formtext)-1,1);fehlerfrei:=FALSE ;ENDPROC fehlersetzen;PROC 
formfehlermelden:TEXT VAR zusatz:=" in Zeile ";IF errormld>0THEN zusatzCAT 
text(errorline);standardmeldung(errormld,zusatz+kennnormal+" <CR> "+
kennauffaellig);pause;FI ;errormld:=0ENDPROC formfehlermelden;PROC 
zugriffmerken(INT CONST objklasse):INT CONST dnr:=dateinr(getobjektklasse(
objklasse));IF dnr=0THEN fehlersetzen(mlddateiunbekannt)ELSE 
zugriffsreihenfolgeCAT "!"+text(dnr)+"!"FI ENDPROC zugriffmerken;BOOL PROC 
dateischonimzugriff(INT CONST datei):pos(zugriffsreihenfolge,"!"+text(datei)+
"!")>0ENDPROC dateischonimzugriff;TEXT PROC blockkey(INT CONST objklasse,
regel):"!"+text(objklasse,2)+text(regel,2)+"!"ENDPROC blockkey;BOOL PROC 
blockschliessen(INT CONST objklasse,regel):INT CONST p:=pos(blockstruktur,
blockkey(objklasse,regel));IF p>0CAND fehlerfreiTHEN 
pruefeobregelmehrfachauftritt;IF fehlerfreiTHEN pruefeobrichtiggeklammertFI 
FI ;p>0.pruefeobregelmehrfachauftritt:IF pos(subtext(blockstruktur,p+
laengeblockkey),blockkey(objklasse,regel))>0THEN fehlersetzen(mldschachtelung
)FI .pruefeobrichtiggeklammert:TEXT VAR bs:=subtext(blockstruktur,p+
laengeblockkey),kr:="";INT VAR pp;WHILE length(bs)>1REP kr:=text(bs,
laengeblockkey);bs:=subtext(bs,laengeblockkey+1);pp:=pos(bs,kr);IF pp=0THEN 
fehlersetzen(mldschachtelung);LEAVE pruefeobrichtiggeklammertELSE change(bs,
pp,pp+laengeblockkey-1,"")FI PER .ENDPROC blockschliessen;PROC 
pruefeaufdisjunkteobjektklassen(INT CONST objkl):TEXT VAR bs:=blockstruktur,
kr:="";TEXT CONST objklkey:="!"+text(objkl,2);INT VAR p:=pos(bs,objklkey);
WHILE p>0REP kr:=subtext(bs,p,p+laengeblockkey-1);change(bs,p,p+
laengeblockkey-1,"");p:=pos(bs,kr);IF p=0THEN fehlersetzen(mldschachtelung);
LEAVE pruefeaufdisjunkteobjektklassenELSE change(bs,p,p+laengeblockkey-1,"");
p:=pos(bs,objklkey)FI PER ENDPROC pruefeaufdisjunkteobjektklassen;PROC 
pruefeobverbundfelderverfuegbar(INT CONST regelnummer):INT VAR i,fnr,datei;
TEXT VAR vglwert:="";FOR iFROM 1UPTO getanzahlregelfelder(regelnummer)REP 
vglwert:=getvergleichswert(regelnummer,i);IF feldnameTHEN fnr:=feldnr(vglwert
);IF fnr=0THEN fehlersetzen(mldfeldunbekannt);LEAVE 
pruefeobverbundfelderverfuegbarFI ;datei:=dateinrzufeld(fnr);IF NOT 
dateischonimzugriff(datei)THEN fehlersetzen(mldnichtverfuegbar);LEAVE 
pruefeobverbundfelderverfuegbarFI FI PER .feldname:(vglwertSUB 1)<>"""".
ENDPROC pruefeobverbundfelderverfuegbar;PROC pruefeobdatenbereitsverfuegbar(
TEXT CONST ausdruck):LET parametergrenze="%";TEXT VAR evtlfeldname:=ausdruck;
INT VAR fnr,dnr;IF pos(evtlfeldname,parametergrenze)>0THEN evtlfeldname:=text
(evtlfeldname,pos(evtlfeldname,parametergrenze)-1);FI ;fnr:=feldnr(
evtlfeldname);IF fnr>0THEN dnr:=dateinrzufeld(fnr);IF NOT dateischonimzugriff
(dnr)THEN fehlersetzen(mldnichtverfuegbar);FI FI ENDPROC 
pruefeobdatenbereitsverfuegbar;PROC blockkeymerken(INT CONST objklasse,regel)
:IF blockstruktur=""CAND objklasse<>1CAND fehlerfreiTHEN fehlersetzen(
mldmussleitobjekt)ELSE blockstrukturCAT blockkey(objklasse,regel);FI ENDPROC 
blockkeymerken;BOOL PROC textkommando(TEXT CONST ausdruck):TEXT VAR parameter
:="";IF pos("!page!head!bottom!end!","!"+ausdruck+"!")>0THEN LEAVE 
textkommandoWITH TRUE FI ;IF pos(ausdruck,"on")=1THEN parameter:=compress(
subtext(ausdruck,3));pruefeparameterELIF pos(ausdruck,"off")=1THEN parameter
:=compress(subtext(ausdruck,4));pruefeparameterELSE FALSE FI .pruefeparameter
:IF text(parameter,2)<>"("""COR subtext(parameter,length(parameter)-1)<>""")"
THEN LEAVE pruefeparameterWITH FALSE FI ;parameter:=subtext(parameter,3,
length(parameter)-2);pos("!bold!b!underline!u!","!"+parameter+"!")>0.ENDPROC 
textkommando;PROC zeileueberpruefen(TEXT CONST zeile):TEXT VAR textzeile:=
zeile,ausdruck:="";INT VAR vonp,bisp,stcodenr,ausglaenge;BOOL VAR rbuendig,
druckvar;IF fehlerfreiTHEN druckvariablenpruefen;textkosmetikpruefenFI .
druckvariablenpruefen:vonp:=pos(textzeile,linkeklammer);WHILE vonp>0REP bisp
:=pos(textzeile,rechteklammer,vonp+1);IF bisp=0THEN fehlersetzen(
mldplatzhalter);LEAVE zeileueberpruefenFI ;disablestop;stcodenr:=int(subtext(
textzeile,vonp+1,bisp-1));clearerror;enablestop;getsteuercode(stcodenr,
ausdruck,ausglaenge,rbuendig,druckvar);IF ausdruck=""COR NOT lastconversionok
THEN fehlersetzen(mldvarunbekannt);LEAVE zeileueberpruefenELSE 
pruefeobdatenbereitsverfuegbar(ausdruck);FI ;change(textzeile,vonp,bisp,"");
vonp:=pos(textzeile,linkeklammer);PER .textkosmetikpruefen:textzeile:=zeile;
vonp:=pos(textzeile,kzkosmetik);WHILE vonp>0REP bisp:=pos(textzeile,
kzkosmetik,vonp+1);IF bisp=0THEN fehlersetzen(mldtextkosmetik);LEAVE 
zeileueberpruefenFI ;ausdruck:=compress(subtext(textzeile,vonp+1,bisp-1));IF 
NOT textkommando(ausdruck)THEN fehlersetzen(mldtextkosmetik);LEAVE 
zeileueberpruefenFI ;change(textzeile,vonp,bisp,"");vonp:=pos(textzeile,
kzkosmetik);PER .ENDPROC zeileueberpruefen;PROC bearbeiteblock:INT VAR p,bis,
objklasse,regel;BOOL VAR eoformtext:=FALSE ;WHILE NOT eoformtextCAND 
fehlerfreiREP IF zugriffsregelgefundenTHEN okundregelbestimmen;IF 
blockschliessen(objklasse,regel)THEN blockkeymerken(objklasse,regel);LEAVE 
bearbeiteblockELSE pruefeaufdisjunkteobjektklassen(objklasse);IF NOT 
fehlerfreiTHEN LEAVE bearbeiteblockFI ;IF objklasse>1CAND fehlerfreiTHEN 
pruefeobverbundfelderverfuegbar(getregelnummer(objklasse,regel));FI ;
blockkeymerken(objklasse,regel);zugriffmerken(objklasse);IF NOT fehlerfrei
THEN LEAVE bearbeiteblockFI ;IF compress(zeile)=""CAND NOT eoformtextTHEN 
getline(formtext,zeile);FI ;bearbeiteblockFI ;ELSE zeileueberpruefen(zeile)
FI ;IF eof(formtext)THEN eoformtext:=TRUE ELSE getline(formtext,zeile);FI ;
PER ;.zugriffsregelgefunden:p:=pos(zeile,linkeklammer+okkenner);p>0.
okundregelbestimmen:bis:=p+2;objklasse:=int(zeileSUB bis);bisINCR 1;IF 
istziffer(zeileSUB bis)THEN objklasse:=objklasse*10+int(zeileSUB bis);bis
INCR 1;FI ;IF objklasse<1COR objklasse>10THEN fehlersetzen(mldplatzhalter);
LEAVE bearbeiteblockFI ;IF (zeileSUB bis)=rechteklammerTHEN regel:=1ELSE 
regel:=int(zeileSUB bis+1);bisINCR 2;IF istziffer(zeileSUB bis)THEN regel:=
regel*10+int(zeileSUB bis);bisINCR 1;FI ;FI ;change(zeile,p,bis,"");IF 
objklasse>1CAND getregelnummer(objklasse,regel)=0THEN fehlersetzen(
mldregelunbekannt);LEAVE bearbeiteblockFI ;.ENDPROC bearbeiteblock;BOOL PROC 
fehlerinformular:#openformular(nr);#fehlerfrei:=TRUE ;stopbeifalschemnamen(
FALSE );blockstruktur:="";zugriffsreihenfolge:="";zeile:="";errormld:=0;
errorline:=0;formtext:=sequentialfile(input,getformtextname);IF NOT eof(
formtext)THEN getline(formtext,zeile)FI ;IF eof(formtext)CAND zeile=""THEN 
ELSE bearbeiteblockFI ;IF fehlerfreiCAND length(blockstruktur)<=
laengeblockkeyTHEN fehlersetzen(mldschachtelung)FI ;stopbeifalschemnamen(
TRUE );NOT fehlerfreiENDPROC fehlerinformular;BOOL PROC istziffer(TEXT CONST 
t):pos("0123456789",t)>0END PROC istziffer;BOOL PROC istsonderfunktion(TEXT 
CONST ausdruck):TEXT CONST liste:="#tagesdatum#tag#monat#jahr#zeit#tt#mm#jj#"
;pos(liste,"#"+ausdruck+"#")>0ENDPROC istsonderfunktion;BOOL PROC istdbfeld(
TEXT CONST feldname):feldnr(feldname)>0ENDPROC istdbfeld;BOOL PROC 
falscherdenotertyp(TEXT CONST vglswert,INT CONST aktfeldtyp):BOOL VAR fehler
:=FALSE ;INT VAR i;REAL VAR r;disablestop;IF aktfeldtyp=intfeldTHEN i:=int(
vglswert);fehler:=NOT lastconversionokCOR iserrorELIF aktfeldtyp=realfeld
THEN r:=real(vglswert);fehler:=NOT lastconversionokCOR iserrorELIF aktfeldtyp
=datumfeldTHEN r:=date(vglswert);fehler:=iserrorFI ;clearerror;enablestop;
fehlerEND PROC falscherdenotertyp;BOOL PROC ausdruckwardruckvariable:
wardruckvarENDPROC ausdruckwardruckvariable;BOOL PROC fehlerindruckvariable(
TEXT CONST origausdruck):BOOL VAR fehlerhaft:=FALSE ;INT VAR p;TEXT VAR 
ausdruck:=compress(origausdruck),feldname:="";stopbeifalschemnamen(FALSE );
wardruckvar:=TRUE ;liesfeldname;IF NOT istdbfeld(feldname)THEN IF 
istsonderfunktion(feldname)THEN IF ausdruck=""THEN wardruckvar:=FALSE ELSE 
standardmeldung(mldvarfehler,ausdruck);fehlerhaft:=TRUE ;FI ELSE 
standardmeldung(mldkeinevar,feldname);fehlerhaft:=TRUE ;FI ;leaveprocFI ;IF 
ausdruck>""THEN fehlerhaft:=zusammengesetzterausdruck(feldname,ausdruck)FI ;
stopbeifalschemnamen(TRUE );fehlerhaft.liesfeldname:p:=pos(ausdruck,
parametergrenze);IF p>0THEN feldname:=text(ausdruck,p-1);ausdruck:=subtext(
ausdruck,p+1)ELSE feldname:=ausdruck;ausdruck:=""FI .leaveproc:
stopbeifalschemnamen(TRUE );LEAVE fehlerindruckvariableWITH fehlerhaft.
ENDPROC fehlerindruckvariable;BOOL PROC zusammengesetzterausdruck(TEXT CONST 
aktfeld,TEXT VAR ausdruck):TEXT VAR feldname:="",vglswert:="";INT CONST 
aktfeldtyp:=feldtyp(feldnr(aktfeld));INT VAR p;BOOL VAR fehlerhaft:=FALSE ;
WHILE ausdruck>""CAND (ausdruckSUB 1)<>rechteklammerREP 
pruefefallunterscheidung;PER ;fehlerhaft.pruefefallunterscheidung:p:=pos(
ausdruck,parametertrennzeichen);IF p=0THEN standardmeldung(mldkeinbegrenzer,
ausdruck);LEAVE zusammengesetzterausdruckWITH TRUE FI ;vglswert:=text(
ausdruck,p-1);ausdruck:=subtext(ausdruck,p+1);IF falscherdenotertyp(vglswert,
aktfeldtyp)THEN standardmeldung(mldtypkonflikt,vglswert);LEAVE 
zusammengesetzterausdruckWITH TRUE FI ;pruefesequenz;IF (ausdruckSUB 1)=
otherwiseTHEN deletechar(ausdruck,1);pruefesequenzELIF (ausdruckSUB 1)=
parametertrennzeichenTHEN deletechar(ausdruck,1)ELIF ausdruck>""THEN IF (
ausdruckSUB 1)=parametertrennzeichenTHEN ELIF (ausdruckSUB 1)=rechteklammer
THEN deletechar(ausdruck,1);LEAVE zusammengesetzterausdruckWITH fehlerhaft
ELSE standardmeldung(mldrestunbekannt,ausdruck);LEAVE 
zusammengesetzterausdruckWITH TRUE FI FI .pruefesequenz:
zeichenketteueberlesen;IF (ausdruckSUB 1)=linkeklammerTHEN deletechar(
ausdruck,1);IF postext(ausdruck,rechteklammer,1)=0THEN standardmeldung(
mldklammerfehlt,ausdruck);LEAVE zusammengesetzterausdruckWITH TRUE FI ;
liesfeldname;IF (ausdruckSUB 1)=parametergrenzeTHEN deletechar(ausdruck,1);
fehlerhaft:=zusammengesetzterausdruck(feldname,ausdruck);IF fehlerhaftTHEN 
LEAVE zusammengesetzterausdruckWITH TRUE FI ;ELSE deletechar(ausdruck,1);FI 
FI .liesfeldname:p:=1;WHILE (ausdruckSUB p)<>rechteklammerCAND (ausdruckSUB p
)<>parametergrenzeREP pINCR 1PER ;feldname:=text(ausdruck,p-1);ausdruck:=
subtext(ausdruck,p);IF NOT istdbfeld(feldname)THEN standardmeldung(
mldfeldunbekannt,feldname);LEAVE zusammengesetzterausdruckWITH TRUE FI .
zeichenketteueberlesen:IF (ausdruckSUB 1)<>textbegrenzerTHEN standardmeldung(
mldkeinezeichenkette,ausdruck);LEAVE zusammengesetzterausdruckWITH TRUE FI ;p
:=2;WHILE (ausdruckSUB p)<>textbegrenzerREP pINCR 1;IF (ausdruckSUB p)=
textbegrenzerCAND (ausdruckSUB p+1)=textbegrenzerTHEN pINCR 2;FI ;UNTIL p>
length(ausdruck)PER ;IF p>length(ausdruck)THEN standardmeldung(
mldkeinezeichenkette,ausdruck);LEAVE zusammengesetzterausdruckWITH TRUE FI ;
ausdruck:=compress(subtext(ausdruck,p+1)).ENDPROC zusammengesetzterausdruck;
END PACKET ispidacheck