【发布时间】:2014-06-06 21:28:34
【问题描述】:
经过几天的挫折,我决定在这里提出这个问题以供解决。通过无数论坛和帮助站点的搜索没有出现任何类似的问题。下面详细介绍 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 方法一起使用,因为这会产生错误(找不到任何相关的示例)。有任何想法吗?提前致谢。
【问题讨论】:
-
只是在黑暗中拍摄,但也许表单还没有绑定?如果 rs 在 EOF,您的代码不会执行任何操作。也许使用 Debug.Print 或消息框处理调试的真实情况。到 AfterUpdate() 发生时,它可能会被绑定,所以可以正常工作。
-
也许是 OnCurrent?这在事件链中应该已经足够晚了,必须绑定表单。只是一个想法。
-
表单的记录源是一个查询。放置在每个条件中的消息框已确认没有 EOF 条件,并且书签似乎也正常工作。有趣的是,将代码粘贴到主窗体的“当前”事件中实际上会产生错误“无法转到指定记录”。不过感谢您的建议!
-
嗯,打断 OnCurrent?您可以在记录集位于 EOF 时收到该消息 - 这可能表明您已经是所需的记录,并且 FindFirst 没有找到其他匹配项,因此 EOF(当前可以运行多次)。您是否尝试过在 OnCurrent 事件上处理 rs.NoMatch(我知道您之前尝试过,但可能在 Load 上)?我认为这是我需要在前面调试的东西。我想另一种选择是将查询更改为仅显示您想要的一条记录,并在表单或全局变量中显式地设置一个参数。不过,可能不适合您的设计。
-
另外,Me.Recordset.Clone 与 Me.RecordsetClone 之间存在细微差别,顺便说一句。不确定这里是否相关,但可能是。我记得有一个问题,对方解决了,但不记得当时的情况了。
标签: forms ms-access-2003 findfirst