2013-09-26 86 views
1

我有一个连续的表单嵌入在Access 2010数据库中深两层的NavigationSubform中。我使用连续表单中不可编辑文本框的onclick事件将当前导航子表单的源对象属性更改为应粘贴到用户单击的文本框指定的特定记录的详细表单。DoCmd.GoToRecord将1添加到目标记录

问题是,访问发送用户+1记录id(addr_id),而不是所需的addr_id。这在大多数情况下会产生错误的数据。当用户点击当前最高的addr_id时,它也会产生错误信息。奇怪的是接入向用户发送到正确的addr_id当且仅当在addr_id = 1

下面是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逻辑来处理访问正在进行的有趣重新路由?

+0

我敢打赌,它是事做改变形式源与该地址标识的结果。我知道当我过去需要类似的用户行为,而不是资源表单时,我打开了一个新表单,指出原始子表单的采购活动记录。 –

回答

2

我将不得不看你的表是肯定的,但问题可能是GoToRecord偏移从记录集开头指定的数字。这意味着,如果您的地址标识为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 

这将只显示在子窗体

+0

谢谢。 +1试图帮助。我试过了你的DoCmd.SearchForRecord语法,但它给了我运行时错误2489,对象NavigationSubform没有打开。当然,我也尝试过表单的名称,也是Forms!Main!NavigationSubform.Form!NavigationSubform.Form和其他,但我仍然得到运行时错误2489.任何有关如何引用导航子表单的建议,只要给出正确的信息如何在我上面的原始帖子中引用它的sourceobject? – CodeMed

+0

如果在子窗体中不需要导航功能,则可以使用过滤器。我这样做是一个体面的数量,而不是直接连接访问中的子表单。我已将代码添加到我的答案中 – engineersmnky

+0

现在可以使用,所以我打算将您的答案标记为答案。我确实必须用实际的Forms!Main!NavigationSubform.Form!NavigationSubform.Form替换你的Me,因为Me在此上下文中引用了一个文本框。但是代码在我做了那么小的改变之后就可以工作。感谢您的帮助。 – CodeMed