在Access VBA中运行DoCmd.Requery时取消选择列表框记录

时间:2015-01-15 16:11:46

标签: vba ms-access listbox access-vba

在我的应用中,用户正在从要编辑的列表框中选择记录。但是,在他们能够编辑之前,还有一个额外的查询,以确保他们想要更改的信息是正确的。以下是流程:

  1. 用户输入Item_Number并单击按钮以在DB中查询包含该Item_Number的所有位置。这些填充到列表框中。
  2. 用户从列表框中选择他/她希望编辑的位置
  3. 用户为所选项目输入新的Last_Cost和/或新Vendor_ID,并点击以确认修改
  4. 在VBA中,存在针对另一个DB的查询以确保新的Vendor_ID有效
  5. 流程继续
  6. 问题是当重新查询的VBA代码

    DoCmd.Requery (VendorNumbers)
    

    执行,它取消选择列表框中的所有选定位置。我已经能够将问题缩小到VBA代码的这一部分。

    我想知道是否有办法确保所选记录保持选中状态,或者是否有办法存储选择了哪些行,以便在运行重新查询代码后再次引用它们?

    代码的全部内容。它可能看起来有点混乱,因为我没有注意到"我。"

    Private Sub EditInLocationsButton_Click()
     EditVendorIDFixed = Null
     EditVendorIDFixed = "               " & EditVendorIDInput
    
     DoCmd.Requery (VendorNumbers)
     If EditVendorIDFixed = "               " Or DCount("*", "VendorNumbers") > 0 Then
        EditResponse = MsgBox("Are you sure you want to edit the selected items?", vbYesNo, "Edit Selected Items?")
        If EditResponse = vbYes Then
            'EditItemNumberResultsList.RowSource = ""
            Dim i As Integer
            For i = 0 To EditItemNumberResultsList.ListCount - 1
                If EditItemNumberResultsList.Selected(i) Then
                    LastCost = EditItemNumberResultsList.Column(4, i)
                    EditID = EditItemNumberResultsList.Column(5, i)
                    VendorID = EditItemNumberResultsList.Column(6, i)
                    'MsgBox for verification purposes
                    MsgBox (LastCost & "-" & EditID & "-" & VendorID)
                    If EditLastCostInput = Null Then
                        LastCostforEditQuery = LastCost
                    Else
                        LastCostforEditQuery = EditLastCostInput
                    End If
    
                    If EditVendorIDInput = Null Then
                        VendorIDforEditQuery = VendorID
                    Else
                        VendorIDforEditQuery = EditVendorIDFixed
                    End If
                End If
                txtEditID = EditID
                With DoCmd
                    .SetWarnings False
                    .OpenQuery "EditIminvlocRecords"
                    .SetWarnings True
                End With
            Next i
            MsgBox ("The selected plants have been updated.")
        End If
    Else
        MsgBox ("Error: The requested Vendor ID does not exist.")
    End If
    End Sub
    

    以下是VendorNumbers查询:

    SELECT dbo_apvenfil_sql.vend_no
    FROM dbo_apvenfil_sql
    WHERE (((dbo_apvenfil_sql.vend_no)=[Forms]![EditItemsInExistingPlants]![EditVendorIDFixed]))
    ORDER BY dbo_apvenfil_sql.vend_no;
    

    同样,这只是为了验证他们输入的Vendor_ID是否有效,即存在现有行。

1 个答案:

答案 0 :(得分:1)

我认为这可能是最好的选择,因为我不知道你是否能够阻止重新查询导致刷新。我会撒谎说我测试了这个SQL,但这是我如何执行你正在寻找的基本思路。您不必重新查询VendorNumbers,而是基本上可以在VBA中运行它。这也假设EditItemsInExistingPlants是您运行此代码的表单,如果没有,则只需适当调整。

Private Sub EditInLocationsButton_Click()
     EditVendorIDFixed = Null
     EditVendorIDFixed = "               " & EditVendorIDInput

    Dim db          As DAO.Database
    Dim rs          As DAO.Recordset
    Dim strSQLQuery As String

    strSQLQuery = "SELECT dbo_apvenfil_sql.vend_no " & _
                  "FROM dbo_apvenfil_sql " & _
                  "WHERE (((dbo_apvenfil_sql.vend_no)= " & Me.EditVendorIDFixed & ")) " & _
                  "ORDER BY dbo_apvenfil_sql.vend_no"

    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQLQuery, dbOpenDynaset)

     If EditVendorIDFixed = "               " Or rs.Count > 0 Then
        EditResponse = MsgBox("Are you sure you want to edit the selected items?", vbYesNo, "Edit Selected Items?")
        If EditResponse = vbYes Then

            'EditItemNumberResultsList.RowSource = ""
            Dim i As Integer
            For i = 0 To EditItemNumberResultsList.ListCount - 1
                If EditItemNumberResultsList.Selected(i) Then
                    LastCost = EditItemNumberResultsList.Column(4, i)
                    EditID = EditItemNumberResultsList.Column(5, i)
                    VendorID = EditItemNumberResultsList.Column(6, i)
                    'MsgBox for verification purposes
                    MsgBox (LastCost & "-" & EditID & "-" & VendorID)
                    If EditLastCostInput = Null Then
                        LastCostforEditQuery = LastCost
                    Else
                        LastCostforEditQuery = EditLastCostInput
                    End If

                    If EditVendorIDInput = Null Then
                        VendorIDforEditQuery = VendorID
                    Else
                        VendorIDforEditQuery = EditVendorIDFixed
                    End If
                End If
                txtEditID = EditID
                With DoCmd
                    .SetWarnings False
                    .OpenQuery "EditIminvlocRecords"
                    .SetWarnings True
                End With
            Next i
            MsgBox ("The selected plants have been updated.")
        End If
    Else
        MsgBox ("Error: The requested Vendor ID does not exist.")
    End If
End Sub