Moin Leute,
ich bin in Bezug auf Access ein fortgeschrittener Anfänger und komme mit der Benutzeroberfläche gut zurecht. VBA mußte ich noch nicht lernen. Einige Versuche in Access habe ich erfolgreich durchgeführt.
Mein Problem ist nun, ich möchte für meine größere private Golfrunde mit Access eine Rundenauswertung basteln. Die einfachere Form der Ergebnisse (zählen der Schläge und auswerten (Zählspiel)) bereitet null,null Probleme.
Es gibt aber im Golf eine zweite, kompliziertere Auswertemethode, und hier fangen meine Probleme an.
Grundsätzlich gilt: der Platz hat 18 Bahnen, jede mit einem festgelegten Standard (Par- 3,4 oder 5). Ein Spieler erhält individuell, je nach Spielstärke, eine bestimmte Zahl an Schlägen pro Bahn, die mehr als diesen Standard haben darf (SPV-0,1,2,3 oder 4). Das Ergenis errechnet sich dann wie folgt: Bei Par 4 und Vorgabe 1 erhält der Spieler bei tätsächlich gespielten 5 Schlägen auf dieser Bahn 2 Punkte. po Schlag mehr erhält er einen Punkt weniger und pro Schlag weniger einen Punkt mehr. Das alles für 18 Bahnen und bei unterschiedlichen Vorgaben, denn nur bei einer durch 18 teilbaren Vorgabe verteilt sich diese gleichmäßig auf alle Bahnen!!!
Analog zu dieser Wertung gibt es eine zweite Wertung bei der dann nur der Standard und dir tatsächlichen Schläge in Relation treten. Die Vorgabe bleibt unberücksichtigt.
Ich stelle mir die Struktur der Datenbank in etwa so vor: Die Spieltage sind die Tabellen, die Teilnehmer die Datensätze. In einem Formular gebe ich (pro Bahn) die Vorgaben und die Schlagzahl ein. Das System errechnet mir dann die Brutto- und Nettopunkte. Die dann in der Tabelle gespeichert werden. Mit Abfragen kann ich eine Rangliste erstellen und drucken. (Uff)
Im beiliegenden Beispiel ist der Rechengang(aus meiner Sicht) verdeutlicht. Leider muß ich (noch?) pro Bahn für jede mögliche Vorgabe in einem eigenen Feld rechnen. Auch kann ich die errechneten Ergebnisse nicht in die Tabelle übernehmen.
Ich hoffe nun sehr, daß mir jemand von Euch beistehen kann. Das System läuft grundsätzlich ist aber doch etwas umständlich.
Vielen Dank
HorstP
[Anhang gelöscht durch Administrator]
Hallo Horst,
ZitatDie Spieltage sind die Tabellen, die Teilnehmer die Datensätze
Nein, die Spieltage sind EINE Tabelle.
Zitatdie Teilnehmer die Datensätze
Jein, die kommen nämlich in eine dritte Tabelle.
Die zweite ist eine Tabelle Spieler.
Die Teilnehmer werden dann in einer Zwischentabelle
gespeichert/zugeordnet:
tblTeilnehmer
TeilnehmerID -> PK
SpielerID -> FK tblSpieler
SpieltagID -> FK tblSpieltage
Du bräuchtest wohl auch noch jeweils eine Tabelle Plaetze und Bahnen.
Die Bahnen werden 1:n den Plätzen zugeordnet.
Evtl. brauchst Du auch noch die eine oder andere Zwischentabelle,
ansonsten kannst Du mit diesem Modell auch alle Berechnungen
in entsprechenden Abfragen durchführen.
ZitatAuch kann ich die errechneten Ergebnisse nicht in die Tabelle übernehmen.
Brauchst Du ja auch nicht. Berechnete Felder müssen/dürfen nicht gespeichert werden,
da sie sich ja jederzeit neu berechnen lassen.
Deine DB schau ich mir morgen mal an.
gruss ekkehard
Hallo Horst,
ZitatEs gibt aber im Golf eine zweite, kompliziertere Auswertemethode, und hier fangen meine Probleme an.
Grundsätzlich gilt: der Platz hat 18 Bahnen, jede mit einem festgelegten Standard (Par- 3,4 oder 5). Ein Spieler erhält individuell, je nach Spielstärke, eine bestimmte Zahl an Schlägen pro Bahn, die mehr als diesen Standard haben darf (SPV-0,1,2,3 oder 4). Das Ergenis errechnet sich dann wie folgt: Bei Par 4 und Vorgabe 1 erhält der Spieler bei tätsächlich gespielten 5 Schlägen auf dieser Bahn 2 Punkte. po Schlag mehr erhält er einen Punkt weniger und pro Schlag weniger einen Punkt mehr. Das alles für 18 Bahnen und bei unterschiedlichen Vorgaben, denn nur bei einer durch 18 teilbaren Vorgabe verteilt sich diese gleichmäßig auf alle Bahnen!!!
Nö, dafür reicht ein Ausdruck:
Punkte=Par+SPV-GespielteSchlaege+2Da braucht's keinen so komplizierten WENN ... DANN Ausdruck.
Das mit den Vorgaben (teilbar durch 18) verstehe ich nicht; gleichmässig verteilt muss die Vorgabe ja auf jeder Bahn gleich sein.
Das wirst Du aber wohl besser wissen, - ich weiss nicht, wie das Handicap berechnet wird. Ich dachte immer das Handicap wird zum Gesamtpar (72 Schläge?) dazu gerechnet.
Mehr kann ich zu Deiner DB im Moment nicht sagen.
hth
gruss ekkehard
Hallo Ekkehard,
vielen Dank für die Hilfe. :)
Die Formel (Punkte = Par-SPV-Schläge+2) ist einfach genial!! Damit lösen sich einige Probleme auf einmal.
Die Vorgabenverteilung ist nur bei Vorgabe 18 (oder vielfaches) gleichmäßig, 1 Schlag pro Bahn. Bei Vorgabe 17 bekommt der Spieler auf der leichtesten Bahn keinen Schlag vor usw.. Evtl. fällt Dir auch noch hierfür eine geniale Möglichkeit ein, wie man die individuelle Vorgabe des Spielers (0-60) entsprechend der Klassifizierung auf die Bahnen verteilen kann.
Deine Vermutung Gesamt Vorgabe (Handicap benutzen Golfer nicht gerne - ist negativ besetzt) wird zum Gesamt Par addiert, gilt nur für sog. Zählspiele.
Ich bin zwar im Bezug auf die Ergebnissrechnung im Golf ein Experte, aber im Bezug auf Access doch wohl nur ein Anfänger. Ich habe bisher immer nur mit Datenbänken mit einer Tabelle gearbeitet (gespielt). Ergo bin ich auch mit der Verknüpfung von Tabellen und deren Sortierung nicht so fit.
Gruß
HorstP
Hallo Ekkehard,
ich war bezüglich der Formel doch wohl etwas zu schnell!!! Es sich dürfen keine nagativen Zahlen ergeben.
Gruß
HorstP
Hallo Horst
In dem Feld wo du den wert dir anzeigen läst, wäre es möglich über die Funktion Fromat alle Negativ zahlen als Null dar zustellen.
Hallo Horst,
! Punkte = Par + SPV - Schläge + 2 !
Wenn Punkte nicht negativ sein dürfen, muss man es wohl doch in ein Wenn ... Dann verpacken:
Punkte = Wenn((Par + SPV - Schläge + 2) >= 0; Par + SPV - Schläge + 2; 0)
Das mit der Vorgabe habe ich jetzt auch verstanden; - die ist nicht auf jeder Bahn gleich.
Um das dann gleichmässig zu verteilen braucht es dann aber eine Katalogisierung/Rangfolge
der Bahnen. Denn es gibt ja auf einem Platz jeweils mehrere Par-3, -4, -5 Löcher.
Und wenn es da ein Schema gibt, wie die individuelle Vorgabe des Spielers verteilt wird,
finden wir sicher auch eine Möglichkeit das zu berechnen.
Du musst allerdings zunächst mal die Tabellenstruktur(en) sprich das Datenmodell
erstellen. In Deiner DB waren ja keine Tabellen drin.
Ohne das kann man sich über Berechnungen nicht den Kopf zerbrechen.
Das bekommen wir aber zusammen bestimmt auch hin.
Ich schau mal wie's dieses WE so aussieht mit Zeit.
gruss ekkehard
Hallo Horst,
In anliegender DB hab' ich mal ein rudimentäres Datenmodell
zusammengestrickt.
Zu mehr fehlen mir die Informationen.
Du musst das jetzt mal ergänzen so wie Du denkst, und
es dann wieder hochladen, dann schauen wir weiter.
Sicher wirft auch einer der anderen Regulars dann mal
einen Blick darauf und gibt weitere Tipps.
gruss ekkehard
[Anhang gelöscht durch Administrator]
Hallo Horst,
also ich glaube du wirst damit nicht glücklich.
Weder wird die Platzvorgabe noch dein aktuelles Handycap in dieser Berechnung berücksichtigt.
Es sei denn, du willst dich nicht verbessern :-)
Einen kostenlosen Rechner für alle Plätze gibt es hier : http://www.golf-index.eu/outs/handicap-rechner/language/de
Wenn dann schon auf diese Art und Weise :-)
Gruss und schönes Spiel
bernie
Hallo Ekkehard,
vielen Dank für Deine Hilfe. Ich habe das Prinzip verstanden.
Allerdings sind es (fast) immer keine einzelnen Spieler, sondern 2er, 3er oder 4er Teams.
Die Gesamtvorgabe wird nach Schwierigkeit der Bahnen verteilt ( 1 schwerste - 18 leichteste Bahn).
Die Formel ist ok. Wenn es viele Schläge (kommt vor!!) sind (mehr als PAR+Vorgabe+2) ergibt sich ein negativer Wert. Deine Formelergänzung funktioniert bei mir nicht.
Gruß
HorstP
[Anhang gelöscht durch Administrator]
Hallo Bernie,
vielen dank für Deinen Beitrag. Ergebnisrechner kenne ich. Es geht um die Ergebnisermittlung einer Gruppe bei privaten Wettspielen zwecks Siegerermittlung. Kein Vorgabewirksames Turnier- macht der Club mit prof. Software.
Platzstandard, Stammvorgabe sind in der Spielvorgebe enthalten.
schönes Spiel
HorstP
Hallo Horst,
ZitatPlatzstandard, Stammvorgabe sind in der Spielvorgebe enthalten.
Bitte wo ?
Gerade weil ihr ein privates Wettspiel macht, müssen alle HCp der einzelnen Spieler bei der Berechnung der Netto-Punkte über die Spielvorgabe berücksicht werden.
Ohne geht das nämlich nicht.
Dann musst du noch die Lochvorgabe der einzelnen Löcher berücksichtigen.
Erst dann kannst du anfangen das Netto-Ergebnis zu berechnen.
Ergo... du brauchst ein paar Tabellen mehr.
gruss
bernie
Hallo Bernie,
siehe beiliegende Datenbank (golfhorst - tblteams)!!
Hallo Horst,
Zitatvielen Dank für Deine Hilfe. Ich habe das Prinzip verstanden.
Wie es scheint noch nicht so ganz.
tblTeams: durchnummerierte Spalten widersprechen den Normalisierungsregeln.
Das gehört wieder auf zwei Tabellen aufgeteilt, 1. eben die tblTeams mit ID, einer Bezeichnung, der TeamSPV.
2. eine Zwischentabelle zur tblSpieler (siehst, die brauchst Du, also wieder rein damit).
Siehe Anlage.
ZitatDeine Formelergänzung funktioniert bei mir nicht.
Dann hast Du da einen Schreibfehler drin. In anliegender DB ist ein Modul mit einer Function, die den Wert zurückgibt.
@Bernie
Wie es sich anhört, hast Du mehr Ahnung von der Golfmaterie als ich. Da ist es sicher einfacher für Dich Tipps zum Datenmodell zu geben.
In der jetzt angehängten DB (hier habe ich die Teams ergänzt) z.B. bin ich mir nicht sicher, ob in die tblTeilnehmer jetzt die SpielerID oder die TeamID, oder beide, hineingehören. Würde mich freuen, wenn ich da auch was lernen könnte.
gruss ekkehard
[Anhang gelöscht durch Administrator]
Hallo Ihr Beiden,
ich brauch noch etwas... dann lad ich meinen Vorschlag hoch.
@Ekkehard Ja einbisschen.. Spiele schon seit fast 10 Jahren :-)
Gruss
Bernie
Hallo Ekkehard und Bernie,
vielen Dank daß Ihr Euch meiner Probleme annehmt.
Durch die Formel von Ekkehard sind 80% meiner Probleme gelöst!!! (Es war doch ein Druckfehler in der Formel-Klammern fehlten).
Wenn wir jetzt noch die Vorgaben per Rechenschema auf die Bahnen verteilen könnten wäre es perfekt.
Die Bahnen sind nach Schwierigkeit durchnumeriert. 1 schwierigste - 18 leichteste. Nun muß die Vorgabe (1 bis 60) darauf verteilt werden. (bei Vorgabe 1 erhält der Spieler nur auf der schwersten Bahn einen Schlag mehr. Bei Vorgabe 60 erhält der Spieler auf den 6 schwersten Bahnen je 4 und auf den anderen 12 je 3 Schläge mehr usw.)
Ist für Bernie nichts Neues.
Wie kann man dies mathematisch lösen?
Die prof. Software druckt entsprechende Striche auf die Scorekarte. Kann man das so ähnlich lösen und die Striche zählen?
@Bernie
ich grüße Dich als "alten" Golfer.
Hallo,
anbei mein Vorschlag.
Einfach mal angucken.
Gruss
Bernie
Ps Hoffe der Rechner rechnet richtig :-)
[Anhang gelöscht durch Administrator]
Hallo,
ZitatWenn wir jetzt noch die Vorgaben per Rechenschema auf die Bahnen verteilen könnten wäre es perfekt.
Die Bahnen sind nach Schwierigkeit durchnumeriert. 1 schwierigste - 18 leichteste. Nun muß die Vorgabe (1 bis 60) darauf verteilt werden. (bei Vorgabe 1 erhält der Spieler nur auf der schwersten Bahn einen Schlag mehr. Bei Vorgabe 60 erhält der Spieler auf den 6 schwersten Bahnen je 4 und auf den anderen 12 je 3 Schläge mehr usw.)
Im Prinzip ganz einfach.
Hat ein Spieler z.B. HCP 18 und seine Platzvorgabe liegt bei ( von HCP - 17,5 bis HCP 20 = 20 ) dann spielt er mit HCP 20
Das heisst. Ersteinmal muss ermittelt werden, welche Vorgabe der Spieler hat.
In meiner DB geht das automatisch, wenn man einen Spieler in einem Wettspiel anlegt bzw . auswählt.Der Spieler hat dann an jedem LOCh (1-18) einen Schlag vor + an Loch mit der Vorgabe 1 + 2 nochmals einen weiteren, also dann 2 Schläge vor.
Beispiel :
Hat ein Loch folgende Daten
Loch 1 = Par 4 = HCP 2
Dann hätte der o.g. Spieler nach o.g. Bewertung ja 6 Schläge um Par zuerreichen ( Netto-Par)
D.h. man gibt durch die Vorgabe dem Par einen neuen Wert..
Somit gilt wenn er 6 Schläge gespielt hat, hat er ein Errechnetes-Par erreicht = 2 Netto-Punkte
Die Netto-Puntke kannst du dann erneut nach Par = 2 Punkte Boogey = 1 Punkt Birdie = 3 Punkte usw . ermitteln.
Vielleicht findet auch ein pfiffiger Mensch eine Formel dafür, aber ich halt mich lieber an diese Methode :-)
Gruss
Bernie
Hallo Bernie,
Reife Leistung, so eine DB mal eben so an ein zwei Tagen
nebenbei zusammen gestrickt, - aR-iE-eS-Pi-iE-Ci-Ti.
ZitatDie Netto-Puntke kannst du dann erneut nach Par = 2 Punkte Boogey = 1 Punkt Birdie = 3 Punkte usw . ermitteln.
Vielleicht findet auch ein pfiffiger Mensch eine Formel dafür, aber ich halt mich lieber an diese Methode :-)
Also mein Ausdruck funzt auch in einer Abfrage (Zeile zwischen den Leerzeilen)
SELECT
S.Spieler_Name,
WSE.Spieler_Vorgabe,
WSE.Spieler_Anzahl_Schläge,
GP.Par, GP.Loch_Vorgabe,
IIf([Spieler_Vorgabe]>=[Loch_Vorgabe],[Wieviel_Vorgabe_je_Loch],0) AS Vorgabewirksam,
[Vorgabewirksam]+[Par] AS Par_Richtig,
[Spieler_Anzahl_Schläge]-[Par_richtig] AS Netto_Schläge,
IIf(([Par_Richtig]-[Spieler_Anzahl_Schläge]+2)<0,0,([Par_Richtig]-[Spieler_Anzahl_Schläge]+2)) AS Netto_Punkte,
WSE.Wettspiel_ID,
WSE.Golfplatz_ID,
WSE.Spieler_ID,
IIf([Netto_Schläge]=0,1,0) AS Anzahl_Par,
IIf([Netto_Schläge]=1,1,0) AS Anzahl_Boogey,
IIf([Netto_Schläge]=-1,1,0) AS Anzahl_Birdie,
IIf([Netto_Schläge]=-2,1,0) AS Anzahl_Eagle,
IIf([Netto_Schläge]=-3,1,0) AS Anzahl_Albatross,
WSE.Wettspiel_Datum
FROM Tbl_Spieler AS S
INNER JOIN (Tbl_Wettspiel_Spieler_Ergebnis AS WSE
INNER JOIN Tbl_Golfplatz_Löcher AS GP
ON (WSE.Golfplatz_ID = GP.Golfplatz_ID) AND (WSE.Loch_Nr = GP.Loch_Nr))
ON S.ID = WSE.Spieler_ID;
Hat bei mir das gleiche Ergebnis angezeigt.
gruss ekkehard
Hi Ekkehard,
cool, ich wusste doch, es geht noch "einfacher" :-)
Das Einzige was noch unschön ist, dass man die Löcher von 1-18 je Spieler im Wettspiel auch noch mit erfassen muss.
Nicht unbedingt Anwender freundlich.
Was fällt dir dazu ein ? Eine Anfügeabfrage vielleicht ?
Gruss
Bernie
Hallo Bernie,
Zitatcool, ich wusste doch, es geht noch "einfacher" :-)
Der Ausdruck lag doch vor, und die Operanden hast Du auch in Deiner
Abfrage drin; - hättest Du auch selbst drauf kommen können ;)
ZitatDas Einzige was noch unschön ist, dass man die Löcher von 1-18 je Spieler im Wettspiel auch noch mit erfassen muss.
Nicht unbedingt Anwender freundlich.
Was fällt dir dazu ein ? Eine Anfügeabfrage vielleicht ?
Könnte man direkt nach Eingabe des Spielers/Teilnehmers machen.
Man muss dazu noch eine Hilfstabelle "tblLoecher" anlegen (1 Feld: LochNr; 18 DS von 1-18),
dann sollte es mit dieser Abfrage funzen
strSQL = "INSERT INTO Tbl_Wettspiel_Spieler_Ergebnis " _
& "( Wettspiel_ID, Golfplatz_ID, Spieler_ID, Spieler_Vorgabe, Loch_Nr ) " _
& "SELECT WSE.Wettspiel_ID, " _
& "WSE.Golfplatz_ID, " _
& "WSE.Spieler_ID, " _
& "WSE.Spieler_Vorgabe, " _
& "L.LochNr "_
& "FROM Tbl_Wettspiel_Spieler_Ergebnis AS WSE " _
& "INNER JOIN Loecher AS L " _
& "ON WSE.Loch_Nr = L.LochNr"
CurrentDb.Execute strSQL, DbFailOnError
Hab's nicht getestet, sollte klappen.
gruss ekkehard
Hallo, hallo, hallo,
das lebe ich an IT Experten. Sie können sich in ein Problem verbeißen und sich daran berauschen. Vielen Dank daß Ihr Euch meines Problems so vehement annehmt. Danke.
Daß ich schon lange nicht mehr folgen kann ist wohl mein Problem. Vieleicht kann einer so nett sein und einem Laien (nach den Erfahrungen bisher einem absoluten!!) weiterhelfen?
Der letzte Stand der DB könnte evtl. helfen
Gruß
HorstP
und frohe Ostern!
Hallo Horst
hast du dir meine Db mal angesehen ?
Damit solltest du eigentlich alles machen können.
@Ekkard die Abfrage funktioniert nicht. Passiert gar nichts
Gruss
Bernie
Hallo,
@Horst
Zitatdas lebe ich an IT Experten. Sie können sich in ein Problem verbeißen und sich daran berauschen.
Dabei bin ich wirklich kein Experte, deshalb ist so ein Verbeißen reiner Selbstzweck; - ich lerne dabei genauso viel
wie Du.
ZitatDaß ich schon lange nicht mehr folgen kann ist wohl mein Problem.
Tja, das ist jetzt Dein Zeitinvestment, das zu verstehen; - darfst aber gerne wieder nachfragen.
@Bernie
Zitat@Ekkard die Abfrage funktioniert nicht. Passiert gar nichts
Ja, die stimmte auch noch nicht; - war noch ein bisschen
luftig ;)
Hab's jetzt aber komplett:
Form = Frm_Wettspiel_Spieler
Private Sub Form_AfterUpdate()
Dim strDatum As String
Dim strSQL As String
strDatum = Format(Me.txtWettspiel_Datum, "\#yyyy\-mm\-dd\#")
strSQL = _
"INSERT INTO Tbl_Wettspiel_Spieler_Ergebnis ( " _
& "Wettspiel_ID, " _
& "Golfplatz_ID, " _
& "Spieler_ID, " _
& "Spieler_Vorgabe, " _
& "Wieviel_Vorgabe_je_Loch, " _
& "Wettspiel_Datum, " _
& "Loch_Nr ) " _
& "SELECT " _
& Me.txtWettspiel_ID & ", " _
& Me.txtGolfplatz_ID & ", " _
& Me.Kombinationsfeld3.Value & ", " _
& Me.txtSpieler_Vorgabe & ", " _
& Me.Wieviel_Loch_Vorgabe & ", " _
& strDatum & ", " _
& "L.LochNr " _
& "FROM Tbl_Wettspiel_Spieler_Ergebnis AS WSE " _
& "INNER JOIN Loecher AS L " _
& "ON WSE.Loch_Nr = L.LochNr " _
& "WHERE WSE.Spieler_ID = " & Me.Kombinationsfeld3.Value
CurrentDb.Execute strSQL, dbFailOnError
End Sub
Damit werden nach Eingabe eines Teilnehmers 18 DS in Tbl_Wettspiel_Spieler_Ergebnis
angelegt; - jedenfalls bei mir.
Ich habe ein paar Controls umbenannt, - ich habe da immer Probleme damit, wenn
Control-Name = Feld-Name ist. Gibt bei mir immer wieder Probleme beim Ausführen
von SQL-Strings per VBA.
Version anbei.
hth
gruss ekkehard
[Anhang gelöscht durch Administrator]