Auf dieser Seite wird die technische Umsetzung des Projektes im Detail erklärt

  1. SchilD-Import
    1. Import durch CSV-Datei
      1. Umsetzung in Power Automate
      2. Endergebniss
  2. Vorerfahrungsstufen/Mitfahr-Status
    1. Ansicht in PowerApps
  3. Gruppengenerierung
    1. Datenvorbereitung in Excel
    2. Umsetzung in Power Automate
      1. Datenvorbereitung in Power Automate
      2. Gruppen-Schleife
      3. Protokollierung (nur Neulings-Flow)
  4. Ereignisse/Erfahrungsstufen
  5. Abschlussbewertung

SchilD-Import

Import durch CSV-Datei

Um den Import von CSV-Dateien in das Backend (also die Excel-Datenbank) zu ermöglichen, müssen wir die Schülerdaten, die vom Nutzer als Text eingefügt werden, zunächst filtern und formatieren, sodass nachher in der Excel-Tabelle jeder Wert in der richtigen Spalte und ohne Trennzeichen und Überschriften hinterlegt ist.
Hierfür haben wir uns für die Plattform Power Automate entschieden, welche auch Teil der Microsoft Power-Plattform ist und somit eine nahtlose Integration in die PowerApp ermöglicht. Wir haben uns für diese Plattform entschieden, da sie mehr Möglichkeiten bietet, Algorithmen zu entwickeln.

Umsetzung in Power Automate

Für die Implementierung haben wir vor allem den “Verfassen”-Block, kombiniert mit dynamischen Inhalten, genutzt, da dieser viele Möglichkeiten bietet, die Daten zu modifizieren.

Zuerst müssen wir die Anführungszeichen von den Daten entfernen, sodass wir am Ende die rohen Daten erhalten. Dies kann man mit einem Verfassen-Block relativ einfach umsetzen:

replace(outputs('Erstellen'), '"', '')

Dieser Ausdruck ersetzt die Anführungsstriche der Eingabe mit nichts, also werden sie entfernt.

Das Ergebnis leiten wir in den nächsten Verfassen-Block weiter, welcher die Zeilen aufteilt, um später die Titelzeile entfernen zu können und jede Zeile einzeln zu bearbeiten. Nach einer kurzen Recherche sind wir auf folgende Lösung gestoßen:

split(outputs('Verfassen'), decodeUriComponent('%0A'))

Dieser Ausdruck wirkt ein wenig komplizierter, ist aber ähnlich simpel. Das split teilt die Eingabe, also “Verfassen”, in zwei Teile, wovon wir nun den zweiten Teil benötigen. Es teilt den Text dort, wo die erste Zeile, also die Titelzeile, beendet wird. Es erkennt dies, indem es nach dem ersten Zeilenumbruch sucht, welcher in diesem Fall als codiertes Element angegeben wird, da Power Automate keinen Zeilenumbruch direkt erkennen kann.
Damit die volle Funktion des Blockes erfüllt ist, brauchen wir einen weiteren Block, welcher die erste Zeile der geteilten Eingabe fallen lässt und nur den Inhalt ohne Titelzeile weiter gibt.
Da Power Automate nicht alle Zeilen auf einmal zu unserer Excel-Tabelle hinzufügen kann, fügen wir jede Zeile einzeln mithilfe einer “Für alle Anwenden“-Schleife.
Diese Schleife wiederholt für jede Zeile der Eingabe aus dem vorherigen Block die angegebenen Blöcke.
Zuerst teilen wir innerhalb der Schleife alle Zellen voneinander, da wir auch diese nicht alle zusammen hinzufügen können. Hierzu nutzen wir das Trennzeichen der exportierten CSV-Datei, in diesem Fall ein Semicolon, um die einzelnen Spalten bzw. Zellen voneinander zu trennen:

split(items('Apply_to_each'), ';')


Im letzten und wichtigsten Schritt fügen wir die Daten in die Excel-Tabelle ein, indem wir die Funktion “Zeile erstellen“nutzen. Diese benötigt einzelne Werte für jede Spalte bzw. Zelle, welche wir bereits mit dem vorherigen Block erstellt haben. Um auf die korrekten Spalten der eingefügten CSV zu verweisen, muss man, wie bei einem Array, die Position des Wertes angeben.
Für die SchilD-ID Zelle sieht das dann wie folgt aus:

outputs('Zeile_splitten2')[0]

Hierbei muss beachtet werden, dass, wie bei Arrays, die erste Position nicht [1], sondern [0] ist.

Endergebniss

Nachdem der Algorithmus vollständig ausgeführt wurde, sind die Daten in Excel im folgenden Layout vorhanden:

Schil-ID Nachname Vorname Klasse Geschlecht Geburtsdatum Name
1 Mustermann Max 10a m 17.10.2010 Max Mustermann
2 Mustermann Erika 10c w 10.11.2010 Erika Mustermann
=[@Vorname] & “ “ & [@Nachname]

Vorerfahrungsstufen/Mitfahr-Status

Ansicht in PowerApps

Der “Erfahrung”-Bildschirm in PowerApps basiert auf der Vorlage “Tabelle und Formular”. Sie bewährt sich als die zuverlässigste und ansprechendste Lösung. In der Tabelle auf der linken Seite werden die Schüler angezeigt. Dazu müssen sie aus der nicht-dynamischen Excel-Tabelle gefiltert werden, um leere bzw. mit “#WERT!” ausgefüllte Zeilen nicht anzuzeigen.

Filter(VE_Notiz; Not(ID = "#WERT!"))
  • Filter(…): Diese Funktion filtert eine Datentabelle nach folgenden Argumenten.
  • Not(…): Negiert das in der Klammer stehende Argument.
  • ID = “#WERT!”: Die Spalte ID in der jeweiligen Zeile entspricht “#WERT!” \
    ***
    Zusammengefasst: Der Term filtert die Datentabelle “VE_Notiz” und zeigt nur Zeilen an, in denen die Spalte “ID” NICHT “#WERT!” entspricht.

Gruppengenerierung

Auch bei diesem Modul haben wir uns für eine Implementierung mithilfe der Plattform Power Automate entschieden. Aufgrund der verschiedenen Erfahrungsstufen, haben wir diesen in 4 fast identische Teile aufgeteilt basierend auf den Erfahrungsstufen.

Datenvorbereitung in Excel

Um die Dauer und Komplexität der Algorithmen bzw. des Algorithmus zu verringern, kalkulieren wir die ersten Werte mithilfe von Excel-Formeln:

Anzahl_Neulinge Anzahl_Gruppen Anzahl_Personen_pro_Gruppe ID
Anzahl von Mitgliedern der jeweiligen Erfahrungsstufe (simpler ZÄHLEWENN) Anzahl von Gruppen mit max. 8 Mitgliedern gerundet (Anzahl von Mitgliedern ÷ 8) Anzahl der ermittelten Mitglieder ÷ Anzahl der ermittelten Gruppen ID-Spalte mit dem Schlüsselwert 1 zur Nutzung in PowerAutomate

Umsetzung in Power Automate

Datenvorbereitung in Power Automate

In den Power Automate Flows importieren wir zuerst die errechneten Werte aus Excel der jeweiligen Erfahrungsstufe. Diese Werte werden dann Variablen zugeteilt, damit die spätere Nutzung der Werte einfacher ist.
Zudem wird die Variable “Anzahl_WDH” auf 0 gesetzt, da diese später für die Zuteilung der Gruppe genutzt wird. Das Gleiche machen wir bei der Variable “übrige_Personen__Index”, welche wir anfangs nullen. Da Power Automate keine einfache dynamische Referenz auf die Ausgabe von Excel erlaubt, müssen wir eine kurze Formel nutzen:

int(body('Zeile_abrufen')?['Anzahl_Neulinge'])

Diese Formel nimmt sich den jeweiligen Wert und konvertiert ihn in einen Integer, also eine ganze Zahl. Dieser Datentyp erlaubt es uns, mit den Zahlen zu rechnen, da er sonst nur als Text behandelt wird:

Integer (ganze Zahl) String (Text)
1 “1”
1 + 1 = 2 “1” + “1” = “11”

Nachdem alle Variablen initialisiert wurden, nutzen wir eine “Wiederholen bis” Schleife, die Ihren Inhalt so lange wiederholt, bis die Variable “übrige_Gruppen” 0 ist, also alle Gruppen generiert wurden.

Gruppen-Schleife

Innerhalb der Schleife wird zuerst die Anzahl der Wiederholungen, also die Variable Anzahl_WDH, um eins erhöht. Dies ist später wichtig, wenn die Gruppen-Nummern zugewiesen werden. Danach folgt ein Block, welcher die Schüler der jeweiligen Erfahrungsstufe auflistet. Wichtig hierbei ist jedoch, dass mittels Filtern nur die Anzahl von Personen, die in der jeweiligen Gruppe sein sollen, aufgelistet werden. Zudem nutzen wir die Variable “übrige_Personen__Index”, um die bereits bearbeiteten Schüler zu überspringen. Aus den Listen extrahieren wir nur die ID-Spalte, da wir nur diese benötigen, um die Gruppe einzutragen. Dieser Schritt ist das Herzstück des Algorithmus, da er die Personen, welche in der Gruppe sind, festlegt.
Damit die Gruppen auch gespeichert werden, nutzten wir eine weitere Schleife, um die derzeitige Gruppe, also die derzeitige Wiederholung, in die Excel-Tabelle einzutragen.
Nachdem dies für die aktuelle Gruppe geschehen ist, werden die Variablen für die übrigen Personen, übrigen Gruppen usw. um den Verwendeten bzw. verarbeiteten Anteil gekürzt. Der letzte wichtige Schritt in der Schleife legt die Anzahl von Personen in der nächsten Gruppe fest. Hierfür nutzen wir folgende Formel:

int(formatNumber(div(float(variables('übrige_Personen')), float(variables('übrige_Gruppen'))), '0'))

Diese Formel wirkt zwar kompliziert, ist aber im Kern relativ einfach:
Die Anzahl der übrigen Personen wird durch die Anzahl der übrigen Gruppen geteilt. Dies lässt sich am div() Ausdruck erkennen. Damit wir die Formel nutzen können, runden wir das Ergebnis kaufmännisch auf die nächste ganze Zahl.
Der Ausdruck ist so lang, da wir zwischen verschiedenen Datentypen wechseln müssen. Hierbei nutzen wir während der Division sogenannte “floats”. Floats sind vereinfacht gesagt Kommazahlen. Wir nutzen sie während der Division, da wir in Power Automate mit normalen Integern keine genaue Kommazahl erhalten hätten. Damit wir am Ende jedoch wieder eine nützliche ganze Zahl erhalten, konvertieren wir das Ergebnis mittels int() wieder zu einem Integer.

Protokollierung (nur Neulings-Flow)

Um für die SuS einen Zeitpunkt der letzten Gruppengenerierung bereitzustellen, schreiben wir im Neulingsflow die aktuelle Zeit, in unsere Zeitzone umgewandelt, in eine Tabellenzelle, welche wir später in PowerApps wieder auslesen können, um den gewünschten Zeitpunkt zu präsentieren.

Ereignisse/Erfahrungsstufen

Die Erfahrungsstufen werden auf einem Bildschirm mit links einer Tabelle und rechts einem Formular dargestellt. Sogleich gilt es für den Bildschirm “Ereignisse”, wo aber anstatt der Schüler die Tage der Skifreizeit angezeigt werden. Damit wir Daten hinzufügen können, nutzen wir Verbinder, welche die intelligente Tabelle in Excel mit unserer PowerApp verbindet. Um zu erzwingen, dass nur die gewünschten Informationen in der Tabelle bzw. in dem Formular angezeigt werden, wählen wir z.B. bei der Seite Ereignisse für die Tabelle auf der Linken Seite -> den Tag und das Datum; und auf der rechten Seite in dem Formular -> das Eingabefeld für Ereignisse. Die einzelnen Spalten in Excel haben wir vorher natürlich passend benannt, um sie später auseinanderzuhalten.

Wir nutzen OnSelect, um das Feld “Ereignisse” nur für den Jeweiligen Tag anzeigen zu lassen. Wenn kein Tag ausgewählt ist, wird oben in der Leiste angezeigt “Kein Tag ausgewählt”, wenn aber ein Tag ausgewählt wird, schreibt die Formel dann den jeweiligen Tag. Die Formel lautet

If(
    IsBlank(ausgTag/ausgSchüler); 
    "Kein Tag/Schüler ausgewählt"; 
    ausgTag/ausgSchüler
)

Diese Formel muss natürlicherweise erst ein wenig angepasst werden, damit sie für den gewünschten Zweck verwendet werden kann.


Abschlussbewertung

Die Ermittlung der Abschlussbewertung stützt sich auf die im Backend (Tagesbewertung) liegenden Daten der täglichen Leistungsbeurteilung. Durch eine strukturierte Datenübernahme in das Abschlussbewertungsmodul wird für jeden Schüler zeilenweise ein Durchschnittswert generiert und in der Spalte „Durchschnitt“ abgebildet.
Die finale Zuordnung der Notenpunkte erfolgt über eine systematische Verknüpfung der erreichten Prozentwerte mit der vorgegebenen Bewertungsskala. Mithilfe von Prozentwerten und der vorgegebenen Notenauswertungstabelle der Lehrkraft wird mithilfe der Operatoren > und < bzw. <= und >= definiert, in welcher Prozentspanne die jeweiligen Notenpunkte zugewiesen werden.