【问题标题】:Integrating command button events with recordset in access VBA在访问 VBA 中将命令按钮事件与记录集集成
【发布时间】:2015-02-17 14:51:43
【问题描述】:

我正在使用未绑定的表单,以便我可以在几个字段中输入/编辑数据(必须从绑定的表单转移来处理此问题)。我在表单上添加上一个、下一个、第一个和最后一个按钮。如何将它与显示我的第一条记录的 FORM_OPEN 事件集成。我不知道如何将 cmdLast_Click、cmdNext_Click、cmdFirst_Click、cmdBack_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 按钮事件,特别是 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 中的 cmdNext_Click() 是公共/全局变量吗?当您单击命令按钮时,是否会出现任何错误?
  • 它是一个全局变量。我删除了 on 错误,那时我注意到 rs 无法识别。

标签: vba ms-access-2007


【解决方案1】:

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

完成此操作后,cmdNext_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

希望这会有所帮助。

【讨论】:

  • 我确实将它们注释掉了,但它们仍然不起作用。我不得不放弃这种方法,并使用 ADO 合并了一种不同的方法。我将在下面添加解决方案
  • 记录集无法识别是不是同一个错误?是在“rs.MoveNext”行吗?您是否输入了“rs.MoveFirst”行?记录集是如何声明的?
  • no.. rs.movenext 没有导致错误。那是我试图打印它的时候 Debug.Print rs!ProcedureName
  • 错误是“没有当前记录”吗?如果是这样,这是因为您的原始代码仅获取“TOP 1”记录,因此记录集中只有一个值。下一步移动时,光标位于 RS.EOF 上,因此当您尝试查看“ProcedureName”字段时,会导致错误。您应该能够删除连接并使用原始代码打开记录集。
  • 但是,您在答案中所做的添加了一系列检查,可以防止错误发生。
【解决方案2】:

这是我为使其正常工作所做的工作。也许我在做的时候做错了什么。如果有任何建议可以使此代码更高效,欢迎提出建议

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

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2020-11-04
    • 2012-05-25
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2022-01-18
    相关资源
    最近更新 更多