[gelöst] Sortierung Deckserie (Schießsport)

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

TrueColor
******
Beiträge: 542
Registriert: Do, 11.03.2010 11:23

Re: Sortierung Deckserie (Schießsport)

Beitrag von TrueColor »

Nach welchen Gesichtspunkten willst du die Schützen sortieren? Durchschnittliche Punkte pro Schuss? Summe aller Punkte?

Ansonsten wäre mein Vorschlag, alle erstmal so eintragen:

Startnummer | Name | Platzierung (berechnet) | Gesamtwertung (berechnet) | [einzelne Wertungen]

Das Sortieren dann per Macro, welches an einen Button gebunden ist. Für jeden Schützen innerhalb einer Zeile die Einzelwertungen sortieren (ich bilde mir ein, da gabs letztens hier im Macro-Forum den Bubblesort als Code zu lesen) und dann die Schützen (dafür sollte dann auch die Verwendung des Dispatchers ausreichen.

Oder:

Wenn du am Ende auf die (sortierte) Aufschlüsselung der Einzelwertungen verzichten kannst:

Erfassung grad hintereinander weg nach:

Startnummer | Name | Durchgang | Einzelwertung

Und die Auswertung kannst du dann mittels SUMMENPRODUKT() (siehe z.B. unter: http://www.online-excel.de/excel/singsel.php?f=53) oder Pivot-Tabelle (damit habe ich selbst noch nicht gearbeitet) fahren und könntest als Ergebnis sowas herausbekommen:

Platzierung | Startnummer | Name | Gesamtwertung

Das Ganze dann herkömmlich sortieren.
System:
Arbeit: Windows 7 (64 bit) + Apache OpenOffice 4.1.2 (AOO412m3), LibreOffice 4.1.4.2
Home: Windows 10 (64 bit) + Apache OpenOffice 4.1.2 (AOO412m3)
Karolus
********
Beiträge: 7441
Registriert: Mo, 02.01.2006 19:48

Re: Sortierung Deckserie (Schießsport)

Beitrag von Karolus »

Hallo

Code: Alles auswählen

def sort_schuetzenliste(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.CurrentSelection
    data = sel.DataArray
    out = []
    for row in data:
        tmp = []
        tmp.append(row[0])
        tmp.extend(sorted(row[1:],
                          key=lambda x: x or 0,
                          reverse=True))
        out.append(tuple(tmp))
        
    sel.DataArray = tuple(sorted(out,
                                 reverse=True,
                                 key=lambda x: [item or 0 for item in x[1:]]))
siehe angehängtes Dokument
Schützenfest.ods
(11.77 KiB) 134-mal heruntergeladen
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Sortierung Deckserie (Schießsport)

Beitrag von Stephan »

Karolus hat geschrieben: Mo, 20.03.2017 10:15 Hallo

Code: Alles auswählen

def sort_schuetzenliste(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.CurrentSelection
    data = sel.DataArray
    out = []
    for row in data:
        tmp = []
        tmp.append(row[0])
        tmp.extend(sorted(row[1:],
                          key=lambda x: x or 0,
                          reverse=True))
        out.append(tuple(tmp))
        
    sel.DataArray = tuple(sorted(out,
                                 reverse=True,
                                 key=lambda x: [item or 0 for item in x[1:]]))
siehe angehängtes Dokument Schützenfest.ods
sehr schöne Lösung!


Gruß
Stephan
TrueColor
******
Beiträge: 542
Registriert: Do, 11.03.2010 11:23

Re: Sortierung Deckserie (Schießsport)

Beitrag von TrueColor »

Hallo Karolus,
Karolus hat geschrieben: Mo, 20.03.2017 10:15

Code: Alles auswählen

[...]
                          key=lambda x: x or 0,
                          [...]
könntest du das mal bitte erläutern oder zu einer guten Erklärung linken (für jmd., der der eigentlich keine Ahnung von Python hat? Was macht das? Der restliche Code ist ja für mich gut verständlich.

Danke!
System:
Arbeit: Windows 7 (64 bit) + Apache OpenOffice 4.1.2 (AOO412m3), LibreOffice 4.1.4.2
Home: Windows 10 (64 bit) + Apache OpenOffice 4.1.2 (AOO412m3)
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Sortierung Deckserie (Schießsport)

Beitrag von mikeleb »

Hallo,
und noch eine Formellösung ...
Dateianhänge
Unbenannt 1.ods
(20.61 KiB) 139-mal heruntergeladen
Gruß,
mikeleb
Karolus
********
Beiträge: 7441
Registriert: Mo, 02.01.2006 19:48

Re: Sortierung Deckserie (Schießsport)

Beitrag von Karolus »

TrueColor hat geschrieben: Mo, 20.03.2017 11:04 Hallo Karolus,
Karolus hat geschrieben: Mo, 20.03.2017 10:15

Code: Alles auswählen

[...]
                          key=lambda x: x or 0,
                          [...]
könntest du das mal bitte erläutern oder zu einer guten Erklärung linken (für jmd., der der eigentlich keine Ahnung von Python hat? Was macht das? Der restliche Code ist ja für mich gut verständlich.

Danke!
Oha… womit fang ich jetzt an?

das DatenArray enhält im konkreten Fall sowohl Zahlenwerte als auch Text, ( !die leeren Zellen enthalten einen Leerstring "" !)
python muss zum sortieren die jeweiligen Inhalte vergleichen (a grösser b), kann das aber nur mit vergleichbaren Typen, und würde dann beim Vergleich Zahl|Text mit einem Fehler abbrechen, daher der Ausdruck x or 0 der im Fall von x=="" eben 0*** statt dem Leerstring als Vergleichswert einsetzt.

lambda kreiert eine anonyme Funktion.

Code: Alles auswählen

key=lambda x: x or 0
ist dasselbe wie eine explizite Funktion:

Code: Alles auswählen

def compareKey(x):
    return x or 0
in Verbindung mit:

Code: Alles auswählen

key=compareKey
***or verhält sich in python etwas anders als in Basic, und liefert den ersten Ausdruck zurück der logisch Wahr ist, falls kein Ausdruck Wahr ist den letzten.

https://docs.python.org/3.5/howto/sorti ... ght=sorted
https://docs.python.org/3.5/howto/funct ... expression
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
TrueColor
******
Beiträge: 542
Registriert: Do, 11.03.2010 11:23

Re: Sortierung Deckserie (Schießsport)

Beitrag von TrueColor »

Ah, jetzt wird's klar, danke dir!

Scheint 'ne gute Doku zu sein, was du da verlinkt hast, recht gut verständlich.
System:
Arbeit: Windows 7 (64 bit) + Apache OpenOffice 4.1.2 (AOO412m3), LibreOffice 4.1.4.2
Home: Windows 10 (64 bit) + Apache OpenOffice 4.1.2 (AOO412m3)
Karolus
********
Beiträge: 7441
Registriert: Mo, 02.01.2006 19:48

Re: Sortierung Deckserie (Schießsport)

Beitrag von Karolus »

Hallo

Der Ansatz von oben bereinigt von hässlichen lambdas und anderen Wiederholungen.
Dafür ist das in der Form nicht mehr kompatibel mit AOO und LO < 5.1 wegen der neuen slice-Syntax für Teil-Zellbereiche (#12),
und des Verzichts auf explizite tuple-Umwandlung (#13ff)

Code: Alles auswählen

from functools import partial

def compare(k):
    if isinstance(k, tuple):
        return [compare(item) for item in k[1:]]
    return k or 0

def sort_schuetzenliste2(*_):
    sort = partial(sorted, reverse=True, key=compare)
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.CurrentSelection
    series = sel[ : ,1:]
    data = [sort(row) for row in series.DataArray ]
    series.DataArray = data
    sel.DataArray = sort(sel.DataArray)
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
CROW1973
Beiträge: 6
Registriert: Mo, 20.03.2017 20:15

Re: Sortierung Deckserie (Schießsport)

Beitrag von CROW1973 »

Soooo :) Jetzt bin ich registriert.

Hab die Datei jetzt noch auf 250 Zeilen erweitert sollten mal mehr als 4 Teilnehmer dabei sein :)
Jetzt muss ich noch nach dem Namen noch einen Vereinsnamen rein basteln, aber das schaffe ich auch noch irgendwie.

*Edit*
Verein ist nun auch dabei :)
Möchte euch mein Ergebnis natürlich nicht vorenthalten!
Dateianhänge
SBCA_Deckserie_Bewerbe.ods
(32.36 KiB) 125-mal heruntergeladen
CROW1973
Beiträge: 6
Registriert: Mo, 20.03.2017 20:15

Re: Sortierung Deckserie (Schießsport)

Beitrag von CROW1973 »

Hallo nochmals

Ich muss leider nochmals lästig sein, sorry dafür!!
Ich habe das File nun halbwegs fertig, aber auch einen Fehler gefunden

Sobald 2 Schützen das gleich Ergebnis haben (z.B. beide Schützen haben 2x 60 Punkte geschossen), wird mir nur Schütze 1 angezeigt und bei Schütze 2 ist ein Fehler.
Ich habe es mal abgespeichert und hier angehängt
.
Desweiteren würde ich es auch gerne so haben, wenn beide punktgleich sind, dass sie auch den selben Platz haben.

Also
Platz 1 60 60
Platz 2 60 40
Platz 3 59 59
Platz 3 59 59
Platz 5 58 30
Platz 6 57 50
Platz 6 57 50
Platz 8 56 50
usw
Dateianhänge
SBCA_Deckserie_Bewerbe.ods
(102.23 KiB) 207-mal heruntergeladen
Karolus
********
Beiträge: 7441
Registriert: Mo, 02.01.2006 19:48

Re: Sortierung Deckserie (Schießsport)

Beitrag von Karolus »

Hallo

Dir wurde bereits eine Lösung vorgeschlagen, die "ohne" diesen Fehler daherkommt…
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
CROW1973
Beiträge: 6
Registriert: Mo, 20.03.2017 20:15

Re: Sortierung Deckserie (Schießsport)

Beitrag von CROW1973 »

Hallo Karolus

Ich habe die Methode von mikeleb genommen, da es genau das ist, was ich gesucht habe.
Jetzt habe ich gestern Stunden dazu verbracht, es so weit zu bringen, wie meine zuletzt angehängte Datei.

Ich habe deine Version auch ausprobiert, aber im Excel wird mir da kein Button angezeigt. Nur ich verwende Open Office im Verein, alle anderen verwenden Excel.
Das von dir verstehe ich leider überhaupt nicht. Wo füge ich das ein usw usw

Das von mikeleb verstehe ich halbweg und es funktioniert ja jetzt tadelos (in Open Office und Excel), bis auf die "Kleinigkeit".
Wäre toll, wenn ihr mir hier noch für den letzten Schritt weiterhelfen könntet. Wenn nicht, muss ich leider ein Auswertungsprogramm um 250€ kaufen.

Sorry wenn ich mich so blöd anstelle, aber das ist absolut nicht mein Gebiet :(

lg
Tommy
echo
*******
Beiträge: 1006
Registriert: Fr, 14.11.2008 15:27
Wohnort: BRA - Nds

Re: Sortierung Deckserie (Schießsport)

Beitrag von echo »

Desweiteren würde ich es auch gerne so haben, wenn beide punktgleich sind, dass sie auch den selben Platz haben.
Hallo
In sortiert.$N$2:$N$250 steht als Rang 1;1;3;4.....usw 2 fehlt, obwohl Vergleich() in deiner Formel danach sucht
Die beiden Zeilen 1;1; unterscheiden sich nicht, daher kannst du auch nicht nach beiden Zeilen suchen

Vorschlag: in Sortiert!N2
ersetze =RANG(M2;$M$2:$M$250) durch =RANG(M2;$M$2:$M$250)+ZEILE()/1000 (Kannst die Nachkommastellen ja ausblenden)
Runter kopieren, jetzt unterscheiden sich die Einträge ohne den Rang zu verändern und du kannst danach suchen

in Rangliste! B11 den Vergleich() ein wenig erweitert, das wars
=VERSCHIEBUNG(sortiert.$A$1;VERGLEICH(KKLEINSTE(sortiert.$N$2:$N$250;$A11);sortiert.$N$2:$N$250;0);SPALTE()-2)

in Excel heißt die Funktion =VERSCHIEBUNG() =BEREICH.VERSCHIEBEN(), daher würde ich INDEX() auch der VERSCHIEBUNG() vorziehen
=INDEX(sortiert.$A$2:$L$250;VERGLEICH(KKLEINSTE(sortiert.$N$2:$N$250;$A11);sortiert.$N$2:$N$250;0);SPALTE(A1))

LG Holger
Zuletzt geändert von echo am Di, 21.03.2017 13:01, insgesamt 6-mal geändert.
CROW1973
Beiträge: 6
Registriert: Mo, 20.03.2017 20:15

Re: Sortierung Deckserie (Schießsport)

Beitrag von CROW1973 »

Hallo echo

Danke! Ich werde mal versuchen das umzusetzen!

lg
Karolus
********
Beiträge: 7441
Registriert: Mo, 02.01.2006 19:48

Re: Sortierung Deckserie (Schießsport)

Beitrag von Karolus »

Hallo

Mit Excel-kompatibilität kann ich dir nicht dienen, der Aufwand steht für mich in keinem vernünftigen Verhältnis zum "Aufwand" ein paar Vereinskollegen davon zu überzeugen kostenlos Libre|Apache -office zu installieren.
Wenn nicht, muss ich leider ein Auswertungsprogramm um 250€ kaufen.
Wow - Ein stolzer Preis für eine derart triviale Aufgabe!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Antworten