Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Import einer Kurs42-Blockung #120

Closed
NielsWL opened this issue Feb 26, 2024 · 18 comments
Closed

Import einer Kurs42-Blockung #120

NielsWL opened this issue Feb 26, 2024 · 18 comments
Assignees

Comments

@NielsWL
Copy link

NielsWL commented Feb 26, 2024

Beim Import einer Kurs42-Blockung werden Kurse, die über mehrere Schienen laufen nicht korrekt importiert. In der Tabelle Kursplanung tauchen sie zwar auf zwei Schienen verteilt auf, eingetragen ist aber nur eine Schiene. Dies führt zu einem Fehler, wenn dann geblockt werden soll.

image

Stellt man dann die Schienenanzahl auf 2, wird in der Tabelle der Kurs auf 3 Schienen verteilt..

image

Die Schienenanzahl lässt sich auch nicht korrigieren.

@benjaminbartsch
Copy link
Collaborator

... bin auf der Spur, brauche nun @ThomasBachran Hilfe.

@benjaminbartsch
Copy link
Collaborator

@NielsWL : Könntest du einmal bitte gucken, was in der Kurse.txt für den 2-Schienen-Kurs gespeichert ist. Ist dort die Schieneanzahl 1 oder 2 gespeichert? Ich habe die Vermutung, dass in den Kurs42 Daten dort eine 1 gespeichert ist und der Kurs dennoch 2 Schienen zugeordnet ist und das Kurs42 mit dieser Inkonsistenz keine Probleme hat.

@NielsWL
Copy link
Author

NielsWL commented Mar 30, 2024

"KursId";"Fach";"Name";"Lehrer";"Std";"Raum";"Kursart";"Schulnummer";"Schienenzahl";"Gesperrt";"Blocken";"ParallelKursZahl";"ParallelKursNr";"FixiertInSchiene"
-59;"TRBB";"TRBB-GK1";"--";3;"--";"GK";0;2;"[]";1;3;3;"3,4"
-60;"TRBB";"TRBB-GK2";"--";3;"--";"GK";0;2;"[]";1;3;2;"5,6"
-81;"TRBB";"TRBB-GK3";"--";3;"--";"GK";0;1;"[]";1;3;1;"5"
-53;"SP";"SP-GK1";"--";3;"--";"GK";0;1;"[]";1;4;4;"3,9"
-54;"SP";"SP-GK2";"--";3;"--";"GK";0;1;"[]";1;4;3;"6,5"
-55;"SP";"SP-GK3";"--";3;"--";"GK";0;1;"[]";1;4;2;"8,11"
-56;"SP";"SP-GK4";"--";3;"--";"GK";0;1;"[]";1;4;1;"5,6"

Dies ist ein Auszug der Infos in der Kurse.txt, die Kurs42-CNF dort speichert und die dann in Kurs42 importiert werden. So werden die Daten auch aus Kurs42 exportiert.

TRBB-GK1 und TRBB-GK2 laufen über 2 Schienen, TRBB-GK3 läuft nur in einer Schiene. Warum in Kurs42 mit Schiene 0 begonnen wird, ist mir nicht klar, aber wahrscheinlich auch egal.
Warum bei den Sportkursen auch hinten zwei Schienennummern angezeigt werden, erschließt sich mir auch nicht. Bei den Kursen TRBB passt es.

Blockplan.txt liefert dazu folgende Infos:
"Schiene";"Kursbezeichnung";"Fixiert"
0;"D-GK1";1
0;"D-GK2";1
0;"D-GK3";1
0;"D-GK4";1
0;"D-GK5";1
0;"D-GK6";1
1;"E-GK1";1
1;"E-GK2";1
1;"E-GK3";1
1;"E-GK4";1
1;"E-GK5";1
1;"E-GK6";1
2;"M-GK1";1
2;"M-GK2";1
2;"M-GK3";1
2;"M-GK4";1
2;"M-GK5";1
2;"M-GK6";1
3;"BI-GK1";1
3;"EK-GK1";1
3;"KU-GK3";1
3;"SP-GK4";1
3;"TRBB-GK1";1
3;"TRLA-GK1";1
3;"TRVB-GK1";1
3;"VKM-VTF2";1
4;"BI-GK2";1
4;"GE-GK2";1
4;"S0-GK1";1
4;"SP-GK3";1
4;"SWF-GK1";1
4;"TRBB-GK1";1
4;"TRLA-GK1";1
4;"TRVB-GK1";1
5;"IF-GK2";1
5;"KU-GK1";1
5;"MU-GK1";1
5;"PL-GK1";1
5;"TRBB-GK2";1
5;"TRBB-GK3";1
5;"TRRU-GK1";1
5;"TRTE-GK1";1
5;"TRVB-GK2";1
5;"VKM-VTF1";1
6;"EK-GK4";1
6;"GE-GK3";1
6;"SP-GK2";1
6;"SW-GK1";1
6;"SWE-GK1";1
6;"TRBB-GK2";1
6;"TRRU-GK1";1
6;"TRTE-GK1";1
6;"TRVB-GK2";1
6;"VKF-VTF1";1
...

@benjaminbartsch
Copy link
Collaborator

... meine Vermutung hat sich leider nicht bestätigt. In den Datendefinitionen hat der Kurs zwei Schienen.

-59;"TRBB";"TRBB-GK1";"--";3;"--";"GK";0;2;"[]";1;3;3;"3,4"
-60;"TRBB";"TRBB-GK2";"--";3;"--";"GK";0;2;"[]";1;3;2;"5,6"
-81;"TRBB";"TRBB-GK3";"--";3;"--";"GK";0;1;"[]";1;3;1;"5"

... dann müsste in der DB auch die 2 ankommen. hmmmm.

@benjaminbartsch
Copy link
Collaborator

-53;"SP";"SP-GK1";"--";3;"--";"GK";0;1;"[]";1;4;4;"3,9"
-54;"SP";"SP-GK2";"--";3;"--";"GK";0;1;"[]";1;4;3;"6,5"
-55;"SP";"SP-GK3";"--";3;"--";"GK";0;1;"[]";1;4;2;"8,11"
-56;"SP";"SP-GK4";"--";3;"--";"GK";0;1;"[]";1;4;1;"5,6"

.... das hier hinten zwei fixiert sind ist für unsere Daten aber sehr problematisch. Wir erzeugen daraus 2 Fixierungs-Regeln, wobei der Kurs aber laut der Blockplan.txt nur in einer der beiden Schienen ist.

@NielsWL
Copy link
Author

NielsWL commented Mar 30, 2024

Schau doch mal, warum CNF das so produziert...

@benjaminbartsch
Copy link
Collaborator

benjaminbartsch commented Mar 30, 2024

CNF erstellt nur Blockplan.txt und Kursbelegung.txt alle andern Dateien werden 1:1 von vom importierten Verzeichnis kopiert. Man kann ja in CNF auch nachträglich nicht mehr die SchienenAnzahl des Kurses verändern. Wenn also SP-GK1 in zwei Schienen fixiert ist, dann kommt das von Kurs42.

@NielsWL
Copy link
Author

NielsWL commented Mar 30, 2024

Das stimmt nicht. In CNF kann man die Anzahl der Schienen festlegen.

Kurs#TRBB-GK1#Schienenanzahl ist#2
Kurs#TRBB-GK2#Schienenanzahl ist#2

Was Kurs42 produziert oder in den Daten hat, kann ich von hier aus nicht sagen. Aber beim Import von CNF nach Kurs42 werden die Daten in Kurse.txt wohl ignoriert. Die Kurse.txt hat sich im Gegensatz zum letzten Jahr beim Export aus Kurs42 auch geändert.

@benjaminbartsch
Copy link
Collaborator

....ahhh stimmt, das hatte ich vergessen. Anscheinend war das noch aus Zeiten, wo diese Informationen nicht in den Daten vorhanden vorhanden waren. Dennoch: Ich erzeuge nur die Blockplan.txt und die Kursbelegung.txt, welche Kurs42 dann wieder importiert.

Ich halte fest: Die Schienenanzahl ist richtig kodiert. Die Fixierungen potentiell falsch.

....warum beim Import die Schienenanzahl aber nicht richtig ankommt, verstehe ich (noch) nicht.

@NielsWL
Copy link
Author

NielsWL commented Mar 31, 2024

Da ist der Export aus Kurs42 einfach nicht korrekt. Das muss Herr Schrewe korrigieren, damit es dauerhaft funktionieren kann.

@NielsWL
Copy link
Author

NielsWL commented Apr 1, 2024

Könnte man beim Import die Infos zu den Schienen nicht ausschließlich aus der Blockplan.txt nehmen?

@benjaminbartsch
Copy link
Collaborator

Ja, das habe ich auch so als workaround programmiert (noch nicht hochgeladen). Dennoch untersuche ich gerade, warum die "2", welche in deinen Daten korrekt vorkommt, nicht übernommen wird...

@NielsWL
Copy link
Author

NielsWL commented Apr 1, 2024

@NielsWL
Copy link
Author

NielsWL commented Apr 3, 2024

Bei einer frisch exportierten Blockung bekomme ich beim Import folgende Fehlermeldung.

Erstelle eine temporäres Verzechnis mit dem Inhalt der Zip-Datei unter dem Namen "./Temp/svwsdb_R05rSuRjLQPuyPRDcAtsHxc0h4V7QsVhQbeHyFqa.zip"
Importiere die Blockung mithilfe der extrahierten Daten:
-> Lese Informationen zu der Schule ein...
  [OK]
-> Bestimme die Schüler der Schule aus der Datenbank...
  [OK]
-> Bestimme die Lehrkräfte der Schule aus der Datenbank...
  [OK]
-> Bestimme die Fächer der Schule aus der Datenbank...
  [OK]
-> Lese die Kurs 42 - Export - Textdateien ein...
  [Fehler] - Fehler beim Einlesen des Kurs42-Text-Exports: 
  java.io.IOException: java.lang.NumberFormatException: For input string: "3,5,6"
	at de.svws_nrw.base.kurs42.Kurs42Import.initKurse(Kurs42Import.java:250)
	at de.svws_nrw.base.kurs42.Kurs42Import.<init>(Kurs42Import.java:169)
	at de.svws_nrw.data.gost.DBUtilsGostBlockung.importKurs42(DBUtilsGostBlockung.java:129)
	at de.svws_nrw.data.gost.DataKurs42.importZip(DataKurs42.java:127)
	at de.svws_nrw.api.server.APIGostDatenaustausch.lambda$2(APIGostDatenaustausch.java:144)
	at de.svws_nrw.data.benutzer.DBBenutzerUtils.runWithoutTransaction(DBBenutzerUtils.java:258)
	at de.svws_nrw.api.server.APIGostDatenaustausch.importKurs42Blockung(APIGostDatenaustausch.java:144)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:154)
	at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:118)
	at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
	at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:413)
	at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:356)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:70)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:429)
	at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:240)
	at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:154)
	at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
	at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:157)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:229)
	at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:222)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1570)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1543)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:149)
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:141)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:538)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
	at org.eclipse.jetty.server.Server.handle(Server.java:563)
	at org.eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
	at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:461)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:421)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:390)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:277)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.produce(AdaptiveExecutionStrategy.java:193)
	at org.eclipse.jetty.http2.HTTP2Connection.produce(HTTP2Connection.java:208)
	at org.eclipse.jetty.http2.HTTP2Connection.onFillable(HTTP2Connection.java:155)
	at org.eclipse.jetty.http2.HTTP2Connection$FillableCallback.succeeded(HTTP2Connection.java:450)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:558)
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:379)
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:146)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:421)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:390)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:277)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:199)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:411)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.NumberFormatException: For input string: "3,5,6"
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
	at java.base/java.lang.Integer.parseInt(Integer.java:662)
	at java.base/java.lang.Integer.parseInt(Integer.java:778)
	at de.svws_nrw.base.kurs42.Kurs42Import.initKurse(Kurs42Import.java:241)
	... 71 more

  Löschen des temporären Verzeichnis "./Temp/svwsdb_R05rSuRjLQPuyPRDcAtsHxc0h4V7QsVhQbeHyFqa.zip".
  [OK]

@ws46
Copy link

ws46 commented Apr 4, 2024

Offenbar versucht der Import, die Aufzählung der fixierten Schienen als Zahl zu interpretieren. Wenn es dem Import hilft, kann ich Kurse.txt gerne um die Aufzählung der tatsächlich belegten Schienen (und deren Anzahl) ergänzen.

@benjaminbartsch
Copy link
Collaborator

benjaminbartsch commented Apr 4, 2024

Das ist sehr nett, aber nicht nötig denke ich. Die wirklich fixierten Schienen lassen sich ja aus der Blockplan.txt herauslesen.

@benjaminbartsch
Copy link
Collaborator

@NielsWL: Ich habe zu obigem Problem bereits ein (internes) Issue erstellt. In Kürze:

Fehler 1: Wir lesen derzeit nur 1 Schiene ein und nicht mehrere, falls durch Komma getrennt.
Fehler 2: Wir sollten gar nicht die Fixierungen an dieser Stelle einlesen, sondern aus der Blockplan.txt entnehmen.

... das wird noch gefixt.

@benjaminbartsch
Copy link
Collaborator

In diesem Issue sind leider zwei Dinge gelandet (das ist ungünstig).

  1. Die Schienenanzahl nach dem Import
  2. Der Absturz bei mehreren fixierten Schienen.

Ich denke ich habe beide Issues gelöst. Müsste beim nächsten release drin sein.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants