在access VBA中将命令按钮事件与记录集集成

在access VBA中将命令按钮事件与记录集集成,vba,ms-access-2007,Vba,Ms Access 2007,我正在使用一个未绑定的表单,这样我就可以在几个字段中输入/编辑数据(必须从绑定表单转移过来才能处理这个问题)。我正在表单上添加上一个、下一个、第一个和最后一个按钮。如何将其与显示第一条记录的FORM_OPEN事件集成。我不知道如何将cmdLast\u Click、cmdNext\u Click、cmdFirst\u Click、cmdBack\u Click事件添加到此。任何帮助都将不胜感激 下面列出了我当前的FORM_OPEN事件,只显示了第一条记录 Private Sub Form_Open

我正在使用一个未绑定的表单,这样我就可以在几个字段中输入/编辑数据(必须从绑定表单转移过来才能处理这个问题)。我正在表单上添加上一个、下一个、第一个和最后一个按钮。如何将其与显示第一条记录的FORM_OPEN事件集成。我不知道如何将cmdLast\u Click、cmdNext\u Click、cmdFirst\u Click、cmdBack\u Click事件添加到此。任何帮助都将不胜感激

下面列出了我当前的FORM_OPEN事件,只显示了第一条记录

Private Sub Form_Open(Cancel As Integer)

  sSQL = "SELECT TOP 1 Proc.ProcedureName, Proc.Manager,   Proc.AnnualApprovalDueDate, AprList.ApprovalDate " & _
"FROM Proc INNER JOIN (SELECT AprTrac.ProcedureId, AprTrac.ApprovalDate FROM AprTrac) " & _
"AS AprList ON Proc.ProcedureId=AprList.ProcedureId WHERE MONTH(Proc.AnnualApprovalDueDate)=MONTH(DATE())"

 Set db = CurrentDb
 Set rs = db.OpenRecordset(sSQL)

 Me.txtProcedureName = rs!ProcedureName
 Me.txtManagerName = rs!Manager
 Me.txtAppDueDate = rs!AnnualApprovalDueDate
 Me.txtAppDate = rs!ApprovalDate

rs.Close

' clear main variable values
Set rs = Nothing
Set db = Nothing
sSQL = ""

End Sub
下面是我添加的cmdNext_Click button事件,但似乎不起作用,特别是rs.movenext

Private Sub cmdNext_Click()

On Error Resume Next
rs.MoveNext

Debug.Print rs!ProcedureName
Me.txtProcedureName = rs!ProcedureName
Forms!frmProcedures!txtProcedureName = rs!ProcedureName
Debug.Print Forms!frmProcedures!txtProcedureName.Value
Me.txtManagerName = rs!Manager
Me.txtAppDueDate = rs!AnnualApprovalDueDate
Me.txtAppDate = rs!ApprovalDate

End Sub

如果rs如您所述是全局的,那么您希望在Form_open事件结束时保持其打开状态。当您关闭记录集,然后将其设置为“无”,然后在按钮事件中尝试稍后访问它时,您正在访问设置为“无”的rs。移除rs。关闭并设置rs=nothing行

执行此操作后,CMDEXT_Click事件应能正常工作。作为警告,您应该检查记录集,而不是“rs.MoveNext”:

If rs.EOF Then
    MsgBox("You are already at the end of the recordset!")
Else
    rs.MoveNext
    'rest of code

End If
同样,您应该检查cmdPrev_Click和其他事件

此外,在form_open事件中,您应该根据要默认的值将记录设置为rs.MoveFirst或rs.MoveLast,从而选择要开始的记录。您还应该进行一些检查,以确保记录集不是空的:

If rs.EOF and rs.BOF Then
    'Do not initialize fields
Else
    rs.MoveFirst 'or rs.MoveLast....
    'initialize textboxes 
End If

希望这能有所帮助。

以下是我为实现这一目标所做的工作。也许我做这件事的时候还做错了什么。如果有任何建议可以提高代码的效率,欢迎提供这些建议

Private Sub Form_Open(Cancel As Integer)


Dim sSQL As String

sSQL = "SELECT Proc.ProcedureName, Proc.Manager, Proc.AnnualApprovalDueDate, AprList.ApprovalDate " & _
"FROM Proc INNER JOIN (SELECT AprTrac.ProcedureId, AprTrac.ApprovalDate FROM AprTrac) " & _
"AS AprList ON Proc.ProcedureId=AprList.ProcedureId WHERE MONTH(Proc.AnnualApprovalDueDate)=MONTH(DATE())"

Set cnn1 = New ADODB.Connection
mydb = "C:\Users\temp\Documents\Tasks.accdb"
strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & mydb
cnn1.Open strCnn

Set rs = New ADODB.Recordset
rs.Open sSQL, cnn1, adOpenKeyset, adLockOptimistic

rs.MoveLast    
rs.MoveFirst

MoveValues 'Just to pick up the values in the recordset and transfer them to the form

End Sub

Private Sub MoveValues()
With Me
    .txtProcedureName = rs("ProcedureName")
    .txtManagerName = rs("Manager")
    .txtAppDueDate = rs("AnnualApprovalDueDate")
    .txtAppDate = rs("ApprovalDate")
End With
End Sub

Private Sub cmdNext_Click()

On Error Resume Next
rs.MoveNext

cmdDummy.SetFocus

If rs.AbsolutePosition = rs.RecordCount Then
    Me.cmdNext.Enabled = False
    Me.cmdLast.Enabled = False
End If

Me.cmdFirst.Enabled = True
Me.cmdBack.Enabled = True

MoveValues
End Sub

Private Sub cmdBack_Click()

On Error Resume Next
rs.MovePrevious
cmdDummy.SetFocus

If rs.AbsolutePosition = 1 Then
    Me.cmdBack.Enabled = False
    Me.cmdFirst.Enabled = False
End If

Me.cmdNext.Enabled = True
Me.cmdLast.Enabled = True

MoveValues
End Sub

Private Sub cmdFirst_Click()

On Error Resume Next
rs.MoveFirst

cmdDummy.SetFocus

Me.cmdBack.Enabled = False
Me.cmdFirst.Enabled = False

Me.cmdNext.Enabled = True
Me.cmdLast.Enabled = True

MoveValues
End Sub

Private Sub cmdLast_Click()

On Error Resume Next
rs.MoveLast
cmdDummy.SetFocus

Me.cmdBack.Enabled = True
Me.cmdFirst.Enabled = True

Me.cmdNext.Enabled = False
Me.cmdLast.Enabled = False

MoveValues
End Sub

cmdNext\u Click()
中的
rs
是否为公共/全局变量?单击命令按钮时,是否发生任何错误?它是一个全局变量。我删除了on错误,当时我注意到rs无法识别。我对它们进行了注释,但它们仍然不起作用。我不得不放弃这种方法,使用ADO合并了一种不同的方法。我将在下面添加解决方案,它是否与无法识别记录集的错误相同?是在“rs.MoveNext”线上吗?你把“rs.MoveFirst”排进去了吗?记录集是如何声明的?否。。rs.movenext没有导致错误。那是我试着打印它的时候调试。打印rs!过程重命名错误是“无当前记录”?如果是这样,这是因为您的原始代码只获取“TOP 1”记录,因此记录集中只有一个值。当您下一步移动时,光标位于RS.EOF上,因此当您尝试查看“ProcedureName”字段时,会导致错误。您应该能够删除连接并使用原始代码打开记录集。但是,您在回答中所做的添加了一系列检查,以防止错误发生。