我正在使用ODBC链接表将Access数据项目(ADP)转换为标准ACCDB格式。在ADP中,我重写了Refresh按钮,使用以下代码将用户返回到当前记录:
Public Sub RibbonCmd_RefreshScreen(ctl As IRibbonControl, ByRef cancelDefault)
On Error GoTo ErrHandler
cancelDefault = False
DoCmd.Echo False
Dim saveBookmark
With Screen.ActiveForm
saveBookmark = .Bookmark
.Requery
.Bookmark = saveBookmark
End With
'Success - cancel the default behavior
cancelDefault = True
ExitHandler:
DoCmd.Echo True
Exit Sub
ErrHandler:
cancelDefault = False
Resume ExitHandler
End Sub
我的理解是这应该可以正常使用DAO,但我收到错误3159,Not a valid bookmark.
我也尝试用.Bookmark
替换.Recordset.Bookmark
,但这给了我相同的结果。我在这里做错了吗?
答案 0 :(得分:1)
实际上,对记录集的表单或重新查询的重新查询将重新设置并使书签无效。
所以这些书签在重新查询后不再有效。
所以这里最好的方法取决于
a)我只是想重新显示任何已更改的记录(而不是移动当前记录)。
b)我只是想重新显示任何已更改的记录,并且还显示新记录(新记录是关键部分)。
如果您只需要刷新,那么您可以使用适当调用的命令刷新。
例如:
Me.Refresh
或者在你的情况下
Screen.ActiveForm.Refresh
所以上面是一行代码,是你需要的全部。使用此命令时,表单的当前记录指针不会更改。所有和任何更改的记录都会为您重新显示。
请注意,由于您可以在表单按钮后面使用:
Me.Refresh
然后需要LITTLE来调用你写的一般程序。
但是,如果您需要表单“加载”或显示添加的任何新记录,那么您必须使用requery。在这种情况下,在这种情况下,所述书签都变得无效。
因此,对于要重新查询的代码,我们使用PK值(希望您使用默认值为20年的默认pk)。然后代码将成为:
Dim lngID As Long
If IsNull(Me!ID) Then Exit Sub
lngID = Me!ID
Me.Requery
Me.Recordset.FindFirst "id = " & lngID
现在当然如果每个表单的PK id不相同,那么你肯定可以将PK值的NAME传递给你的“常规”刷新例程。它看起来像是:
Public Sub MyRefresh(strPK As String)
Dim lngID As Long
If IsNull(Me(strPK)) Then Exit Sub
lngID = Me(strPK)
Me.Requery
Me.Recordset.FindFirst strPK & " = " & lngID
End Sub
这里的“希望”实际上你真的需要刷新,因为如上所述,这只是一行代码,更好的是它不会移动记录指针。
答案 1 :(得分:0)
我使用了表格Recordset.AbsolutePosition,这很好用,例如在字段的OnKeyDown出口
Dim PrefilterPosition As Long
Private Sub ValnSubject_KeyDown(KeyCode As Integer, Shift As Integer)
' Not F2 - exit
If KeyCode <> vbKeyF2 Then Exit Sub
' Get the active control
Dim ActiveCtl As Control
Set ActiveCtl = Me.ActiveControl
ActiveControlName = ActiveCtl.Name
' Is the form's filter set?
If Me.Filter = "" Then
' NO: Apply the new filter
' Note the current position in the recordset
PrefilterPosition = Me.Recordset.AbsolutePosition
' Set the filter to the Active control's value
Me.Filter = "[" & ActiveCtl.ControlSource & "]='" & ActiveCtl.Value & "'"
Me.FilterOn = Me.Filter <> ""
Me.Requery
Else
' YES: Clear the filter
Me.Filter = ""
Me.FilterOn = Me.Filter <> ""
Me.Requery
' Align the recordset on the previously stored position
Me.Recordset.AbsolutePosition = PrefilterPosition
End If
' Restore the cursor to where it came from
Me.Controls(ActiveControlName).SetFocus
Ex_it:
End Sub
对于上下文:此代码来自“即时过滤器”的想法,您可以将光标放在选项卡表单中的字段上,按F2,然后应用过滤器,这样您只能看到包含所选字段的记录值。再次按F2,过滤器被移除,光标返回到第一次点击F2时的位置。书签在这里不起作用,正如阿尔伯特上面所说的那样。
答案 2 :(得分:0)
我在开发中使用VB6和Visual Data Manager。我曾经也有过一样的问题。最有可能是当2个用户试图同时更新同一条记录时。因此表中的某些字段已损坏。 以下是我用来解决问题的步骤: 1-将表的结构(我们称之为table1)复制到另一个表(让我们称之为table2)。 2-查找表1中的相关记录。 3-将数据从table1传输到table2,但损坏的记录除外 4-再次将已排除的记录重新输入到table2。 5-重命名table1 table3 6-重命名table2 table1
那是所有人的
abdobox@yahoo.com