【问题标题】:Date parameters in query查询中的日期参数
【发布时间】:2012-06-04 13:00:47
【问题描述】:

我有一个输入数据的表格。排序顺序、开始日期和结束日期。

输入数据后,会生成报告。但我得到了错误。

错误:“Microsoft Access 数据库引擎无法将 '[Forms]![AuditPTETotals]![startDate]' 识别为有效的字段名称或表达式。

这是我的交叉表 (AuditPTETotals_CrosstabDateRange) 查询,它使用另一个查询 (AuditPTETotalsDateRange) 检索到的数据

TRANSFORM Sum(AuditPTETotalsDateRange.PTEtotal) AS SumOfPTEtotal
SELECT AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum,    Sum(AuditPTETotalsDateRange.PTEtotal) AS [Total Of PTEtotal]
FROM AuditPTETotalsDateRange
GROUP BY AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum
PIVOT AuditPTETotalsDateRange.description;

这是 AuditPTETotalsDateRange

    SELECT CUSTOMER.regNum, CUSTOMER.companyName, ScrapTireType.description, ScrapTireType.PTEamount, ScrapCollectionTireType.amount, ScrapCollection.PTEtotal, ScrapCollection.Date
FROM (ScrapCollection INNER JOIN CUSTOMER ON ScrapCollection.regNum = CUSTOMER.regNum) INNER JOIN (ScrapTireType INNER JOIN ScrapCollectionTireType ON (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID) AND (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID)) ON ScrapCollection.scrapCollectionID = ScrapCollectionTireType.scrapCollectionID
WHERE (((ScrapCollection.Date) Between [Forms]![AuditPTETotals]![startDate] And [Forms]![AuditPTETotals]![endDate]));

我以类似的方式使用这种方法来引用查询中的表单字段,但是这一次,我不确定自己做错了什么。请帮忙。

谢谢

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    我找到了解决办法!我在控件上使用了日期/时间格式。我认为它弄乱了我的参数的实际格式。相反,我使用了一个常规文本框并为其设置了一个输入掩码。有效。

    【讨论】:

    • 找到另一个解决方案,我使用的是短日期而不是一般日期。我改变了这个,它也能正常工作。
    【解决方案2】:

    在您正在使用的表单上创建一个按钮,并将以下内容添加到其 Click 事件中。确保将 MyReportName 更改为实际的报告名称。 MyReportName 在下面的代码中出现了两次。

    On Error Resume Next
    DoCmd.Close acReport, "MyReportName"
    DoCmd.DeleteObject acQuery, "AuditPTETotalsDateRange"
    On Error GoTo Err_cmd_Click
    
    Dim strSQL, strSQL1 As String
    Dim qdef As DAO.QueryDef
    
    strSQL = "SELECT CUSTOMER.regNum, CUSTOMER.companyName, ScrapTireType.description, ScrapTireType.PTEamount, ScrapCollectionTireType.amount, ScrapCollection.PTEtotal, ScrapCollection.Date " & _
             "FROM (ScrapCollection INNER JOIN CUSTOMER ON ScrapCollection.regNum = CUSTOMER.regNum) INNER JOIN (ScrapTireType INNER JOIN ScrapCollectionTireType ON (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID) AND (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID)) ON ScrapCollection.scrapCollectionID = ScrapCollectionTireType.scrapCollectionID " & _
             "WHERE (((ScrapCollection.Date) Between #" & [Forms]![AuditPTETotals]![startDate] & "# And #" & [Forms]![AuditPTETotals]![endDate] & "#))"
    
    strSQL1 = "TRANSFORM Sum(AuditPTETotalsDateRange.PTEtotal) AS SumOfPTEtotal " & _
              "SELECT AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum, Sum(AuditPTETotalsDateRange.PTEtotal) AS [Total Of PTEtotal] " & _
              "FROM AuditPTETotalsDateRange " & _
              "GROUP BY AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum " & _
              "PIVOT AuditPTETotalsDateRange.description"
    
    Set qdef = CurrentDb.CreateQueryDef("AuditPTETotalsDateRange", strSQL)
    Set qdef = CurrentDb.CreateQueryDef("AuditPTETotals_CrosstabDateRange", strSQL1)
    DoCmd.OpenReport "MyReportName", acViewPreview
    
    Exit_cmd_Click:
        Exit Sub
    Err_cmd_Click:
        MsgBox Err.Description
        Resume Exit_cmd_Click
    

    然后在关闭事件的表单上添加以下内容:

    On Error Resume Next
    DoCmd.DeleteObject acQuery, "AuditPTETotalsDateRange"
    

    然后发生的情况是,如果单击该按钮,AuditPTETTotalsDateRange 将被删除然后重新创建。此外,如果您关闭表单,则会删除 AuditPTETotalsDateRange 查询。这没关系,因为只有在表单打开时才需要查询。将报告的记录源设置为 AuditPTETotals_CrosstabDateRange。

    您必须设置对 Microsoft DAO x.x 对象库 的引用才能使上述代码正常工作。您可能已经拥有参考集。 x.x 代表版本。任何版本都可以使用。

    编辑

    在进行所有这些更改之前,您可能需要复制原始报告,以防它不适合您。尝试从报表上的字段中删除数据源,使其不受约束。然后将以下代码添加到打开事件的报告中:

    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("AuditPTETotals_CrosstabDateRange", dbOpenDynaset)
    
    On Error Resume Next
    [txtdata1].ControlSource = rs.Fields(4).Name
    [txtData2].ControlSource = rs.Fields(5).Name
    [txtData3].ControlSource = rs.Fields(6).Name
    //And etc for as many fields as you have on report
    

    您还可以以类似的方式在页眉上分配列标题。他们需要从标签更改为未绑定的文本框才能正常工作。将以下代码添加到页眉 On Format 事件中:

    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("AuditPTETotals_CrosstabDateRange", dbOpenDynaset)
    
    On Error Resume Next
    [txtColHeading1].value = rs.Fields(4).Name
    [txtColHeading2].value = rs.Fields(5).Name
    [txtColHeading3].value = rs.Fields(6).Name
    //And etc for as many fields as you have on report
    

    这将允许您在不知道您将拥有哪些列的情况下运行您的报告。确保为控件命名以匹配代码中此处的名称,反之亦然。

    【讨论】:

    • 我使用查询向导创建了查询,并将其设置为我的报告的记录源。我尝试使用“#”但仍然没有运气。我已尝试通过 VBA 执行查询,但我需要该查询始终存在才能使交叉表查询正常工作。
    • 我修改了答案以显示如何在您使用的表单中创建/删除查询。
    • 我不再收到错误消息,尽管它似乎超时了。我还没有引用 DAO 对象库,所以这可能就是原因,但我只是放在了代码的顶部,或者?
    • 消息是“此操作将在中断模式下重置当前代码”
    • 我目前在我的 report_open 事件中使用此代码。我当然修改了它,但这会带来任何问题吗?我是超级新手,这是一个工作学期项目,所以我有点迷茫。不过感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2014-06-21
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多