【问题标题】:Access crosstab query data parameter not filtering query访问交叉表查询数据参数不过滤查询
【发布时间】:2016-09-09 09:18:02
【问题描述】:

我终于让我的交叉表报告动态更新,但由于某种原因,日期参数没有传递给报告或查询。

我有一个更新交叉表报告的记录集,并且在悬停/步进时通过 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

如果我没有提供足够的详细信息/信息,请告诉我

【问题讨论】:

    标签: sql vba ms-access-2013 recordset


    【解决方案1】:

    检查您的 SQL WHERE 子句条件逻辑。照原样,逻辑过滤任何一个(不是两个)阵营中的记录:

    1. 在日期范围内并且查询的标签只等于表单的标签1
    2. 查询的标签等于表单的标签 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
    

    【讨论】:

    • 很好奇,问题出在哪里?我看到您接受了上述答案。是日期格式吗?
    • 抱歉,我收错了。正是括号解决了这个问题
    【解决方案2】:

    您可能必须转换为真实的日期值。并使用 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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2012-04-07
      相关资源
      最近更新 更多