2016-10-26 4 views
1

Ich denke, ich bin fast mit diesem Projekt da, aber ich brauche Hilfe mit dem SQL-Teil meines Codes. Ich habe begrenzte Erfahrung mit dem SQL-Teil und brauche etwas Hilfe bei der Syntax, da ich 'Laufzeitfehler 3075 Syntaxfehler fehlt Operator im Abfrageausdruck' bekomme. Und wenn ich die SQL korrekt mit dem Query SQL inkorporiere. Die SQL aus der Abfragetabelle ist.Multiple Multi Select Listenfelder VBA/SQL Query

SELECT warehouseMetrics.Date, warehouseMetrics.Client, Teammates.[User ID], JobDescriptions.[Job Code Description], warehouseMetrics.[Perf Percent],  Supervisors.Supervisor 
FROM ((Teammates INNER JOIN warehouseMetrics ON Teammates.[User ID] = warehouseMetrics.[User ID]) INNER JOIN Supervisors ON Teammates.Supervisor =  Supervisors.Supervisor) INNER JOIN JobDescriptions ON warehouseMetrics.[Job Code  Description] = JobDescriptions.[Job Code Description] 
WHERE (((warehouseMetrics.Date) Between [Forms]![MasterForm]![txtBeginDate] And [Forms]![MasterForm]![txtEndDate])) 
ORDER BY warehouseMetrics.Date; 

Und der Code, der die Abfrage ausgeführt wird ... ist

Dim Q As QueryDef, DB As Database 

Dim Criteria1 As String 
Dim Criteria2 As String 
Dim Criteria3 As String 
Dim Criteria4 As String 
Dim itm As Variant 
Dim strSQL As String 

Set DB = CurrentDb() 
Set QueryDef = DB.QueryDefs("MasterReportQuery") 

For Each itm In Me!lstSupervisor.ItemsSelected 
    Criteria1 = Criteria1 & "," & Me!lstSupervisor.ItemData(itm) & "" 
Next itm 

For Each itm In Me!lstClient.ItemsSelected 
    Criteria2 = Criteria2 & "," & Me!lstClient.ItemData(itm) & "" 
Next itm 

For Each itm In Me!lstTeammates.ItemsSelected 
    Criteria3 = Criteria3 & "," & Me!lstTeammates.ItemData(itm) & "" 
Next itm 

For Each itm In Me!lstJobs.ItemsSelected 
    Criteria4 = Criteria4 & "," & Me!lstJobs.ItemData(itm) & "" 
Next itm 

If Len(Criteria1) = 0 Or Len(Criteria2) = 0 Or Len(Criteria3) = 0 Or Len(Criteria4) = 0 Then 
MsgBox "You did not select anything" 
Exit Sub 
End If 

Criteria1 = Right(Criteria1, Len(Criteria1) - 1) 
Criteria2 = Right(Criteria2, Len(Criteria2) - 1) 
Criteria3 = Right(Criteria3, Len(Criteria3) - 1) 
Cirteria4 = Right(Criteria4, Len(Criteria4) - 1) 

MsgBox (Criteria1) 
MsgBox (Criteria2) 
MsgBox (Criteria3) 
MsgBox (Criteria4) 

strSQL = "SELECT warehouseMetrics.Date, warehouseMetrics.Client, Teammates. [User ID]," & _ 
"JobDescriptions.[Job Code Description], warehouseMetrics.[Perf Percent], Supervisors.Supervisor" & _ 
"FROM ((Teammates INNER JOIN warehouseMetrics ON Teammates.[User ID] = warehouseMetrics.[User ID])" & _ 
"INNER JOIN Supervisors ON Teammates.Supervisor = Supervisors.Supervisor) INNER JOIN" & _ 
"JobDescriptions ON warehouseMetrics.[Job Code Description] = JobDescriptions.[Job Code Description]" & _ 
"WHERE warehouseMetrics.Client IN (" & Criteria2 & ")" & _ 
"Supervisors.Supervisor IN (" & Criteria1 & ")" & _ 
"Teammates.[User ID] IN (" & Criteria3 & ")" & _ 
"JobDescriptions.[Job Code Description] IN (" & Criteria4 & ");" 

QueryDef.SQL = strSQL 
DoCmd.OpenQuery "MasterReportQuery" 
Set DB = Nothing 
Set QueryDef = Nothing 

End Sub 
+0

Haben Sie Ihre letzte strSQL überprüft, um herauszufinden, ob es gültige SQL ist? Ich frage mich zum Beispiel, ob Ihre Kriterien1, 2, 3 usw. als Zeichenfolge enden, die mit einem Komma beginnt, da die erste Schleife ein Komma mit einer leeren Variablen verkettet. – Ambulare

+0

Sind alle Felder Ihrer Kriterien numerisch? – SunKnight0

+0

Alle Kriterien sind als Kurztext eingerichtet. – lPaclMan

Antwort

0

Die Kriterien Variablen müssen in einfachen Anführungszeichen eingewickelt werden, wenn sie von einem Text-Datentyp sind. Da Sie durch mehrere Artikel und unter Verwendung einer IN-Anweisung in der SQL für jede Kriterien sind Looping, müssen Sie wahrscheinlich diese in der for-Schleifen hinzuzufügen:

For Each itm In Me!lstSupervisor.ItemsSelected 
    Criteria1 = Criteria1 & ", '" & & Me!lstSupervisor.ItemData(itm) & "'" 
Next itm 

For Each itm In Me!lstClient.ItemsSelected 
    Criteria2 = Criteria2 & ", '" & Me!lstClient.ItemData(itm) & "'" 
Next itm 

For Each itm In Me!lstTeammates.ItemsSelected 
    Criteria3 = Criteria3 & ", '" & Me!lstTeammates.ItemData(itm) & "'" 
Next itm 

For Each itm In Me!lstJobs.ItemsSelected 
    Criteria4 = Criteria4 & ", '" & Me!lstJobs.ItemData(itm) & "'" 
Next itm 

Es gibt auch einige Probleme mit dem Abstand von der SQL-Anweisung :

strSQL = "SELECT warehouseMetrics.Date, warehouseMetrics.Client, Teammates.[User ID], " & _ 
"JobDescriptions.[Job Code Description], warehouseMetrics.[Perf Percent], Supervisors.Supervisor " & _ 
"FROM ((Teammates INNER JOIN warehouseMetrics ON Teammates.[User ID] = warehouseMetrics.[User ID]) " & _ 
"INNER JOIN Supervisors ON Teammates.Supervisor = Supervisors.Supervisor) INNER JOIN " & _ 
"JobDescriptions ON warehouseMetrics.[Job Code Description] = JobDescriptions.[Job Code Description] " & _ 
"WHERE warehouseMetrics.Client IN (" & Criteria2 & ") " & _ 
"Supervisors.Supervisor IN (" & Criteria1 & ") " & _ 
"Teammates.[User ID] IN (" & Criteria3 & ") " & _ 
"JobDescriptions.[Job Code Description] IN (" & Criteria4 & ");"` 
+0

Ich machte die vorgeschlagenen Änderungen, aber die Laufzeitfehler Ich bekomme immer noch das selbe. Ich habe das Gefühl, dass die strSQL nicht richtig formatiert ist, aber mit meiner mangelnden Erfahrung bin ich nicht sicher, wie ich wissen soll, was falsch ist. 'Laufzeitfehler '3075': Syntaxfehler (fehlender Operator) im Abfrageausdruck 'Supervisors.SupervisorFrom ((Treammates INNER JOIN warehouseMetrics ON Teamkameraden. [Benutzer-ID] = warehouseMetrics. [Benutzer-ID]) INNER JOIN Supervisors auf Teammitglieder.Supervisors .Supervisor) IINER JOIN JobBeschreibungen ON warehouseMetrics [Job Code Beschreibung] = JobDescriptions [Job Code Beschreibung] Where' – lPaclMan

+0

Ich habe meine ursprüngliche Antwort bearbeitet, es gibt eine Reihe von Problemen mit Ihrer SQL-Anweisung, die ich ursprünglich nicht bemerkt habe - Sie haben Ihre Abfrage in die nächste Zeile ohne Leerzeichen zwischen den Wörtern übertragen, weshalb Sie "Supervisors.SupervisorFrom" erhalten. Können Sie es erneut mit dem bearbeiteten Code versuchen? – finjo