簡體   English   中英

在命令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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM