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]
为了简化,将参数重命名为 DateFrom 和 DateTo.
我正在尝试遍历使用具有 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]
为了简化,将参数重命名为 DateFrom 和 DateTo.