MS Access 2003 findfirst方法在表单的Load()事件中不起作用

时间:2014-06-06 21:28:34

标签: forms ms-access-2003 findfirst

经过几天的挫折之后,我决定在这里提出这个问题以便解决。搜索无数论坛和帮助网站没有提出任何类似的问题。以下详细说明了MS Access 2003中的FindFirst方法的问题:

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

目标:主窗体(包含基于select查询的子窗体)应该打开指定的记录/子记录。

当前方法:主窗体上的组合框(不是搜索表单)允许用户使用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方法一起使用的记录源,因为这会产生错误(无法找到任何相关的示例)。有任何想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

好的,我终于明白了。实际问题是在将表单打开到特定记录时多次加载Current()事件的表单。这几乎发生在显示现有记录的每个表单上。它似乎是MS Access 2003的表单打开和记录选择的工件(不知道更新的版本,但我已阅读其他几个有关此问题的帖子)。

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

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

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