PDA

Vollständige Version anzeigen : Ranking von Datensätzen


lois
29.12.2001, 14:41
Hallo ! wer kann mir helfen den sehr nützlichen code aus der KnowHow datei mit dem Beispiel der Plätze des Hochspringers so zu ändern, daß die Bezifferung über eine Gruppe sprich Klasse geht und nicht über alle Teilnehmer. Mein Kriterium wäre in meinem Falle die KlassenId (klaID). Vielleicht kann mir jemand weiterhelfen. Und allen Lesern und helferen ein gutes neues Jahr und ein Dankeschön im voraus

Alexander Jan Peters
02.01.2002, 22:09
<font face="Tahoma">Hallo lois,

die Grundprozedur "RangBerechnen" ist mit minimalen Anpassungen in der Lage diese Aufgabe zu lösen (ich poste nur die angepaßten Zeilen):
</font><font face="Courier New">
Private Function RangBerechnen(lngClsID As Long, TableName As String, LeistungFeld As String) As Boolean

...

Set DB = CurrentDb
Set rst = DB.OpenRecordset("SELECT * FROM " & TableName & " WHERE klaID=" & lngClsID & " ORDER BY " & LeistungFeld & " DESC", dbOpenDynaset)

...
</font><font face="Tahoma">
Beim Aufruf übergibst Du den Filter für die zu bearbeitende Datenmenge einfach in der Variablen lngClsID (in meinem Beispiel Long Integer, mußt Du entsprechend anpassen).
Um für alle Klassen diese Berechnung und Aktualisierung durchzuführen mußt Du die die Prozedur einfach z.B. über eine Schleife mit den verschiedenen Klassen aufrufen und die jeweilige klaID übergeben.

Gruß

A.J. Peters</font>

Alexander Jan Peters
05.01.2002, 00:26
<font face="Tahoma">Mail von Lois:</font>

Hallo Alexander,
ich danke Dir vorerst noch einmal für Deine Hilfe, bin jedoch zu blöd um mein Problem zu einem positiven Ende zu führen. Vielleicht kannst Du mir nochmals kurz helfen ?
Ich übersende Dir den abgeänderten Code: DANKE nochmals
mfg Lois

Private Function RangBerechnen(class As Long, tblName As String, timeField As String) As Boolean
On Error GoTo err_laRang

Dim DB As Database
Dim rs As Recordset
Dim iRang As Byte
Dim iTime As Integer
Dim iEquo As Integer



Set DB = CurrentDb()
For class = 1 To 48
Set rs = DB.OpenRecordset("SELECT * FROM " & tblName & "WHERE klaID=" & class & " ORDER BY " & timeField & " ASC", dbOpenDynaset)

iRang = 1
With rs

Do While Not .EOF
iTime = .Fields(timeField)
.Edit
!laRang = iRang
.Update
.MoveNext
If .EOF Then Exit Do
iEquo = 0
Do While (.Fields(timeField) = iTime)
.Edit
!laRang = iRang
.Update
iEquo = iEquo + 1
.MoveNext
If .EOF Then Exit Do
Loop
iRang = iRang + 1 + iEquo
Loop
.Close


End With
RangBerechnen = True
Set DB = Nothing
Set rs = Nothing

Exit Function
Next class
err_laRang:
RangBerechnen = False

End Function



Private Sub Form_Load()
If Not RangBerechnen((class), "tblERGEBNIS", "laTime") Then
MsgBox "Rang-Berechnung mißlungen!"
End If
Me.Requery
End Sub

-----------------------------------------------
<font face="Tahoma">Hallo Alois,

eigentlich gehört jede Nachfrage, egal welcher Art in das Forum, damit alle etwas davon haben.
Ich würde wohl den halben Tag nur mit meinen Mails beschäftigt sein, wenn mich jeder zu meinen Antworten anmailt, vor allem würde ich wohl tausendmal die gleiche Antworten schreiben.
Ich stelle Deinen Mail-Text also in den Beitrag des Forums und die Antwort auch.

Gruß

A.J. Peters</font>

Alexander Jan Peters
05.01.2002, 00:35
<font face="Tahoma">Und hier die Antwort:</font>

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Function</span> RangBerechnen(intClass <span class="TOKEN">As</span> Long, strClass <span class="TOKEN">As</span> String, TableName <span class="TOKEN">As</span> String, LeistungFeld <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
<span class="REM">'//Original:</span>
<span class="REM">'//Private Function RangBerechnen(TableName As String, LeistungFeld As String) As Boolean</span>
<span class="REM">'//</span>
<span class="REM">'//intClass ist der Parameter mit dem die Datenmenge so gefiltert wird, daß die Rangberechnung nur über diese Gruppe erfolgt</span>
<span class="REM">'//strClass ist der Name des Feldes, in dem diese Zahl steht</span>

<span class="REM">'Autor: fullaccess.de</span>
<span class="REM">'Öffnet die Tabelle 'TableName' und füllt das Feld "Rang" mit den Rangnummern. Die Funktion</span>
<span class="REM">'geht davon aus, daß 'TableName' das Feld "Rang" enthält. Das Parameter 'LeistungFeld' enthält</span>
<span class="REM">'den Namen des Feld, in dem die Höhe, Distanz usw. eingetragen sind.</span>
<span class="TOKEN">On Error GoTo</span> Err_Rang

<span class="TOKEN">Dim</span> DB <span class="TOKEN">As</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Dim</span> rst <span class="TOKEN">As</span> Recordset
<span class="TOKEN">Dim</span> iRang <span class="TOKEN">As</span> <span class="TOKEN">Byte</span>
<span class="TOKEN">Dim</span> iLeistung <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> iGleicherRang <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> strSQL <span class="TOKEN">As</span> <span class="TOKEN">String</span> <span class="REM">'//String-Variable zur Speicherung der SQL-Anweisung,</span>
<span class="REM"> '//nur aus Gründen der Übersichtlichkeit</span>

<span class="REM">'//ASC für Ascending, da hier wohl Zeiten sortiert werden sollen, wobei die kleinere Zeit die Bessere ist ;) </span>
strSQL = "SELECT * FROM " & TableName & " WHERE " & strClass & "=" & intClass & " ORDER BY " & LeistungFeld & " ASC"

<span class="TOKEN">Set</span> DB = CurrentDb
<span class="TOKEN">Set</span> rst = DB.OpenRecordset(strSQL, dbOpenDynaset)
<span class="REM">'//Original:</span>
<span class="REM">'//Set rst = DB.OpenRecordset("SELECT * FROM " & TableName & " ORDER BY " & LeistungFeld & " DESC", dbOpenDynaset)</span>

iRang = 1

<span class="TOKEN">With</span> rst
<span class="TOKEN">Do</span> <span class="TOKEN">While</span> <span class="TOKEN">Not</span> .EOF
<span class="REM"> 'Die Leistung (Höhe, Distanz &c.) wird hier gespeichert, damit wir sie mit</span>
<span class="REM"> 'den weiteren Leistungen vergleichen können.</span>
iLeistung = .Fields(LeistungFeld)
.Edit
!Rang = iRang <span class="REM">'den Rang speichern</span>
.Update
.MoveNext
<span class="TOKEN">If</span> .EOF <span class="TOKEN">Then</span> <span class="TOKEN">Exit Do</span> <span class="REM">'für den Fall, daß wir uns auf dem letzten Datensatz befinden</span>
iGleicherRang = 0 <span class="REM">'diese Variable muß jedesmal zurückgesetzt werden</span>
<span class="TOKEN">Do</span> <span class="TOKEN">While</span> (.Fields(LeistungFeld) = iLeistung) <span class="REM">'für alle gleichrängigen Leistungen</span>
.Edit
!Rang = iRang <span class="REM">'den selben Rang speichern</span>
.Update
<span class="REM"> 'diesen Zähler erhöhen, um den nächsten Rang für den nächsten Teilnehmer zu überspringen</span>
iGleicherRang = iGleicherRang + 1
.MoveNext
<span class="TOKEN">If</span> .EOF <span class="TOKEN">Then</span> <span class="TOKEN">Exit Do</span> <span class="REM">'für den Fall, daß wir uns auf dem letzten Datensatz befinden</span>
<span class="TOKEN">Loop</span>
iRang = iRang + 1 + iGleicherRang <span class="REM">'den Rang erhöhen und ggfs. überspringen</span>
<span class="TOKEN">Loop</span>
.Close
<span class="TOKEN">End</span> <span class="TOKEN">With</span>

RangBerechnen = <span class="TOKEN">True</span>

<span class="TOKEN">Set</span> DB = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Set</span> rst = <span class="TOKEN">Nothing</span>

Exit_Rang:
<span class="TOKEN">Exit Function</span>
Err_Rang:
RangBerechnen = <span class="TOKEN">False</span>
<span class="TOKEN">Resume</span> Exit_Rang
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
<span class="TOKEN">Private Sub</span> Form_Load()
<span class="TOKEN">For</span> intA = 1 <span class="TOKEN">To</span> 48
<span class="REM">'//Alternativ kann zu dieser festen Schleife natürlich auch ein Recordset über alle Gruppen eingesetzt werden</span>
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> RangBerechnen(intA, "Gruppe", "tblErgebnisse", "Zeit")<span class="TOKEN">Then</span>
MsgBox "Rang-Berechnung mißlungen!"
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Next</span>
Me.Requery
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
<font face="Tahoma">
Gruß

A.J. Peters</font>