Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Unterabfragen Variabel in VBA

Begonnen von gino79, August 25, 2010, 17:49:42

⏪ vorheriges - nächstes ⏩

gino79

Hallo Kollegen,

ich mache aus 3 Abfragen, 1 Abfrage (Leider schwer anders möglich, da ich 3 verschieden Datenquellen habe die ich schwer zusammen fassen kann)

Meine Abgrenzungen (Datum und andere Kriterien) möchte ich gerne in den Unterabfragen machen und die Laufzeiten zu veringern.
Wie kann ich nun meine Datumsabgrenzung (Felder lese ich dann aus dem Formular aus) in meine Unterabfrage einbauen.

Kann ich einfach die 3 Abfragen in VBA eingeben und meine Endabfrage als Quelle die 3 Variablen geben:
Also so ähnlich

SQL1 = "Select....
SQL2 = "Select....
SQL3 = "Select....
SQLHaupt= "Select name.sql1, name.sql2, name.sql3 from..... ?

Gruß gino

oma

Hallo,

Zitatich mache aus 3 Abfragen, 1 Abfrage (Leider schwer anders möglich, da ich 3 verschieden Datenquellen habe die ich schwer zusammen fassen kann)

Und wie sieht die Abfrage aus?

ZitatMeine Abgrenzungen (Datum und andere Kriterien) möchte ich gerne in den Unterabfragen machen und die Laufzeiten zu veringern.

und warum sollte die Abfrage mit Unterabfragen schneller sein? das wage ich zu bezweifeln!

Gruß Oma
nichts ist fertig!

gino79

Hallo Oma,

ich vermute das Access bei der Hauptabfrage zuviel rechnen muss und deswegen ewig die Abfrage ausführt. Mit den Unterabfragen geht das viele schneller.

Es gibt 3 Datenquellen: Bestand, Verkauf, Einkauf
Aus diesen 3 Quellen benötige ich Mittelwerte und Anzahlen für ein Diagramm.

So hatte ich es zunächst probiert, Datum möchte ich nacher per Formular übergeben und ich benötige je Modell eine Abfrage (die Abfrage wird einem Diagramm übegeben):

SELECT [Standtage] & "           " & [Altergruppe] AS [Alter und Standtage], Count(D_VKEKAL_B.ID) AS AnzahlvonID1, Avg(D_VKEKAL_B.AuszeichnungspreisAktuell) AS MittelwertvonAuszeichnungspreisAktuell, Count(D_VKEKAL_V.ID) AS AnzahlvonID, Avg(D_VKEKAL_V.Verkaufspreis) AS MittelwertvonVerkaufspreis, Count(D_VKEKAL_E.ID) AS AnzahlvonID2
FROM D_VKEKAL_E RIGHT JOIN ((Altersgruppen LEFT JOIN D_VKEKAL_B ON Altersgruppen.Altersgruppe_Sort = D_VKEKAL_B.Sort_B) LEFT JOIN D_VKEKAL_V ON Altersgruppen.Altersgruppe_Sort = D_VKEKAL_V.Sort_V) ON D_VKEKAL_E.Sort_B = Altersgruppen.Altersgruppe_Sort
WHERE (((D_VKEKAL_B.KosyModelle)="fiesta")) OR (((D_VKEKAL_V.Auslieferungsdatum) Between #7/22/2010# And #7/29/2010#) AND ((D_VKEKAL_V.KosyModelle)="fiesta")) OR (((D_VKEKAL_E.HE) Between #7/22/2010# And #7/29/2010#) AND ((D_VKEKAL_E.KosyModelle)="fiesta"))
GROUP BY [Standtage] & "           " & [Altergruppe], Altersgruppen.Altersgruppe_Sort
ORDER BY Altersgruppen.Altersgruppe_Sort;

Alter und Standtage wird bei mir die x-Achse, und die 2. Mittelwerte und 3 Anzahlen werden meine Datenreihen.
Diese Abfrage breche ich nach 10 Minuten ab.

Wenn ich nun die Mittelwerte und Anzahlen bereits in den Unterabfragen ausführe und in der Hauptabfrage die Werte nur zusammne füge, geht das halt irgentwie deutlich schneller. Nur wie bekomme ich dann das Modell und das Datum vor jeder Hauptabfrage neu rein?

Hier auch mal eine andere, die geht halt schneller bisher:

Hier mal eine von 3 Unterabfragen:

SELECT IIf(DateDiff("m",[erstzulassung],Date())<=6,"A < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12,"B < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24,"C < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36,"D < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48,"E < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60,"F < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72,"G < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84,"H < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96,"I < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108,"J < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120,"K < 120 Monate","L > 120 Monate"))))))))))) AS Sort_V, IIf(DateDiff("m",[erstzulassung],Date())<=6," < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12," < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24," < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36," < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48," < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60," < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72," < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84," < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96," < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108," < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120," < 120 Monate"," > 120 Monate"))))))))))) AS Altersgruppe, Count(Modelle.ID) AS AnzahlvonID, Avg(Modelle.Verkaufspreis) AS MittelwertvonVerkaufspreis
FROM Modelle
WHERE (((Modelle.Auslieferungsdatum) Between [ALDatum1] And [ALDatum2]) AND ((Modelle.KosyModelle)=[Modellname_V]))
GROUP BY IIf(DateDiff("m",[erstzulassung],Date())<=6,"A < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12,"B < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24,"C < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36,"D < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48,"E < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60,"F < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72,"G < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84,"H < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96,"I < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108,"J < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120,"K < 120 Monate","L > 120 Monate"))))))))))), IIf(DateDiff("m",[erstzulassung],Date())<=6," < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12," < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24," < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36," < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48," < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60," < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72," < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84," < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96," < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108," < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120," < 120 Monate"," > 120 Monate")))))))))));

Hier jetzt die dazugehörige Hauptabfrage:

SELECT [Standtage] & "           " & [Altergruppe] AS [Alter und Standtage], D_VKEKAL_B.AnzahlvonID, D_VKEKAL_B.MittelwertvonAuszeichnungspreisAktuell, D_VKEKAL_B.MittelwertvonStandtage, D_VKEKAL_V.AnzahlvonID, D_VKEKAL_V.MittelwertvonVerkaufspreis, D_VKEKAL_E.AnzahlvonID
FROM D_VKEKAL_E RIGHT JOIN ((Altersgruppen LEFT JOIN D_VKEKAL_B ON Altersgruppen.Altersgruppe_Sort = D_VKEKAL_B.Sort_B) LEFT JOIN D_VKEKAL_V ON Altersgruppen.Altersgruppe_Sort = D_VKEKAL_V.Sort_V) ON D_VKEKAL_E.Sort_B = Altersgruppen.Altersgruppe_Sort
GROUP BY [Standtage] & "           " & [Altergruppe], D_VKEKAL_B.AnzahlvonID, D_VKEKAL_B.MittelwertvonAuszeichnungspreisAktuell, D_VKEKAL_B.MittelwertvonStandtage, D_VKEKAL_V.AnzahlvonID, D_VKEKAL_V.MittelwertvonVerkaufspreis, D_VKEKAL_E.AnzahlvonID, Altersgruppen.Altersgruppe_Sort
ORDER BY Altersgruppen.Altersgruppe_Sort;

Bei dieser Variante ist halt die Frage, wie ich die Parameter per VBA vorher immer fülle?

Danke für die Hilfe

Fruß Gino

oma

nichts ist fertig!

gino79

Ich habe es gemerkt, war aber garnicht Böse gemeint. Habe mir da nichts bei gedacht, habe mich deshalb jetzt auf eure Seite  beschränkt.

gino79

Wenn ihr mir noch helfen mögt:

Hier nochmal die 3 Unterabfragen:

Bestand:
SELECT IIf(DateDiff("m",[erstzulassung],Date())<=6,"A < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12,"B < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24,"C < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36,"D < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48,"E < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60,"F < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72,"G < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84,"H < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96,"I < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108,"J < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120,"K < 120 Monate","L > 120 Monate"))))))))))) AS Sort_B, IIf(DateDiff("m",[erstzulassung],Date())<=6," < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12," < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24," < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36," < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48," < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60," < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72," < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84," < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96," < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108," < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120," < 120 Monate"," > 120 Monate"))))))))))) AS Altersgruppe, Count(Modelle_B.ID) AS AnzahlvonID, Avg(Modelle_B.AuszeichnungspreisAktuell) AS MittelwertvonAuszeichnungspreisAktuell, Avg(Modelle_B.Standtage) AS MittelwertvonStandtage
FROM Modelle_B
WHERE (((Modelle_B.KosyModelle)=[Modellname_B]))
GROUP BY IIf(DateDiff("m",[erstzulassung],Date())<=6,"A < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12,"B < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24,"C < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36,"D < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48,"E < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60,"F < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72,"G < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84,"H < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96,"I < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108,"J < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120,"K < 120 Monate","L > 120 Monate"))))))))))), IIf(DateDiff("m",[erstzulassung],Date())<=6," < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12," < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24," < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36," < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48," < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60," < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72," < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84," < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96," < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108," < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120," < 120 Monate"," > 120 Monate")))))))))));

Verkauf:

SELECT IIf(DateDiff("m",[erstzulassung],Date())<=6,"A < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12,"B < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24,"C < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36,"D < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48,"E < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60,"F < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72,"G < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84,"H < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96,"I < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108,"J < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120,"K < 120 Monate","L > 120 Monate"))))))))))) AS Sort_V, IIf(DateDiff("m",[erstzulassung],Date())<=6," < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12," < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24," < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36," < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48," < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60," < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72," < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84," < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96," < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108," < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120," < 120 Monate"," > 120 Monate"))))))))))) AS Altersgruppe, Count(Modelle.ID) AS AnzahlvonID, Avg(Modelle.Verkaufspreis) AS MittelwertvonVerkaufspreis
FROM Modelle
WHERE (((Modelle.Auslieferungsdatum) Between [ALDatum1] And [ALDatum2]) AND ((Modelle.KosyModelle)=[Modellname_V]))
GROUP BY IIf(DateDiff("m",[erstzulassung],Date())<=6,"A < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12,"B < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24,"C < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36,"D < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48,"E < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60,"F < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72,"G < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84,"H < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96,"I < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108,"J < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120,"K < 120 Monate","L > 120 Monate"))))))))))), IIf(DateDiff("m",[erstzulassung],Date())<=6," < 06 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=12," < 12 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=24," < 24 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=36," < 36 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=48," < 48 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=60," < 60 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=72," < 72 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=84," < 84 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=96," < 96 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=108," < 108 Monate",IIf(DateDiff("m",[erstzulassung],Date())<=120," < 120 Monate"," > 120 Monate")))))))))));


Einkauf:

SELECT D_VKEKAL_Alle.Sort_B, Count(D_VKEKAL_Alle.ID) AS AnzahlvonID
FROM D_VKEKAL_Alle
WHERE (((CDate([HereinnahmeDatum])) Between [HEDATUM1] And [HEDATUM2]) AND ((D_VKEKAL_Alle.KosyModelle)=[Modellname_E]))
GROUP BY D_VKEKAL_Alle.Sort_B;

Hauptabfrage:

SELECT [Standtage] & "           " & [Altergruppe] AS [Alter und Standtage], D_VKEKAL_B.AnzahlvonID, D_VKEKAL_B.MittelwertvonAuszeichnungspreisAktuell, D_VKEKAL_B.MittelwertvonStandtage, D_VKEKAL_V.AnzahlvonID, D_VKEKAL_V.MittelwertvonVerkaufspreis, D_VKEKAL_E.AnzahlvonID
FROM D_VKEKAL_E RIGHT JOIN ((Altersgruppen LEFT JOIN D_VKEKAL_B ON Altersgruppen.Altersgruppe_Sort = D_VKEKAL_B.Sort_B) LEFT JOIN D_VKEKAL_V ON Altersgruppen.Altersgruppe_Sort = D_VKEKAL_V.Sort_V) ON D_VKEKAL_E.Sort_B = Altersgruppen.Altersgruppe_Sort
GROUP BY [Standtage] & "           " & [Altergruppe], D_VKEKAL_B.AnzahlvonID, D_VKEKAL_B.MittelwertvonAuszeichnungspreisAktuell, D_VKEKAL_B.MittelwertvonStandtage, D_VKEKAL_V.AnzahlvonID, D_VKEKAL_V.MittelwertvonVerkaufspreis, D_VKEKAL_E.AnzahlvonID, Altersgruppen.Altersgruppe_Sort
ORDER BY Altersgruppen.Altersgruppe_Sort;

Gruß Gino

gino79

Möchte die Favorisierte Lösung trotzdem mal hierein posten. Der Nachfolgende Code hatte mir sehr gut geholfen. So konnte ich ganz bequem meine Variablen aus dem Formular in die SQl-Anweisung einbauen.

Dim db AS DAO.Database
Dim strSQL As String

Set db = CurrentDb()

strSQL = "SELECT ......"
db.QueryDefs("DeineErsteAbfrage").SQL = strSQL

strSQL = "SELECT ......"
db.QueryDefs("DeineZweiteAbfrage").SQL = strSQL

strSQL = "SELECT ......"
db.QueryDefs("DeineDritteAbfrage").SQL = strSQL

Set db = Nothing

Trotzdem Danke für die Mühen, weiss ja jetzt was die Helfer nicht mögen  ;)

Gruß Gino

MzKlMu

Hallo,
ZitatEs gibt 3 Datenquellen: Bestand, Verkauf, Einkauf
da liegt bereits der grundsätzliche Fehler.
Das sollte alles in einer Tabelle sein. Die Menge für den Einkauf positiv die Menge für den Verkauf negativ. Der Bestand ergibt sich dann aus der Summe der Mengen.
Auf eine Tabelle für den Bestand kann verzichtet werden.
Betände werden aus den Mengen immer errechnet und nie in einer Tabelle geführt.
Gruß Klaus