gpt4 book ai didi

ms-access - Access VBA - 使用书签删除过滤器并保留在当前记录中

转载 作者:行者123 更新时间:2023-12-05 04:08:10 32 4
gpt4 key购买 nike

在 Access 2010 中,我有一个可以使用过滤器打开特定记录或记录的表单:

DoCmd.OpenForm "frmStories", , , "StoryID = " & someNumber  'open one record
DoCmd.OpenForm "frmStories", , , someCriteria 'open multiple records

使用下面的代码 (source)让我删除过滤器并保留在当前记录上……我是这么想的。部分表单 - 即由 VBA 计算的字段 - 仍然认为它们在第一条记录上,使用 StoryID = 1,因此显示错误的结果。

Dim varFilterID As Variant

Public Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)

'Note current record if filter is removed
If ApplyType = acShowAllRecords Then
varFilterID = Me.StoryID
End If

End Sub

Private Sub Form_Current()
' If the filter is OFF, and we have a stored ID from the filter setting,
' use standard bookmark code to return to the record selected for the filter.

If Me.FilterOn = False Then
If Nz(varFilterID) <> "" Then
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
rs.FindFirst = "StoryID = " & varFilterID
Debug.Print "varFilterID=" & varFilterID & " storyID = " & Me.StoryID & " 1st"
If rs.NoMatch = False Then Me.Bookmark = rs.Bookmark
' Reset the stored filterID so that the code does not keep forcing this
' selection as the user navigates through the records.
varFilterID = Null
Set rs = Nothing
Debug.Print "varFilterID=" & varFilterID & " storyID = " & Me.StoryID & " 2nd"

End If
End If

'other stuff
End Sub

单步执行代码显示它第一次工作正常,到达子结尾然后在再次触发 Form_Current 时重新启动(为什么?)此时 Me.StoryID 恢复为 1 .这让我觉得问题与事件触发顺序有关(ApplyFilter 似乎在“当前”完成后触发)。

分页到上一条记录并返回修复它;当放置在命令按钮中时,代码可以完美运行。

我做错了什么?或者,我可以采取另一种方法吗? (我需要过滤几个不连续的记录,所以用 .FindFirst 加载表单不是一个选项。)

预计到达时间:我添加了一些 Print.Debug 行以查看发生了什么。这是结果:

ApplyType
varFilterID=35 storyID = 1 1st
varFilterID=35 storyID = 35 1st
varFilterID= storyID = 35 2nd
varFilterID= storyID = 1 2nd <- resets between Current's End Sub and the last Current

编辑(5 年后):已解决!我在下面发布了我的解决方案。 Tl;Exit Sub 博士是上帝。

最佳答案

问题如下:If rs.NoMatch = False Then Me.Bookmark = rs.Bookmark 移动表单中的当前记录,触发另一个 Form_Current,可能触发无限循环。

您可以尝试将 Form_Current 速率限制为每秒仅触发一次:

Private lastCurrent As Date
Private Sub Form_Current()
If lastCurrent < Now() - #00:00:01# Then Exit Sub
LastCurrent = Now()

请注意,根据代码运行的时间长短,您可能需要增加秒数。

不过请注意,这可能是一个 XY 问题。您可以在打开表单时移动到特定记录,而无需通过以下方式应用过滤器

Dim frm As Form
Application.ScreenUpdating = False
DoCmd.OpenForm "frmStories"
Set frm = Forms!frmStories
Dim rs As RecordSet
Set rs = frm.RecordsetClone
strCriteria = "StoryID = " & someNumber
rs.FindFirst strCriteria
If rs.NoMatch = False Then frm.Bookmark = rs.Bookmark
Application.ScreenUpdating = True

实现此目的的其他技术可能是使用 OpenArgs,这是我经常使用的技术。

关于ms-access - Access VBA - 使用书签删除过滤器并保留在当前记录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47850780/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com