![](/img/trans.png)
[英]Change a form's recordset when command button clicked Access 2013 vba
[英]Integrating command button events with recordset in access VBA
我正在使用未綁定的表單,以便我可以在幾個字段中輸入/編輯數據(必須從綁定的表單移出來處理它)。 我在表單上添加了prev,next,first和last按鈕。 如何將其與我顯示第一條記錄的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是全局的,那么你想在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
希望這可以幫助。
以下是我為實現這一目標所做的工作。 也許我在做它的時候我做錯了什么。 如果有任何建議可以使這個代碼更有效,那么這些建議非常受歡迎
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.