2016-06-29 10 views
1

Ich versuche, ein Formular-Setup zum Starten verschiedener Berichte basierend auf verschiedenen Kriterien zu erhalten, und ich habe Probleme beim Abrufen eines der Berichte, die eine GroupBy/Count/Sum-basierte SQL-Datenquelle zwischen arbeiten 2 ungebundene Textfelder, die als FromDate und ToDate dienen.Access 2010 Bericht zwischen Daten beschränkt

VBA Skript - Aufruf Bericht von Form (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 Abfrage - zunächst Daten in dem Haupt SQL-Ansicht (vueRptFeedback) ziehen:

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 Abfrage - aktuelle Datenherkunft für Bericht von ID-Projekt (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 

ich mein Problem kenne die WHERE Klausel ist, wie wenn ich es aus dem Bericht fein zieht aber mit allen Datensatz, nicht die, die zwischen denen, zwei Daten. Nachdem ich den Bericht bekommen können zwischen dem txtFromDate und txtToDate zu ziehen, muss ich wohl die OpenReport() ändern, um die txtFromDate und txtToDate als Parameter anstelle eines zwischen X und Y passieren, aber ich erhalte immer gestolpert durch Syntax auf der Recordsource des Reports.

+0

Format Daten bekannt Format für SQL Server. –

+0

Ist das nicht das, was die CONVERT (DATETIME, txtFromDate, 102) tun soll? Wenn es hilft, ist das Feld in der tatsächlichen Tabelle Datetime-Typ. Die Textfelder sind alle ShortDate-Formate wie MM/TT/JJJJ. –

+0

'CONVERT (DATETIME, txtFromDate, 102)' - und wo ist das in deinem Code? 102 ist sowieso 'yyyy.mm.dd' Format https://msdn.microsoft.com/en-us/library/ms187928.aspx. –

Antwort

0

Im Wesentlichen werden zwei SQL-Dialekte zusammengeführt - SQL Server SQL und MS Access SQL. Es gibt keine CONVERT()-Funktion in der Access SQL-Syntax, die die Engine zu sein scheint, die die Recordsource des Berichts ausführt, und nicht die Pass-Through-Abfrage vueRptFeedback, die von MSSQL ausgeführt wird.

Betrachten FORMAT() mit Daten ANSI Datetime-Format auszurichten: 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 

Auf der Seite VBA, können Sie immer noch Format() wie von VBA-Funktionen abgeleitet viele von Access SQL-Funktionen verwenden (evtl. dies ist der Grund, Access SQL von seinen anderen RDMS Kollegen unterscheidet, die auf die Notwendigkeit, nach ANSI mehr aufgrund haftet in MS Office VBA Kontext) kompatibel zu bleiben:

Dim strFromDate As String 
Dim strToDate As String 

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

Wenn Sie FORMAT wie oben beschrieben verwenden, erhalte ich den folgenden Fehler. 'Ungültiger Text oder ungültiges Symbol. Fehler in der Liste der Funktionsargumente: '!' nicht wiedererkannt. Fehler in der Liste der Funktionsargumente: '"YYYY-MM-DD)) GROUP BY ProjectID, RESPEMP, Projektname ORDER BY ProjectID, RESPEMP' nicht erkannt kann nicht Abfrage text.' Ich denke, analysieren, muss ich kann finden. eine Möglichkeit, das txtFromDate und das txtToDate an verborgene ungebundene Textfelder im Bericht zu übergeben und dann festzustellen, ob ich die RecordSource im OnLoad-Ereignis ändern kann –

+0

Welche Abfrage ist eine Pass-Through-Abfrage und welche ist eine regelmäßig gespeicherte Access-Abfrage? kommt nicht von der Access-Engine. Pass-Thru-Abfragen können keine lokalen Informationen wie Formular-/Berichtssteuerelemente anzeigen. – Parfait

+0

Die letzte Berichtsabfrage in Access konvertieren. Vor dem Senden zum Testen lege ich ein Datumstextfeld auf ein Formular und fülle es mit MM/DD/YYYY und führte das 'Format()' in einer Access-Abfrage aus, deren 'FROM'-Klausel eine ODBC-Pass-Thru-Abfrage verwendete. Die Abfrage lief perfekt. – Parfait