【问题标题】:OpenRecordset is not applying query parametersOpenRecordset 未应用查询参数
【发布时间】:2021-08-24 23:05:25
【问题描述】:

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

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

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

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

查询:

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

【问题讨论】:

  • 这不是您定义查询参数的方式([forms]![frmReporting]![txtDateFrom])。阅读一些有关查询参数的信息 - 在查询中将它们定义为日期,然后在查询和代码中使用参数名称
  • 感谢 cmets!该链接非常有用,@June7。

标签: vba ms-access


【解决方案1】:

首先,指定你的参数:

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

【讨论】:

  • 非常感谢!这是有道理的。没想到我也必须在查询中声明参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2018-04-11
  • 2013-12-26
相关资源
最近更新 更多