Dcount参数化查询访问

时间:2016-02-27 16:01:32

标签: database ms-access access-vba

初学者访问,很抱歉,如果这是一个之前被问过的问题(我搜索了很长时间,所以也许我正在寻找错误的东西?)。无论如何,在我的数据库中,我有一个用于提交记录的表单,以及一个检查双重预订的查询(它显示了与输入日期重叠的所有记录)。我在表单上创建了一个“提交记录”按钮,我要做的就是通过运行双重预订查询并检查是否没有记录来验证没有双重预订。

我尝试过使用Dcount函数,但我似乎无法找到如何运行查询,因为它有参数(我需要将表单的输入传递给查询)。我不确定这是否是检查双重预订的最有效方式,但我只需要一个目前有效的解决方案:P。这是我当前的代码,显然不起作用,因为sql查询需要参数:

If DCount("*","Double Booked")=0 Then ...

(其中'Double Booked'是我在数据库中查询的名称)

对不起,如果我不清楚,请提前谢谢。

编辑:这是双重预订的查询代码:

SELECT *
FROM Booking
WHERE (

([Your VanID] = [Booking].[VanID])

AND (

( ([Your Collection Date] >= [Booking].[Collection date]) AND ([Your Collection Date] <= [Booking].[Return date]))

OR ([Your Return Date] >= [Booking].[Collection date]) AND ([Your Return Date] <= [Booking].[Return date])

OR (([Your Collection Date] <= [Booking].[Collection date]) AND ([Your Return Date] >= [Booking].[Return date]))

)

);

1 个答案:

答案 0 :(得分:1)

如果你只想知道如果有双重预订(不是多少),则DCount是不必要的。打开记录集就足够了。

使用表单字段作为参数的查询在直接打开时运行正常,或者作为RecordSource运行,但在VBA中打开时则不运行。

为了能够做到这一点,我在公共模块中有这个功能:

Public Sub EVal_Params(QD As DAO.QueryDef)

On Error GoTo EVal_Params_Err

    Dim i As Integer
    Dim par As DAO.Parameter

    For i = 0 To QD.Parameters.Count - 1
        Set par = QD.Parameters(i)
        ' This is the key line: Eval "evaluates" the form field and gets the value
        par.Value = Eval(par.Name)
    Next i

EVal_Params_Exit:
    On Error Resume Next
    Exit Sub

EVal_Params_Err:
    MsgBox Err.Description, vbExclamation, "Runtime-Error " & Err.Number & " in EVal_Params"
    Resume EVal_Params_Exit

End Sub

这样你可以在查询上打开一个记录集,它的.EOF属性会告诉你是否有双重预订:

Dim DB As DAO.Database
Dim QD As DAO.QueryDef
Dim RS As DAO.Recordset

Set DB = CurrentDb

Set QD = DB.QueryDefs("Double Booked")
' Get form field values into query parameters
Call EVal_Params(QD)
Set RS = QD.OpenRecordset(dbOpenSnapshot)
If RS.EOF Then
    ' no doubles
Else
    ' there are double bookings
End If
RS.Close

修改

如果查询参数不是对表单控件的引用,那么&#34; normal&#34;命名参数,您可以改为:

Set QD = DB.QueryDefs("Double Booked")
QD.Parameters("Your VanID") = someValue
QD.Parameters("Your Collection Date") = someOtherValue
Set RS = QD.OpenRecordset(dbOpenSnapshot)