Ms access 查询中的日期参数

Ms access 查询中的日期参数,ms-access,Ms Access,我有一个输入数据的表格。排序顺序、开始日期和结束日期 输入数据后,将生成一份报告。但我发现了错误 错误:“Microsoft Access数据库引擎无法将“[Forms]![AuditPteToals]![startDate]”识别为有效的字段名或表达式 这是我的交叉表(AuditPTETotals\u交叉表日期范围)查询,它使用另一个查询(AuditPTETotalsDateRange)检索的数据 这是我的朋友 TRANSFORM Sum(AuditPTETotalsDateRange.PTE

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

输入数据后,将生成一份报告。但我发现了错误

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

这是我的交叉表(AuditPTETotals\u交叉表日期范围)查询,它使用另一个查询(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;
    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]));
我曾以类似的方式在查询中引用表单字段,但这次我不确定我做错了什么。请帮助


谢谢

在您正在使用的表单上创建一个按钮,并将以下内容添加到其单击事件中。请确保将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"
然后,如果单击该按钮,则会删除并重新创建AuditPteTotalsDataRange。此外,如果关闭表单,则会删除AuditPteTotalsDataRange查询。这是正常的,因为仅当表单仍然打开时才需要查询。将报告的记录源设置为AuditPTETotals\u 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
您还可以以类似的方式在页眉上指定列标题。它们需要从标签更改为未绑定的文本框,才能正常工作。在格式化事件中向页眉添加以下代码:

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

这将允许您的报表运行,而不知道您将拥有哪些列。请确保您命名的控件与代码中此处的名称相匹配,反之亦然。

我找到了一个解决方案!我在控件上使用了日期/时间格式。我想这会弄乱我参数的实际格式。相反,我使用了reg单击文本框并为其设置输入掩码。它起作用。

我使用查询向导创建了查询,并将其设置为报表的记录源。我尝试使用“#“但还是没有运气。我已尝试通过VBA执行查询,但我需要该查询始终存在,以使交叉表查询正常工作。我修改了答案,以显示如何在您使用的表单中创建/删除查询。我不再收到该错误,尽管它似乎超时。我还没有引用DAO对象库,这可能就是为什么我只是将其放在代码的顶部,或者?消息是“此操作将在中断模式下重置当前代码”。我当前正在我的report\u open事件中使用此代码。我当然修改了,但这会带来任何问题吗?我是超级新手,这是一个工作学期的项目,所以我有点迷路了。不过谢谢你的帮助。找到了另一个解决方案,我用了短日期而不是一般日期。我改变了这个,它也起了作用。