From 04e68443040c7abad84d66477e98f93bed701760 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 4 Feb 2019 13:09:03 +0100 Subject: Initial import --- app/schulis/2.2.1/src/4.stundenplan schnittstelle | 692 ++++++++++++++++++++++ 1 file changed, 692 insertions(+) create mode 100644 app/schulis/2.2.1/src/4.stundenplan schnittstelle (limited to 'app/schulis/2.2.1/src/4.stundenplan schnittstelle') diff --git a/app/schulis/2.2.1/src/4.stundenplan schnittstelle b/app/schulis/2.2.1/src/4.stundenplan schnittstelle new file mode 100644 index 0000000..bc036af --- /dev/null +++ b/app/schulis/2.2.1/src/4.stundenplan schnittstelle @@ -0,0 +1,692 @@ +PACKET stundenplanschnittstelleDEFINES tagstunde,stundenplanhalbjahrsetzen, +stundenplanbasisundstundenplanerstellen,stundenplanerstellen, +stundenplanbasisundstundenplanholen,stundenplanbasissichern, +stundenplansichern,stundenplandatenvorhanden, +stundenplanbasisundstundenplanloeschen,stundenplanloeschen, +stundenplanreorganisierenundsichern,bezeichnungzulaessig,datenzurlv, +beteiligteschuelergruppen,schuelergruppenschnittbeizeit, +schuelergruppenschnittallezeiten,gemeinsameschuelergruppen, +lvderschuelergruppe,allelvmit,lvgeplant,geplantelvfuer,allezeitenvon, +datenderzeit,planeintraglesen,planeintragvornehmen,planeintragloeschen, +erstellungszeitderdatenraeume:LET maxdatenraumeintraege=4000, +maxlehrveranstaltungen=2500,erstestunde=1,letztestunde=66,stdprotag=12, +samstagstd=6,schultage=6,stuplanverwalter="stundenplan server",sgnull= +"Stundenplan-0 ",sgeins="Stundenplan-1 ",lvnull="Stundenplan-2 ",lveins= +"Stundenplan-3 ",stuplan="Stundenplan-4 ",aenderungakt="aktuell", +aenderunggepl="geplant",maxsugruppen=30,laengelv=8,laengekopplung=8, +laengeparaphe=4,laengeraum=4,laengezeit=2,laengejgst=2,laengefachkennung=6, +laengesugruppe=6,laengeklagruppe=4,laengewochenstd=2,laengestuplaneintrag=24, +stuplanposjgst=1,stuplanposkopplung=9,stuplanposparaphe=17,stuplanposraum=21, +erstellzeittag=1,erstellzeitmonat=4,erstellzeitjahr=7,erstellzeitstdmin=10, +beginnlvjgst=1,beginnlvbez=1,beginnlvkopplung=9,beginnlvparaphe=17, +beginnlvwochenstd=21,beginnlvraumgr1=23,beginnlvraumgr2=27;INT CONST +endelvbez:=beginnlvbez+laengelv-1,endelvkopplung:=beginnlvkopplung+ +laengekopplung-1,endelvparaphe:=beginnlvparaphe+laengeparaphe-1, +endelvwochenstd:=beginnlvwochenstd+laengewochenstd-1,endelvraumgr1:= +beginnlvraumgr1+laengeraum-1,endelvraumgr2:=beginnlvraumgr2+laengeraum-1;LET +leistenlaenge=8,bits=16,jgstnull=0,jgstfuenf=5,jgstdreizehn=13,anzklst=9, +trenner="�",klstjgst="�05�5�06�6�07�7�08�8�09�9�10�11�12�13�", +zeitrastersperre="x",dbraeume="c02 raeume",dbaenderung= +"c02 aenderungsvermerk",dbaenderungakt="aktuell",dbaenderunggepl="geplant", +halbj="Schulhalbjahr",fehlerzeichen="$",blank=" ",punkt=".",null="0",eins="1" +,leereraumangabe=" ",kennunglv="L",kennungkopplung="K",kennungparaphe="P", +kennungraum="R",kennungzeit="ZA",kennungzugelassenezeit="ZZ",kennungsugruppe= +"S",kennungwochenstd="W",kennungwunschraum="RW",kennungersatzraum="RE";LET +kennungmo="Mo ",kennungdi="Di ",kennungmi="Mi ",kennungdo="Do ",kennungfr= +"Fr ",kennungsa="Sa ",kennungmontag="Montag ",kennungdienstag="Dienstag ", +kennungmittwoch="Mittwoch ",kennungdonnerstag="Donnerstag ",kennungfreitag= +"Freitag ",kennungsamstag="Samstag ";TYPE BITLEISTE =ROW leistenlaengeINT ; +BITLEISTE VAR sugrupurleiste,sugrupleiste;BOUND ROW maxlehrveranstaltungen +BITLEISTE VAR lvbitleisten;BOUND ROW maxdatenraumeintraegeBITLEISTE VAR +sgbitleisten;ROW maxsugruppenBITLEISTE VAR sugruppenstack;DATASPACE VAR dslv, +dssugrup,dsstdpl;FILE VAR lvdatei,sugrupdatei,stuplandatei;TEXT VAR gewschulj +:="",gewhalbj:="",halbjplausizeit:="",dateieintrag,ergebnis,dserstellungszeit +,behandeltesugruppen:=trenner,letztedbzeit,lvzeile,sugruppeneinerklgr:="", +plausiparaphen:=trenner,plausizeiten:="",plausiklgr:=trenner,plausiraeume:= +trenner;INT VAR i,j,k,zz,anzbitleisten:=0,lowbit,anzsugrup,anzsugrupundklgr, +anzlv,lvjgstnullanfang,lvjgstnullende,lvsugrupjgstanfang,lvsugrupjgstende, +letzteposstuplanzeile,letzterzugrifflv0:=1;BOOL VAR klgreintrag;TEXT PROC +tagstunde(INT CONST anwstdnr,BOOL CONST mitkurzform):INT VAR stdnr:= +konvertierezeit(anwstdnr);TEXT VAR std;IF stdnr +letztestundeTHEN ""ELSE std:=text((stdnr-1)MOD stdprotag+1);IF mitkurzform +THEN SELECT (stdnr-1)DIV stdprotagOF CASE 0:kennungmo+stdCASE 1:kennungdi+std +CASE 2:kennungmi+stdCASE 3:kennungdo+stdCASE 4:kennungfr+stdCASE 5:kennungsa+ +stdOTHERWISE ""END SELECT ELSE SELECT (stdnr-1)DIV stdprotagOF CASE 0: +kennungmontag+stdCASE 1:kennungdienstag+stdCASE 2:kennungmittwoch+stdCASE 3: +kennungdonnerstag+stdCASE 4:kennungfreitag+stdCASE 5:kennungsamstag+std +OTHERWISE ""END SELECT FI FI END PROC tagstunde;PROC +stundenplanhalbjahrsetzen(TEXT CONST anwhalbj,anwschulj):gewschulj:=anwschulj +;gewhalbj:=anwhalbj;plausizeiten:=""END PROC stundenplanhalbjahrsetzen;PROC +stundenplanbasisundstundenplanerstellen(INT VAR fehlerstatus):IF gewschulj="" +THEN fehlerstatus:=1ELSE hilfsdatenerstellen(fehlerstatus);IF fehlerstatus=0 +THEN schreibeerstellungszeitFI ;FI .END PROC +stundenplanbasisundstundenplanerstellen;PROC stundenplanerstellen(TEXT CONST +zeit,INT VAR fehlerstatus):commanddialogue(FALSE );IF gewschulj=""THEN +fehlerstatus:=1;forget(stuplandatenraum)ELSE forget(stuplandatenraum);# +dsstdpl:=new(stuplandatenraum);forget(dsstdpl);#commanddialogue(TRUE ); +stuplandatei:=sequentialfile(modify,stuplandatenraum);FOR iFROM erstestunde +UPTO letztestunde+1REP insertrecord(stuplandatei)PER ;schreibzeitinstdpl; +fehlerstatus:=0FI .schreibzeitinstdpl:toline(stuplandatei,letztestunde+1); +writerecord(stuplandatei,zeit).END PROC stundenplanerstellen;PROC +stundenplanbasissichern(INT VAR fehlerstatus):TASK VAR server;disablestop; +server:=task(stuplanverwalter);IF iserrorTHEN clearerror;fehlerstatus:=2; +ELIF gewschulj=""THEN fehlerstatus:=1;ELIF NOT exists(lvnulldatenraum)COR +NOT exists(lveinsdatenraum)COR NOT exists(sgnulldatenraum)COR NOT exists( +sgeinsdatenraum)THEN fehlerstatus:=3ELSE commanddialogue(FALSE );save( +lvnulldatenraum,server);save(lveinsdatenraum,server);save(sgnulldatenraum, +server);save(sgeinsdatenraum,server);commanddialogue(TRUE );fehlerstatus:=0 +FI ;enablestopEND PROC stundenplanbasissichern;PROC stundenplansichern(INT +VAR fehlerstatus):TASK VAR server;disablestop;server:=task(stuplanverwalter); +IF iserrorTHEN clearerror;fehlerstatus:=2;ELIF gewschulj=""THEN fehlerstatus +:=1ELIF NOT exists(stuplandatenraum)THEN fehlerstatus:=3ELSE commanddialogue( +FALSE );save(stuplandatenraum,server);commanddialogue(TRUE );fehlerstatus:=0; +FI ;enablestopEND PROC stundenplansichern;PROC +stundenplanbasisundstundenplanholen(INT VAR fehlerstatus):TASK VAR server; +disablestop;server:=task(stuplanverwalter);IF iserrorTHEN clearerror; +fehlerstatus:=2;ELIF gewschulj=""THEN fehlerstatus:=1ELIF NOT exists( +lvnulldatenraum,server)COR NOT exists(lveinsdatenraum,server)COR NOT exists( +sgnulldatenraum,server)COR NOT exists(sgeinsdatenraum,server)COR NOT exists( +stuplandatenraum,server)THEN fehlerstatus:=3;ELSE commanddialogue(FALSE ); +fetch(stuplandatenraum,server);fetch(lvnulldatenraum,server);fetch( +lveinsdatenraum,server);fetch(sgnulldatenraum,server);fetch(sgeinsdatenraum, +server);datenraeumeankoppeln;commanddialogue(TRUE );IF +stundenplanbasisaktuell(fehlerstatus)THEN anzsugrupundklgr:=lines(sugrupdatei +)-anzklst;anzsugrup:=anzsugrupundklgr-int(records(dnrklassengruppen));anzlv:= +lines(lvdatei);fehlerstatus:=0;ELSE IF fehlerstatus=9THEN +aenderungsvermerkderdbsetzen;FI ;stundenplanbasiserstellen(fehlerstatus);IF +fehlerstatus=0THEN stundenplanbasissichern(fehlerstatus);IF fehlerstatus=0 +THEN stundenplansichern(fehlerstatus);fehlerstatus:=8FI FI FI FI ;enablestop. +aenderungsvermerkderdbsetzen:IF gewhalbj=schulkenndatum(halbj)THEN +aenderungsvermerksetzen(aenderungakt)ELSE aenderungsvermerksetzen( +aenderunggepl)FI .END PROC stundenplanbasisundstundenplanholen;BOOL PROC +stundenplandatenvorhanden:TASK VAR server;IF NOT existstask(stuplanverwalter) +THEN FALSE ELIF gewschulj=""THEN FALSE ELSE server:=task(stuplanverwalter); +exists(lvnulldatenraum,server)COR exists(lveinsdatenraum,server)COR exists( +sgnulldatenraum,server)COR exists(sgeinsdatenraum,server)COR exists( +stuplandatenraum,server)FI END PROC stundenplandatenvorhanden;PROC +stundenplanbasisundstundenplanloeschen(INT VAR fehlerstatus):TASK VAR server; +IF NOT existstask(stuplanverwalter)THEN fehlerstatus:=2ELIF gewschulj=""THEN +fehlerstatus:=1;ELSE server:=task(stuplanverwalter);commanddialogue(FALSE ); +erase(stuplandatenraum,server);erase(lvnulldatenraum,server);erase( +lveinsdatenraum,server);erase(sgnulldatenraum,server);erase(sgeinsdatenraum, +server);commanddialogue(TRUE );fehlerstatus:=0;FI END PROC +stundenplanbasisundstundenplanloeschen;PROC stundenplanloeschen(INT VAR +fehlerstatus):IF gewschulj=""THEN fehlerstatus:=1ELIF NOT exists( +stuplandatenraum)THEN fehlerstatus:=3;ELSE forget(stuplandatenraum,quiet); +fehlerstatus:=0FI END PROC stundenplanloeschen;PROC +stundenplanreorganisierenundsichern(INT VAR fehlerstatus):INT VAR kanal;IF +gewschulj=""THEN fehlerstatus:=1ELIF NOT exists(stuplandatenraum)THEN +fehlerstatus:=3ELSE kanal:=channel(myself);break(quiet);reorganize( +stuplandatenraum);continue(kanal);modify(stuplandatei);stundenplansichern( +fehlerstatus)FI END PROC stundenplanreorganisierenundsichern;TEXT PROC +erstellungszeitderdatenraeume:IF exists(stuplandatenraum)THEN toline( +stuplandatei,letztestunde+1);readrecord(stuplandatei,dserstellungszeit); +dserstellungszeitELSE fehlerzeichenFI END PROC erstellungszeitderdatenraeume; +BOOL PROC bezeichnungzulaessig(TEXT CONST kennung,kennungstext):TEXT VAR +sicherung;INT VAR zeit,alterdbstatus;IF kennung=kennunglvTHEN lv0eintrag(text +(kennungstext,laengelv))<>""ELIF kennung=kennungkopplungTHEN kopplunginlv0( +text(kennungstext,laengekopplung))ELIF kennung=kennungparapheTHEN IF +plausiparaphen=trennerTHEN alterdbstatus:=dbstatus;savetupel(dnrlehrer, +sicherung);statleseschleife(dnrlehrer,"","",fnrlparaphe,fnrlparaphe,PROC +paraphencat);restoretupel(dnrlehrer,sicherung);dbstatus(alterdbstatus)FI ;pos +(plausiparaphen,trenner+text(kennungstext,laengeparaphe)+trenner)>0ELIF +kennung=kennungsugruppeTHEN sg0eintrag(text(kennungstext,laengesugruppe)) +ELIF kennung=kennungraumTHEN IF plausiraeume=trennerTHEN alterdbstatus:= +dbstatus;savetupel(dnrschluessel,sicherung);statleseschleife(dnrschluessel, +dbraeume,"",fnrschlsachgebiet,fnrschlschluessel,PROC raumcat);restoretupel( +dnrschluessel,sicherung);dbstatus(alterdbstatus)FI ;pos(plausiraeume,trenner+ +text(kennungstext,laengeraum)+trenner)>0ELIF kennung=kennungzeitTHEN IF real( +kennungstext)<1000.0THEN konvertierezeit(int(kennungstext))<>0ELSE FALSE FI +ELIF kennung=kennungzugelassenezeitTHEN IF real(kennungstext)>1000.0THEN +LEAVE bezeichnungzulaessigWITH FALSE FI ;IF plausizeiten=""COR gewhalbj<> +halbjplausizeitTHEN halbjplausizeit:=gewhalbj;plausizeiten:=letztestunde*"0"; +inittupel(dnrzeitraster);alterdbstatus:=dbstatus;savetupel(dnrzeitraster, +sicherung);statleseschleife(dnrzeitraster,gewschulj,gewhalbj,fnrzrsj,fnrzrhj, +PROC erstelleplausizeiten);restoretupel(dnrzeitraster,sicherung);dbstatus( +alterdbstatus)FI ;zeit:=konvertierezeit(int(kennungstext));IF zeit<>0THEN ( +plausizeitenSUB zeit)="0"ELSE FALSE FI ELSE FALSE FI END PROC +bezeichnungzulaessig;TEXT PROC datenzurlv(TEXT CONST kennung, +lehrveranstaltung):lvzeile:=lv0eintrag(text(lehrveranstaltung,laengelv));IF +lvzeile<>""THEN IF kennung=kennungparapheTHEN paraphederlv(lvzeile)ELIF +kennung=kennungkopplungTHEN kopplungderlv(lvzeile)ELIF kennung= +kennungwochenstdTHEN wochenstdderlv(lvzeile)ELIF kennung=kennungwunschraum +THEN wunschraumderlv(lvzeile)ELIF kennung=kennungersatzraumTHEN +ersatzraumderlv(lvzeile)ELSE fehlerzeichenFI ELSE ungueltigesergebnis(kennung +)FI END PROC datenzurlv;TEXT PROC beteiligteschuelergruppen(TEXT CONST +kennung,kennungstext):BITLEISTE VAR bitleiste;IF kennung=kennunglvTHEN IF +lv0eintrag(text(kennungstext,laengelv))=""THEN ungueltigesergebnis( +kennungsugruppe)ELSE sugruppenausbitleiste(lv1eintrag(zugriffszeilelv0))FI +ELIF kennung=kennungkopplungTHEN sammlebitleisten(text(kennungstext, +laengekopplung),beginnlvkopplung,bitleiste);sugruppenausbitleiste(bitleiste) +ELSE ungueltigesergebnis(kennungsugruppe)FI END PROC +beteiligteschuelergruppen;TEXT PROC schuelergruppenschnittallezeiten(TEXT +CONST kennung,anwkennungstext1):BITLEISTE VAR bitleiste,stdplbitleiste;TEXT +VAR allestdpllv:="",gesamtlv:="",jgst:="",kopplung:="",stdpllv:="",stdplkopp +:="",stdpljgst:="",schuelergruppen:="",jgstzurnull:=trenner,verfplan:="", +schgrjgst:="",fehler:=letztestunde*fehlerzeichen;TEXT VAR kennungstext1:=""; +INT VAR zeit,anfangeintrag,laengeallestdpllv,ij,schgrindex;BOOL VAR schnitt:= +FALSE ;IF kennung=kennunglvTHEN kennungstext1:=text(anwkennungstext1,laengelv +);gesamtlv:=lv0eintrag(kennungstext1);IF gesamtlv=""THEN LEAVE +schuelergruppenschnittallezeitenWITH fehlerELSE jgst:=text(gesamtlv, +laengejgst);kopplung:=kopplungderlv(gesamtlv);bitleiste:=lv1eintrag( +zugriffszeilelv0);FI ELIF kennung=kennungkopplungTHEN kennungstext1:=text( +anwkennungstext1,laengekopplung);jgst:=jgstzukopplung(kennungstext1);kopplung +:=kennungstext1;IF jgst=""THEN LEAVE schuelergruppenschnittallezeitenWITH +fehlerELSE sammlebitleisten(kennungstext1,beginnlvkopplung,bitleiste)FI ELSE +LEAVE schuelergruppenschnittallezeitenWITH fehlerFI ;IF jgst="00"THEN +bildejgstzurnullFI ;FOR zeitFROM erstestundeUPTO letztestundeREP allestdpllv +:=stuplanzeile(zeit);laengeallestdpllv:=length(allestdpllv);IF +laengeallestdpllv>laengejgstTHEN schnitt:=FALSE ; +pruefeallestdplanlvaufschnitt;IF schnittTHEN verfplanCAT einsELSE verfplan +CAT nullFI ;ELSE verfplanCAT nullFI ;PER ;verfplan.bildejgstzurnull: +schuelergruppen:=beteiligteschuelergruppen(kennung,kennungstext1);FOR ijFROM +1UPTO length(schuelergruppen)DIV laengesugruppeREP schgrindex:=(ij-1)* +laengesugruppe;schgrjgst:=subtext(schuelergruppen,schgrindex+1,schgrindex+2); +IF pos(jgstzurnull,trenner+schgrjgst+trenner)=0THEN jgstzurnullCAT schgrjgst; +jgstzurnullCAT trennerFI PER ;IF length(jgstzurnull)=4THEN jgst:=subtext( +jgstzurnull,2,3);jgstzurnull:=""FI .pruefeallestdplanlvaufschnitt: +anfangeintrag:=0;WHILE anfangeintrag +kennungstext1THEN stdplkopp:=subtext(allestdpllv,anfangeintrag+ +beginnlvkopplung,anfangeintrag+endelvkopplung);IF kopplungsbezunterschiedlich +THEN IF lv0eintrag(stdpllv)<>""THEN stdplbitleiste:=lv1eintrag( +zugriffszeilelv0);IF bitleistenschnittTHEN schnitt:=TRUE ;LEAVE +pruefeallestdplanlvaufschnittFI ELSE LEAVE schuelergruppenschnittallezeiten +WITH fehlerFI ;FI ;FI ;ELSE IF jgstgleichTHEN stdplkopp:=subtext(allestdpllv, +anfangeintrag+beginnlvkopplung,anfangeintrag+endelvkopplung);IF +kopplungsbezunterschiedlichTHEN IF lv0eintrag(stdpllv)<>""THEN stdplbitleiste +:=lv1eintrag(zugriffszeilelv0);IF bitleistenschnittTHEN schnitt:=TRUE ;LEAVE +pruefeallestdplanlvaufschnittFI ELSE LEAVE schuelergruppenschnittallezeiten +WITH fehlerFI ;FI ;FI ;FI ;anfangeintrag:=anfangeintrag+laengestuplaneintrag +PER .jgstgleich:jgst=stdpljgstCOR stdpljgst="00"COR pos(jgstzurnull,trenner+ +stdpljgst+trenner)>0.kopplungsbezunterschiedlich:kopplung<>stdplkopp. +bitleistenschnitt:gibtesgemeinsamesugruppen(bitleiste,stdplbitleiste).END +PROC schuelergruppenschnittallezeiten;BOOL PROC schuelergruppenschnittbeizeit +(INT CONST anwzeit,TEXT CONST kennung,anwkennungstext1,anwkennungstext2): +BITLEISTE VAR bitleiste,stdplbitleiste;TEXT VAR allestdpllv:="",gesamtlv:="", +jgst:="",kopplung:="",stdpllv:="",stdplkopp:="",stdpljgst:="",schgrjgst:="", +schuelergruppen:="",jgstzurnull:=trenner;TEXT VAR kennungstext1:="", +kennungstext2:="";INT VAR zeit:=konvertierezeit(anwzeit),anfangeintrag, +laengeallestdpllv,ij,schgrindex;IF zeit=0THEN LEAVE +schuelergruppenschnittbeizeitWITH TRUE ELIF kennung=kennunglvTHEN +kennungstext1:=text(anwkennungstext1,laengelv);IF anwkennungstext2<>""THEN +kennungstext2:=text(anwkennungstext2,laengelv)FI ;gesamtlv:=lv0eintrag( +kennungstext1);IF gesamtlv=""THEN LEAVE schuelergruppenschnittbeizeitWITH +TRUE ELSE jgst:=text(gesamtlv,laengejgst);kopplung:=kopplungderlv(gesamtlv); +bitleiste:=lv1eintrag(zugriffszeilelv0);FI ELIF kennung=kennungkopplungTHEN +kennungstext1:=text(anwkennungstext1,laengekopplung);jgst:=jgstzukopplung( +kennungstext1);kopplung:=kennungstext1;IF jgst=""THEN LEAVE +schuelergruppenschnittbeizeitWITH TRUE ELSE sammlebitleisten(kennungstext1, +beginnlvkopplung,bitleiste)FI ELSE LEAVE schuelergruppenschnittbeizeitWITH +TRUE FI ;allestdpllv:=stuplanzeile(zeit);laengeallestdpllv:=length( +allestdpllv);IF laengeallestdpllvkennungstext1CAND stdpllv<>kennungstext2THEN stdplkopp:=subtext +(allestdpllv,anfangeintrag+beginnlvkopplung,anfangeintrag+endelvkopplung);IF +kopplungsbezunterschiedlichTHEN IF lv0eintrag(stdpllv)<>""THEN stdplbitleiste +:=lv1eintrag(zugriffszeilelv0);IF bitleistenschnittTHEN LEAVE +schuelergruppenschnittbeizeitWITH TRUE FI ELSE LEAVE +schuelergruppenschnittbeizeitWITH TRUE FI ;FI ;FI ;ELSE IF jgstgleichTHEN +stdplkopp:=subtext(allestdpllv,anfangeintrag+beginnlvkopplung,anfangeintrag+ +endelvkopplung);IF kopplungsbezunterschiedlichTHEN IF lv0eintrag(stdpllv)<>"" +THEN stdplbitleiste:=lv1eintrag(zugriffszeilelv0);IF bitleistenschnittTHEN +LEAVE schuelergruppenschnittbeizeitWITH TRUE FI ELSE LEAVE +schuelergruppenschnittbeizeitWITH TRUE FI ;FI ;FI ;FI ;anfangeintrag:= +anfangeintrag+laengestuplaneintragPER ;FALSE .bildejgstzurnull: +schuelergruppen:=beteiligteschuelergruppen(kennung,kennungstext1);FOR ijFROM +1UPTO length(schuelergruppen)DIV laengesugruppeREP schgrindex:=(ij-1)* +laengesugruppe;schgrjgst:=subtext(schuelergruppen,schgrindex+1,schgrindex+2); +IF pos(jgstzurnull,trenner+schgrjgst+trenner)=0THEN jgstzurnullCAT schgrjgst; +jgstzurnullCAT trennerFI PER ;IF length(jgstzurnull)=4THEN jgst:=subtext( +jgstzurnull,2,3);jgstzurnull:=""FI .jgstgleich:jgst=stdpljgstCOR stdpljgst= +"00"COR pos(jgstzurnull,trenner+stdpljgst+trenner)>0. +kopplungsbezunterschiedlich:kopplung<>stdplkopp.bitleistenschnitt: +gibtesgemeinsamesugruppen(bitleiste,stdplbitleiste).END PROC +schuelergruppenschnittbeizeit;BOOL PROC schuelergruppenschnittbeizeit(INT +CONST anwzeit,TEXT CONST kennung,anwkennungstext1,anwkennungstext2,TEXT VAR +lv,sugruppen):BITLEISTE VAR bitleiste,stdplbitleiste;TEXT VAR allestdpllv, +gesamtlv,jgst,kopplung,stdpllv,stdplkopp,stdpljgst:="",schgrjgst:="", +schuelergruppen:="",jgstzurnull:=trenner;TEXT VAR kennungstext1:="", +kennungstext2:="";INT VAR zeit:=konvertierezeit(anwzeit),anfangeintrag, +laengeallestdpllv,ij,schgrindex;lv:="";sugruppen:="";IF zeit=0THEN LEAVE +schuelergruppenschnittbeizeitWITH TRUE ELIF kennung=kennunglvTHEN +kennungstext1:=text(anwkennungstext1,laengelv);IF anwkennungstext2<>""THEN +kennungstext2:=text(anwkennungstext2,laengelv)FI ;gesamtlv:=lv0eintrag( +kennungstext1);IF gesamtlv=""THEN LEAVE schuelergruppenschnittbeizeitWITH +TRUE ELSE jgst:=text(gesamtlv,laengejgst);kopplung:=kopplungderlv(gesamtlv); +bitleiste:=lv1eintrag(zugriffszeilelv0);FI ELIF kennung=kennungkopplungTHEN +kennungstext1:=text(anwkennungstext1,laengekopplung);jgst:=jgstzukopplung( +kennungstext1);kopplung:=kennungstext1;IF jgst=""THEN LEAVE +schuelergruppenschnittbeizeitWITH TRUE ELSE sammlebitleisten(kennungstext1, +beginnlvkopplung,bitleiste)FI ELSE LEAVE schuelergruppenschnittbeizeitWITH +TRUE FI ;allestdpllv:=stuplanzeile(zeit);laengeallestdpllv:=length( +allestdpllv);IF laengeallestdpllvkennungstext1CAND stdpllv<>kennungstext2THEN stdplkopp:=subtext +(allestdpllv,anfangeintrag+beginnlvkopplung,anfangeintrag+endelvkopplung);IF +kopplungsbezunterschiedlichTHEN IF lv0eintrag(stdpllv)<>""THEN stdplbitleiste +:=lv1eintrag(zugriffszeilelv0);IF bitleistenschnittTHEN lv:=stdpllv;sugruppen +:=sugruppenausbitleiste(bitleistegemeinsamesugruppen(stdplbitleiste,bitleiste +));LEAVE schuelergruppenschnittbeizeitWITH TRUE FI ELSE LEAVE +schuelergruppenschnittbeizeitWITH TRUE FI ;FI ;FI ;ELSE IF jgstgleichTHEN +stdplkopp:=subtext(allestdpllv,anfangeintrag+beginnlvkopplung,anfangeintrag+ +endelvkopplung);IF kopplungsbezunterschiedlichTHEN IF lv0eintrag(stdpllv)<>"" +THEN stdplbitleiste:=lv1eintrag(zugriffszeilelv0);IF bitleistenschnittTHEN lv +:=stdpllv;sugruppen:=sugruppenausbitleiste(bitleistegemeinsamesugruppen( +stdplbitleiste,bitleiste));LEAVE schuelergruppenschnittbeizeitWITH TRUE FI +ELSE LEAVE schuelergruppenschnittbeizeitWITH TRUE FI ;FI ;FI ;FI ; +anfangeintrag:=anfangeintrag+laengestuplaneintragPER ;FALSE .bildejgstzurnull +:schuelergruppen:=beteiligteschuelergruppen(kennung,kennungstext1);FOR ij +FROM 1UPTO length(schuelergruppen)DIV laengesugruppeREP schgrindex:=(ij-1)* +laengesugruppe;schgrjgst:=subtext(schuelergruppen,schgrindex+1,schgrindex+2); +IF pos(jgstzurnull,trenner+schgrjgst+trenner)=0THEN jgstzurnullCAT schgrjgst; +jgstzurnullCAT trennerFI PER ;IF length(jgstzurnull)=4THEN jgst:=subtext( +jgstzurnull,2,3);jgstzurnull:=""FI .jgstgleich:jgst=stdpljgstCOR stdpljgst= +"00"COR pos(jgstzurnull,trenner+stdpljgst+trenner)>0. +kopplungsbezunterschiedlich:kopplung<>stdplkopp.bitleistenschnitt: +gibtesgemeinsamesugruppen(bitleiste,stdplbitleiste).END PROC +schuelergruppenschnittbeizeit;BOOL PROC gemeinsameschuelergruppen(TEXT CONST +kennung1,akennungstext1,kennung2,akennungstext2):BITLEISTE VAR bitleiste1, +bitleiste2;TEXT VAR kennungstext1:="",kennungstext2:="";IF kennung1=kennunglv +THEN kennungstext1:=text(akennungstext1,laengelv);IF lv0eintrag(kennungstext1 +)=""THEN LEAVE gemeinsameschuelergruppenWITH TRUE ELSE bitleiste1:=lv1eintrag +(zugriffszeilelv0)FI ELIF kennung1=kennungkopplungTHEN kennungstext1:=text( +akennungstext1,laengekopplung);sammlebitleisten(kennungstext1, +beginnlvkopplung,bitleiste1);ELSE LEAVE gemeinsameschuelergruppenWITH TRUE +FI ;IF kennung2=kennunglvTHEN kennungstext2:=text(akennungstext2,laengelv); +IF lv0eintrag(kennungstext2)=""THEN LEAVE gemeinsameschuelergruppenWITH TRUE +ELSE bitleiste2:=lv1eintrag(zugriffszeilelv0)FI ELIF kennung2=kennungkopplung +THEN kennungstext2:=text(akennungstext2,laengekopplung);sammlebitleisten( +kennungstext2,beginnlvkopplung,bitleiste2);ELSE LEAVE +gemeinsameschuelergruppenWITH TRUE FI ;gibtesgemeinsamesugruppen(bitleiste1, +bitleiste2)END PROC gemeinsameschuelergruppen;TEXT PROC lvderschuelergruppe( +TEXT CONST anwsugrup):INT VAR i,folgejgst:=5;TEXT VAR lvmitsugrup:="", +aufberjgst:=formatjgst(anwsugrup),sugrup:=text(anwsugrup,laengesugruppe); +BITLEISTE VAR bitleiste:=sugrupurleiste;IF pos(klstjgst,trenner+compress( +sugrup)+trenner)>0COR aufberjgst="00"COR schuelergruppeTHEN betrachtelvELSE +ungueltigesergebnis(kennunglv)FI .betrachtelv:bitleiste:=sg1eintrag(sugrup); +lvjgstnullanfang:=1;lvjgstnullende:=-1;WHILE lvjgstnullende=-1CAND folgejgst< +14REP lvjgstnullende:=erstezeileindatei(lvdatei,formatjgst(text(folgejgst)),1 +,beginnlvjgst)-1;folgejgstINCR 1PER ;IF formatjgst(anwsugrup)<>"00"THEN +lvsugrupjgstanfang:=erstezeileindatei(lvdatei,aufberjgst,1,beginnlvjgst);IF +int(sugrup)=jgstdreizehnTHEN lvsugrupjgstende:=anzlv;ELSE lvsugrupjgstende:= +erstezeileindatei(lvdatei,formatjgst(text(int(sugrup)+1)),lvsugrupjgstanfang, +beginnlvjgst);FI ;IF lvsugrupjgstanfang=0THEN lvsugrupjgstanfang:= +lvsugrupjgstende+1FI ELSE lvsugrupjgstanfang:=1;lvsugrupjgstende:=0FI ;FOR i +FROM lvjgstnullanfangUPTO lvjgstnullendeREP IF +bitleistenvergleichgemeinsamesugruppenTHEN lvmitsugrupCAT text(lv0eintrag(i), +laengelv)FI PER ;FOR iFROM lvsugrupjgstanfangUPTO lvsugrupjgstendeREP IF +bitleistenvergleichgemeinsamesugruppenTHEN lvmitsugrupCAT text(lv0eintrag(i), +laengelv)FI PER ;lvmitsugrup.bitleistenvergleichgemeinsamesugruppen: +gibtesgemeinsamesugruppen(bitleiste,lv1eintrag(i)).schuelergruppe:toline( +sugrupdatei,1);col(sugrupdatei,1);WHILE NOT eof(sugrupdatei)REP downety( +sugrupdatei,sugrup);IF col(sugrupdatei)=1THEN LEAVE schuelergruppeWITH TRUE +ELSE positionierenFI ;PER ;FALSE .positionieren:col(sugrupdatei,col( +sugrupdatei)+1).END PROC lvderschuelergruppe;TEXT PROC allelvmit(TEXT CONST +kennung,anwkennungstext):TEXT VAR lvmit:="",lv:="",kennungstext:="";INT VAR +richtigepos;IF kennung=kennungparapheTHEN kennungstext:=text(anwkennungstext, +laengeparaphe);richtigepos:=stuplanposparapheELIF kennung=kennungkopplung +THEN kennungstext:=text(anwkennungstext,laengekopplung);richtigepos:= +stuplanposkopplungELSE LEAVE allelvmitWITH ungueltigesergebnis(kennunglv)FI ; +toline(lvdatei,1);col(lvdatei,1);WHILE NOT eof(lvdatei)REP downety(lvdatei, +kennungstext);IF col(lvdatei)=richtigeposCAND NOT eof(lvdatei)THEN readrecord +(lvdatei,lv);lvmitCAT text(lv,laengelv)FI ;positionierenPER ;lvmit. +positionieren:col(lvdatei,col(lvdatei)+1).END PROC allelvmit;BOOL PROC +lvgeplant(INT CONST zeit,TEXT CONST lehrveranstaltung):INT CONST std:= +konvertierezeit(zeit);TEXT VAR eintrag:="";IF std=0THEN TRUE ELSE eintrag:= +stuplanzeile(std);instuplanzeile(eintrag,text(lehrveranstaltung,laengelv), +stuplanposjgst,letzteposstuplanzeile)FI END PROC lvgeplant;TEXT PROC +geplantelvfuer(INT CONST zeit,TEXT CONST kennung,anwkennungstext):INT VAR std +:=konvertierezeit(zeit),poslv,richtigepos;TEXT VAR kennungstext:="";IF std=0 +THEN LEAVE geplantelvfuerWITH ungueltigesergebnis(kennunglv)ELIF kennung= +kennungparapheTHEN kennungstext:=text(anwkennungstext,laengeparaphe); +richtigepos:=stuplanposparapheELIF kennung=kennungraumTHEN kennungstext:=text +(anwkennungstext,laengeraum);richtigepos:=stuplanposraumELSE LEAVE +geplantelvfuerWITH ungueltigesergebnis(kennunglv)FI ;IF instuplanzeile( +stuplanzeile(std),kennungstext,richtigepos,letzteposstuplanzeile)THEN +holentsprlvELSE ""FI .holentsprlv:poslv:=letzteposstuplanzeile-richtigepos+1; +subtext(stuplanzeile(std),poslv,poslv+laengelv-1).END PROC geplantelvfuer; +TEXT PROC allezeitenvon(TEXT CONST kennung,anwkennungstext):INT VAR i, +richtigepos;TEXT VAR verfplan:="",kennungstext:="";IF kennung=kennungparaphe +THEN kennungstext:=text(anwkennungstext,laengeparaphe);richtigepos:= +stuplanposparapheELIF kennung=kennunglvTHEN kennungstext:=text( +anwkennungstext,laengelv);richtigepos:=stuplanposjgstELIF kennung=kennungraum +THEN kennungstext:=text(anwkennungstext,laengeraum);richtigepos:= +stuplanposraumELIF kennung=kennungkopplungTHEN kennungstext:=text( +anwkennungstext,laengekopplung);richtigepos:=stuplanposkopplungELSE LEAVE +allezeitenvonWITH letztestunde*fehlerzeichenFI ;FOR iFROM erstestundeUPTO +letztestundeREP IF instuplanzeile(stuplanzeile(i),kennungstext,richtigepos, +letzteposstuplanzeile)THEN verfplanCAT einsELSE verfplanCAT nullFI PER ; +verfplanEND PROC allezeitenvon;TEXT PROC datenderzeit(INT CONST zeit,TEXT +CONST kennung):INT VAR std:=konvertierezeit(zeit),poseintrag,laengeeintrag, +objektlaenge,objektbeginn;TEXT VAR eintrag:="",ausgabe:="";IF kennung= +kennunglvTHEN objektlaenge:=laengelv;objektbeginn:=stuplanposjgstELIF kennung +=kennungkopplungTHEN objektlaenge:=laengekopplung;objektbeginn:= +stuplanposkopplungELIF kennung=kennungparapheTHEN objektlaenge:=laengeparaphe +;objektbeginn:=stuplanposparapheELIF kennung=kennungraumTHEN objektlaenge:= +laengeraum;objektbeginn:=stuplanposraumELSE LEAVE datenderzeitWITH +fehlerzeichenFI ;IF std=0THEN LEAVE datenderzeitWITH ungueltigesergebnis( +kennung)FI ;toline(stuplandatei,std);readrecord(stuplandatei,eintrag);ausgabe +:="";poseintrag:=objektbeginn;laengeeintrag:=length(eintrag);WHILE poseintrag +kennungsugruppeTHEN IF instuplanzeile(stuplanzeile( +std),kennungstext,richtigepos,letzteposstuplanzeile)THEN holentsprlvFI ELSE +holelvderzeit;ermittlebitleiste;vergleichelvmitbitleisteFI .holentsprlv:poslv +:=letzteposstuplanzeile-richtigepos+1;lehrveranstaltung:=subtext(stuplanzeile +(std),poslv,poslv+laengestuplaneintrag-1);raum:=subtext(lehrveranstaltung, +stuplanposraum);paraphe:=subtext(lehrveranstaltung,stuplanposparaphe, +stuplanposparaphe+laengeparaphe-1);lehrveranstaltung:=text(lehrveranstaltung, +laengelv).ermittlebitleiste:stackpos:=pos(behandeltesugruppen,trenner+ +kennungstext+trenner);IF bitleistenochzuermittelnTHEN sugrupbitleiste:= +sg1eintrag(kennungstext);IF anzbitleisten""THEN stdplbitleiste:= +lv1eintrag(zugriffszeilelv0);IF bitleistenschnittTHEN lehrveranstaltungCAT +stdpllv;raumCAT subtext(allestdpllv,anfangeintrag+stuplanposraum, +anfangeintrag+laengestuplaneintrag);parapheCAT subtext(allestdpllv, +anfangeintrag+stuplanposparaphe,anfangeintrag+stuplanposraum-1)FI FI ;FI ; +anfangeintrag:=anfangeintrag+laengestuplaneintragPER .jgstgleichodernullnull: +jgstdersugrup=jgstderlvCOR jgstderlv="00".bitleistenschnitt: +gibtesgemeinsamesugruppen(sugrupbitleiste,stdplbitleiste).fehlerbehandlung: +lehrveranstaltung:=ungueltigesergebnis(kennunglv);raum:="";paraphe:="";LEAVE +planeintraglesen.END PROC planeintraglesen;PROC planeintragvornehmen(INT +CONST zeit,TEXT CONST anwlehrveranstaltung,anwraum,BOOL VAR ok):INT VAR std:= +konvertierezeit(zeit);TEXT VAR lv,eintrag,neuereintrag,lehrveranstaltung:= +text(anwlehrveranstaltung,laengelv),raum:=text(anwraum,laengeraum);IF std=0 +THEN ok:=FALSE ;LEAVE planeintragvornehmenFI ;IF raum<>leereraumangabeAND ( +NOT bezeichnungzulaessig(kennungraum,raum))THEN ok:=FALSE ;LEAVE +planeintragvornehmenFI ;lv:=lv0eintrag(lehrveranstaltung);IF lv=""THEN ok:= +FALSE ;ELIF instuplanzeile(stuplanzeile(std),lehrveranstaltung,stuplanposjgst +,letzteposstuplanzeile)THEN holstuplaneintrag;substituierelvELSE +holstuplaneintrag;erweitereumlvFI .holstuplaneintrag:ok:=TRUE ;toline( +stuplandatei,std);readrecord(stuplandatei,eintrag).erweitereumlv:eintragCAT +text(lv,laengelv+laengekopplung+laengeparaphe);eintragCAT text(raum, +laengeraum);writerecord(stuplandatei,eintrag).substituierelv:neuereintrag:= +text(eintrag,letzteposstuplanzeile-1);neuereintragCAT text(lv,laengelv+ +laengekopplung+laengeparaphe);neuereintragCAT text(raum,laengeraum); +neuereintragCAT subtext(eintrag,letzteposstuplanzeile+laengestuplaneintrag); +writerecord(stuplandatei,neuereintrag).END PROC planeintragvornehmen;PROC +planeintragloeschen(INT CONST zeit,TEXT CONST lehrveranstaltung,BOOL VAR ok): +INT VAR std:=konvertierezeit(zeit);TEXT VAR eintrag,neuereintrag;IF std=0 +THEN ok:=FALSE ELIF instuplanzeile(stuplanzeile(std),text(lehrveranstaltung, +laengelv),stuplanposjgst,letzteposstuplanzeile)THEN holstuplaneintrag; +loescheeintragELSE ok:=FALSE FI .holstuplaneintrag:ok:=TRUE ;toline( +stuplandatei,std);readrecord(stuplandatei,eintrag).loescheeintrag: +neuereintrag:=text(eintrag,letzteposstuplanzeile-1);neuereintragCAT subtext( +eintrag,letzteposstuplanzeile+laengestuplaneintrag);writerecord(stuplandatei, +neuereintrag).END PROC planeintragloeschen;PROC resetbitleiste(BITLEISTE VAR +bitleiste):FOR iFROM 1UPTO leistenlaengeREP FOR jFROM 0UPTO bits-1REP +resetbit(bitleiste(i),j)PER PER ;END PROC resetbitleiste;PROC +loeschdatenraeume:forget(lvnulldatenraum,quiet);forget(sgnulldatenraum,quiet) +;forget(lveinsdatenraum,quiet);forget(sgeinsdatenraum,quiet)END PROC +loeschdatenraeume;OP :=(BITLEISTE VAR eins,BITLEISTE CONST zwei):INT VAR i; +FOR iFROM 1UPTO leistenlaengeREP eins(i):=zwei(i)PER END OP :=;PROC +schreibesugrupundklgrinds:zz:=0;positioniersugrup;holsugrupdaten;IF zz=0THEN +LEAVE schreibesugrupundklgrindsFI ;anzsugrup:=zz;positionierklgr;holklgrdaten +;IF anzsugrup=-1THEN LEAVE schreibesugrupundklgrindsFI ;anzsugrupundklgr:=zz; +FOR iFROM jgstfuenfUPTO jgstdreizehnREP toline(sugrupdatei,lines(sugrupdatei) ++1);schreibjgstindateiPER .positioniersugrup:inittupel(dnraktschuelergruppen) +;putwert(fnrsgrpsj,gewschulj);putwert(fnrsgrphj,gewhalbj);putintwert( +fnrsgrpjgst,0).positionierklgr:inittupel(dnrklassengruppen);first( +dnrklassengruppen).holsugrupdaten:IF records(dnraktschuelergruppen)=0.0THEN +LEAVE schreibesugrupundklgrindsFI ;statleseschleife(dnraktschuelergruppen, +gewschulj,gewhalbj,fnrsgrpsj,fnrsgrphj,PROC sugrupinds).holklgrdaten:IF +records(dnrklassengruppen)=0.0THEN LEAVE holklgrdatenFI ;statleseschleife( +dnrklassengruppen,"","",fnrkgklassengrp,fnrkgschuelergrp,PROC klgrinds). +schreibjgstindatei:putds(sugrupdatei,text(formatjgst(text(i)),laengesugruppe) +);schreibbitleisteinds.schreibbitleisteinds:sugrupleiste:=sugrupurleiste; +ermittlebitleistejgstodersugrupklgr(formatjgst(text(i,laengejgst))); +sgbitleisten(zz+1):=sugrupleiste;zzINCR 1.END PROC schreibesugrupundklgrinds; +PROC schreibelvinds:anzlv:=0;sucheerstensatz;schreibsugrupleiste;IF zz<>0 +THEN anzlv:=zz-1FI .sucheerstensatz:IF records(dnrlehrveranstaltungen)=0.0 +THEN LEAVE schreibelvindsFI ;inittupel(dnrlehrveranstaltungen);putwert( +fnrlvsj,gewschulj);putwert(fnrlvhj,gewhalbj);putintwert(fnrlvjgst,jgstnull); +putwert(fnrlvfachkennung,"");search(dnrlehrveranstaltungen,FALSE ). +schreibsugrupleiste:zz:=0;statleseschleife(dnrlehrveranstaltungen,gewschulj, +gewhalbj,fnrlvsj,fnrlvhj,PROC sugrupleisteinds).END PROC schreibelvinds;PROC +sugrupleisteinds(BOOL VAR b):IF wert(fnrlvsj)=gewschuljCAND wert(fnrlvhj)= +gewhalbjCAND dbstatus=0CAND zz<2499THEN klgreintrag:=FALSE ;sugrupleiste:= +sugrupurleiste;analysiereklgreinerlv(fnrlvklgrp1);IF anzsugrup=-1THEN b:= +TRUE ;LEAVE sugrupleisteindsELSE analysiereklgreinerlv(fnrlvklgrp2);IF +anzsugrup=-1THEN b:=TRUE ;LEAVE sugrupleisteindsELSE analysiereklgreinerlv( +fnrlvklgrp3);IF anzsugrup=-1THEN b:=TRUE ;LEAVE sugrupleisteindsELSE +analysiereklgreinerlv(fnrlvklgrp4);FI ;FI ;FI ;IF NOT klgreintragTHEN +ermittlebitleistejgst(wert(fnrlvjgst));FI ;schreiblvindatei; +schreibsugrupleisteindsELSE b:=TRUE FI .schreiblvindatei:dateieintrag:=""; +dateieintragCAT formatjgst(wert(fnrlvjgst));dateieintragCAT text(wert( +fnrlvfachkennung),laengefachkennung);dateieintragCAT text(wert(fnrlvkopplung) +,laengekopplung);dateieintragCAT text(wert(fnrlvparaphe),laengeparaphe); +dateieintragCAT text(wert(fnrlvwochenstd),laengewochenstd);dateieintragCAT +text(wert(fnrlvraumgrp1),laengeraum);dateieintragCAT text(wert(fnrlvraumgrp2) +,laengeraum);putds(lvdatei,dateieintrag).schreibsugrupleisteinds:lvbitleisten +(zz+1):=sugrupleiste;zzINCR 1;.END PROC sugrupleisteinds;PROC +analysiereklgreinerlv(INT CONST lvklgrfeld):IF wert(lvklgrfeld)<>""THEN IF +istjgst(wert(lvklgrfeld))THEN ermittlebitleistejgst(wert(lvklgrfeld));ELIF +istklgr(wert(lvklgrfeld))THEN ermittlebitleistejgstodersugrupklgr(wert( +lvklgrfeld));ELSE ermittlebitleistejgstodersugrupklgr(formatjgst(wert( +fnrlvjgst))+wert(lvklgrfeld));IF anzsugrup=-1THEN LEAVE analysiereklgreinerlv +FI ;FI ;klgreintrag:=TRUE FI ;END PROC analysiereklgreinerlv;PROC sugrupinds( +BOOL VAR b):IF wert(fnrsgrpsj)=gewschuljCAND wert(fnrsgrphj)=gewhalbjCAND +dbstatus=0THEN sugrupleiste:=sugrupurleiste;putds(sugrupdatei,formatjgst(wert +(fnrsgrpjgst))+text(wert(fnrsgrpkennung),laengeklagruppe));IF zz<127THEN +schreibesugrupleisteFI ;sgbitleisten(zz+1):=sugrupleiste;zzINCR 1;ELIF wert( +fnrsgrpsj)>gewschuljCOR wert(fnrsgrphj)>gewhalbjCOR dbstatus<>0COR zz=127 +THEN b:=TRUE FI .schreibesugrupleiste:setzebit(zz).END PROC sugrupinds;PROC +klgrinds(BOOL VAR b):IF dbstatus=0THEN toline(sugrupdatei,lines(sugrupdatei)+ +1);plausiklgrCAT wert(fnrkgklassengrp)+trenner;putds(sugrupdatei,text(wert( +fnrkgklassengrp),laengesugruppe));analysieresugrupen;sgbitleisten(zz+1):= +sugrupleiste;zzINCR 1ELSE b:=TRUE FI .analysieresugrupen:sugrupleiste:= +sugrupurleiste;sugruppeneinerklgr:=wert(fnrkgschuelergrp);FOR kFROM 1UPTO +LENGTH sugruppeneinerklgrDIV laengesugruppeREP +ermittlebitleistejgstodersugrupklgr(subtext(sugruppeneinerklgr,(k-1)* +laengesugruppe+1,k*laengesugruppe));IF anzsugrup=-1THEN b:=TRUE ;LEAVE +klgrindsFI ;PER .END PROC klgrinds;PROC ermittlebitleistejgstodersugrupklgr( +TEXT CONST klgrteil):TEXT VAR compklgrteil:=compress(klgrteil);IF istjgst( +compklgrteil)THEN stellebitleistenjgstELSE stellebitleistesugrupoderklgrFI . +stellebitleistesugrupoderklgr:IF istklgr(compklgrteil)THEN toline(sugrupdatei +,anzsugrup);ELSE toline(sugrupdatei,1);FI ;col(sugrupdatei,1);downety( +sugrupdatei,compklgrteil);IF NOT eof(sugrupdatei)THEN oderbitleisten;LEAVE +stellebitleistesugrupoderklgrELSE anzsugrup:=-1;LEAVE +ermittlebitleistejgstodersugrupklgrFI .stellebitleistenjgst:toline( +sugrupdatei,1);col(sugrupdatei,1);WHILE NOT eof(sugrupdatei)REP downety( +sugrupdatei,formatjgst(klgrteil));IF col(sugrupdatei)=1CAND lineno( +sugrupdatei)<=anzsugrupTHEN oderbitleistenFI ;positionierenPER .positionieren +:col(sugrupdatei,col(sugrupdatei)+1).oderbitleisten:BITLEISTE VAR bitleiste:= +sgbitleisten(lineno(sugrupdatei));FOR jFROM 1UPTO leistenlaengeREP +sugrupleiste(j):=sugrupleiste(j)OR bitleiste(j)PER .END PROC +ermittlebitleistejgstodersugrupklgr;PROC ermittlebitleistejgst(TEXT CONST +klgrteil):stellebitleistenjgst.stellebitleistenjgst:toline(sugrupdatei, +anzsugrupundklgr);col(sugrupdatei,1);WHILE NOT eof(sugrupdatei)REP downety( +sugrupdatei,formatjgst(klgrteil));IF col(sugrupdatei)=1THEN oderbitleistenFI +;positionierenPER .positionieren:col(sugrupdatei,col(sugrupdatei)+1). +oderbitleisten:BITLEISTE VAR bitleiste:=sgbitleisten(lineno(sugrupdatei)); +FOR jFROM 1UPTO leistenlaengeREP sugrupleiste(j):=sugrupleiste(j)OR bitleiste +(j)PER .END PROC ermittlebitleistejgst;BOOL PROC stundenplanbasisaktuell(INT +VAR fehlerstatus):dserstellungszeit:="";letztedbzeit:="";ermittledszeit; +ermittledbzeit;vergleichezeit;IF fehlerstatus=0THEN TRUE ELSE FALSE FI . +ermittledszeit:dserstellungszeit:=erstellungszeitderdatenraeume. +ermittledbzeit:IF gewhalbj=schulkenndatum(halbj)THEN inittupel(dnrschluessel) +;putwert(fnrschlschluessel,dbaenderungakt);ELSE inittupel(dnrschluessel); +putwert(fnrschlschluessel,dbaenderunggepl);FI ;putwert(fnrschlsachgebiet, +dbaenderung);search(dnrschluessel,TRUE );IF dbstatus<>okTHEN fehlerstatus:=9; +LEAVE stundenplanbasisaktuellWITH FALSE ELSE letztedbzeit:=wert( +fnrschllangtext)FI .vergleichezeit:IF dsjahr=dbjahrTHEN pruefmonatELIF dsjahr +>dbjahrTHEN fehlerstatus:=0ELSE fehlerstatus:=1FI .pruefmonat:IF dsmonat= +dbmonatTHEN prueftagELIF dsmonat>dbmonatTHEN fehlerstatus:=0ELSE fehlerstatus +:=1FI .prueftag:IF dstag=dbtagTHEN pruefzeitELIF dstag>dbtagTHEN fehlerstatus +:=0ELSE fehlerstatus:=1FI .pruefzeit:IF dszeit>=dbzeitTHEN fehlerstatus:=0 +ELSE fehlerstatus:=1FI .dsjahr:subtext(dserstellungszeit,erstellzeitjahr, +erstellzeitjahr+1).dbjahr:subtext(letztedbzeit,erstellzeitjahr, +erstellzeitjahr+1).dsmonat:subtext(dserstellungszeit,erstellzeitmonat, +erstellzeitmonat+1).dbmonat:subtext(letztedbzeit,erstellzeitmonat, +erstellzeitmonat+1).dstag:text(dserstellungszeit,erstellzeittag+1).dbtag:text +(letztedbzeit,erstellzeittag+1).dszeit:subtext(dserstellungszeit, +erstellzeitstdmin).dbzeit:subtext(letztedbzeit,erstellzeitstdmin).END PROC +stundenplanbasisaktuell;PROC stundenplanbasiserstellen(INT VAR fehlerstatus): +hilfsdatenerstellen(fehlerstatus);IF fehlerstatus=0THEN toline(stuplandatei, +letztestunde+1);writerecord(stuplandatei,date+blank+timeofday);FI .END PROC +stundenplanbasiserstellen;PROC hilfsdatenerstellen(INT VAR fehlerstatus): +inithilfsdateien;schreibesugrupundklgrinds;IF anzsugrup=-1THEN fehlerstatus:= +9;forget(sgnulldatenraum,quiet);forget(sgeinsdatenraum,quiet)ELIF anzsugrup=0 +THEN fehlerstatus:=4ELIF anzsugrup>127THEN fehlerstatus:=5;loeschdatenraeume +ELSE schreibelvinds;IF anzsugrup=-1THEN fehlerstatus:=9;loeschdatenraeume +ELIF anzlv=0THEN fehlerstatus:=6;loeschdatenraeumeELIF anzlv>2499THEN +fehlerstatus:=7;loeschdatenraeumeELSE fehlerstatus:=0FI ;FI .inithilfsdateien +:commanddialogue(FALSE );loeschdatenraeume;commanddialogue(TRUE );#dslv:=new( +lvnulldatenraum);dssugrup:=new(sgnulldatenraum);commanddialogue(FALSE ); +forget(dslv);forget(dssugrup);commanddialogue(TRUE );#lvdatei:=sequentialfile +(modify,lvnulldatenraum);sugrupdatei:=sequentialfile(modify,sgnulldatenraum); +lvbitleisten:=new(lveinsdatenraum);sgbitleisten:=new(sgeinsdatenraum); +resetbitleiste(sugrupurleiste).END PROC hilfsdatenerstellen;PROC +datenraeumeankoppeln:IF exists(lvnulldatenraum)THEN lvdatei:=sequentialfile( +modify,old(lvnulldatenraum))FI ;IF exists(sgnulldatenraum)THEN sugrupdatei:= +sequentialfile(modify,old(sgnulldatenraum))FI ;IF exists(stuplandatenraum) +THEN stuplandatei:=sequentialfile(modify,old(stuplandatenraum))FI ;IF exists( +lveinsdatenraum)THEN lvbitleisten:=old(lveinsdatenraum);FI ;IF exists( +sgeinsdatenraum)THEN sgbitleisten:=old(sgeinsdatenraum);FI END PROC +datenraeumeankoppeln;INT PROC zugriffszeilelv0:letzterzugrifflv0END PROC +zugriffszeilelv0;TEXT PROC lv0eintrag(TEXT CONST lv):TEXT VAR dateieintrag:= +"";letzterzugrifflv0:=0;dateieintrag:="";toline(lvdatei,1);col(lvdatei,1); +WHILE NOT eof(lvdatei)REP downety(lvdatei,lv);IF col(lvdatei)=beginnlvbez +CAND NOT eof(lvdatei)THEN readrecord(lvdatei,dateieintrag);letzterzugrifflv0 +:=lineno(lvdatei);LEAVE lv0eintragWITH dateieintragELSE positionierenFI ;PER +;"".positionieren:col(lvdatei,col(lvdatei)+1).END PROC lv0eintrag;TEXT PROC +lv0eintrag(INT CONST index):TEXT VAR dateieintrag:="";toline(lvdatei,index); +col(lvdatei,1);IF eof(lvdatei)THEN ""ELSE readrecord(lvdatei,dateieintrag); +dateieintragFI END PROC lv0eintrag;BOOL PROC kopplunginlv0(TEXT CONST +kopplung):toline(lvdatei,1);col(lvdatei,1);WHILE NOT eof(lvdatei)REP downety( +lvdatei,kopplung);IF col(lvdatei)=beginnlvkopplungCAND NOT eof(lvdatei)THEN +LEAVE kopplunginlv0WITH TRUE ELSE positionierenFI ;PER ;FALSE .positionieren: +col(lvdatei,col(lvdatei)+1).END PROC kopplunginlv0;BOOL PROC sg0eintrag(TEXT +CONST sg):toline(sugrupdatei,1);col(sugrupdatei,1);WHILE NOT eof(sugrupdatei) +REP downety(sugrupdatei,sg);IF col(sugrupdatei)=1CAND NOT eof(sugrupdatei) +CAND lineno(sugrupdatei)<=anzsugrupTHEN LEAVE sg0eintragWITH TRUE ELSE +positionierenFI ;PER ;FALSE .positionieren:col(sugrupdatei,col(sugrupdatei)+1 +).END PROC sg0eintrag;TEXT PROC sg0eintrag(INT CONST index):dateieintrag:=""; +toline(sugrupdatei,index);col(sugrupdatei,1);IF eof(sugrupdatei)THEN ""ELSE +readrecord(sugrupdatei,dateieintrag);text(dateieintrag,laengesugruppe)FI END +PROC sg0eintrag;BITLEISTE PROC sg1eintrag(TEXT CONST anwsugrup):TEXT VAR +sugrup:=text(anwsugrup,laengesugruppe);toline(sugrupdatei,1);col(sugrupdatei, +1);WHILE NOT eof(sugrupdatei)REP downety(sugrupdatei,sugrup);IF col( +sugrupdatei)=1CAND NOT eof(sugrupdatei)THEN LEAVE sg1eintragWITH sgbitleisten +(lineno(sugrupdatei))ELSE positionierenFI ;PER ;sugrupurleiste.positionieren: +col(sugrupdatei,col(sugrupdatei)+1).END PROC sg1eintrag;BITLEISTE PROC +lv1eintrag(INT CONST index):lvbitleisten(index)END PROC lv1eintrag;TEXT PROC +sugruppenausbitleiste(BITLEISTE CONST bitleiste):sugruppeneinerklgr:="";FOR j +FROM 1UPTO leistenlaengeREP lowbit:=lowestset(bitleiste(j));IF lowbit<>-1 +THEN FOR kFROM lowbitUPTO bits-1REP IF bit(bitleiste(j),k)THEN +sugruppeneinerklgrCAT sg0eintrag(k+(j-1)*bits+1)FI PER ;FI ;PER ; +sugruppeneinerklgrEND PROC sugruppenausbitleiste;BITLEISTE PROC +bitleisteallesugruppen(BITLEISTE VAR v,BITLEISTE CONST c):BITLEISTE VAR b:= +sugrupurleiste;FOR jFROM 1UPTO leistenlaengeREP b(j):=v(j)OR c(j)PER ;bEND +PROC bitleisteallesugruppen;BITLEISTE PROC bitleistegemeinsamesugruppen( +BITLEISTE CONST v,c):BITLEISTE VAR b:=sugrupurleiste;FOR jFROM 1UPTO +leistenlaengeREP b(j):=v(j)AND c(j)PER ;bEND PROC +bitleistegemeinsamesugruppen;BOOL PROC gibtesgemeinsamesugruppen(BITLEISTE +CONST v,c):BITLEISTE VAR b:=sugrupurleiste;FOR jFROM 1UPTO leistenlaengeREP b +(j):=v(j)AND c(j);lowbit:=lowestset(b(j));IF lowbit<>-1THEN LEAVE +gibtesgemeinsamesugruppenWITH TRUE FI ;PER ;FALSE END PROC +gibtesgemeinsamesugruppen;BITLEISTE PROC bitleistenichtgemeinsamesugruppen( +BITLEISTE CONST v,c):BITLEISTE VAR b:=sugrupurleiste;FOR jFROM 1UPTO +leistenlaengeREP b(j):=v(j)XOR c(j)PER ;bEND PROC +bitleistenichtgemeinsamesugruppen;PROC sammlebitleisten(TEXT CONST +kennungstext,INT CONST richtigepos,BITLEISTE VAR bitleiste):resetbitleiste( +bitleiste);toline(lvdatei,1);col(lvdatei,1);WHILE NOT eof(lvdatei)REP downety +(lvdatei,kennungstext);IF col(lvdatei)=richtigeposCAND NOT eof(lvdatei)THEN +bitleiste:=bitleisteallesugruppen(bitleiste,lv1eintrag(lineno(lvdatei)));FI ; +positionieren;PER .positionieren:col(lvdatei,col(lvdatei)+1).END PROC +sammlebitleisten;TEXT PROC jgstzukopplung(TEXT CONST kennungstext):TEXT VAR +lv:="";toline(lvdatei,1);col(lvdatei,1);WHILE NOT eof(lvdatei)REP downety( +lvdatei,kennungstext);IF col(lvdatei)=beginnlvkopplungCAND NOT eof(lvdatei) +THEN readrecord(lvdatei,lv);LEAVE jgstzukopplungWITH text(lv,laengejgst)FI ; +positionieren;PER ;"".positionieren:col(lvdatei,col(lvdatei)+1).END PROC +jgstzukopplung;TEXT PROC ungueltigesergebnis(TEXT CONST kennung):IF kennung= +kennunglvTHEN ergebnis:=laengelv*fehlerzeichenELIF kennung=kennungzeitOR +kennung=kennungzugelassenezeitTHEN ergebnis:=laengezeit*fehlerzeichenELIF +kennung=kennungparapheTHEN ergebnis:=laengeparaphe*fehlerzeichenELIF kennung= +kennungkopplungTHEN ergebnis:=laengekopplung*fehlerzeichenELIF kennung= +kennungsugruppeTHEN ergebnis:=laengesugruppe*fehlerzeichenELIF kennung= +kennungraumOR kennung=kennungwunschraumOR kennung=kennungersatzraumTHEN +ergebnis:=laengeraum*fehlerzeichenELIF kennung=kennungwochenstdTHEN ergebnis +:=laengewochenstd*fehlerzeichenELSE ergebnis:=fehlerzeichenFI ;ergebnisEND +PROC ungueltigesergebnis;PROC raumcat(BOOL VAR b):IF wert(fnrschlsachgebiet)= +dbraeumeTHEN plausiraeumeCAT text(wert(fnrschlschluessel),laengeraum)+trenner +;ELIF wert(fnrschlsachgebiet)>dbraeumeCOR dbstatus<>0THEN b:=TRUE FI END +PROC raumcat;PROC paraphencat(BOOL VAR b):IF dbstatus<>0THEN b:=TRUE ELSE +plausiparaphenCAT text(wert(dnrlehrer+1),laengeparaphe);plausiparaphenCAT +trennerFI END PROC paraphencat;PROC erstelleplausizeiten(BOOL VAR b):IF wert( +fnrzrsj)>gewschuljCOR wert(fnrzrhj)<>gewhalbjCOR dbstatus<>0THEN b:=TRUE +ELSE IF wert(fnrzrkennungteil)=zeitrastersperreTHEN replace(plausizeiten, +intwert(fnrzrtagstunde),"1")FI ;FI END PROC erstelleplausizeiten;TEXT PROC +stuplanzeile(INT CONST zeit):INT VAR std:=konvertierezeit(zeit);TEXT VAR +eintrag:="";IF std=0THEN laengestuplaneintrag*fehlerzeichenELSE toline( +stuplandatei,std);eintrag:="";readrecord(stuplandatei,eintrag);eintragFI END +PROC stuplanzeile;BOOL PROC instuplanzeile(TEXT CONST quelle,muster,INT +CONST richtigepos,INT VAR findpos):INT VAR suchab:=1,aktpos;WHILE pos(quelle, +muster,suchab)<>0REP aktpos:=pos(quelle,muster,suchab);IF aktposMOD +laengestuplaneintrag=richtigeposTHEN findpos:=aktpos;LEAVE instuplanzeile +WITH TRUE ELSE suchab:=aktpos+1FI PER ;FALSE END PROC instuplanzeile;INT +PROC erstezeileindatei(FILE VAR datei,TEXT CONST muster,INT CONST suchab, +richtigepos):toline(datei,suchab);col(datei,1);WHILE NOT eof(datei)REP +downety(datei,muster);IF col(datei)=richtigeposTHEN LEAVE erstezeileindatei +WITH lineno(datei)FI ;positionierenPER ;0.positionieren:col(datei,col(datei)+ +1).END PROC erstezeileindatei;PROC schreibeerstellungszeit:INT VAR +fehlerstatus;IF NOT exists(stuplandatenraum)THEN stundenplanerstellen(date+ +blank+timeofday,fehlerstatus)FI END PROC schreibeerstellungszeit;INT PROC +konvertierezeit(INT CONST tagstd):IF tagstd<1THEN 0ELIF tagstd<=letztestunde +THEN tagstdELIF tagstd>schultage*100+samstagstdTHEN 0ELIF tagstdMOD 100> +stdprotagTHEN 0ELIF tagstdMOD 100=0THEN 0ELSE ((tagstdDIV 100)-1)*stdprotag+( +tagstdMOD 100)FI END PROC konvertierezeit;PROC setzebit(INT CONST bitnr):IF +bitnrDIV bits+1>leistenlaengeTHEN LEAVE setzebitFI ;setbit(sugrupleiste(bitnr +DIV bits+1),bitnrMOD bits)END PROC setzebit;BOOL PROC istjgst(TEXT CONST t): +pos(klstjgst,trenner+t+trenner)>0END PROC istjgst;BOOL PROC istklgr(TEXT +CONST t):pos(plausiklgr,trenner+t+trenner)>0END PROC istklgr;PROC putds(FILE +VAR file,TEXT CONST t):insertrecord(file);writerecord(file,t);down(file);END +PROC putds;TEXT PROC formatjgst(TEXT CONST t):subtext("0"+compress(text(t, +laengejgst)),length("0"+compress(text(t,laengejgst)))-1)END PROC formatjgst; +TEXT PROC lvnulldatenraum:lvnull+gewhalbj+punkt+gewschuljEND PROC +lvnulldatenraum;TEXT PROC lveinsdatenraum:lveins+gewhalbj+punkt+gewschuljEND +PROC lveinsdatenraum;TEXT PROC sgnulldatenraum:sgnull+gewhalbj+punkt+ +gewschuljEND PROC sgnulldatenraum;TEXT PROC sgeinsdatenraum:sgeins+gewhalbj+ +punkt+gewschuljEND PROC sgeinsdatenraum;TEXT PROC stuplandatenraum:stuplan+ +gewhalbj+punkt+gewschuljEND PROC stuplandatenraum;TEXT PROC bezderlv(TEXT +CONST lvzeile):subtext(lvzeile,beginnlvbez,endelvbez)END PROC bezderlv;TEXT +PROC kopplungderlv(TEXT CONST lvzeile):subtext(lvzeile,beginnlvkopplung, +endelvkopplung)END PROC kopplungderlv;TEXT PROC paraphederlv(TEXT CONST +lvzeile):subtext(lvzeile,beginnlvparaphe,endelvparaphe)END PROC paraphederlv; +TEXT PROC wochenstdderlv(TEXT CONST lvzeile):subtext(lvzeile, +beginnlvwochenstd,endelvwochenstd)END PROC wochenstdderlv;TEXT PROC +wunschraumderlv(TEXT CONST lvzeile):subtext(lvzeile,beginnlvraumgr1, +endelvraumgr1)END PROC wunschraumderlv;TEXT PROC ersatzraumderlv(TEXT CONST +lvzeile):subtext(lvzeile,beginnlvraumgr2,endelvraumgr2)END PROC +ersatzraumderlv;END PACKET stundenplanschnittstelle + -- cgit v1.2.3