0

我在 MS-Access 中创建了一个带有选项卡控件的表单。

在其中一个选项卡上,我有 2 个子表单控件显示来自同一个表的记录。这个表有一个我称之为“状态”的字段,可以有一个“打开”或“关闭”的条目;2 个子表单只是将这 2 个选项显示为选项卡控件上的单独组。

然后我在每个子表单下方都有一个按钮;用户选择(单击)任一子表单中的一条记录,然后该按钮将在子表单中的选定记录处打开一个新的“编辑”表单,以便他们可以查看更多信息并将“状态”字段切换为“打开”或“关闭”。

当用户按下“保存并关闭”按钮时,将保存更改,关闭“编辑”表单,并重新查询 2 个子表单。

我要做的是计算“编辑”表单关闭后仍然显示的“打开”记录数。然后将计数传递到此选项卡的选项卡标题,以便用户一眼就可以看到有多少“打开”记录与该主窗体上的记录相对。

到目前为止,这是我的代码:

Private Sub cmdAdminIssue_Edit_SaveClose_Click()

' save and close currently open edit form
    DoCmd.Close acForm, "tblAdminIssue_Edit", acSaveYes

' requery the subforms to show the effect of the edits made via the edit form   
    Forms![tblJobs]![tblAdminIssue_Sub_Open].Form.Requery
    Forms![tblJobs]![tblAdminIssue_Sub_Closed].Form.Requery

' count number of records still open and pass the number through to the tab control caption property    
    Dim AdIssOpenCount As Long

        AdIssOpenCount = DCount("JobID", "qryAdminIssue_Open", "JobID = '" & Me![JobID] & "'")
        Forms![tblJobs]![tab_AdIssues].Caption = "Admin Issues (" & AdIssOpenCount & ")"

End Sub

上面的代码触发了错误:“你输入的表达式引用了一个已关闭或不存在的对象”,在调试中突出显示了我的 DCount 表达式。

但是我可以让 DCount 独立于它上面的其他代码工作;他们似乎相互干扰,但我不太明白如何。

参考上面的错误消息,它似乎暗示 DCount 需要打开我引用的查询才能运行......这对我来说没有多大意义,因为我认为这些类型的函数不需要你显式打开在代码中,它试图从中获取数据的对象......我可能误解了这个错误的实际含义。

对错误的任何解释和可能的解决方法将不胜感激。谢谢。

4

1 回答 1

1

虽然您显然已尽力解释情况,但它似乎相当复杂。

我将尝试将其分解一下,并建议您可能会做的事情。

"I've create a form with a tab control in MS-Access.
On one of the tabs I have 2 subform controls showing records from the same table. 
This  table has a field I've called "Status" and can have an entry of either "Open" 
or "Closed"; the 2 subforms simply show these 2 options filtered as separate groups on 
the tab control."

所以,你有一个表单,有 2 个子表单。他们在标签页上不应该真正相关。我将把表单称为 frm,将子表单称为 sf_o 和 sf_c。

每个子表单下方的按钮(双击打开详细表单可能会更好)-“保存并关闭”按钮可能在弹出屏幕中;此按钮当前正在执行它自己的数据的保存,并执行其他所有操作。

这非常混乱,因为这意味着如果不更改保存/关闭按钮的逻辑,就无法修改 frm 的内容。更好的方法是使用主表单(frm)中的公共方法将刷新主表单的逻辑与编辑表单分开:

Public Sub RefreshData()
    sf_o.Form.Requery
    sf_c.Form.Requery
    'other logic
End Sub

那么,你有:

Private sub cmdAdminIssue_Edit_SaveClose_Click()
    'save & close logic...

    Forms(frm).RefreshData
End sub

好吧,现在,另一个逻辑。您想知道有多少记录现在“打开”并将这些信息放在某处。在这种情况下,某处是一个标签页标题,但这并不是真正的材料。

我从不使用 DCount(DLookup 等),因为它非常慢。另一种(在这种情况下更简单)的方法是使用表单自己的属性:

tab_AdIssues.Caption = "Admin Issues (" & trim(sf_o.Form.RecordsetClone.RecordCount) & ")"

怎么样?然后,您无需尝试找出所有预编译逻辑(即 Microsoft 访问)中出了什么问题。

希望这可以帮助

于 2013-11-01T02:00:12.513 回答