【问题标题】:Access 2010 report constrained between dates访问 2010 年报告在日期之间受到限制
【发布时间】:2016-06-30 08:47:53
【问题描述】:

我正在尝试设置一个表单以根据不同的条件启动各种报告,但我在获取一个基于 GroupBy/Count/Sum 的 SQL 数据源的报告以在两个未绑定的文本框之间工作时遇到问题FromDate 和 ToDate。

VBA 脚本 - 从表单调用报告 (frmRptFeedback):

Private Sub cmdPrint_Click()

    If Not chkPrintPreview Then
        Set Application.Printer = Application.Printers.Item(cboPrinter.Value)
    End If

    Dim strCondition As String

    Dim strFromDate As String
    Dim strToDate As String

    strFromDate = txtFromDate.Value
    strToDate = txtToDate.Value


    Select Case opgOptions

        Case 1  ' Feedback By Employee
            If IsNull(cboEmployee.Value) Then
                strCondition = "DateSubmitted BETWEEN '" & strFromDate & "' AND '" & strToDate & "'"
            Else
                strCondition = "RespEmp = '" & cboEmployee.Value & "' AND DateSubmitted BETWEEN '" & _
                strFromDate & "' AND '" & strToDate & "'"
            End If

            Call OpenReport("rptFeedbackByEmp", IIf(chkPrintPreview, acViewPreview, acViewNormal), strCondition)

        Case 2  ' Feedback By Team
            If IsNull(cboTeam.Value) Then
                strCondition = "DateSubmitted BETWEEN '" & strFromDate & "' AND '" & strToDate & "'"
            Else
                strCondition = "EmpType = '" & cboTeam.Value & "' AND DateSubmitted BETWEEN '" & _
                strFromDate & "' AND '" & strToDate & "'"
            End If

            Call OpenReport("rptFeedbackByTeam", IIf(chkPrintPreview, acViewPreview, acViewNormal), strCondition)

        Case 3  ' Feedback By Project #
            If IsNull(txtProjectID) Then
                strCondition = "DateSubmitted BETWEEN '" & strFromDate & "' AND '" & strToDate & "'"
            Else
                strCondition = "ProjectID = " & txtProjectID & "AND DateSubmitted BETWEEN '" & _
                strFromDate & "' AND '" & strToDate & "'"
            End If

            Call OpenReport("rptFeedbackByProject", IIf(chkPrintPreview, acViewPreview, acViewNormal), strCondition)

    End Select

    If Not chkPreview Then
        Set Application.Printer = Nothing
    End If
End Sub

SQL 查询 - 最初将数据拉入主 SQL 视图 (vueRptFeedback):

SELECT f.FeedbackID, f.BFID, bf.ProjectID, p.ProjectName, e2.Name AS PM, e1.Name AS RespEmp, 
       et.Description AS EmpType, f.SubByInits, f.DateSubmitted, f.QtyIssues, 
       f.EstHoursImpact, f.PlusDelta, f.Notes, f.HowResolved
FROM dbo.tblEmployee e2 
INNER JOIN dbo.tblProject p
INNER JOIN dbo.tblBookingForm bf 
        ON p.ProjectID = bf.ProjectID 
        ON e2.EmployeeID = p.Scope_PM_EmployeeID 
RIGHT OUTER JOIN dbo.tblEmployeeType et 
INNER JOIN dbo.tblEmployee e1 
        ON et.EmployeeTypeID = e1.EmployeeTypeID 
INNER JOIN dbo.tblFeedback f 
        ON e1.EmployeeID = f.ResponsibleEmpID 
        ON bf.BookingFormID = f.BFID

SQL 查询 - 按项目 ID (vueRptFeedbackByProject) 报告的当前记录源:

SELECT ProjectID, ProjectName, RespEmp, COUNT(FeedbackID) AS CountReports, 
       SUM(QtyIssues) AS SumIssues, SUM(EstHoursImpact) AS SumHours
FROM vueRptFeedback
WHERE (DateSubmitted 
       BETWEEN CONVERT(DATETIME, [Forms]![frmRptFeedback]![txtFromDate], 102) 
           AND CONVERT(DATETIME, [Forms]![frmRptFeedback]![txtToDate], 102))
GROUP BY ProjectID, RespEmp, ProjectName, DateSubmitted
ORDER BY ProjectID, RespEmp

我知道我的问题出在WHERE 子句中,因为当我将其取出时,报告可以正常显示,但包含所有记录,而不是这两个日期之间的记录。一旦我可以在 txtFromDatetxtToDate 之间获取报告,我可能需要更改 OpenReport() 以传递 txtFromDatetxtToDate 作为参数而不是在 X 和 Y 之间,但我一直被报告的 Recordsource 上的语法绊倒。

【问题讨论】:

  • 将日期格式化为 sql server 的已知格式。
  • 这不是 CONVERT(DATETIME,txtFromDate,102) 应该做的吗?如果有帮助,实际表中的字段是日期时间类型。文本框都是 ShortDate 格式,如 mm/dd/yyyy。
  • CONVERT(DATETIME,txtFromDate,102) - 你的代码在哪里? 102 无论如何都是yyyy.mm.dd 格式msdn.microsoft.com/en-us/library/ms187928.aspx
  • WHERE (DateSubmitted BETWEEN CONVERT(DATETIME, [Forms]![frmRptFeedback]![txtFromDate], 102) AND CONVERT(DATETIME, [Forms] ! [frmRptFeedback] ! [txtToDate], 102)) 是我遇到问题的报告的记录源的 WHERE 子句。即使我将其设置为 101 以匹配格式,我也会得到相同的 Unable to parse text 和 Incorrect syntax near !错误。
  • 那么strCondition 在哪里使用? “解析错误”是客户端。问题可能出在! 周围的那些空间中,其中引用了 txtToData。

标签: sql-server vba ms-access


【解决方案1】:

基本上,您将两种 SQL 方言混为一谈 - SQL Server SQL 和 MS Access SQL。 Access SQL 语法中没有 CONVERT() 函数,该函数似乎是运行报表记录源的引擎,而不是 MSSQL 运行的传递查询 vueRptFeedback。

考虑使用FORMAT() 将日期与ANSI 日期时间格式对齐:YYYY-MM-DD:

SELECT ProjectID, ProjectName, RespEmp, COUNT(FeedbackID) AS CountReports, 
       SUM(QtyIssues) AS SumIssues, SUM(EstHoursImpact) AS SumHours
FROM vueRptFeedback
WHERE (DateSubmitted 
       BETWEEN FORMAT([Forms]![frmRptFeedback]![txtFromDate], "YYYY-MM-DD") 
           AND FORMAT([Forms]![frmRptFeedback]![txtToDate], "YYYY-MM-DD"))
GROUP BY ProjectID, RespEmp, ProjectName, DateSubmitted
ORDER BY ProjectID, RespEmp

在 VBA 方面,您仍然可以使用 Format(),因为 Access 的许多 SQL 函数派生自 VBA 函数(这可能是 Access SQL 与其他遵循 ANSI 的 RDMS 对应物不同的原因,因为需要在 MS Office VBA 上下文中保持兼容):

Dim strFromDate As String
Dim strToDate As String

strFromDate = Format(txtFromDate.Value, "YYYY-MM-DD")
strToDate = Format(txtToDate.Value, "YYYY-MM-DD")
...

【讨论】:

  • 当使用您在上面键入的格式时,我收到以下错误。 Invalid text or symbol. Error in list of function arguments: '!' not recognized. Error in list of function arguments: '"YYYY-MM-DD)) GROUP BY ProjectID, RespEmp, ProjectName ORDER BY ProjectID, RespEmp' not recognized. Unable to parse query text. 我想我可能需要想办法将 txtFromDate 和 txtToDate 传递给报表上隐藏的未绑定文本框,然后看看我是否可以在 OnLoad 事件中更改 RecordSource。
  • 哪个查询是直通查询,哪个是常规存储访问查询?此错误不是来自 Access 引擎。请记住,直通查询看不到任何本地内容,例如表单/报告控件。
  • 将后面的报表查询转换为 Access。在发布测试之前,我在表单上放置了一个日期文本框,将其填写为 MM/DD/YYYY 并在 Access 查询中运行 Format(),其 FROM 子句使用 ODBC 直通查询。查询运行良好。
  • 这也可能是问题的一部分。这是直接连接到 SQL Server 的 ADP/ADE。没有 ODBC 连接。
  • 与您的整个帖子非常相关的信息。我不使用 ADP。我建议使用 .accdb/.mdb 文件并使用链接的 MSSQL 表/视图或直通查询,甚至将参数传递给返回结果集的存储过程。请参阅此SO post on Adp files Microsoft 多年来一直在弃用 ADP
猜你喜欢
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多