2015-01-15 95 views
0

在我的應用程序中,用戶正在從要編輯的列表框中選擇記錄。然而,在他們能夠編輯之前,還有一個額外的查詢來確保他們想要更改的信息是正確的。以下是流程:在Access VBA中運行DoCmd.Requery時取消選擇列表框中的記錄

  1. 用戶輸入一個Item_Number,然後單擊一個按鈕來查詢包含該Item_Number的所有位置的數據庫。這些填充到列表框中。
  2. 用戶從他/她希望編輯
  3. 用戶列表框的位置(一個或多個)輸入用於所選擇的項的新Last_Cost和/或新VENDOR_ID並點擊確認編輯
  4. 在VBA中,有對另一個數據庫的查詢,以確保新VENDOR_ID有效
  5. 流程繼續

的問題是,當重新查詢

DoCmd.Requery (VendorNumbers) 
VBA代碼

執行時,它將取消選擇列表框中的所有選定位置。我已經能夠將問題縮小到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輸入是有效的,即有現有行。

+0

你碰巧有更多的代碼來顯示發生了什麼?我對你將需要做的事情的想法是在查詢之前創建一個「書籤」系統,保存列表框中的值,並在查詢之後將其設置回該值。但擔心的是它會重新觸發代碼導致整個週期重複。 – Newd 2015-01-15 16:21:29

+0

@Newd當然,我將使用我正在使用的整個VBA代碼進行編輯。 – GothamHunter 2015-01-15 16:30:14

+0

@HansUp我需要驗證他們放入的Vendor_ID是否有效,因此該行使用它們輸入的Vendor_ID對單獨的數據庫運行查詢以查看它是否返回任何記錄。如果是,它是有效的,如果沒有,那麼它是無效的。也許有一個更簡單的方法來實現這一目標? – GothamHunter 2015-01-15 16:38:00

回答

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 
+0

我試圖儘量避免直接在我的VBA中直接使用SQL,但是這確實最終奏效了。謝謝Newd。 – GothamHunter 2015-01-15 18:35:05

+0

很高興聽到這種說法,我可以問一下,是什麼讓你避免將SQL直接放入你的VBA中?只是爲了好奇的緣故。 – Newd 2015-01-15 19:12:40

相關問題