0

次のコード (ADP フォーム) に何か問題がありますか?

Private Sub cmbSearchCode_AfterUpdate()
  Me.Recordset.Find "usr_cde = '" & ctl & "'"`
  ctl = null
end sub

動作が不規則です: フォームを開いた後、最初は機能しますが、突然何もしなくなったように見えます。

問題がないように思われるこのコードに置き換えました。

With Me.RecordsetClone
    .Find "usr_cde = '" & ctl & "'"
    Me.Bookmark = .Bookmark
End With
ctl = Null

説明はありますか?クライアントは A2003 で、サーバーは SS 2000 です (古いことはわかっていますが、どうしようもありません!)

4

1 に答える 1

0

Form.Recordset プロパティは、アクセスへのかなり新しい追加です。ヘルプテキストにはいくつかのビットがあります。問題を引き起こしていると思われるのは、それらがどのように組み合わされているかです。

たとえば、フォームがクエリに基づいている場合、Recordset プロパティを参照することは、同じクエリを使用して Recordset オブジェクトを複製することと同じです。ただし、RecordsetClone プロパティを使用する場合とは異なり、フォームの Recordset プロパティによって返されるレコードセットで現在のレコードを変更すると、フォームの現在のレコードも設定されます。

したがって、最初はそのようには見えませんが、実際にはレコードセットを複製し、その新しいコピーを作成します。同期を維持するだけです。

これで、新しいRecordset オブジェクトが作成されました。ここに問題があります。

新しい Recordset オブジェクトは、オブジェクトを開くと Recordsets コレクションに自動的に追加され、オブジェクトを閉じると自動的に削除されます。

最初に、usr_cde で検索されたレコードセットを複製すると、フォームは魔法のように現在のレコードを一致するように設定します。

2 回目は、usr_cde で見つかったレコードセットのクローンを作成しますが、魔法のレコード同期は、Recordsets コレクションに保存されているレコードセットの最初のコピーで停止したままです。

したがって、レコードセットを閉じる必要がありますが、別のコピーを作成して閉じるだけではないことを確認するには、次の手順を実行します。

'untested
Private Sub cmbSearchCode_AfterUpdate() 
  Dim rs as adodb.Recordset

  Set rs = Me.Recordset
  rs.Find "usr_cde = '" & ctl & "'"`
  rs.Close

  ctl = null
end sub

これをテストする機会はありませんでしたが、.Bookmark を使用した実用的なソリューションが既にあります。これで予期しない動作が説明されることを願っています。

于 2011-12-10T13:48:39.850 に答える