Access 2010报告在日期之间受到限制

时间:2016-06-29 19:57:33

标签: sql-server vba ms-access

我正在尝试使用表单设置来根据不同的标准启动各种报告,但我遇到的问题之一是基于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条款中,因为当我把它拿出来时,报告很好但是有所有记录,而不是那两个日期之间的记录。一旦我可以在 txtFromDate txtToDate 之间获取报告,我可能需要更改OpenReport()以传递 txtFromDate txtToDate 作为参数而不是介于X和Y之间,但我不断通过报告的Recordsource上的语法来绊倒。

1 个答案:

答案 0 :(得分:0)

从根本上说,您正在混淆两种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()从VBA函数派生的Access的SQL函数(可能,这就是因为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")
...