1

我在 Access 2010 数据库中的两层深度的 NavigationSubform 中嵌入了一个连续表单。我正在使用连续表单中不可编辑文本框的 onclick 事件将当前导航子表单的源对象属性更改为详细表单,该表单应提示用户单击的文本框指示的特定记录。

问题是访问将用户发送到 +1 记录 ID (addr_id) 而不是所需的 addr_id。这在大多数情况下会产生错误的数据。当用户单击当前最高的 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  

我测试了一个 hack 编辑来“修复”这个问题,如下所示:

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.

例如,我将 100 条记录添加到 ID 为 1-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 回答