由于另一个控件的 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
您需要确保:
- 表单记录集的排序与列表框相同。因此,例如,您可以按
ID
或 Title
. 来订购
请注意 +1
是因为 ListIndex
从 0 开始,而记录索引从 1 开始。
方法二
- 确保每条记录的
Title
是唯一的(在此字段上设置无重复项)。
- 将您的列表框更改为 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)
来代替,我们在其中指定列号和行号。如果您的列表框有两列(例如 ID
和 Title
),我们要选择第二列。索引从 0 开始,因此我们将使用值 1。如果像我的 lstSelect
一样,您只有一列 (Title
),那么我们使用 0。注意: 列是否隐藏(即宽度为 0)并不重要。还是'counts'.
行号为Form.CurrentRecord - 1
。请记住,表单记录集索引从 1 开始,但列表框的索引从 0 开始;因此 - 1
.
那么为什么我们需要在 AfterUpdate
事件中复制这一新行?试着把它注释掉,看看如果我们不把它放进去会发生什么。这与我们使用列表框后触发的 Form_Current
事件有关。
我在 SQL 查找代码中使用联合子句解决了这个问题。 table 上的 UNION ALL 子句和以下联合在另一部分中使用已允许使用所有记录。
我有一个查找列表框,它被编程为允许用户从列表中找到特定的 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
您需要确保:
- 表单记录集的排序与列表框相同。因此,例如,您可以按
ID
或Title
. 来订购
请注意 +1
是因为 ListIndex
从 0 开始,而记录索引从 1 开始。
方法二
- 确保每条记录的
Title
是唯一的(在此字段上设置无重复项)。 - 将您的列表框更改为 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)
来代替,我们在其中指定列号和行号。如果您的列表框有两列(例如ID
和Title
),我们要选择第二列。索引从 0 开始,因此我们将使用值 1。如果像我的lstSelect
一样,您只有一列 (Title
),那么我们使用 0。注意: 列是否隐藏(即宽度为 0)并不重要。还是'counts'.行号为
Form.CurrentRecord - 1
。请记住,表单记录集索引从 1 开始,但列表框的索引从 0 开始;因此- 1
.那么为什么我们需要在
AfterUpdate
事件中复制这一新行?试着把它注释掉,看看如果我们不把它放进去会发生什么。这与我们使用列表框后触发的Form_Current
事件有关。
我在 SQL 查找代码中使用联合子句解决了这个问题。 table 上的 UNION ALL 子句和以下联合在另一部分中使用已允许使用所有记录。