我正在尝试使用基于frmPackingSlipHeader.JOB
和.REL
控件的记录填充frmPanelUnitEntryHeader.txtJOB_NUMBER
和.txtRELEASE_NUMBER
。当记录在frmPackingSlipHeader
上导航时,.JOB
和.REL
被提交到gtxtCurrentJobNumber
>xtCurrentJobRelease
全局变量。我遇到了rs.FindFirst
方法,但大约需要一分钟或更长时间才能返回有效记录;找到正确的记录并按预期显示。在抱怨用.FindFirst
搜索长时间等待后,我遇到了OpenRecordset
方法,并使用strSQL
提取记录,但在Me.Bookmark = rs.Bookmark
上得到了运行时错误"3159"消息。frmPanelUnitEntryHeader
不是子rom。
Private Sub txtJOB_NUMBER_GotFocus()
'Used to bring up existing jobs in SUB table
Dim rs As Object
Dim strSQL As String
' Set rs = Me.RecordsetClone
strSQL = "SELECT * FROM MAIN_SUB WHERE [JOB_NUMBER] = '" & gtxtCurrentJobNumber & "' And RELEASE_NUMBER = '" & gtxtCurrentJobRelease & "';"
Set rs = CurrentDb.OpenRecordset(strSQL)
With rs
If .RecordCount = 0 Then
DoCmd.GoToRecord , , acNewRec
Else
Me.Bookmark = .Bookmark
End If
End With
Set rs = Nothing
' With rs
' .FindFirst "JOB_NUMBER='" & gtxtCurrentJobNumber & "' And RELEASE_NUMBER='" & gtxtCurrentJobRelease & "'"
' If .NoMatch Then
' DoCmd.GoToRecord , , acNewRec
' Else
' Me.Bookmark = .Bookmark
' End If
' End With
'
' Set rs = Nothing
End Sub
评论的行放在一起。
我在搜索错误时注意到,许多网站都会求助于数据库损坏和修复,但我不认为这里是这样。.FindFirst
工作正常,但速度较慢。为什么书签在这两种方法之间的工作方式似乎不同?这与我在txtJOB_NUMBER_GotFocus()
上这样做有什么关系吗?TIA。
如果你仔细阅读Form.Bookmark上的文档,它会说:
因为Access在打开窗体时会为窗体记录集中的每个记录创建一个唯一的书签,所以即使两个记录集基于相同的表、查询或SQL语句,窗体的书签也不会在另一个记录集上起作用。
因此,每个记录集都有不同的书签,您只能使用同一记录集的书签。
.RecordsetClone
是相同的记录集,但却是不同的游标,这就是为什么如果rs
是Me.Recordset
的克隆,则Me.Bookmark = rs.Bookmark
会工作(如果与rs = CurrentDb.OpenRecordset(strSQL)
不同,则会失败(。
您可以尝试直接使用过滤记录集
Private Sub txtJOB_NUMBER_GotFocus()
With CurrentDb.CreateQueryDef(vbNullString) 'Temporary QueryDef to use parameters
.SQL = "SELECT * FROM MAIN_SUB WHERE [JOB_NUMBER] = [CurrentJobNumberParameter] And RELEASE_NUMBER = [CurrentJobReleaseParameter];"
.Parameters("CurrentJobNumberParameter") = gtxtCurrentJobNumber
.Parameters("CurrentJobReleaseParameter") = gtxtCurrentJobRelease
With .OpenRecordset
If .RecordCount = 0 Then
Me.Recordset.NewRecord
Else
Set Me.Recordset = .Parent.Recordsets(.Name) ' equvalent to Set Me.Recordset = rs, but without the need of variables declaration
End If
End With
End With
End Sub
这段代码还展示了如何避免在DAO上使用参数进行注入。阅读Bobby Tables及其Microsoft Access部分!