OpenRecordset 未应用查询参数

OpenRecordset is not applying query parameters

我正在尝试遍历使用具有 2 个参数的查询生成的结果集。这些参数的值是从表单字段(开始和结束日期)中读取的。由于 Access 抛出 运行 时间错误“3061”。参数太少。预期 2. 即使在表单字段中设置了值,我也尝试通过 VBA 和 QueryDef 对象(下面给出的代码)来设置参数。

当开始日期和结束日期相同时,它工作正常,但如果我 select 不同的开始日期和结束日期,它将不会应用分配给查询参数的日期过滤器。

我尝试过更改日期值的格式并将它们转换为另一种类型,但都没有成功。

有没有人遇到过类似的问题? 如有任何帮助,我们将不胜感激!

查询:

SELECT DISTINCT 
    tblComp_Payout.Agent_ID_int As [Agent ID],
    tblExchOffices.Agent_Name AS Name
FROM
    tblExchOffices 
INNER JOIN 
    tblComp_Payout ON tblExchOffices.Agent_ID_int = tblComp_Payout.Agent_ID_int
WHERE 
    ((DateValue([Paid_Date])) >= ([forms]![frmReporting]![txtDateFrom])
    AND (DateValue([Paid_Date]))<=[forms]![frmReporting]![txtDateTo])

UNION 

SELECT DISTINCT 
    tblComp_Sending.Agent_ID_int AS [Agent ID],
    tblExchOffices.Agent_Name AS Name
FROM
    tblExchOffices 
INNER JOIN 
    tblComp_Sending ON tblExchOffices.Agent_ID_int = tblComp_Sending.Agent_ID_int
WHERE 
    ((DateValue([Sending_Date])) >= ([forms]![frmReporting]![txtDateFrom])
    AND (DateValue([Sending_Date]))<=[forms]![frmReporting]![txtDateTo]);

方法:

Private Sub iterate_Click()
On Error GoTo iterate_Err
    
    Dim rs As DAO.Recordset
    Dim qdf As DAO.QueryDef
    Set qdf = CurrentDb.QueryDefs("queAgentByDate")
    qdf.Parameters.Refresh
    
    If CurrentProject.AllForms("frmReporting").IsLoaded Then
        qdf.Parameters("[forms]![frmReporting]![txtDateFrom]") = CStr([Forms]![frmReporting]![txtDateFrom])
        qdf.Parameters("[forms]![frmReporting]![txtDateTo]") = CStr([Forms]![frmReporting]![txtDateTo])
    Else
        Beep
        Resume iterate_Exit
    End If
    
    Set rs = qdf.OpenRecordset(dbOpenDynaset, dbSeeChanges)
    
    MsgBox rs.RecordCount
    
    If rs.EOF Then Exit Sub

    With rs
        Do Until .EOF
           'Loop logic
        Loop
    End With
 

    rs.Close
    Set rs = Nothing

iterate_Exit:
    Exit Sub

iterate_Err:
    MsgBox Error$
    Resume iterate_Exit
End Sub

首先,指定您的参数:

PARAMETERS
    [forms]![frmReporting]![txtDateFrom] DateTime,
    [forms]![frmReporting]![txtDateTo] DateTime;
SELECT DISTINCT tblComp_Payout.Agent_ID_int As [Agent ID],
        tblExchOffices.Agent_Name AS Name
FROM tblExchOffices INNER JOIN tblComp_Payout 
    ON tblExchOffices.Agent_ID_int = tblComp_Payout.Agent_ID_int
WHERE ((DateValue([Paid_Date]))>=([forms]![frmReporting]![txtDateFrom])
        And (DateValue([Paid_Date]))<=[forms]![frmReporting]![txtDateTo])
UNION 
SELECT DISTINCT tblComp_Sending.Agent_ID_int As [Agent ID],
        tblExchOffices.Agent_Name AS Name
FROM tblExchOffices INNER JOIN tblComp_Sending 
    ON tblExchOffices.Agent_ID_int = tblComp_Sending.Agent_ID_int
WHERE ((DateValue([Sending_Date]))>=([forms]![frmReporting]![txtDateFrom])
        And (DateValue([Sending_Date]))<=[forms]![frmReporting]![txtDateTo]);

然后将它们的值设置为真实的日期值:

qdf.Parameters("[forms]![frmReporting]![txtDateFrom]") = [Forms]![frmReporting]![txtDateFrom]
qdf.Parameters("[forms]![frmReporting]![txtDateTo]") = [Forms]![frmReporting]![txtDateTo]

为了简化,将参数重命名为 DateFromDateTo.