2011-06-09 77 views
0

我有一個問題(警報等)的SQL查詢中,每次我打開它時彈出...MS-Access如何使用查詢帶有參數的形式

對於插在每個值問題你得到不同的結果。

我希望能夠使用該查詢在我的形式與組合框...

我不知道如何從表單中exceute與參數查詢....

我使用VBA沒有問題,只是告訴我如何調用查詢與參數

感謝, Fingerman

回答

3

我通常使用以下原則使用我的濾波形式:

1)I首先創建一個查詢,包括所有我想要顯示的字段和所有我要過濾的字段。它可以使用多個表格。在這個查詢中,我沒有設置任何條件(WHERE子句),除非總是需要應用一個條件而不管它是什麼。

2)接下來我創建一個基於這個查詢的數據表格,我保存它,給它一個名稱,指出它是一個子表單。

3)接下來,我創建一個未綁定的主窗體,並添加將用於過濾不同字段的未綁定控件,如文本框,組合框,列表框,複選框等。一個控件可能允許用戶在多個字段上搜索,具體取決於如何在VBA中編寫過濾例程。

4)現在是時候在主窗體上編寫代碼來使這一切工作。基本上,代碼需要檢查是否有任何控件中的值,如果是,它會創建一個WHERE子句(不帶WHERE關鍵字),最後它將設置子窗體的過濾器屬性並將子窗體的FilterOn屬性爲TRUE。

下面是一些示例代碼。這是從我剛纔演示的過濾示例數據庫中獲取的(請參見下文)。此示例不使用模糊搜索(星號),並且主窗體上的每個控件僅過濾子窗體上的一個字段。

Private Sub cmdFilter_Click() 
    'You can also call the FilterSubForm function on a control's AfterUpdate event. 
    Call FilterSubform 
End Sub 

Private Sub FilterSubform() 

    Dim strFilter As String 

    'Note: We have to wrap field names in brackets if they contain spaces or 
    'special characters. These fields are in Northwind Traders 2007 from Microsoft 
    'I would never consider naming my fields with spaces or special characters 
    'in them. 

    'Company 
    If Nz(Me.txtCompany, "") <> "" Then 
     strFilter = strFilter & "Company = '" & PQ(Me.txtCompany) & "' And " 
    End If 
    'First Name 
    If Nz(Me.txtFirstName, "") <> "" Then 
     strFilter = strFilter & "[First Name] = '" & PQ(Me.txtFirstName) & "' AND " 
    End If 
    'Last Name 
    If Nz(Me.txtLastName, "") <> "" Then 
     strFilter = strFilter & "[Last Name] = '" & PQ(Me.txtLastName) & "' AND " 
    End If 
    'Business Phone 
    If Nz(Me.txtBusinessPhone, "") <> "" Then 
     strFilter = strFilter & "[Business Phone] = '" & PQ(Me.txtBusinessPhone) & "' AND " 
    End If 
    'City 
    If Nz(Me.cboCity, "") <> "" Then 
     strFilter = strFilter & "City = '" & PQ(Me.cboCity) & "' AND " 
    End If 
    'State/Province 
    If Nz(Me.cboStateProvince, "") <> "" Then 
     strFilter = strFilter & "[State/Province] = '" & PQ(Me.cboStateProvince) & "' AND " 
    End If 
    'Order Date 
    If Nz(Me.txtOrderDate, "") <> "" Then 
     If IsDate(Me.txtOrderDate) = True Then 
      strFilter = strFilter & "[Order Date] = #" & Me.txtOrderDate & "# AND " 
     End If 
    End If 
    'Ship Name 
    If Nz(Me.txtShipName, "") <> "" Then 
     strFilter = strFilter & "[Ship Name] = '" & PQ(Me.txtShipName) & "' AND " 
    End If 
    'Ship City 
    If Nz(Me.txtShipCity, "") <> "" Then 
     strFilter = strFilter & "[Ship City] = '" & PQ(Me.txtShipCity) & "' AND " 
    End If 
    'Ship State/Province 
    If Nz(Me.cboShipStateProvince, "") <> "" Then 
     strFilter = strFilter & "[Ship State/Province] = '" & PQ(Me.cboShipStateProvince) & "' AND " 
    End If 
    'Product Code 
    If Nz(Me.cboProductCode, "") <> "" Then 
     strFilter = strFilter & "[Product Code] = '" & PQ(Me.cboProductCode) & "' AND " 
    End If 
    'Quantity 
    If Nz(Me.txtQuantity, "") <> "" Then 
     If IsNumeric(Me.txtQuantity) = True Then 
      strFilter = strFilter & "Quantity = " & Me.txtQuantity & " AND " 
     End If 
    End If 

    If Right(strFilter, 5) = " AND " Then strFilter = Left(strFilter, Len(strFilter) - 5) 

    If strFilter <> "" Then 
     Me.subformOrderSearch.Form.Filter = strFilter 
     Me.subformOrderSearch.Form.FilterOn = True 
    Else 
        'Clear the filter 
     Me.subformOrderSearch.Form.Filter = "" 
     Me.subformOrderSearch.Form.FilterOn = False 
    End If 

End Sub 

Private Function PQ(s As String) As String 
    'This function is used to "pad quotes" for SQL 
     PQ = Replace(s, "'", "''") 
End Function 

我已經放在一起的示例數據庫,有幾個不同的例子,建立在我在這裏發佈的東西。你可以在這裏下載這個數據庫: http://www.utteraccess.com/forum/Search-filtering-Examples-t1968063.html

+0

這是一個很好的答案..我希望有一個更簡單的解決方案 - 但這是可以通過的。投票正確的答案。 – fingerman 2011-06-11 00:44:28

相關問題