0

Gruppen erstellen

Hallo Zusammen,
ich suche eine Formel, mit der ich Gruppen automatisch erstellen kann, wobei ich in einer Abfrage zwei Dinge jeweils berücksichtigen möchte: "Gruppengröße festlegen" oder "Anzahl der Gruppen festlegen".
Ich stelle mir das von der Struktur so vor:

1.) Auswahlfeld mit zwei Iptionen: Berechnung auf der Grundlage von "Gruppengröße" oder "Anzahl der Gruppen"

wenn "Gruppengröße", dann
2.a) Zahlenfeld mit Eingabeoption, wie viele Personen in einer Gruppe sein sollen (Max. 50)

wenn "Anzahl der Gruppen", dann
2.b) Zahlenfeld oder Auswahlfeld mit Eingabeoption der Anzahl der Gruppen  (Max. 10)

3.) Einige Spieler in der Tabelle haben das Label "Torhüter". Ich möchte also noch mit einem Ja/Nein-feld auswählen können, ob die Torhüter eine eigene seperate Gruppe bilden sollen oder einfach mit auf alle anderen Gruppen (wie alle anderen) verteilt werden

Die Daten befinden sich in in der verknüpften Tabelle "Anwesenheit".

Ich hoffe, das ist nicht zu viel. Ich meine mich erinnern zu können, dass ich hier irgendwo im Forum schon mal so etwas ähnliches gesehen hätte. Das würde mir im zweifel auch schon helfen. Eines meiner Probleme ist, dass ich z.B. nicht weiß, wie ich round((random()*10), 0) auf den Zahlenbereich eingrenzen kann, den ich in einem Auswahlfeld abfrage...

Vielleicht habt ihr ja eine Idee.
LG und schon mal Danke!

10 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Stephan, ich habe leider auch keine Antwort, aber einige Fragen:

     

    Was heißt "Gruppe erstellen"? Du hast eine Tabelle mit Spielern, die du alle in einer bestimmten Anzahl gruppieren willst? Nach welchen Kriterien? Und was soll mit den Gruppen passieren? Sollen sie in eine eigene Tabelle geschrieben und mit den Spielern verknüpft oder im Spieler-Datensatz mit Gruppe "A", "B", "C" usw. vermerkt werden? Was genau hat es mit der (womit?) "verknüpften Tabelle 'Anwesenheit'" auf sich? Und wozu brauchst du eine Zufallszahl?

     

    Oder hat sich das Problem inzwischen erledigt?

     

    PS: Die Eingrenzung des Zahlenbereichs bei random() dürfte vermutlich nur mit einer Schleife und Abfrage funktionieren (ich habe das vor kurzem irgendwo gemacht, find's aber gerade nicht wieder).

    • Stephan_Haumann
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,
    danke Dir für Deine Antwort. Nein, das Thema hat sich noch nicht erledigt ;)
    Ich versuche mal auf Deine Fragen zu Antworten:

    Ich habe eine Tabelle "Trainingseinheiten". Diese ist mit der Tabelle "Anwesenheiten" verknüpft. In "Anwesenheiten" wird für jeden Spieler aus "Spielerdatenbank", der für das Training eingeladen wurde, ein neuer Datensatz erstellt in dem erfasst wird, ob er/sie "Anwesend" war oder nicht (true oder false). Gleichzeitig habe ich in "Anwesenheiten" auch ein MFA-Feld "Kohorte". Hier trage ich dann nicht nur ein, ob der Spieler anwesend war, sondern auch direkt, in welcher Untergruppe er/sie trainieren soll. Kohorte hat einfach 10 Werte von "1" bis "10".

    Ich möchte nun mittels Button in "Trainingseinheit" automatisch eine Kohorte zuweisen für alle, die in der verknüpften Tabelle "Anwesenheit" mit "Anwesend = true" markiert sind. Vorher möchte ich entweder die Anzahl der Kohorten abfragen die erstellt werden sollen, oder die Anzahl der Teilnehmer pro Kohorte. Beispiel: Bei 20 TNs wären bei der Option "Anzahl Kohorten" und "5" dann entsprechend "4" Teilnehmer in jeder Gruppe. Bei der Option "Anzahl Teilnehmer" und "2" wären es 10 Kohorten mit jeweils 2 TNs.
    Ich habe in "Anwesenheit" ein Berechnungsfeld "RandomZahl" mit dem Inhalt random() eingebaut. Mein Ansatz war, dass ich mit "Anzahl Kohorten" anfange, mit cnt(Anwesenheit[Anwesend])/5 die Anzahl der TNs pro Kohorte bestimme (was mache ich bei nicht ganzen Zahlen?), eine for-Schleife baue und zuerst einmal in "Anwesenheit" gucke, welcher TN die kleinste Random Zahl hat (first(Anwesenheit.RandomZahl)). Dann würde ich gucken, wer die nächst kleinere RandomZahl hat usw. bis die Kohorte voll ist und dann zur nächsten Kohorte.

    Mit der Formulierung des Scripts tue ich mich aber gerade sehr, sehr schwer...

    Was meinst Du? Kannst Du helfen oder ist das zu komplex für solch ein Forum?

    Liebe Grüße

    • Stephan_Haumann
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Vielleicht noch kurz zu Deiner Frage warum Zufallszahl: Die Gruppen sollen ja irgendwie zufällig sein, d.h. sie sollen immer wieder neue Zusammensetzungen haben...

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Stephan, ich kann nicht für das Forum sprechen, aber zumindest für mich ist es zu "komplex". ;)

    Mir ist nach wie vor völlig unklar, was genau da praktisch passiert und wie ein Ergebnis aussehen kann. Du schreibst bspw.

     

    >>Hier trage ich dann nicht nur ein, ob der Spieler anwesend WAR [Vergangenheit], sondern auch direkt, in welcher Untergruppe er/sie trainieren SOLL [Zukunft].<<

     

    War das nur missverständlich formuliert und soll bedeuten, dass du zu Beginn einer Trainingseinheit vor Ort die Anwesenheit erfasst und daraus Gruppen bildest, in denen diese Trainingseinheit dann absolviert wird? Oder ...

    Davon abgesehen geht es im Kern aber wohl um die Aufteilung von Spielern auf Trainingsgruppen. Oder noch abstrakter: Die zufällige Gruppierung von Datensätzen nach vorgegebener Größenordnung (Anzahl der Datensätze pro Gruppe oder Anzahl der Gruppen). Ist die Aufgabenstellung (kontextbefreit) so richtig interpretiert?

    Auch dafür hätte ich spontan keine konkrete Lösung und gerade auch wenig Zeit. Ich würde mir das aber später noch mal in Ruhe ansehen, wenn zwischenzeitlich niemand anderes eine zündende Idee hat.

    Wobei es natürlich immer hilfreich ist, mal in die betreffende Datenbank reinschauen und sich selbst ein Bild machen zu können.

    • Stephan_Haumann
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich versuche es mal deutlicher zu machen mit Fotos

    Bildschirmfoto 2020-06-15 um 13.24.06

    Dies ist die Ansicht für einen Teilnehmer in "Anwesenheiten". Hier sieht man "Kohorte", wo später eine Gruppe zufällig zugeordnet sein soll.

    Bildschirmfoto 2020-06-15 um 13.24.49

    Dies ist die Ansicht "Trainingseinheiten" (erster Tab) hier sind in der Liste "Anwesenheiten" die Spieler aufgeführt (s.o.).

    Bildschirmfoto 2020-06-15 um 13.26.31

    In diesem zweiten Tab sollen die Gruppen (Kohorten) erstellt werden. Die Auswahlfelder sind schon angelegt. Macht es das deutlicher?

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Stephan, ich habe mir wie versprochen noch mal Gedanken um das Problem der Gruppierung gemacht. Allerdings war mir das als Trockenübung zu kompliziert, deshalb musste ich das Szenario doch nachstellen, um testen zu können. Da das bei etwas komplexeren Konstellationen aber immer viel Zeit kostet - und eigentlich ja auch unsinnig ist, weil die DB beim Fragesteller ja schon existiert -, würde ich beim nächsten Mal wohl doch um eine Demo-Version der Datenbank bitten.

    Bei meinem Lösungsvorschlag habe ich mich auf das Kernproblem konzentriert und nicht alle Eventualitäten berücksichtigt. Zum Beispiel die Frage, wie man damit umgeht, wenn bei 4er-Gruppen einer übrig bleibt. Auch das  Torhüter-Problem bspw. habe ich erst mal außen vor gelassen. Und sicher geht das an einigen Stellen auch noch besser/effektiver, aber ich wollte keinen Schönheitspreis gewinnen. Die Vorgehensweise:

    1.) In einem Funktionsfeld namens 'Anwesende' ermittle ich die Zahl der anwesenden Spieler anhand des Ja-/Nein-Feldes 'Anwesend':

    cnt(Anwesenheiten[Anwesend])

    2.) Die Zuordnung der Gruppen erfolgt immer anhand der 'Gruppengröße'. Für den Fall, dass die 'Anzahl der Gruppen' angegeben wird, ist dort ein Trigger hinterlegt, der den entsprechenden Wert berechnet und in das Feld 'Gruppengröße' schreibt:

    if 'Anzahl Gruppen' then
        let GesSp := Anwesende;
        let AnzGr := number(text('Anzahl Gruppen'));
        'Gruppengröße' := if GesSp % AnzGr > 0 then
                floor(GesSp / AnzGr) + 1
            else
                GesSp / AnzGr
            end
    else
        'Gruppengröße' := null
    end

    3.) Die Berechnung der Gruppen erfolgt dann über einen Button. Dort wird für jeden anwesenden Spieler eine Zufallszahl generiert ('Index'), die Einträge nach dieser Zahl sortiert und nach Gruppengröße abgearbeitet:

    for i in Anwesenheiten[Anwesend] do
        i.(Index := round(random() * 1000000, 0))
    end;
    let AnzSp := number(text('Gruppengröße'));
    let myZ := 1;
    let myG := 1;
    if Auswahl = 1 then
        for x in Anwesenheiten[Index] order by Index do
            x.(Gruppe := myG);
            myG := if myZ = AnzSp then myG + 1 else myG end;
            myZ := if myZ < AnzSp then myZ + 1 else 1 end
        end
    end

    Und so sieht das Ganze am Ende aus (die zusätzliche Tabellenansicht habe ich zu Kontrollzwecken eingefügt):

     

    NX_Zufallsgruppen1

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ach so, bei Interesse lege ich die DB auch gerne zum Download auf einen Server. Aber vielleicht kommst du ja auch so klar.

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ach, ist jetzt auch wurscht. Hier liegt die DB:

     

    https://www.dropbox.com/s/t6dha9yfyihcxxv/Zufallsgruppen_StephanH.ninox?dl=0

    • Stephan_Haumann
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,
    also es hat jetzt den Vormittag gebraucht bis ich Deine Schritte alle im Detail nachvollzogen habe und ich finde es ziemlich genial!!! Ich habe es in Deiner Datenbank aus der DB getestet und fange mal an, es in meine hinein zu kopieren.

    Aber an dieser Stelle schon einmal vielen, vielen, vielen Dank, dass Du Dich so umfassend, zeitaufwenidig und mit diesem genialen Outcome in meine Frage reingearbeitet hast! Wirklich weltklasse!

    Liebe Grüße
    Stephan

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Stephan, danke für die Rückmeldung. Freut mich, dass ich helfen konnte.

    Die Torhüter-Problematik hatte ich wie gesagt erst mal nicht berücksichtigt, um die Sache nicht zu verkomplizieren. Im Grunde wäre es aber relativ simpel. Man könnte einfach mit einem Funktionsfeld die anwesenden Torhüter zählen (Ja-/Nein-Feld), ...

    cnt(Anwesenheiten[Anwesend and Spieler.Torwart])

    ... in eine Gruppe packen und von der Gesamtzahl der anwesenden Spieler abziehen. Berechnung der weiteren Gruppen dann wie gehabt. Okay, das ist jetzt ein bisschen vereinfacht, aber die Herangehensweise ist klar, denke ich. Melde dich, wenn du Unterstützung bei der Umsetzung brauchst.