| 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位 といった順位の付け方にならないといけません。 |
|
| レポート 呼び出されるレポートは、共通です。 並び替えは次のようにしています ![]() 同順位が無い場合は、成績順位の順番で出るので、生年月日は関係有りません。 同順位が有る場合は、年齢の上の人を最初に印字するようにしています。 |
|