访问交叉表查询数据参数不过滤查询
Access crosstab query data parameter not filtering query
我终于让我的交叉表报告动态更新,但由于某些原因,日期参数没有传递给报告或查询。
我有一个更新交叉表报告的记录集,在 hover/step 通过 vba 中的日期参数显示正确的日期,但报告仍显示所有数据。
查询还显示了所有日期的数据。这是我在查询中做错了什么吗?我已经尝试了我能在每个论坛中找到的所有选项,但无法找到解决方案。
这是查询的SQL
PARAMETERS [Forms]![frm_menu]![txtFromDate] DateTime,
[Forms]![frm_menu]![txtToDate] DateTime,
[Forms]![frm_menu]![cmbMplTag1] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag2] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag3] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag4] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag5] Text ( 255 );
TRANSFORM First(tbl_logdata.Input_Value) AS FirstOfInput_Value
SELECT tbl_logdata.Log_Date, tbl_logdata.Log_Time
FROM tbl_logdata
WHERE (((tbl_logdata.Log_Date) Between [Forms]![frm_menu]![txtFromDate]
And [Forms]![frm_menu]![txtToDate])
AND ((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag1]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag2]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag3]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag4]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag5]))
GROUP BY tbl_logdata.Log_Date, tbl_logdata.Log_Time
PIVOT tbl_logdata.tag;
这是交叉表报告的 VBA。 cmbMplTag# 的参数工作正常:
Private Sub Report_Open(Cancel As Integer)
Dim rst As dao.Recordset
Dim db As dao.Database
Dim qdf As dao.QueryDef
Dim i As Integer
Dim j As Integer
Set db = CurrentDb
Set qdf = db.QueryDefs("qry_MplTagsSummary")
'on hover shows date from textbox'
qdf.Parameters("Forms!frm_menu!txtFromDate") = [Forms]![frm_menu]![txtFromDate]
'on hover shows date from textbox'
qdf.Parameters("Forms!frm_menu!txtToDate") = [Forms]![frm_menu]![txtToDate]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag1]") = [Forms]![frm_menu]![cmbMplTag1]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag2]") = [Forms]![frm_menu]![cmbMplTag2]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag3]") = [Forms]![frm_menu]![cmbMplTag3]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag4]") = [Forms]![frm_menu]![cmbMplTag4]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag5]") = [Forms]![frm_menu]![cmbMplTag5]
Set rst = qdf.OpenRecordset()
rst.MoveFirst
j = -1
i = 0
For i = 0 To rst.Fields.Count - 1
j = j + 1
Select Case j
Case 0
Me.Log_Date.ControlSource = rst.Fields(i).Name
Case 1
Me.Log_Time.ControlSource = rst.Fields(i).Name
Case 2
Me.field1.ControlSource = rst.Fields(i).Name
Case 3
Me.field2.ControlSource = rst.Fields(i).Name
Case 4
Me.Field3.ControlSource = rst.Fields(i).Name
Case 5
Me.Field4.ControlSource = rst.Fields(i).Name
Case 6
Me.Field5.ControlSource = rst.Fields(i).Name
End Select
skip_it:
Next i
rst.Close
Set rst = Nothing
End Sub
如果我提供的不够,请告诉我details/information
您可能必须转换为真实的日期值。并使用 Value 属性:
qdf.Parameters("Forms!frm_menu!txtFromDate").Value = DateValue([Forms]![frm_menu]![txtFromDate])
qdf.Parameters("Forms!frm_menu!txtToDate").Value = DateValue([Forms]![frm_menu]![txtToDate])
检查您的 SQL WHERE
子句条件逻辑。照原样,逻辑过滤任一(不是两个)阵营中的记录:
- 日期范围 和 查询的标签只等于表单的标签 1
- 查询的标签等于任何表单的标签 2 - 标签 5。
您可能想分开日期范围和标签。因此,使用 AND
运算符将每个条件括起来,甚至使用 IN
子句。请参阅下面的缩进说明:
...
WHERE (
(
(tbl_logdata.Log_Date) Between [Forms]![frm_menu]![txtFromDate]
And [Forms]![frm_menu]![txtToDate]
)
AND (
(tbl_logdata.tag) IN (
[Forms]![frm_menu]![cmbMplTag1],
[Forms]![frm_menu]![cmbMplTag2],
[Forms]![frm_menu]![cmbMplTag3],
[Forms]![frm_menu]![cmbMplTag4],
[Forms]![frm_menu]![cmbMplTag5]
)
)
)
GROUP BY tbl_logdata.Log_Date, tbl_logdata.Log_Time
我终于让我的交叉表报告动态更新,但由于某些原因,日期参数没有传递给报告或查询。
我有一个更新交叉表报告的记录集,在 hover/step 通过 vba 中的日期参数显示正确的日期,但报告仍显示所有数据。
查询还显示了所有日期的数据。这是我在查询中做错了什么吗?我已经尝试了我能在每个论坛中找到的所有选项,但无法找到解决方案。
这是查询的SQL
PARAMETERS [Forms]![frm_menu]![txtFromDate] DateTime,
[Forms]![frm_menu]![txtToDate] DateTime,
[Forms]![frm_menu]![cmbMplTag1] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag2] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag3] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag4] Text ( 255 ),
[Forms]![frm_menu]![cmbMplTag5] Text ( 255 );
TRANSFORM First(tbl_logdata.Input_Value) AS FirstOfInput_Value
SELECT tbl_logdata.Log_Date, tbl_logdata.Log_Time
FROM tbl_logdata
WHERE (((tbl_logdata.Log_Date) Between [Forms]![frm_menu]![txtFromDate]
And [Forms]![frm_menu]![txtToDate])
AND ((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag1]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag2]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag3]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag4]))
OR (((tbl_logdata.tag)=[Forms]![frm_menu]![cmbMplTag5]))
GROUP BY tbl_logdata.Log_Date, tbl_logdata.Log_Time
PIVOT tbl_logdata.tag;
这是交叉表报告的 VBA。 cmbMplTag# 的参数工作正常:
Private Sub Report_Open(Cancel As Integer)
Dim rst As dao.Recordset
Dim db As dao.Database
Dim qdf As dao.QueryDef
Dim i As Integer
Dim j As Integer
Set db = CurrentDb
Set qdf = db.QueryDefs("qry_MplTagsSummary")
'on hover shows date from textbox'
qdf.Parameters("Forms!frm_menu!txtFromDate") = [Forms]![frm_menu]![txtFromDate]
'on hover shows date from textbox'
qdf.Parameters("Forms!frm_menu!txtToDate") = [Forms]![frm_menu]![txtToDate]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag1]") = [Forms]![frm_menu]![cmbMplTag1]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag2]") = [Forms]![frm_menu]![cmbMplTag2]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag3]") = [Forms]![frm_menu]![cmbMplTag3]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag4]") = [Forms]![frm_menu]![cmbMplTag4]
qdf.Parameters("[Forms]![frm_menu]![cmbMplTag5]") = [Forms]![frm_menu]![cmbMplTag5]
Set rst = qdf.OpenRecordset()
rst.MoveFirst
j = -1
i = 0
For i = 0 To rst.Fields.Count - 1
j = j + 1
Select Case j
Case 0
Me.Log_Date.ControlSource = rst.Fields(i).Name
Case 1
Me.Log_Time.ControlSource = rst.Fields(i).Name
Case 2
Me.field1.ControlSource = rst.Fields(i).Name
Case 3
Me.field2.ControlSource = rst.Fields(i).Name
Case 4
Me.Field3.ControlSource = rst.Fields(i).Name
Case 5
Me.Field4.ControlSource = rst.Fields(i).Name
Case 6
Me.Field5.ControlSource = rst.Fields(i).Name
End Select
skip_it:
Next i
rst.Close
Set rst = Nothing
End Sub
如果我提供的不够,请告诉我details/information
您可能必须转换为真实的日期值。并使用 Value 属性:
qdf.Parameters("Forms!frm_menu!txtFromDate").Value = DateValue([Forms]![frm_menu]![txtFromDate])
qdf.Parameters("Forms!frm_menu!txtToDate").Value = DateValue([Forms]![frm_menu]![txtToDate])
检查您的 SQL WHERE
子句条件逻辑。照原样,逻辑过滤任一(不是两个)阵营中的记录:
- 日期范围 和 查询的标签只等于表单的标签 1
- 查询的标签等于任何表单的标签 2 - 标签 5。
您可能想分开日期范围和标签。因此,使用 AND
运算符将每个条件括起来,甚至使用 IN
子句。请参阅下面的缩进说明:
...
WHERE (
(
(tbl_logdata.Log_Date) Between [Forms]![frm_menu]![txtFromDate]
And [Forms]![frm_menu]![txtToDate]
)
AND (
(tbl_logdata.tag) IN (
[Forms]![frm_menu]![cmbMplTag1],
[Forms]![frm_menu]![cmbMplTag2],
[Forms]![frm_menu]![cmbMplTag3],
[Forms]![frm_menu]![cmbMplTag4],
[Forms]![frm_menu]![cmbMplTag5]
)
)
)
GROUP BY tbl_logdata.Log_Date, tbl_logdata.Log_Time