1

Access 2010 データベースの 2 層の NavigationSubform に埋め込まれた連続フォームがあります。現在のナビゲーション サブフォームのソース オブジェクト プロパティを、ユーザーがクリックしたテキスト ボックスによって示される特定のレコードにキューアップする必要がある詳細フォームに変更するために、連続フォームで編集不可能なテキスト ボックスの onclick イベントを使用しています。

問題は、アクセスによってユーザーが目的の addr_id ではなくレコード ID (addr_id) に +1 されることです。これにより、ほとんどの場合、間違ったデータが生成されます。また、ユーザーが現在の最も高い addr_id をクリックすると、エラー メッセージが生成されます。そして奇妙なことに、addr_id = 1 の場合にのみ、十分なアクセス権がユーザーを正しい addr_id に送信します。

問題を引き起こしている onclick イベントのコードは次のとおりです。

Private Sub AddressID_Click()
    Dim addr_id As Long
    addr_id = Me.AddressID
    Forms!Main!NavigationSubform.Form!NavigationSubform.SourceObject = "AddressDetails"
    DoCmd.GoToRecord , , acGoTo, addr_id
End Sub  

次のように問題を「修正」するために、これのハック編集をテストしました。

Private Sub AddressID_Click()
    Dim addr_id As Long
    Dim new_addr_id As Long
    addr_id = Me.AddressID
    Forms!Main!NavigationSubform.Form!NavigationSubform.SourceObject = "AddressDetails"
    If addr_id = 1 Then
        new_addr_id = addr_id
    Else
        new_addr_id = addr_id - 1
    End If
    DoCmd.GoToRecord , , acGoTo, new_addr_id
End Sub  

しかし、明らかにより良い解決策があるはずなので、私の「修正」は完全なハックのように思えます。アクセスが行っているこの面白い再ルーティングを処理するために if-else ロジックを追加する必要がないように、このコードを修正する方法を誰か教えてもらえますか?

4

1 に答える 1

2

確かにテーブルを確認する必要がありますが、問題は GoToRecord がレコードセットの先頭から指定された数をオフセットする可能性があります。これは、アドレス ID が 51 の場合、理論的には 51 を記録する必要があることを意味します。

この方法を使用する際の問題は、いずれかを削除するAddressIDと、 に関係なく 51 番目のレコードに移動するため、51 が目的のレコードにならないことですAddressID

たとえば、ID が 1 ~ 100 のアドレスに 100 個のレコードを追加してから、最初の 99 個を削除すると、AddressIDこのコマンドを使用すると 100 個が残り、「指定されたレコードに移動できません」という標準メッセージが表示されます。存在しないレコードにアクセスするように指示しているためです。

テーブルをチェックして、すべてのAddressIDフィールドが正確に順番に並んでいることを確認し、お知らせください。通常、これをナビゲーションの方法としてお勧めしません。

AddressIDアクセスに自動インクリメント番号はありますか? アドレスが決して削除されないことを保証していますか?

これを試して

'expression.SearchForRecord(ObjectType, ObjectName, Record, WhereCondition)
Docmd.SearchForRecord acForm,"NavigationSubform",,"AddressID=" & addr_id

これにより、指定された WHERE 条件のレコード セットが実際に検索され、そのレコードに移動します。これは、ID を使用しているため問題にならない最初のレコードに移動することに注意してください。

フィルターの使用

With Me.NavigationSubForm.Form
    .Filter = "AddressID=" & addr_id
    .FilterOn = True
End With

これにより、サブフォームにそのアドレス ID を持つ結果のみが表示されます

于 2013-09-26T20:42:31.793 に答える