经过几天的挫折,我决定在这里提出这个问题以供解决。通过无数论坛和帮助站点的搜索没有出现任何类似的问题。下面详细介绍了 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 方法一起使用,因为这会产生错误(找不到任何相关的示例)。有任何想法吗?提前致谢。