PDA

Vollständige Version anzeigen : SQL - Unterabfrage schwierig


Claus33
24.03.2006, 09:36
Hallo ,

Und zwar will ich in VBA eine SQL-Abfrage erstellen, die auf eine formularbasierende Unterabfrage zugreift.

Ich habe ein Formular mit diversen Feldern zum Filtern der Datensätze.
Dann habe ich eine Abfrage die auf die Unterabfrage zugreift.

Die Unterabfrage zeigt mir praktisch die Laufleistung für einen bestimmten Zeitraum. Dieser Zeitraum ist eine Filterbedingung die im Formular gesetzt wird.


Sobald ich in der Unterabfrage direkt / explizit den Zeitraum angebe lfunktioniert die Abfrage. Nur wenn ich versuche, das Filterkriterium über das Formular anzusprechen, kommt die Fehlermeldung "2 Parameter fehlen"



Zunächst einmal der Code ohne die Unterabfrage. Hier kommt logischerweise die Fehlermeldung, da dass Filterkriterium aus dem Formular nicht greift. Wie gesagt, wenn ich die Paramter in die Unterabfrage manuell einfüge (also anstatt forms!Formular!Feld den Zeitraum, dann funktioniert es:

datum1 = Format([Forms]![ÜbersichtKostenanalyse]![txtSuchenDAT], "\#yyyy\-mm\-dd\#")
datum2 = Format([Forms]![ÜbersichtKostenanalyse]![txtSuchenDATB], "\#yyyy\-mm\-dd\#")

' SQL-Abfragestring sSQL = "SELECT Fahrzeugstammdaten.Kennzeichen, " & _
"Fahrzeugstammdaten.EZ, Fahrzeugstammdaten.Abmeldung, " & _
"Fahrzeugtypen.Hersteller, " & _ "Fahrzeugtypen.Typenbezeichnung, " & _
"Kostenart.Kostengruppenbezeichnung, " & _ "Sum(Rechn_Allok.Nettolohn) AS Lohn, " & _
"Sum(Rechn_Allok.NettoMaterial) AS Material, " & _
"Sum([Nettolohn]+[Nettomaterial]) AS Gesamt, " & _
"LL_Parameter.LL, Max(Rechnung.Rechnungs_ID) AS Re_ID, " & _ "Max(Rechn_Allok.Kostenart_ID) AS Kostenart_ID, " & _ "[LLGesamt].[Maxkm] " & _
"FROM ((((Fahrzeugstammdaten LEFT JOIN Fahrzeugtypen ON Fahrzeugstammdaten.[Fahrzeugtyp ID] = Fahrzeugtypen.Fahrzeugtyp_ID)" & _
"LEFT JOIN [LLGesamt] ON Fahrzeugstammdaten.Fahrzeug_ID = [LLGesamt].Fahrzeug_ID) " & _
"INNER JOIN Rechnung ON Fahrzeugstammdaten.Fahrzeug_ID = Rechnung.Fahrzeug_ID) " & _
"INNER JOIN (Rechn_Allok INNER JOIN Kostenart ON Rechn_Allok.Kostenart_ID = Kostenart.Kostenart_ID)ON Rechnung.Rechnungs_ID = Rechn_Allok.Rechnungs_ID) " & _
"INNER JOIN LL_Parameter ON Fahrzeugstammdaten.Fahrzeug_ID = LL_Parameter.Fahrzeug_ID " & _
"WHERE Rechnung.[abgeschlossene Rechnung]=Yes " & _
"And Rechnung.Reparaturdatum Between " & datum1 & " AND " & datum2 & _
"GROUP BY Fahrzeugstammdaten.Kennzeichen, Fahrzeugstammdaten.EZ, Fahrzeugstammdaten.Abmeldung, " & _
"Fahrzeugtypen.Hersteller, Fahrzeugtypen.Typenbezeichnung,Kostenart.Kostengruppenbezeichnung, LL_Parameter.LL, LLGesamt.Maxkm " & _
"HAVING Fahrzeugstammdaten.Kennzeichen Like '" & [Forms]![ÜbersichtKostenanalyse]![txtSuchenAKZ] & "'
AND Fahrzeugtypen.Hersteller Like '" & [Forms]![ÜbersichtKostenanalyse]![txtsuchenFab] & "' AND Fahrzeugtypen.Typenbezeichnung Like '" & [Forms]![ÜbersichtKostenanalyse]![txtSuchenTYP] & "' AND Kostenart.Kostengruppenbezeichnung Like '" & [Forms]![ÜbersichtKostenanalyse]![txtsuchenArt] & "' OR Fahrzeugtypen.Hersteller Is Null AND Fahrzeugtypen.Typenbezeichnung Is Null;"

Versuch mit der Unterabfrage
sSQL = "SELECT Fahrzeugstammdaten.Kennzeichen, " & _
"Fahrzeugstammdaten.EZ, Fahrzeugstammdaten.Abmeldung, " & _
"Fahrzeugtypen.Hersteller, " & _
"Fahrzeugtypen.Typenbezeichnung, " & _
"Kostenart.Kostengruppenbezeichnung, " & _
"Sum(Rechn_Allok.Nettolohn) AS Lohn, " & _
"Sum(Rechn_Allok.NettoMaterial) AS Material, " & _
"Sum([Nettolohn]+[Nettomaterial]) AS Gesamt, " & _
"LL_Parameter.LL, Max(Rechnung.Rechnungs_ID) AS Re_ID, " & _
"Max(Rechn_Allok.Kostenart_ID) AS Kostenart_ID, " & _
"[LLGesamt].[Maxkm] " & _
"FROM ((((Fahrzeugstammdaten LEFT JOIN Fahrzeugtypen ON Fahrzeugstammdaten.[Fahrzeugtyp ID] = Fahrzeugtypen.Fahrzeugtyp_ID)" & _
"LEFT JOIN [LLGesamt] ON Fahrzeugstammdaten.Fahrzeug_ID = [LLGesamt].Fahrzeug_ID) " & _
"INNER JOIN Rechnung ON Fahrzeugstammdaten.Fahrzeug_ID = Rechnung.Fahrzeug_ID) " & _
"INNER JOIN (Rechn_Allok INNER JOIN Kostenart ON Rechn_Allok.Kostenart_ID = Kostenart.Kostenart_ID)ON Rechnung.Rechnungs_ID = Rechn_Allok.Rechnungs_ID) " & _
"INNER JOIN LL_Parameter ON Fahrzeugstammdaten.Fahrzeug_ID = LL_Parameter.Fahrzeug_ID " & _
"WHERE Rechnung.[abgeschlossene Rechnung]=Yes " & _
"And Rechnung.Reparaturdatum Between " & datum1 & " AND " & datum2 & _
"[B]And Exists (SELECT [km-Tabelle].Fahrzeug_ID, [maxk]-[mink] AS LL, Max([km-Tabelle].km_Stand) AS Maxk, Min([km-Tabelle].km_Stand) AS Mink " & _
"FROM Fahrzeugstammdaten INNER JOIN [km-Tabelle] ON Fahrzeugstammdaten.Fahrzeug_ID = [km-Tabelle].Fahrzeug_ID WHERE [km-Tabelle].KM_datum Between " & datum1 & " AND " & datum2 & _
"GROUP BY [km-Tabelle].Fahrzeug_ID;) " & _[/B]
"GROUP BY Fahrzeugstammdaten.Kennzeichen, Fahrzeugstammdaten.EZ, Fahrzeugstammdaten.Abmeldung, " & _
"Fahrzeugtypen.Hersteller, Fahrzeugtypen.Typenbezeichnung,Kostenart.Kostengruppenbezeichnung, LL_Parameter.LL, LLGesamt.Maxkm " & _
"HAVING Fahrzeugstammdaten.Kennzeichen Like '" & [Forms]![ÜbersichtKostenanalyse]![txtSuchenAKZ] & "' AND Fahrzeugtypen.Hersteller Like '" & [Forms]![ÜbersichtKostenanalyse]![txtsuchenFab] & "' AND Fahrzeugtypen.Typenbezeichnung Like '" & [Forms]![ÜbersichtKostenanalyse]![txtSuchenTYP] & "' AND Kostenart.Kostengruppenbezeichnung Like '" & [Forms]![ÜbersichtKostenanalyse]![txtsuchenArt] & "' OR Fahrzeugtypen.Hersteller Is Null AND Fahrzeugtypen.Typenbezeichnung Is Null;"


Ergänzung: Die Unterabfrage soll mir die Laufleistung aus der Kilometertabelle zu jedem Fahrzeug in Abhängigkeit des Zeitraums liefern

Kann mir geholfen werden?
Gruss

Claus33
24.03.2006, 10:24
Habe oben die Frage noch näher ergänzt

Claus33
25.03.2006, 15:17
Bitte helft mir :(

Arne Dieckmann
25.03.2006, 15:24
Auf den ersten Blick fehlen mehrere Leerzeichen: Hinter dem zweiten Datum (oder am Anfang der darauffolgenden Zeile) und bei diversen anderen Zeilen.

Claus33
25.03.2006, 15:48
Danke Arne das Du mal drüberschaust,

Ich bin nicht so fit in SQL und habe mittels der Entwurfsabfrage das SQL Satement aufgebaut. Mit der Zeichensetzung habe ich immer meine Schwierigkeiten.

Bitte korrigiere mich wenn ich was falsches sage:

Vor Zeilenumbrüchen kommt ein Leerzeichen gefolgt von einem & einem weiteren Leerzeichen und einem Unterstrich

Am Anfang jeder Zeile steht ein "

Die Abfrage ohne die Sache mit der Unterabfrage funktioniert. Ich weiss nicht wie ich die Unterabfrage mit der Hauptabfrage verbinde und gleichzeitig das Filterkriterim aus dem Formular richtig einsetze.

Gruss
Claus

Arne Dieckmann
25.03.2006, 15:52
Bitte korrigiere mich wenn ich was falsches sage:

Vor Zeilenumbrüchen kommt ein Leerzeichen gefolgt von einem & einem weiteren Leerzeichen und einem Unterstrich

Am Anfang jeder Zeile steht ein "
Das ist alles korrekt. Allerdings musst du dafür sorgen, dass der zusammengesetzte String nachher richtig aussieht. Aus
strSQL="SELECT A,B" & _
"FROM Tabelle"
wird "SELECT A,BFROM Tabelle"

Richtig sieht's dann so aus:
strSQL="SELECT A,B " & _
"FROM Tabelle"

Claus33
25.03.2006, 16:02
ok verstehe, werde das mal überarbeiten.

Danke zunächst einmal

Gruss
Claus

Claus33
25.03.2006, 16:18
Irgendwie kriege ich das beim Datum nicht hin

And Rechnung.Reparaturdatum Between " & datum1 & " AND " & datum2 " & _

Hier kommt jedesmal : erwartet Anweisungsende

Wie mus das dort richtigerweise aussehen?

Claus33
25.03.2006, 16:25
Habe es doch noch hinbekommen,
aber das Problem mit den fehlenden Parametern in der Unterabfrage hat das nix geändert.

Die Frage ist: Wie bekomme ich die Parameter vom Formular in die Unterabfrage so dass die Hauptabfrage darauf zugreifen kann