summaryrefslogtreecommitdiff
path: root/app/schulis/2.2.1/src/6.ida.grund
blob: b298b9521ed8a4d5ff3eae494fea0223f65c07a2 (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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
PACKET ispidagrundfunktionenDEFINES selektionenindateieintragen,
zugriffsregelnindateieintragen,druckausgabenlistezeigen,regellistezeigen,
variablenlistezeigen,behandlungderausgesuchten,inlisteblaettern,
maskenwertesichern,nummerderdruckausgabesetzen,nureinedruckausgabeangekreuzt,
rueckschrittevorproc,rueckschrittenachproc,sichernundhilfsfilesloeschen,
hilfsfilesloeschen,erfassungdruckausgabe,init,put,
setzedruckausgabelistenauswahl,druckausgabelistenauswahl,
setzelistederdruckausgabengezeigt,listederdruckausgabengezeigt,
setzeaktuellemaske,aktuellemaske:LET filenamezug="Hilfsdatei.Zugriff",
filenamesel="Hilfsdatei.Selektion",filenamedruck="Hilfsdatei.Druck",
filenamedliste="Druckausgaben",filenamezliste="Zugriffe",filenamevliste=
"Variablen";LET meldunglistenerstellung=7,meldungletzterwert=67,
meldungkeineliste=68,meldungkeinblaettern=72,meldungkeinezugriffe=200,
meldungkeinevariablen=201;LET maxselektionen=17,maxzugriffe=16,zeileninliste=
18,ausgabelaenge=71,maxvariablen=100;LET zugriffsregeln=4,druckvariablen=7;
LET serstervergleich=3,zobjkl=2,zregnr=3,zerstervergleich=7,lt=3,dnummer=2,
vnummer=2;LET vergleichtrenner="</>",trenner=" = ",oblitrenner="$",blank=" ",
kleinr="r",kleink="k",niltext="";LET andenanfang=1,andasende=2,vorwaerts=3,
rueckwaerts=4;BOOL VAR listenauswahl,listegezeigt;BOOL VAR dvrrechts,
dvrdruckvar,listeeinmalgezeigt:=FALSE ;INT VAR lvi,lvf,posi,zeilennr,
dvrlaenge,zobjekt,zregel,zindex,zanzahl,startzeile,zeilenindatei,schritte;
FILE VAR f,g;TAG VAR aktmaske;TEXT VAR zeile,dvrname,wert1,wert2,datname;
PROC selektionenindateieintragen(INT CONST leseanfangindatei,ROW 100TEXT 
CONST erfassungsfeld):f:=sequentialfile(modify,filenamesel);zeilennr:=
leseanfangindatei;lvi:=serstervergleich;FOR lvfFROM leseanfangindateiUPTO 
leseanfangindatei+maxselektionen-1REP IF zeilennr<=lines(f)THEN 
vergleichswerteanhaengenFI PER ;.vergleichswerteanhaengen:toline(f,lvf);
readrecord(f,zeile);posi:=pos(zeile,vergleichtrenner);IF posi>0THEN zeile:=
subtext(zeile,1,posi-1)FI ;zeileCAT vergleichtrenner;zeileCAT erfassungsfeld[
lvi];writerecord(f,zeile);lviINCR 2;zeilennrINCR 1;.END PROC 
selektionenindateieintragen;PROC zugriffsregelnindateieintragen(INT CONST 
leseanfangindatei,ROW 100TEXT CONST erfassungsfeld):f:=sequentialfile(modify,
filenamezug);zeilennr:=leseanfangindatei;lvi:=zerstervergleich;FOR lvfFROM 
leseanfangindateiUPTO leseanfangindatei+maxzugriffe-1REP IF zeilennr<=lines(f
)THEN vergleichswerteanhaengenFI PER ;.vergleichswerteanhaengen:toline(f,lvf)
;readrecord(f,zeile);posi:=pos(zeile,vergleichtrenner);IF posi>0THEN zeile:=
subtext(zeile,1,posi-1);FI ;IF erfassungsfeld[lvi]<>niltextTHEN zeileCAT 
vergleichtrenner;zeileCAT erfassungsfeld[lvi];FI ;writerecord(f,zeile);lvi
INCR 3;zeilennrINCR 1;.END PROC zugriffsregelnindateieintragen;PROC 
druckausgabenlistezeigen:forget(filenamedliste,quiet);datname:=filenamedliste
;f:=sequentialfile(output,datname);first(dnrida);WHILE dbstatus=okREP 
zeilezusammensetzen;putline(f,text(zeile,ausgabelaenge));succ(dnrida)PER ;
startzeiledruckausgabenlistebestimmen(datname);IF startzeile=0THEN 
meldeauffaellig(aktuellemaske,meldungkeineliste);return(1)ELSE 
setzelistederdruckausgabengezeigt(TRUE );listeeinmalgezeigt:=TRUE ;
listezeigen(datname)FI .zeilezusammensetzen:zeile:=wert(fnridanummer)+trenner
+wert(fnridaname);.END PROC druckausgabenlistezeigen;PROC 
startzeiledruckausgabenlistebestimmen(TEXT VAR fname):INT VAR lv;f:=
sequentialfile(modify,fname);FOR lvFROM 1UPTO lines(f)REP toline(f,lv);
readrecord(f,zeile);IF int(subtext(zeile,1,pos(zeile,trenner)-1))>=int(
standardmaskenfeld(dnummer))THEN startzeile:=lv;LEAVE 
startzeiledruckausgabenlistebestimmenFI PER ;startzeile:=0END PROC 
startzeiledruckausgabenlistebestimmen;PROC regellistezeigen:forget(
filenamezliste,quiet);datname:=filenamezliste;f:=sequentialfile(output,
datname);IF getanzahlregeln=0THEN meldeauffaellig(aktuellemaske,
meldungkeinezugriffe);return(1)ELSE meldeauffaellig(aktuellemaske,
meldunglistenerstellung);listeeinmalgezeigt:=FALSE ;
listederregelnzusammenstellen;startzeileregellistebestimmen(datname);IF 
startzeile=0THEN meldeauffaellig(aktuellemaske,meldungkeineliste);return(1)
ELSE setzedruckausgabelistenauswahl(TRUE );listezeigen(datname)FI FI ;END 
PROC regellistezeigen;PROC listederregelnzusammenstellen:FOR lvfFROM 1UPTO 
getanzahlregelnREP getzugriffsregel(lvf,zobjekt,zregel,zindex,zanzahl);zeile
:=kleink+text(zobjekt)+kleinr+text(zregel);putline(f,text(zeile,ausgabelaenge
))PER END PROC listederregelnzusammenstellen;PROC 
startzeileregellistebestimmen(TEXT VAR fname):INT VAR lv,lvi,anzahl;f:=
sequentialfile(modify,fname);regelnsortieren;anzahl:=lines(f);FOR lvFROM 1
UPTO anzahlREP toline(f,lv);readrecord(f,zeile);IF objektindatei=
objektinmaskeTHEN lvi:=lv;WHILE regelindatei<regelinmaskeREP 
pruefenobdateiendesonstnaechstenlesenUNTIL objektindatei>objektinmaskePER ;
startzeile:=lvi;LEAVE startzeileregellistebestimmenFI ;IF objektindatei>
objektinmaskeTHEN startzeile:=lv;LEAVE startzeileregellistebestimmenFI PER ;
startzeile:=0.objektindatei:int(subtext(zeile,2,pos(zeile,kleinr)-1)).
objektinmaske:int(standardmaskenfeld(zobjkl)).regelindatei:int(subtext(zeile,
pos(zeile,kleinr)+1)).regelinmaske:int(standardmaskenfeld(zregnr)).
pruefenobdateiendesonstnaechstenlesen:IF lvi=anzahlTHEN startzeile:=0;LEAVE 
startzeileregellistebestimmenELSE lviINCR 1;toline(f,lvi);readrecord(f,zeile)
;FI .END PROC startzeileregellistebestimmen;PROC variablenlistezeigen:forget(
filenamevliste,quiet);datname:=filenamevliste;f:=sequentialfile(output,
datname);FOR lvfFROM 1UPTO maxvariablenREP getsteuercode(lvf,dvrname,
dvrlaenge,dvrrechts,dvrdruckvar);IF dvrname<>niltextTHEN 
listedervariablenzusammenstellen;FI PER ;IF lines(f)=0THEN meldeauffaellig(
aktuellemaske,meldungkeinevariablen);return(1)ELSE meldeauffaellig(
aktuellemaske,meldunglistenerstellung);listeeinmalgezeigt:=FALSE ;
startzeilevariablenlistebestimmen(datname);IF startzeile=0THEN 
meldeauffaellig(aktuellemaske,meldungkeineliste);return(1)ELSE 
setzedruckausgabelistenauswahl(TRUE );listezeigen(datname)FI FI END PROC 
variablenlistezeigen;PROC listedervariablenzusammenstellen:zeile:=text(lvf);
zeileCAT trenner;zeileCAT dvrname;putline(f,text(zeile,ausgabelaenge))END 
PROC listedervariablenzusammenstellen;PROC startzeilevariablenlistebestimmen(
TEXT VAR fname):INT VAR lv;f:=sequentialfile(modify,fname);FOR lvFROM 1UPTO 
lines(f)REP toline(f,lv);readrecord(f,zeile);IF int(subtext(zeile,1,pos(zeile
,trenner)-1))>=int(standardmaskenfeld(vnummer))THEN startzeile:=lv;LEAVE 
startzeilevariablenlistebestimmenFI PER ;startzeile:=0END PROC 
startzeilevariablenlistebestimmen;PROC listezeigen(TEXT CONST dateiname):LET 
listenmaskenname="mu objektliste";initobli;initmaske(aktmaske,
listenmaskenname);standardstartproc(listenmaskenname);f:=sequentialfile(
modify,dateiname);zeilenindatei:=lines(f);seitezeigenEND PROC listezeigen;
PROC inlisteblaettern(INT CONST wohin):SELECT wohinOF CASE andenanfang:
andendateianfangCASE andasende:andasdateiendeCASE vorwaerts:
vorwaertsblaetternindateiCASE rueckwaerts:rueckwaertsblaetternindateiEND 
SELECT ;.andendateianfang:IF startzeile<>1THEN startzeile:=1;seitezeigenELSE 
zurueck;FI .andasdateiende:IF startzeile<zeilenindatei-zeileninliste+1THEN 
startzeile:=zeilenindatei-zeileninliste+1;seitezeigenELSE zurueck;FI .
vorwaertsblaetternindatei:IF startzeile<zeilenindatei-zeileninliste+1THEN 
startzeileINCR zeileninliste;seitezeigenELSE zurueck;FI .
rueckwaertsblaetternindatei:IF startzeile>zeileninlisteTHEN startzeileDECR 
zeileninliste;seitezeigenELSE andendateianfangFI .END PROC inlisteblaettern;
PROC seitezeigen:FOR lvfFROM 1UPTO zeileninlisteREP IF startzeile+lvf-1<=
zeilenindateiTHEN toline(f,startzeile+lvf-1);readrecord(f,zeile);posi:=pos(
zeile,vergleichtrenner);IF posi>0THEN standardmaskenfeld(subtext(zeile,1,posi
-1),lvf*2+1);standardmaskenfeld(subtext(zeile,posi+lt),lvf*2);ELSE 
standardmaskenfeld(zeile,lvf*2+1);standardmaskenfeld(niltext,lvf*2);FI ;
feldfrei(lvf*2)ELSE standardmaskenfeld(text(niltext,ausgabelaenge),lvf*2+1);
standardmaskenfeld(niltext,lvf*2);feldschutz(lvf*2)FI PER ;END PROC 
seitezeigen;PROC maskenwertesichern:FOR lvfFROM 1UPTO zeileninlisteREP IF 
standardmaskenfeld(lvf*2+1)<>ausgabelaenge*blankTHEN zeile:=
standardmaskenfeld(lvf*2+1);zeileCAT vergleichtrenner;zeileCAT 
standardmaskenfeld(lvf*2);toline(f,startzeile+lvf-1);writerecord(f,zeile)FI 
PER END PROC maskenwertesichern;PROC behandlungderausgesuchten(PROC (INT 
CONST )wastun,ROW 100TEXT VAR feld,INT CONST womit):BOOL VAR ok:=FALSE ;init(
feld);wertholen(womit,ok);IF okTHEN feldervorbelegen;wastun(womit);ELSE 
meldeauffaellig(aktuellemaske,meldungletzterwert);zurueck;
setzedruckausgabelistenauswahl(FALSE );forget(datname,quiet);
listeeinmalgezeigt:=FALSE ;enter(2)#rueckschrittevorproc(2)dr01.08.88#FI .
feldervorbelegen:SELECT womitOF CASE zugriffsregeln:feld[zobjkl]:=wert1;feld[
zregnr]:=wert2;CASE druckvariablen:feld[vnummer]:=wert1END SELECT .END PROC 
behandlungderausgesuchten;PROC wertholen(INT CONST wozu,BOOL VAR nochda):g:=
sequentialfile(modify,datname);#dr01.08.88#nochda:=lines(g)>0;IF NOT nochda
THEN LEAVE wertholenELSE toline(g,1);WHILE lines(g)>0REP readrecord(g,zeile);
posi:=pos(zeile,vergleichtrenner);deleterecord(g);UNTIL posi>0CAND subtext(
zeile,posi+lt)<>niltextPER ;IF lines(g)>0THEN werteermittelnELIF posi>0CAND 
subtext(zeile,posi+lt)<>niltextTHEN werteermittelnELSE nochda:=FALSE FI FI .
werteermitteln:SELECT wozuOF CASE zugriffsregeln:objektundregelermittelnCASE 
druckvariablen:variablennummerermittelnEND SELECT .objektundregelermitteln:
wert1:=subtext(zeile,pos(zeile,kleink)+1,pos(zeile,kleinr)-1);wert2:=subtext(
zeile,pos(zeile,kleinr)+1,pos(zeile,blank)-1).variablennummerermitteln:wert1
:=subtext(zeile,1,pos(zeile,trenner)-1);wert2:=niltext.END PROC wertholen;
PROC rueckschrittevorproc(INT CONST wieviele):BOOL VAR b:=TRUE ;schritte:=
wieviele;WHILE bREP IF listeeinmalgezeigtTHEN schritteINCR 1;b:=FALSE ELSE #
dr01.08.88#b:=listederdruckausgabengezeigt;listeeinmalgezeigt:=TRUE FI PER ;
listeeinmalgezeigt:=listederdruckausgabengezeigt;enter(schritte)END PROC 
rueckschrittevorproc;PROC rueckschrittenachproc(INT CONST wieviele):return(
wieviele);END PROC rueckschrittenachproc;PROC nummerderdruckausgabesetzen(
TEXT VAR nr):FOR lvfFROM 1UPTO lines(f)REP toline(f,lvf);readrecord(f,zeile);
posi:=pos(zeile,vergleichtrenner);IF posi>0CAND subtext(zeile,posi+lt)<>
niltextTHEN nr:=subtext(zeile,1,pos(zeile," = ")-1);LEAVE 
nummerderdruckausgabesetzenFI ;PER END PROC nummerderdruckausgabesetzen;BOOL 
PROC nureinedruckausgabeangekreuzt:BOOL VAR angekreuzt:=FALSE ;f:=
sequentialfile(modify,filenamedliste);FOR lvfFROM 1UPTO lines(f)REP toline(f,
lvf);readrecord(f,zeile);posi:=pos(zeile,vergleichtrenner);IF posi>0CAND 
subtext(zeile,posi+lt)<>niltextTHEN IF angekreuztTHEN LEAVE 
nureinedruckausgabeangekreuztWITH FALSE ELSE angekreuzt:=TRUE FI FI PER ;
angekreuztEND PROC nureinedruckausgabeangekreuzt;PROC 
sichernundhilfsfilesloeschen:putform;hilfsfilesloeschenEND PROC 
sichernundhilfsfilesloeschen;PROC hilfsfilesloeschen:forget(filenamezug,quiet
);forget(filenamesel,quiet);forget(filenamedruck,quiet);forget(filenamedliste
,quiet)END PROC hilfsfilesloeschen;PROC erfassungdruckausgabe(INT CONST n):
LET trenner=" = ";LET laengezeile=71;TEXT VAR identizeile;identizeile:=wert(
fnridanummer)+trenner+wert(fnridaname);identizeile:=text(identizeile,
laengezeile);setzeidentiwert(identizeilemitschluesselanhang).
identizeilemitschluesselanhang:identizeile+oblitrenner+wert(fnridanummer).
END PROC erfassungdruckausgabe;PROC init(ROW 100TEXT VAR feld):INT VAR i;FOR 
iFROM 1UPTO 100REP feld(i):=""PER END PROC init;PROC put(TAG CONST maske,ROW 
100TEXT CONST feld,INT CONST letztesfeld):INT VAR lv;FOR lvFROM 2UPTO 
letztesfeldREP IF fieldexists(maske,lv)THEN put(maske,feld[lv],lv)FI PER END 
PROC put;PROC setzeaktuellemaske(TAG CONST welchemaske):aktmaske:=welchemaske
END PROC setzeaktuellemaske;TAG PROC aktuellemaske:aktmaskeEND PROC 
aktuellemaske;PROC setzedruckausgabelistenauswahl(BOOL CONST b):listenauswahl
:=bEND PROC setzedruckausgabelistenauswahl;BOOL PROC 
listederdruckausgabengezeigt:listegezeigtEND PROC 
listederdruckausgabengezeigt;PROC setzelistederdruckausgabengezeigt(BOOL 
CONST b):listegezeigt:=bEND PROC setzelistederdruckausgabengezeigt;BOOL PROC 
druckausgabelistenauswahl:listenauswahlEND PROC druckausgabelistenauswahl;
PROC regelnsortieren:INT VAR lv,anzahl;anzahl:=lines(f);blanksentfernen;sort(
filenamezliste);moeglicherweisenachsortieren.blanksentfernen:FOR lvFROM 1
UPTO anzahlREP toline(f,lv);readrecord(f,zeile);changeall(zeile," ","");
writerecord(f,text(zeile,ausgabelaenge))PER .moeglicherweisenachsortieren:
FOR lvFROM 1UPTO anzahlREP toline(f,1);readrecord(f,zeile);IF subtext(zeile,2
,2)="1"THEN deleterecord(f);toline(f,anzahl);insertrecord(f);writerecord(f,
text(zeile,ausgabelaenge))ELSE LEAVE regelnsortierenFI PER .END PROC 
regelnsortieren;END PACKET ispidagrundfunktionen;