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