SSブログ

アクセス小僧:レコード番号とレコード数(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つ入れています。

・新規レコード判定しているのは、カレントレコードが新規レコードだと、再クエリによって、空っぽのレコードが追加されてしまうためです。
ヤバイぜ!(5)  コメント(1) 
共通テーマ:パソコン・インターネット

ヤバイぜ! 5

コメント 1

cheese999

ヤバイぜ! ありがとうございます[__猫]
by cheese999 (2017-08-14 00:50) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字(英大文字の「オー」、英小文字の「ユー」、アラビア数字の「ハチ」、アラビア数字の「イチ」、アラビア数字の「ニ」)を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。