Hallo zusammen
Ich möchte für die drei ersten Datensätze einen Wert setzen.
Ausgangslage:
Ich habe eine Tabelle mit Wertungspunkten für eine Rangliste.
Diese besteht aus einem bis sechs Datensätzen pro Team. Von diesen ein bis sechs Datensätzen, sollten für die ersten drei Datensätze das Statusfeld auf ,,ja" gesetzt werden. Sind drei oder weniger Datensätze pro Team vorhanden, müssen diese alle auf ,,ja" gesetzt werden. Das Total dieser drei Datensätze wird für die Gesamtrangliste weiter verwendet.
Dazu im Anhang ein kleines Beispiel mit Daten.
Tabelle: Scores
Sortierreihenfolge: Total; OLF; Drive, Shedding; Pen; Singling. Diese alle absteigend sortiert.
Kriterium: Rangiert = ,,ja"
Bezug für die 3 besten Läufe pro: Link_team_number
Statusfeld: Status_3_besten_Läufe
Kleines Beispiel
Team 1 Lauf 1 99 Punkte ja
Team 1 Lauf 6 95 Punkte ja
Team 1 Lauf 3 80 Punkte ja
Team 1 Lauf 2 80 Punkte Nein
Team 1 Lauf 5 79 Punkte Nein
Team 1 Lauf 4 60 Punkte Nein
Team 2 Lauf 3 85 Punkte ja
Team 2 Lauf 1 83 Punkte ja
Team 2 Lauf 5 72 Punkte ja
Team 3 Lauf 3 82 Punkte ja
Team 3 Lauf 4 67 Punkte ja
Team 4... etc.
Vielen Dank für die Hilfe
Nachtrag vom 26.11.2011
Habe leider bis jetzt noch keine Antwort erhalten. Ich möchte mich erkundigen, ob es daran liegt, dass ich die Frage nicht verständlich gestellt habe, was mit meinem Wissenstand leicht möglich wäre, oder ob diese Funktion im Access nicht lösbar ist? Ich könnte die Markierungen auch manuell durchführen, bei bis zu 348 Datensätzen braucht das aber eine gewisse Zeit und diese habe ich in der Situation wo ich die Ranglisten erstellen muss, eigentlich nicht.
Kann mir ein ,,Spezialist" bitte eine Antwort auf diese Frage geben.
Vielen herzlichen Dank.
[Anhang gelöscht durch Administrator]
Hallo,
auch wenn das mit einer reinen (komplexen) SQL-Lösung realisierbar wäre, tendiere ich zu einer Funktion, die diese Berechnungsvorgabe durchführt und die, wenn es denn unbedingt sein muß, das jeweilige Ergebnis in die Tabelle schreibt (bzw. durch Aufruf in einer Aktualisierungsabfrage die Tabelle aktualisiert).
Statt in eine Tabelle zu schreiben, wäre ein Bericht mit entspr. Programmierung für eine Auswertung vorteilhafter.
(bei mir fehlt aber jetzt die Zeit, das in Code umzusetzen)
Hallo,
Erst mal vielen dank für die Antwort.
Leider ist es so, dass ich die Werte fest in der Tabelle benötige, da aus diesen noch weitere Abfragen erstellt werden müssen. Nicht zuletzt möchte ich mir die Möglichkeit offen lassen, die "automatisch" gesetzten Werte bei bedarf nachträglich manuell ändern zu können.
Ich hoffe, dass ich noch jemanden finde, der die Herausforderung annimmt und einen Code schreiben kann. Ich selber bin damit leider mehr als überfordert. Falls dies nicht möglich ist, werde ich mir den Bericht als "Notlösung" offen lassen.
Hallo KueAla1,
Mit Code funzt es so:
Private Sub SetzeStatus()
On Error GoTo Fehler
Dim z As Integer
Dim iTeam As Integer
Dim rst As dao.Recordset
Dim dbe As dao.Database
Set dbe = CurrentDb
Set rst = _
dbe.OpenRecordset( _
"SELECT S.Link_team_number, S.Total, S.Status_3_besten_Läufe " _
& "FROM Scores AS S " _
& "ORDER BY S.Link_team_number, S.Total DESC")
Do While Not rst.EOF
iTeam = rst.Fields("Link_team_number").Value
For z = 1 To 3
rst.Edit
rst.Fields("[Status_3_besten_Läufe]").Value = True
rst.Update
rst.MoveNext
Next z
If rst.EOF = True Then Exit Do
Do While rst.Fields("Link_team_number").Value = iTeam And Not rst.EOF
rst.MoveNext
Loop
Loop
Ende:
rst.Close
Set rst = Nothing
Set dbe = Nothing
Exit Sub
Fehler:
If Err.Number = 3021 Then GoTo Ende
End Sub
Eine Lösung per Abfrage ist mir nicht gelungen.
Eine Anmerkung am Rande. Das Feld "Total" brauchst Du nicht, das ist doch die Summe von fünf anderen Feldern, die Du immer per Abfrage ermitteln kannst. Berechnete Felder soll(te) man aus Gründen der Inkonsistenz vermeiden.
Die Abfrage in obigem Code würde dann so aussehen:
"SELECT S.Link_team_number, S.OLF+S.Drive+S.Shedding+S.Pen+S.Singling AS Total, [Status_3_besten_Läufe] " _
& "FROM Scores AS S " _
& "ORDER BY S.Link_team_number, S.OLF+S.Drive+S.Shedding+S.Pen+S.Singling DESC"
Und vermeide Umlaute und Sonderzeichen ( _ ist erlaubt) in Feldnamen.
hth
gruss ekkehard
Hallo Ekkehard
Vielen Dank für den Code. Funktioniert super! :)
Es hat noch einen kleinen Schönheitsfehler:
Es werden z.T. auch Datensätze markiert, bei denen der Feldstatus [Rangiert] auf ,,Nein" gesetzt ist. Es dürften eigentlich nur TOP 3 Datensätze markiert werden, bei denen [Rangiert] auf ,,Ja" gesetzt ist. Ev, ist diese Korrektur eine kurze Sache. Ich habe es leider nicht zustande gebracht. Nachstehend der Code, den ich benutze:
Private Sub Test_Top_3_Click()
On Error GoTo Fehler
Dim z As Integer
Dim iTeam As Integer
Dim rst As dao.Recordset
Dim dbe As dao.Database
Set dbe = CurrentDb
Set rst = _
dbe.OpenRecordset( _
"SELECT S.Link_team_number, S.Ranking_Points, S.Status_3_besten_Läufe " _
& "FROM Scores AS S " _
& "ORDER BY S.Link_team_number, S.Ranking_Points DESC, S.Total DESC, S.Drive DESC")
Do While Not rst.EOF
iTeam = rst.Fields("Link_team_number").Value
For z = 1 To 3
rst.Edit
rst.Fields("[Status_3_besten_Läufe]").Value = True
rst.Update
rst.MoveNext
Next z
If rst.EOF = True Then Exit Do
Do While rst.Fields("Link_team_number").Value = iTeam And Not rst.EOF
rst.MoveNext
Loop
Loop
Ende:
rst.Close
Set rst = Nothing
Set dbe = Nothing
Exit Sub
Fehler:
If Err.Number = 3021 Then GoTo Ende
End Sub
Im Anhang noch zwei PDF-Dateien. Eine mit Staus ,,Ja", diese ist i.O.. Die zweite mit Staus ,,Nein". Hier sollten eigentlich keine Datensätze markiert sein.
Falls der Code nicht angepasst werden kann, habe ich die Möglichkeit den ,,Fehler" mittels einer Aktualisierungsabfrage zu beheben.
Noch kurz eine Antwort zu Deiner Anregung:
Du hast vollkommen recht, die Summe kann mit einer Abfrage gerechnet werden und wäre eigentlich auch der richtige Weg, ohne die Resultate in einem Feld zu berechnen und zu speichern.
Beim Anlass, für welchen ich die Ranglisten erstelle, ist es schon öfters vorgekommen, dass es in letzter Sekunde eine Änderung betreffend den Vorgaben für die Rangierung gegeben hat. Dies sind meist Entscheide, wie z.B. bei Punktegleichheit vorgegangen werden muss etc. Mit dem hinterlegen aller Daten, halte ich mir die Möglichkeit vor, manuell die entsprechenden Daten zu ändern. Denn nach der Eingabe des letzten Resultats, warten die Leute auf die Rangliste und ich habe die Zeit nicht, im Access komplexere Abfragen und Berichte neu zu definieren.
Gruss
Alain
[Anhang gelöscht durch Administrator]
Hallo Alain,
ZitatVielen Dank für den Code. Funktioniert super!
Hat aber Fehler :( (korrigierter Code s.u.)
ZitatEs werden z.T. auch Datensätze markiert, bei denen der Feldstatus [Rangiert] auf ,,Nein" gesetzt ist.
Das hatte ich übersehen, aber jetzt auch berücksichtigt.
Was ich noch als Fehler entdeckt habe, war die Stelle an der es nur 2 DS für ein Team gibt. Da lief die For...Next Schleife in den ersten DS des nächsten Teams (auch geändert).
Private Sub SetzeStatus()
On Error GoTo Fehler
Dim z As Integer
Dim iTeam As Integer
Dim rst As dao.Recordset
Dim dbe As dao.Database
Set dbe = CurrentDb
Set rst = _
dbe.OpenRecordset( _
"SELECT S.Link_team_number, S.OLF+S.Drive+S.Shedding+S.Pen+S.Singling AS gesamt, " _
& "S.[Status_3_besten_Läufe], S.Rangiert " _
& "FROM Scores AS S " _
& "WHERE S.Rangiert = True " _
& "ORDER BY S.Link_team_number, S.OLF+S.Drive+S.Shedding+S.Pen+S.Singling DESC")
Do
iTeam = rst.Fields("Link_team_number").Value
For z = 1 To 3
If rst.Fields("Link_team_number").Value = iTeam Then
rst.Edit
rst.Fields("[Status_3_besten_Läufe]").Value = True
rst.Update
rst.MoveNext
Else
Exit For
End If
Next z
If rst.EOF = True Then Exit Do
Do While rst.Fields("Link_team_number") = iTeam And Not rst.EOF
rst.MoveNext
Loop
Loop Until rst.EOF
Ende:
rst.Close
Set rst = Nothing
Set dbe = Nothing
Exit Sub
Fehler:
If Err.Number = 3021 Then GoTo Ende
End Sub
Das sollte jetzt so funzen; bei mir tut.
Ich werde jetzt noch mal versuchen, dass doch noch mit SQL hinzubekommen. Eberhard hat da in Deinem zweitem Thread zu diesem Thema ja schon einen Ansatz geschaffen.
gruss ekkehard
Hallo Alain,
Nun hab' ich's doch noch geschafft die SQL-Lösung zu finden (Danke Eberhard):
UPDATE Scores AS S
Set S.Status_3_besten_Läufe = True
WHERE S.Total In
(SELECT TOP 3 T.Total
FROM
(SELECT SC.Link_team_number, SC.Total
FROM Scores AS SC
ORDER BY SC.Link_team_number, SC.Total DESC) AS T
WHERE T.Link_team_number=S.Link_team_number AND S.Rangiert=True)
hth
gruss ekkehard
Hallo Ekkehard
Wau, funktioniert supper! :) Werde für meinen Zweck die SQL-Abfrage verwenden. Für mich ist diese etwas verständlicher als der Code.
Vielen Dank an Dich für Deine super Hilfe (natürlich auch an Eberhard).
Jetzt kann ich dem Anlass viel ruhiger entgegen sehen und hoffen, dass alles klappen wird. Dieses Jahr hat es Teilnehmer aus Deutschland, Niederlande, Frankreich, Österreich, Italien. Lichtenstein und natürlich aus der Schweiz, wo ich herkomme.
Gruss
Alain
Hallo Alain,
ZitatWau, funktioniert supper! Werde für meinen Zweck die SQL-Abfrage verwenden.
Das wird Eberhards Mundwinkel sicher dazu veranlassen mal wieder bei den Ohren auf einen Kaffee vorbei zu schauen. ;D
gruss ekkehard
Welch unglaubliche Nachbearbeitung eines eigentlich gelösten Themas, sowohl in fachlicher Hinsicht (ich entschuldige mich auch, wenn ich ein SQL-Problem dann doch mit VBA lösen muss) als auch im Lesen fremder Beweg-Leitlinien.
MfGA
ebs
Hallo Eberhard,
ZitatZitat einfügen
Welch unglaubliche Nachbearbeitung eines eigentlich gelösten Themas, sowohl in fachlicher Hinsicht (ich entschuldige mich auch, wenn ich ein SQL-Problem dann doch mit VBA lösen muss) als auch im Lesen fremder Beweg-Leitlinien.
Sorry, aber ehrlich gesagt, verstehe ich jetzt nicht, was Du mir jetzt sagen willst.
Auf Deine Antwort in dem anderen Thread hat Alain ja geantwortet, das er mit Deinem SQL-Vorschlag nicht zurecht kommt.
Ich hatte den Thread erst gelesen, nach dem ich zunächst vergeblich nach einer SQL-Lösung gesucht hatte, ihm dann auf die Schnelle (daher die Fehler in der ersten Version) eine Procedur geschrieben.
Als ich dann, mit Deiner Hilfe, die SQL-Lösung doch noch hin bekommen hatte, wollte ich Alain diese natürlich auch mitteilen.
Gut, noch zu erwähnen, dass Du dich (als Verfechter reinen SQLs) über seine Entscheidung die zu benutzen freuen wirst, war vielleicht nicht nötig, - nichts für ungut.
gruss ekkehard
@ekkehard: Wer wird denn negativ denken und sich dieser deutschen Krankheit unterwerfen?
Ich unterstelle positiv, und genau so war es gemeint. Mein Fehler, dass ich das nicht explizit betonte (und schade, dass man das offensichtlich tun muss).
Mit anderen Worten: Trotz einer akzeptierten Lösung sich um eine bessere Lösung bemühen - das zeigt Charakter. Das dient eventuell dem Fragesteller, befördert vor allem aber einen selber.
MfGA
ebs
Hallo Eberhard,
ZitatWer wird denn negativ denken und sich dieser deutschen Krankheit unterwerfen?
Aber man wird dann öfter
positiv überrascht ;)
ZitatIch unterstelle positiv, und genau so war es gemeint. Mein Fehler, dass ich das nicht explizit betonte (und schade, dass man das offensichtlich tun muss).
Eigentlich nicht, ich konnte nur nicht erkennen, ob Du mir nun die Bratpfanne oder ein Kompliment machen wolltest, - jetzt klar :)
Zudem bin hier ja noch nicht solange unterwegs. Habe zwar schon einige Deiner Beiträge gelesen, aber bis man jemanden so "aus der Ferne" besser kennt dauert dann doch eine Weile.
ZitatTrotz einer akzeptierten Lösung
Die aber Fehler hatte.
Zitatsich um eine bessere Lösung bemühen - das zeigt Charakter
Eher Wissbegier; ich hab's nämlich mit SQL auch noch nicht so, und ohne Deine Vorlage hätte ich es auch nicht geschafft.
Zitatbefördert vor allem aber einen selber.
Das war, was ich hiermit
ZitatDas wird Eberhards Mundwinkel sicher dazu veranlassen mal wieder bei den Ohren auf einen Kaffee vorbei zu schauen.
sagen wollte. Und jetzt hole ich meine da wieder ab ;D
Schönen Abend noch (Nachtarbeiter?)
gruss ekkehard
Sehr OT:
Mit "sich befördern" meine ich nicht den Hinweisgeber, sondern eben den mit Wissbegier, der sich aus dem Ansatz eine Lösung und letztendlich Wissen erarbeitet - eine erforderliche Fähigkeit für eine kreative Tätigkeit wie Programmieren.
Wenn einer, der eher anderen antwortet als sich von anderen seine eigenen Probleme lösen lässt, sich dieses Wissen aneignet, ist das eine schöne und gewünschte mögliche Vervielfältigung von Wissen (genauer eines winzigen Teiles davon).
Als Hinweisgeber freut man sich selbstverständlich,
- wenn man sichtbar wahrgenommen wird,
- wenn zusätzlich die Nützlichkeit des Hinweises erahnt wird,
- wenn man am Ende verstanden wird - ohne Dauereinsatz einer Bratpfanne,
also letztlich, wenn der Hinweis nicht umsonst war. Diese Stufen nenne ich nicht ohne Grund, dazwischen können teils nennenswerte zeitliche Abstände liegen.
Aber ein Wiedergeben von Bekanntem ist nur ein Schmoren im eigenen Saft (manche begnügen sich damit), ein "sich befördern" ist das nicht, bestenfalls ein Training und Erhalten von Erarbeiteten. Für eine eigene "Beförderung" muss man schon an eigene Grenzen herantreten und diese überschreiten. Auch dazu bieten Aufgabenstellungen in einem Forum Gelegenheit.
Und wenn es um vermeintliches Wissen geht: Eine "verlorene" fachliche Diskussion ist für die eigene Entwicklung wertvoller als "Recht zu haben" und somit ein echter Gewinn (es gibt immer einen, der besser sein kann).
MfGA
ebs