0

经过几天的挫折,我决定在这里提出这个问题以供解决。通过无数论坛和帮助站点的搜索没有出现任何类似的问题。下面详细介绍了 MS Access 2003 中 FindFirst 方法的问题:

表格和表格:客户信息表 > 服务详细信息表作为一对多关系,启用了引用完整性和级联更新(每个客户可能有多个服务详细信息)。搜索表单允许用户选择“客户”和“服务提供商”(表服务详细信息中的一个字段)发送该信息以打开主表单/子表单以使用“服务提供商”(文本字符串)输入与“客户”相关的服务数据) 作为标准。每个“客户”可能有多个“服务提供者”(即每个服务细节条目可能对同一“客户”有不同的“服务提供者”)。

目标:主表单(带有子表单,都基于选择查询)应该打开到指定的记录/子记录。

当前方法:主表单(不是搜索表单)上的组合框允许用户使用 FindFirst 方法(由向导创建的组合框)选择适当的“服务提供商”。这有效,但不是预期的。“服务提供者”标准最初是在搜索表单中选择并传递到主表单(现在作为全局变量),因此主表单上的组合框选择变得多余,可能会导致用户混淆(他们可能会不小心输入错误服务详情的数据)。

问题:我假设将代码从组合框的 AfterUpdate() 事件复制到主窗体的 Load() 事件就足够了,但它什么也不做,没有错误,只是加载第一个可用的服务详细信息记录而不是使用“服务提供商”作为标准选择了一个。

测试:我已插入消息框来检查所选“服务提供者”的标准值,并且在主窗体的 Load() 事件中插入的 FindFirst 方法内外,一切似乎都正常。我尝试了 DLookup()、DoCmd.Findrecord 并将组合框的默认值设置为从搜索表单传递的条件,但仍然只显示第一个“服务提供商”记录,而不是在搜索表单中选择的记录.

代码:

    Dim rs As Object

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Service Provider] = '" & [g_serviceProvider] & "'"
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark

这不会产生错误,并且在调试模式下将鼠标悬停在 g_serviceProvider 变量上会显示正确的字符串值。此代码在组合框的 AfterUpdate() 事件中完美运行,但在插入表单的 Load() 事件时不执行任何操作,即使确实传递了值(使用消息框检查以在每个阶段显示数据)执行)。

我不知道为什么这只适用于组合框,但不适用于表单的 Load() 事件。我怀疑问题出在表单的记录源中(选择查询),因为组合框的记录源使用基于与表单相同的查询的 SELECT 表达式。我没有成功编码记录源以与 Load() 事件中的 FindFirst 方法一起使用,因为这会产生错误(找不到任何相关的示例)。有任何想法吗?提前致谢。

4

1 回答 1

0

好的,我终于想通了。实际问题是在打开表单到特定记录时多次加载 Current() 事件的表单。这发生在几乎所有显示现有记录的表单上。它似乎是 MS Access 2003 的表单打开和记录选择的产物(不知道较新的版本,但我已阅读有关此问题的其他几篇文章)。

通过使用打开表单时 Current() 事件运行的次数的计数,有一个肮脏的工作。我发现对于“原始”表单(准备好接受带有空白记录源(表)的输入的空白​​表单),Current() 只运行一次。如果有任何现有记录,但表格为空白准备输入新记录,则 Current() 将运行两次。当显示必须填充表单的已经存在的记录时,Current() 将运行3次,然后所有数据加载到足以通过编码而不是通过组合框(与控件一起加载)进行选择。子表单 Current() 似乎比父表单多运行一次。

要检查任何事件是否发生以及发生了多少次,请在表单的 VBA 代码的可疑块中插入一个简单的消息框。

创建一个简单的计数器,在主窗体的 Current() 事件块中编码,解决了这个问题。

于 2014-06-13T16:30:41.913 回答