1

現在、Access Data Project(ADP)をODBCリンクテーブルを使用して標準のACCDB形式に変換しています。ADPでは、次のコードを使用して、[更新]ボタンをオーバーライドし、ユーザーを現在のレコードに戻しました。

Public Sub RibbonCmd_RefreshScreen(ctl As IRibbonControl, ByRef cancelDefault)
    On Error GoTo ErrHandler

    cancelDefault = False

    DoCmd.Echo False

    Dim saveBookmark
    With Screen.ActiveForm
        saveBookmark = .Bookmark
        .Requery
        .Bookmark = saveBookmark
    End With

    'Success - cancel the default behavior
    cancelDefault = True

ExitHandler:
    DoCmd.Echo True
    Exit Sub

ErrHandler:
    cancelDefault = False
    Resume ExitHandler

End Sub

私の理解では、これはDAOで問題なく機能するはずですが、エラー3159が発生しますNot a valid bookmark.。また、に置き換え.Bookmarkてみまし.Recordset.Bookmarkたが、同じ結果が得られました。ここで私が間違っていることはありますか?

4

3 に答える 3

1

実際には、フォームの再クエリまたはレコードセットの再クエリは、ブックマークを再設定して無効にします。

したがって、そのようなブックマークは、再クエリ後には無効になります。

したがって、ここでの最善のアプローチはどちらかに依存します

a)変更されたレコードを再表示したい(現在のレコードから移動したくない)。

b)変更されたレコードを再表示し、新しいレコードも表示したいだけです(新しいレコードが重要な部分です)。

更新が必要な場合は、適切に呼び出されたコマンドrefreshを使用できます。

例えば:

Me.Refresh

またはあなたの場合

Screen.ActiveForm.Refresh

したがって、上記は1行のコードであり、必要なのはこれだけです。このコマンドを使用しても、フォームの現在のレコードポインタは変更されません。変更されたすべてのレコードが再表示されます。

フォームボタンの背後で使用できるため、次の点に注意してください。

Me.Refresh

次に、あなたが書いたように、一般的なルーチンを呼び出すために少しの必要があります。

ただし、追加された新しいレコードを「ロード」または表示するためのフォームが必要な場合は、再クエリを使用する必要があります。この場合、注記されているように、この場合のブックマークはすべて無効になります。

したがって、コードを再クエリするには、PK値を使用します(20年間デフォルトであったIDのデフォルトのpkを使用したことを願っています)。その場合、コードは次のようになります。

Dim lngID         As Long

If IsNull(Me!ID) Then Exit Sub

lngID = Me!ID

Me.Requery

Me.Recordset.FindFirst "id = " & lngID

もちろん、PK IDが各フォームで同じでない場合は、PK値のNAMEを「一般的な」更新ルーチンに渡すことができます。次のようになります。

Public Sub MyRefresh(strPK As String)

   Dim lngID         As Long

   If IsNull(Me(strPK)) Then Exit Sub

   lngID = Me(strPK)

   Me.Requery

   Me.Recordset.FindFirst strPK & " = " & lngID

End Sub

ここでの「希望」とは、実際には更新が必要なことです。前述のように、これは1行のコードであり、レコードポインタは移動しないためです。

于 2013-03-09T09:37:29.233 に答える
0

Recordset.AbsolutePositionのフォームを使用しましたが、これは、たとえばフィールドのOnKeyDown出口で正常に機能します。

Dim PrefilterPosition As Long

Private Sub ValnSubject_KeyDown(KeyCode As Integer, Shift As Integer)

' Not F2 - exit
If KeyCode <> vbKeyF2 Then Exit Sub

'   Get the active control
Dim ActiveCtl As Control
Set ActiveCtl = Me.ActiveControl

ActiveControlName = ActiveCtl.Name

' Is the form's filter set?
If Me.Filter = "" Then

' NO: Apply the new filter
        ' Note the current position in the recordset
        PrefilterPosition = Me.Recordset.AbsolutePosition

        ' Set the filter to the Active control's value
        Me.Filter = "[" & ActiveCtl.ControlSource & "]='" & ActiveCtl.Value & "'"
        Me.FilterOn = Me.Filter <> ""
        Me.Requery
Else

' YES: Clear the filter
        Me.Filter = ""
        Me.FilterOn = Me.Filter <> ""
        Me.Requery

        ' Align the recordset on the previously stored position
        Me.Recordset.AbsolutePosition = PrefilterPosition

    End If

' Restore the cursor to where it came from
Me.Controls(ActiveControlName).SetFocus

Ex_it:

End Sub

コンテキスト:このコードは、「インスタントフィルター」のアイデアからのもので、タブフォームのフィールドにカーソルを置き、F2キーを押すと、フィルターが適用され、選択したフィールドの値を持つレコードのみが表示されます。もう一度F2を押すと、フィルターが削除され、カーソルが最初にF2を押したときの位置に戻ります。アルバートが上で言ったように、ブックマークはここでは機能しません。

于 2014-03-13T15:14:17.453 に答える
0

開発ではVB6とVisualDataManagerを使用しています。私も同じ問題を抱えています。2人のユーザーが同じ時間に同じレコードを更新しようとしたときに発生した可能性があります。そのため、テーブルの一部のフィールドが破損しています。問題を解決するために使用した手順は次のとおりです。1-テーブルの構造(table1と呼びます)を別のテーブル(table2と呼びます)にコピーします。2-表1で修正されたレコードを見つけます。3-破損したレコードを除いてテーブル1からテーブル2にデータを転送します。4-除外されたレコードをテーブル2に再入力します。5-table1table3の名前を変更します6-table2table1の名前を変更します

それはすべての人々です

abdobox@yahoo.com

于 2016-04-21T09:19:10.267 に答える