Access実践入門 TOPへ
 ■ マイクロソフトアクセス、プロシージャを使って順位を計算する
成績順位の計算



ゴルフコンペでは、同じスコアでも年齢とかを見て、同順位は無いでしょうけど、算数のテストとかでは、同じ点数なら同順位となるでしょう
サンプルプログラムでは、両方作ってみました。

まず、同順位が無い場合です。
ボタンの「クリック時」に次のようなプロシージャがあります
--------------------------------−−−−----------------
DoCmd.OpenQuery "qu削除成績作業"
DoCmd.OpenQuery "qu大会参加者成績作業作成"

Dim jun As Long

Dim dbs As Database
Dim rst As Recordset

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("to成績作業", dbOpenTable)

If rst.RecordCount = 0 Then
Exit Sub
End If

jun = 0

rst.Index = "PrimaryKey"
rst.MoveFirst

Do Until rst.EOF

rst.Edit

jun = jun + 1

rst!成績順位 = jun

rst.Update


rst.MoveNext


Loop

rst.Close


DoCmd.OpenReport "re大会参加者一覧", acViewPreview
--------------------------------−−−−----------------
まず、作業テーブル「to成績作業」の全レコードを削除するクエリー「qu削除成績作業」の実行

続いて、下のクエリー「qu大会参加者成績作業作成」で、「to成績作業」に成績順にレコードが追加されます。

並び替えを4つ指定しています。
成績が同じなら、年齢、さらに性別、最終的には登録順です。
これで、「to成績作業」が成績順に作られます。
あとは、順番にレコードを読み込んで、順位のフィールドに順位を書き込んでいます。
ループを使って、変数junを1つプラスしながら、回しています。



次に、同順位が有る場合です。
ボタンの「クリック時」に次のようなプロシージャがあります
--------------------------------−−−−----------------
DoCmd.OpenQuery "qu削除成績作業"
DoCmd.OpenQuery "qu大会参加者成績作業作成"

Dim jun As Long
Dim co As Long
Dim sc As Long

Dim dbs As Database
Dim rst As Recordset

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("to成績作業", dbOpenTable)

If rst.RecordCount = 0 Then
Exit Sub
End If

jun = 1
co = 0

rst.Index = "PrimaryKey"
rst.MoveFirst

sc = rst!成績

Do Until rst.EOF

rst.Edit

co = co + 1
If sc = rst!成績 Then
jun = jun
Else
jun = co
sc = rst!成績
End If

rst!成績順位 = jun
rst.Update


rst.MoveNext


Loop

rst.Close


DoCmd.OpenReport "re大会参加者一覧", acViewPreview
--------------------------------−−−−----------------
同順位が無い場合と違うのは、scに成績を代入して比較しながら順位を決めている部分です。
coは、成績が違った場合の次の順位を決めるカウントです。
同じ成績なら、同じ順位で、違った場合は、実際のカウントが入ります
10点・・・1位
 8点・・・2位
 8点・・・2位
 7点・・・4位
といった順位の付け方にならないといけません。

レポート

呼び出されるレポートは、共通です。

並び替えは次のようにしています


同順位が無い場合は、成績順位の順番で出るので、生年月日は関係有りません。
同順位が有る場合は、年齢の上の人を最初に印字するようにしています。