アクセス小僧:レコード番号とレコード数(4) [コンピューター]
アクセス小僧:レコード番号とレコード数(3)
http://cheese999.blog.so-net.ne.jp/2017-08-09-1
で、レコードセットを使ってテーブルの「レコード番号/レコード数」を更新した後にフォームにも反映するためには、フォームも再クエリ(Requery)する必要があると書きましたが、コードをいじくっていたら、フォームの再クエリをしなくても、フォームに反映されるようになってしまい、よく分からなくなってしまいました。
とりあえず、今、動いているコードを以下に示します。
Private Sub 再クエリ_Click()
'【機能】再クエリ
On Error GoTo ERR1
'【引数】
' なし
'【変数】
Dim db1 As DAO.Database ' データベース
Dim rs1 As DAO.Recordset ' レコードセット
Dim varBookMark As Variant ' ブックマーク
Dim myCurRcd1 As Long ' カレントレコード
Dim myID1 As Long ' ID
Dim rc As VbMsgBoxResult ' メッセージボックスの答え
' 【コード】
' 新規レコードなら、最終レコードに移動
If Me.NewRecord = True Then
' 最終レコードへ
DoCmd.GoToRecord acDataForm, "F_フォーム名", acLast
End If
' 保存
DoCmd.RunCommand acCmdSaveRecord
' カレントレコード
myCurRcd1 = CurrentRecord
' ID
myID1 = [ID]
' テーブルをレコードセットとして開く
Set db1 = CurrentDb()
Set rs1 = db1.OpenRecordset("T_テーブル名", dbOpenDynaset)
'レコードセットのブックマーク(再クエリ前のカレントレコード)を取得
varBookMark = rs1.Bookmark
'フォームを再クエリする
rs1.Requery
'先頭レコードへ
rs1.MoveFirst
'最終レコードへ
rs1.MoveLast
'先頭レコードへ
rs1.MoveFirst
'最終レコードまで繰り返し
Do Until rs1.EOF
rs1.Edit ' 編集
rs1!F_Record_No1 = (rs1.AbsolutePosition + 1) & "/" & rs1.RecordCount
rs1.Update ' 更新
rs1.MoveNext
Loop
' カレントレコードを保存されているブックマークに設定
rs1.Bookmark = varBookMark
' フォームを再クエリ
Me.Requery
' カレントレコードが更新前と違うときは、更新前のカレントレコードへ
If CurrentRecord <> myCurRcd1 Then
rc = MsgBox("CurrentRecordが更新前と違う[再クエリ_Click]" & vbCrLf _
& "前=" & myCurRcd1 & " 後=" & CurrentRecord, vbOKOnly + vbExclamation)
DoCmd.GoToRecord acDataForm, "F_フォーム名", acGoTo, myCurRcd1 ' 更新前のレコードへ
End If
' 更新前のカレントレコードをIDで検索
rs1.FindFirst [ID] = myID1
' IDが見つからない
If rs1.NoMatch = True Then
rc = MsgBox("更新前のカレントレコードが見つかりません。[再クエリ_Click]", vbExclamation)
End If
' レコードセット、データベース変数の解放
Set rs1 = Nothing
Set db1 = Nothing
' Subを抜ける
Exit Sub
ERR1:
rc = MsgBox("エラー[再クエリ_Click]" & vbCrLf & Err.Description)
' レコードセット、データベース変数の解放
Set rs1 = Nothing
Set db1 = Nothing
End Sub
・フォームの再クエリを追加しています。
・再クエリすると、カレントレコードが先頭レコードになってしまう仕様に対して、3つほど対処を入れています。
(1) ブックマークで更新前のカレントレコードに戻す
(2) カレントレコード番号を元に戻す
(3) 主キー(ID)で検索をかけて、カレントレコードを戻す
※レコードの追加、削除をすると、うまくカレントレコードが戻らない場合があり、3つ入れています。
・新規レコード判定しているのは、カレントレコードが新規レコードだと、再クエリによって、空っぽのレコードが追加されてしまうためです。
http://cheese999.blog.so-net.ne.jp/2017-08-09-1
で、レコードセットを使ってテーブルの「レコード番号/レコード数」を更新した後にフォームにも反映するためには、フォームも再クエリ(Requery)する必要があると書きましたが、コードをいじくっていたら、フォームの再クエリをしなくても、フォームに反映されるようになってしまい、よく分からなくなってしまいました。
とりあえず、今、動いているコードを以下に示します。
Private Sub 再クエリ_Click()
'【機能】再クエリ
On Error GoTo ERR1
'【引数】
' なし
'【変数】
Dim db1 As DAO.Database ' データベース
Dim rs1 As DAO.Recordset ' レコードセット
Dim varBookMark As Variant ' ブックマーク
Dim myCurRcd1 As Long ' カレントレコード
Dim myID1 As Long ' ID
Dim rc As VbMsgBoxResult ' メッセージボックスの答え
' 【コード】
' 新規レコードなら、最終レコードに移動
If Me.NewRecord = True Then
' 最終レコードへ
DoCmd.GoToRecord acDataForm, "F_フォーム名", acLast
End If
' 保存
DoCmd.RunCommand acCmdSaveRecord
' カレントレコード
myCurRcd1 = CurrentRecord
' ID
myID1 = [ID]
' テーブルをレコードセットとして開く
Set db1 = CurrentDb()
Set rs1 = db1.OpenRecordset("T_テーブル名", dbOpenDynaset)
'レコードセットのブックマーク(再クエリ前のカレントレコード)を取得
varBookMark = rs1.Bookmark
'フォームを再クエリする
rs1.Requery
'先頭レコードへ
rs1.MoveFirst
'最終レコードへ
rs1.MoveLast
'先頭レコードへ
rs1.MoveFirst
'最終レコードまで繰り返し
Do Until rs1.EOF
rs1.Edit ' 編集
rs1!F_Record_No1 = (rs1.AbsolutePosition + 1) & "/" & rs1.RecordCount
rs1.Update ' 更新
rs1.MoveNext
Loop
' カレントレコードを保存されているブックマークに設定
rs1.Bookmark = varBookMark
' フォームを再クエリ
Me.Requery
' カレントレコードが更新前と違うときは、更新前のカレントレコードへ
If CurrentRecord <> myCurRcd1 Then
rc = MsgBox("CurrentRecordが更新前と違う[再クエリ_Click]" & vbCrLf _
& "前=" & myCurRcd1 & " 後=" & CurrentRecord, vbOKOnly + vbExclamation)
DoCmd.GoToRecord acDataForm, "F_フォーム名", acGoTo, myCurRcd1 ' 更新前のレコードへ
End If
' 更新前のカレントレコードをIDで検索
rs1.FindFirst [ID] = myID1
' IDが見つからない
If rs1.NoMatch = True Then
rc = MsgBox("更新前のカレントレコードが見つかりません。[再クエリ_Click]", vbExclamation)
End If
' レコードセット、データベース変数の解放
Set rs1 = Nothing
Set db1 = Nothing
' Subを抜ける
Exit Sub
ERR1:
rc = MsgBox("エラー[再クエリ_Click]" & vbCrLf & Err.Description)
' レコードセット、データベース変数の解放
Set rs1 = Nothing
Set db1 = Nothing
End Sub
・フォームの再クエリを追加しています。
・再クエリすると、カレントレコードが先頭レコードになってしまう仕様に対して、3つほど対処を入れています。
(1) ブックマークで更新前のカレントレコードに戻す
(2) カレントレコード番号を元に戻す
(3) 主キー(ID)で検索をかけて、カレントレコードを戻す
※レコードの追加、削除をすると、うまくカレントレコードが戻らない場合があり、3つ入れています。
・新規レコード判定しているのは、カレントレコードが新規レコードだと、再クエリによって、空っぽのレコードが追加されてしまうためです。
ヤバイぜ! ありがとうございます[__猫]
by cheese999 (2017-08-14 00:50)