最終段階の各生徒の各科目の成績をテーブルにセットしていく処理である。
Recordsetは4つ必要である。
r1—T_seiseki 各科目の成績を参照するテーブル
r2—T_ichiran 各科目の成績を書き込むテーブル
r3—T_kamoku 科目を参照するテーブル(既に配列k_name(i)に読込済み)
r4ーT_seito 生徒名を参照するテーブル
単独の機能として説明の都合上、重複した記述となっているが(今回はコマンドボタンcmd3としている)、今回のコードが最終的な一括したコードである。
前回までの確認をすると
連載3では
r3を参照して、科目名をフィールド定義しT_ichiranを作成する処理
連載4では
r4を参照して、作成したT_ichiran(r2)に生徒名をセット
今回は
生徒名と科目名が一致するデータを順に書き込んでいけばよい。(全科目ループ)
点数が格納されるフィールドは1番目から、(科目数-1)番目までなのでループさせる。
0番目フィールドは生徒名、最終フィールドは平均点である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
Dim cnn As ADODB.Connection ‘—- 4つのテーブルを使用します —- Dim r1 As ADODB.Recordset Dim r2 As ADODB.Recordset Dim r3 As ADODB.Recordset Dim r4 As ADODB.Recordset ‘—————————————————– Dim h_avg As Double ‘平均点 Dim i, j, k ‘カウンター Dim st_SQL As String ‘sql用文字列 Dim all_k As String ‘科目名をフィールド名にするための文字列、sql文で使用 Dim all_k_i As String ‘科目名をフィールド名にするための文字列、sql文で使用 Dim all_k_h As String ‘科目名をフィールド名にするための文字列、sql文で使用 Dim k_name(30) As String ‘科目名を入れる配列 Dim k_n As Integer ‘科目数を入れる変数 ‘科目数を取得 k_n = DCount(“*”, “T_kamoku”) all_k_i = “生徒名 varchar,” ‘フィールド定義 all_k_h = “平均点 Double” ‘フィールド定義 Set cnn = CurrentProject.Connection Set r1 = New ADODB.Recordset Set r2 = New ADODB.Recordset Set r3 = New ADODB.Recordset Set r4 = New ADODB.Recordset r1.Open “T_seiseki”, cnn, adOpenStatic, adLockReadOnly ‘得点テーブル r3.Open “T_kamoku”, cnn, adOpenStatic, adLockReadOnly ‘科目名テーブル i = 1 ‘科目名を取得 Do Until r3.EOF k_name(i) = r3!科目名 r3.MoveNext i = i + 1 Loop ‘———————– i = 1 ‘科目名を一般化してフィールド名に入れる準備 For i = 1 To 25 all_k = all_k & “kn” & i & ” double,” Next ‘最終的にフィールド名とするための処理 all_k = all_k_i & all_k & all_k_h ‘処理前にテーブルを削除 On Error Resume Next DoCmd.DeleteObject acTable, “T_ichiran” On Error GoTo 0 ‘テーブル作成のSQL文およびSQL実行 st_SQL = “CREATE TABLE T_ichiran(” & all_k & “);” DoCmd.RunSQL st_SQL r2.Open “T_ichiran”, cnn, adOpenKeyset, adLockOptimistic ‘新規に作成したテーブル ‘生徒名を取り出し、新規テーブルに登録する処理 r4.Open “T_seito”, cnn, adOpenStatic, adLockReadOnly ‘生徒名を参照するテーブル Do Until r4.EOF r2.AddNew r2!生徒名 = r4!生徒名 r2.Update r4.MoveNext Loop ‘——————————————————- ‘ここから点数を書き込む処理 参照テーブルは成績テーブル T_seideki(r1.open) → T_ichiran(r2.open) ‘——————————————————- r1.MoveFirst r2.MoveFirst Do Until r2.EOF h_avg = 0 k = 0 r1.MoveFirst Do Until r1.EOF j = 1 Do Until j > r2.Fields.Count – 1 If r1!生徒名 = r2!生徒名 And k_name(j) = r1!科目名 Then ‘r2.Fields(j) = r1!点数 r2(“kn” & j) = r1!点数 h_avg = h_avg + Nz(r1!点数) k = k + 1 If h_avg <> 0 Then r2!平均点 = Round((h_avg / k), 2) r2.Update Else End If j = j + 1 Loop r1.MoveNext Loop r2.MoveNext Loop ‘———–開いたものは閉じる——— r1.Close Set r1 = Nothing r2.Close Set r2 = Nothing r3.Close Set r3 = Nothing r4.Close Set r4 = Nothing cnn.Close Set cnn = Nothing End Sub |
平均点は単純に科目数で割り算しているだけである。