Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: KuehAla1 am November 24, 2011, 23:13:37

Titel: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: KuehAla1 am November 24, 2011, 23:13:37
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]
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: DF6GL am November 26, 2011, 18:28:44
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)
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: KuehAla1 am November 26, 2011, 19:04:32
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.
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: Beaker s.a. am November 27, 2011, 01:22:34
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: KuehAla1 am November 27, 2011, 17:32:04
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]
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: Beaker s.a. am November 27, 2011, 20:00:49
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: Beaker s.a. am November 27, 2011, 20:41:32
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: KuehAla1 am November 27, 2011, 21:33:08
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: Beaker s.a. am November 28, 2011, 21:21:00
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: ebs17 am November 28, 2011, 22:27:21
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: Beaker s.a. am November 28, 2011, 23:46:16
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: ebs17 am November 29, 2011, 02:12:44
@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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: Beaker s.a. am November 29, 2011, 21:14:08
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
Titel: Re: Wert "ja" setzen für die jeweils 3 ersten Datensätze pro Teilnehmer
Beitrag von: ebs17 am November 30, 2011, 02:09:50
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