由于另一个控件的 VB where 子句,MS Access 无法转到指定的记录

MS Access Can't go to specified record because of another control's VB where clause

我有一个查找列表框,它被编程为允许用户从列表中找到特定的 record/help 主题并查看它。现在,当使用列表框时,where 子句锁定在记录中,第一个、上一个、下一个、最后一个按钮冻结,您不能使用它们转到记录。有没有办法释放按钮的功能来浏览记录以及 select 的 where 子句。 这里是操作列表框的代码selections:

Private Sub List35_AfterUpdate()
Dim myTopic As String
myTopic = "Select * from FormsHelpTable where ([ID] = " & Me.List35 & ")"
Me.Form.RecordSource = myTopic
Me.Comment.Requery
End Sub

我相信,由于 where 子句锁定了框中的 selection,所以它不允许来自其他控件的导航干扰。有什么办法解决这个问题? 您收到运行时错误: 你不能去指定的记录。 使用列表框更新后,它似乎没有读取源 table 中名为“帮助”的另一条记录。

无需更改记录集(这是表单可以显示的 'pool' 条记录),您只需从列表框中转到用户 select 的记录。

方法 1(如果您的列表框与表单记录的顺序相同,这可能是最简单的方法)

使用此代码:

Private Sub lstSelect_AfterUpdate()

    DoCmd.GoToRecord acDataForm, "HelpForm", acGoTo, Me.lstSelect.ListIndex + 1

End Sub

您需要确保:

  • 表单记录集的排序与列表框相同。因此,例如,您可以按 IDTitle.
  • 来订购

请注意 +1 是因为 ListIndex 从 0 开始,而记录索引从 1 开始。


方法二

  1. 确保每条记录的 Title 是唯一的(在此字段上设置无重复项)。
  2. 将您的列表框更改为 return 记录的 Title,而不是 ID

然后使用这个:

Private Sub lstSelect_AfterUpdate()

    Me.Title.SetFocus

    DoCmd.FindRecord Me.lstSelect

    Me.lstSelect.SetFocus

End Sub

注意事项:

  • 它的工作原理是在 具有焦点的字段 中搜索指定的字符串。这就是为什么我们必须在表单的 Title 文本框中 SetFocus
  • 我们可以改用 ID(这意味着如果需要,我们可以有重复的标题),但是我们必须在表单上有一个 ID 控件才能 SetFocus 到。您也不能隐藏此控件,因为它需要在使用 FindRecord.
  • 时获得焦点

更新:方法 1 reverse-selection

使用此代码在 Form_Current 事件中添加一个事件过程。然后更新 lstSelect_AfterUpdate 过程中的代码,如下所示。

Private Sub Form_Current()

    Me.lstSelect = Me.lstSelect.Column(0, Form.CurrentRecord - 1)

End Sub

请注意,根据您的 lstSelect 设置方式,它可能是 Column(1, Form.CurrentRecord - 1) 。继续阅读了解详情!

Private Sub lstSelect_AfterUpdate()

    DoCmd.GoToRecord acDataForm, "HelpForm", acGoTo, Me.lstSelect.ListIndex + 1

    Me.lstSelect = Me.lstSelect.Column(0, Form.CurrentRecord - 1)

End Sub

新行说明:

  • 每次我们转到新记录时都会触发 Form_Current 事件。我们需要查看记录的索引(即它在记录集中的位置),这是我们使用 Form.CurrentRecord 获得的。然后我们要使列表框 select 那个记录。但是,我们不能像以前那样使用me.lstSelect.ListIndex,因为那是一个read-only属性(我们可以访问它来读取它,但是我们无法设置)。

  • 因此,我们使用 me.lstSelect.Column(colNum,rowNum) 来代替,我们在其中指定列号和行号。如果您的列表框有两列(例如 IDTitle),我们要选择第二列。索引从 0 开始,因此我们将使用值 1。如果像我的 lstSelect 一样,您只有一列 (Title),那么我们使用 0。注意: 列是否隐藏(即宽度为 0)并不重要。还是'counts'.

  • 行号为Form.CurrentRecord - 1。请记住,表单记录集索引从 1 开始,但列表框的索引从 0 开始;因此 - 1.

  • 那么为什么我们需要在 AfterUpdate 事件中复制这一新行?试着把它注释掉,看看如果我们不把它放进去会发生什么。这与我们使用列表框后触发的 Form_Current 事件有关。

我在 SQL 查找代码中使用联合子句解决了这个问题。 table 上的 UNION ALL 子句和以下联合在另一部分中使用已允许使用所有记录。