簡體   English   中英

變量正在跨越不同的事件

[英]Variable is crossing different events

為模糊的標題道歉,但這是我的問題。 我有一個表單,其中包含多個 select 列表和關聯的文本框。 基本上它的工作方式是,如果您 select 來自第一個列表的名稱,則會觸發 AfterUpdate 事件以查詢數據庫以查看 Eng_ID 和 Person_ID 是否已存在於表中。 如果是這樣,則刪除該行然后插入更新的行。 如果沒有任何記錄,則只需插入數據。 問題是,當我在第一個列表中單擊一個名稱,然后移動到第二個列表時,發生的事情是第一個列表的 Person_ID 用於 DLookup 查詢,然后刪除記錄,然后插入記錄我在不同的列表框中選擇的新人。 代碼如下: 提前致謝

    ' Add/Remove Participant 1
Private Sub lstPar1_AfterUpdate()
    Dim n As Integer
    Dim strCriteria As String
    Dim strSQL As String
        
     With Me.lstPar1
        For n = .ListCount - 1 To 0 Step -1
            strCriteria = "Eng_ID = " & Nz(Me.Eng_ID, 0) & " And Person_ID = " & .ItemData(n)
                If .Selected(n) = False Then
                ' If a person has been deselected, then delete row from table
                If Not IsNull(DLookup("Eng_ID", "tblEngParRole", strCriteria)) Then
                    strSQL = "DELETE * FROM tblEngParRole WHERE " & strCriteria
                    CurrentDb.Execute strSQL, dbFailOnError
                    
                End If
                Else
                ' If a person has been selected, then insert row into the table
                If IsNull(DLookup("Eng_ID", "tblEngParRole", strCriteria)) Then
                   strSQL = "INSERT INTO tblEngParRole (Eng_ID, Person_ID, ParticipantNumber, Role)" & "VALUES(" & Me.Eng_ID & "," & .ItemData(n) & "," & 1 & ",'" & Me.txtParRole1.Value & "' )"
                    CurrentDb.Execute strSQL, dbFailOnError
                End If
            End If
        Next n
    End With
    
End Sub

' Add/Remove Participant 2

Private Sub lstPar2_AfterUpdate()
    Dim n As Integer
    Dim strCriteria As String
    Dim strSQL As String
    
    With Me.lstPar2
     For n = .ListCount - 1 To 0 Step -1
            strCriteria = "Eng_ID = " & Nz(Me.Eng_ID, 0) & " And Person_ID = " & .ItemData(n)
                If .Selected(n) = False Then
                ' If a person has been deselected, then delete row from table
                If Not IsNull(DLookup("Eng_ID", "tblEngParRole", strCriteria)) Then
                    strSQL = "DELETE * FROM tblEngParRole WHERE " & strCriteria
                    CurrentDb.Execute strSQL, dbFailOnError
                End If
                Else
                ' If a person has been selected, then insert row into the table
                If IsNull(DLookup("Eng_ID", "tblEngParRole", strCriteria)) Then
                    strSQL = "INSERT INTO tblEngParRole (Eng_ID, Person_ID, ParticipantNumber, Role) " & "VALUES(" & Me.Eng_ID & "," & .ItemData(n) & "," & 2 & ",'" & Me.txtParRole2.Value & "' )"
                    CurrentDb.Execute strSQL, dbFailOnError
                End If
            End If
        Next n
    End With
End Sub

在此處輸入圖像描述

使用此圖像,如果我 select Daniel 並輸入他的角色,則 eng_ID、Person_ID、ParticipantNumber 和 Role 將作為 130、118、1、Collaborator 輸入到數據庫中。 如果我是 select Kristin,它會刪除 Daniel,因為它仍在使用 Person_ID 118 而不是她的 134,並且由於有相應的記錄,它會刪除 Daniel,然后添加 Kristin。

我沒有訪問權限來對此進行測試,但看起來您在執行 DLookup 時需要將 Participant1 記錄與 Participant2 記錄分開。

您還可以通過將公共部分拉入單獨的子部分來概括您的代碼。

Private Sub lstPar1_AfterUpdate()
    CheckParticipant Me.lstPar1, 1, Me.txtParRole1.Value
End Sub

Private Sub lstPar2_AfterUpdate()
    CheckParticipant Me.lstPar2, 2, Me.txtParRole2.Value
End Sub

Sub CheckParticipant(objList As Object, participantNum As Long, role As String)
    Dim n As Integer
    Dim strCriteria As String
    Dim strSQL As String
        
    With objList
        For n = .ListCount - 1 To 0 Step -1
            strCriteria = "Eng_ID = " & Nz(Me.Eng_ID, 0) & " And Person_ID = " & .ItemData(n) & _
                          " And ParticipantNumber=" & participantNum
            strSQL = ""
            If Not .Selected(n) Then
                ' If a person has been deselected, then delete row from table
                If Not IsNull(DLookup("Eng_ID", "tblEngParRole", strCriteria)) Then
                    strSQL = "DELETE * FROM tblEngParRole WHERE " & strCriteria
                End If
            Else
                ' If a person has been selected, then insert row into the table
                If IsNull(DLookup("Eng_ID", "tblEngParRole", strCriteria)) Then
                   strSQL = "INSERT INTO tblEngParRole (Eng_ID, Person_ID, ParticipantNumber, Role)" & _
                             " VALUES(" & Me.Eng_ID & "," & .ItemData(n) & "," & participantNum & _
                                      ",'" & role & "' )"
                End If
            End If
            If Len(strSQL) > 0 Then CurrentDb.Execute strSQL, dbFailOnError
        Next n
    End With
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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