Wie immer in RACE RESULT 12 gibt es auch hier mehrere Wege, die Aufgaben zu lösen. Selbst innerhalb des Support-Teams hat jeder seinen eigenen Weg. Der Hauptgedanke dieser Aufgabe ist es, zum Nachdenken anzuregen, wie bestehende Daten in einer Veranstaltungsdatei auch anderweitig verwendet werden können.
Bis Version 12.0.22 gibt es Probleme mit dem Mannschaftswertungs-Geschlechtsfeld auf Englisch. Da unsere Lösungen in der Regel auf Englisch verfasst werden, kann es hier zu Problemen führen, bis die Version 12.0.23 offline verfügbar ist.
Mannschaftsgeschlecht (Team Gender)
Wie in der Aufgabenbeschreibung erwähnt, ist der einfachste Weg hierfür MW1.Geschlecht, da 1 (Männlich), 2 (Weiblich) oder 3 (Mixed) liefert. Da Teamdaten oftmals auch in einem Datensatz und dann in mehreren ZTFs abgefragt werden, wollten wir eine anderen Lösungsweg sehen. Die nachfolgende Erklärung kann also auch unabhängig von der Art und Weise, Mannschaftsdaten zu erheben, verwendet werden.
Zunächst erstellen wir einr benutzerdefinierte Formel, die das Geschlecht eines Teilnehmers in eine Zahl umwandelt.
In diesem Fall können wir die translate()-Funktion verwenden, da unser Geschlecht als F bzw. M gespeichert ist. Ist Geschlecht als "Weiblich" oder "Männlich" gespeichert, muss diese Formel geändert werden, und bspw. eine if()-Formel verwendet werden.
Da nun das Geschlecht jedes Teammitglieds als Zahl gespeichert ist, können wir daraus eine Summe bilden und darüber bestimmen, welches Mannschaftsgeschlecht ein Tem hat. Ist die Summe 4, ist es "Männlich", ist die Summe 5, 6 oder 7, ist es ein "Mixed"-Team, bei Summe 8 ist es ein reines "Frauen"-Team. Um das in einen Text umzuwandeln, erstellen wir ein benutzerdefiniertes Feld TeamGender mit folgender Berechnung.
Choose(Val(GenderNumber([MW1.P1.Geschlecht])+GenderNumber([MW1.P2.Geschlecht])+GenderNumber([MW1.P3.Geschlecht])+GenderNumber([MW1.P4.Geschlecht]));;;;"Männer";"Mixed";"Mixed";"Mixed";"Frauen")
Wir verwenden Mannschaftswertung 1, um die Mannschaften zusammenzustellen. Mit unser o.g. benutzerdefinierten Formel GenderNumber(x) wandeln wir für jedes Teammitglied das Geschlecht in eine Zahl um, und über die choose-Formel rufen wir das entsprechende Mannschaftsgeschlecht ab. Da eine Summe von 1, 2 oder 3 nicht möglich ist, geben wir hier einen leeren Parameter ein.
Teammitglieder auf der Strecke
Zur Lösung dieses Aufgabe hatten wir selbst 2 grundauf verschiedene Ansätze. Der nachfolgende Ansatz zeigt Ihnen, wie Mannschaftswertungen nicht nur für Ergebnisse genutzt werden können, sondern auch für sonstiges Teilnehmer-Handling.
Zunächst müssen wir definieren, wo ein Teilnehmer das letzte Mal gesehen wurde. Hierfür erstellen wir für jede Messstelle ein spezielles Ergebnis, das jeweils die letzte Detektion liefert.
Es macht außerdem Sinn, ein weiteres Ergebnis anzulegen, das mit TMaxID() die ID des Ergebnisses mit der größten Zeit liefert, d.h. wo der Teilnehmer das letzte Mal detektiert wurde. Die Reihenfolge der Ergebnisse vereinfacht den nächsten Schritt.
Wir erstellen dann eine Mannschaftswertung, in der wir nur Fahrer berücksichtigen, die auf der Strecke sind. Hierfür erweitern wir den bestehenden Filter aus Mannschaftswertung 1 um T10>11, d.h. alle Teilnehmer, bei denen T10 (die ID der letzten Detektion) größer als 11 ist (d.h. entweder LastPitExit oder LastLapTime). TMaxID() hätte auch direkt im Filter verwendet werden können.
Da wir aber nur die Teams mit mehr als 1 Fahrer auf der Strecke überwachen wollen, ist die Min. Anzahl Teilnehmer auf 2 gesetzt. Es können je Team bis zu 4 Fahrer gleichzeitig auf der Strecke sein und ein Team kann nach wie vor aus einer beliebigen Anzahl Frauen bestehen. Innerhalb jedes Teams sortieren wir Teilnehmer nach deren letzter Detektion, indem wir TMax(11;13) verwenden. Dadurch ist der Teilnehmer, dessen letzte Detektion am längsten her ist, das erste Teammitglied.
Die Einstellungen zur Mannschaftszusammenfassung und Gruppierung sind analog zur Mannschaftswertung 1.
Um uns zu vereinfachen, an welcher Stelle ein Teilnehmer zuletzt detektiert wurde, erstellen wir ein benutzerdef. Feld, das uns die Position der letzten Detektion als Text liefert.
Da T10 entweder 11, 12 oder 13 ist, ziehen wir hiervon 10 ab und können über die choose()-Funktion dann den jeweiligen Text anzeigen lassen.
Für die Anzeige der Teams mit mehr als einem Fahrer auf der Strecke erstellen wir schließlich noch eine Ausgabeliste, die wir ganz einfach während des Rennens geöffnet haben können.
Wir gruppieren nach dem Teamnamen, der in [Verein] gespeichert ist, und sortieren dann nach der Position innerhalb der Mannschaftswertung 3, so dass der Teilnehmer, der länger auf der Strecke ist, oben angezeigt wird.
Um nur die Teams anzuzeigen, bei denen mehr als 2 Fahrer auf der Strecke sind, setzen wir einen Filter auf LastTimeSeen.Anzahl > 1. Das schließt auch die Teilnehmer aus, die Teil des Teams sind aber aktuell nicht auf der Strecke sind.
Für jeden Teilnehmer zeigen wir lediglich die FahrerID (Äquivalent zur Startnummer), den Namen, die Position und die Zeit der letzten Detektion an.
For each participant we simply show their RiderID which was the equivalent bib they were wearing, name, LastSeenPosition and also the time at which they were last seen.
Jetzt sehen wir, dass aktuell 2 Fahrer von Team 17 auf der Strecke sind.
Zu lange auf der Strecke
Diese Aufgabe ist etwas komplexer, da es keinen einfachen Weg gibt, Teilnehmer nach der ElapsedTime() zu filtern. Daher verwenden wir die now)-Funktion, die das aktuelle Datum und Zeitstempel der Veranstaltung gemäß der verwendeten Zeitzone verwendet. Da jeder diese Aufgabe zu einer anderen Zeit durchführt, haben wir ein benutzerdefiniertes Feld TimeNow angelegt, um eine feste Uhrzeit (2020-04-15 20:37:00) zu simulieren. Während der Veranstaltung muss [TimeNow] durch Now() ersetzt werden.
Um die aktuelle Uhrzeit zu generieren, müssen wir aus dem Ausdruck die 8 Zeichen von rechts extrahieren. Hierfür verwenden wir die right()-Funktion. Allerdings ist dies als Text formatiert und kann nicht mit einem Zeitwert verglichen werden. Um das zu umgehen, verwenden wir die TimeFromString()-Funktion. Der gesamte Ausdruck lautet also:
(timefromstring(right([TimeNow];8))
Um zu berechnen, wie lange ein Teilnehmer auf der Strecke ist, müssen wir noch einen Blick auf die Zeit werfen, zu der der Teilnehmer das letzte Mal detektiert wurde. Diese Information haben wir in Ergebnis 12 gespeichert, das die letzte Detektion in AfterPits ist.
Da dies ein 25-Stunden-Rennen ist, das über Mitternacht geht, gibt es noch ein paar weitere Limitierungen und Dinge zu berücksichtigen. Wenn Mitternacht überschritten wird, wird das Ergebnis größer als 24 STunden. Die aktuelle Uhrzeit ist allerdings immer maximal 24 STunden und fängt anschließend wieder bei 00:00:00 an. Der einfachste Weg hierfür ist es, die Zeit der letzten Detektion in ein wahres 24-Stunden-Format zu bringen. Allerdings funktioniert der Vergleich dann nicht mehr, wenn der Teilnehmer vor Mitternacht detektiert wurde, die aktuelle Uhrzeit allerdings bereits nach Mitternacht ist.
Um die Zeit in Ergebnis 12 in eine wahre 24-Stunden-Zeit zu konvertieren, verwenden wir den % Operator, der den Rest nach einer Division liefert. Wir schreiben folgende Berechnung:
T12%86400
86400 ist die Anzahl Sekunden in 24 Stunden, also gibt uns die Berechnung die Anzahl Sekunden, die über 86400 hinausgeht, und somit die Uhrzeit der letzten Detekion.
Um nun zu berechnen, wie lange ein Teilnehmer aktuell auf der Strecke ist, können wir die beiden Berechnungen in einer kombinieren:
(timefromstring(right([TimeNow];8)))-(T12%86400)
Diesen Ausdruck verwenden wir im Filter unserer Ausgabeliste. Die Definition, wann ein Teilnehmer lange auf der Strecke ist, basiert auf der Durchschnittsrundenzeit des Teams. Die aktuelle Durchschnittsrundenzeit können wir über MW2.LapTimeTeamAvg abrufen und multiplizieren dies mit 1,5. Außerdem wollen wir nur die Teilnehmer berücksichtigen, die aktuell auf der Strecke sind, also filtern wir nach Ergebnis 10, das wir in der zweiten Aufgabe erstellt haben.
Die Sortierung basiert ebenfalls auf der aktuellen Zeit auf der Strecke, von groß nach klein sortiert, so dass die am längsten auf der Strecke befindlichen Teilnehmer als erstes angezeigt werden.
Bei den Datenfeldern geben wir einige Standardfelder an, zeigen über Position auch eine Anzahl an. Die Zeit auf der Strecke könnte hier auch über ElapsedTime angezeigt werden, aber wir verwenden der Einheitlichkeit wegen die Zeit, die wir auch als Filter verwenden.