Neuigkeiten:

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

Mobiles Hauptmenü

SQL-Abfrage in VBA, Werte an Variablen übergeben

Begonnen von Lkwjoe, Mai 20, 2019, 10:29:06

⏪ vorheriges - nächstes ⏩

Lkwjoe

Hallo zusammen,
auf der Suche nach Lösungen bin ich über Euer Forum gestolpert und hoffe, Ihr könnt mir ein wenig weiter helfen.
Vorab: habe früher viel mit PHP und mySQL gearbeitet, mit VBA in Access eigentlich noch gar nicht, suche mir daher gerade alles zusammen.

Was will ich mit der Abfrage erreichen:
- die Aufträge und deren zeitliche Bewertung von zwei Kunden werden in einer Tabelle (tblAuftraege) gespeichert
- zur Abrechnung soll "mit einem Klick" ausgelesen werden können, wieviele Aufträge hat man jeweils von KundeA und KundeB erhalten und wie wurden diese zeitlich bewertet
- die Kunden sind eindeutig über die Auftragsnummern zu unterscheiden
- der gewünschte Zeitraum (Monat, Jahr) wird über ein Listenfeld ('AuswZeitraum') im Bericht ausgewählt und dann an VBA übergeben

So sieht das bisher aus:Private Sub AuswZeitraum_AfterUpdate()
  If Not IsNull(Me!AuswZeitraum) Then
    Dim AuswJahr As String
    Dim AuswMonat As String
    Dim AlphaMonat As String
    AuswJahr = Left(Me!AuswZeitraum.Column(0), 4)
    AuswMonat = Right(Me!AuswZeitraum.Column(0), 2)

    Me.RecordSource = _
    "SELECT DISTINCT Sum(Bewertung) AS [SummeBewertungKundeA], Count(*) AS [SummeAuftraegeKundeA] " & _
    "FROM tblAuftraege " & _
    "WHERE AuftragNr Like 'YAP5*' AND ((Format$([Freigabedatum],'mm'))=" & AuswMonat & ") AND (([Bewertung])>0) AND (([Freigabe])=True); " & _
    "UNION " & _
    "SELECT DISTINCT Sum(Bewertung) AS [SummeBewertungKundeB], Count(*) AS [SummeAuftraegeKundeB] " & _
    "FROM tblAuftraege " & _
    "WHERE AuftragNr Like 'YAP6*' AND ((Format$([Freigabedatum],'mm'))=" & AuswMonat & ") AND (([Bewertung])>0) AND (([Freigabe])=True);"

    Me!BewertungKundeA.ControlSource = "SummeBewertungKundeA"
    Me!AnzahlAuftraegeKundeA.ControlSource = "SummeAuftraegeKundeA"

    Me!BewertungKundeB.ControlSource = "SummeBewertungKundeB"
    Me!AnzahlAuftraegeKundeB.ControlSource = "SummeAuftraegeKundeB"

End Sub

Mit nur einer Abfrage funktioniert das problemlos, nach Klick auf den gewünschten Monat/Jahr im Listenfeld erscheinen die entsprechenden Werte im Bericht.

Versuche ich das Ganze mit der zweiten Abfrage für den zweiten Kunden, dann bekomme ich die Meldung "Parameterwert eingeben" "SummeBewertungKundeB".

Die Abfrage kommt also nicht weiter weil ein Parameter fehlt. Dieser ist aber doch vorgegeben in der Variable "AuswMonat"... Habe es auch schon mit einem festen Wert anstelle der Variablen probiert, gleicher Fehler.

Das "RecordSource" habe ich aus einem Beispiel übernommen.
Mache ich evtl. etwas grundlegendes falsch?

Freue mich über jede Hilfe! :)

Grüße, Joe

MzKlMu

Hallo,
wozu brauchst Du hier eine Unionabfrage ?
Du musst doch nur eine Abfrage über den Kunden gruppieren, dann siehst Du in einer Abfrage in 2 Zeilen deren Anzahl an Aufträgen für den gewünschten Zeitraum.

Zeige mal ein Bild es Beziehungsfensters ?
Gruß Klaus

Lkwjoe

Hallo MzKlMu,
Zitat von: MzKlMu am Mai 20, 2019, 10:38:20wozu brauchst Du hier eine Unionabfrage ?
Du musst doch nur eine Abfrage über den Kunden gruppieren, dann siehst Du in einer Abfrage in 2 Zeilen deren Anzahl an Aufträgen für den gewünschten Zeitraum.
Stimmt eigentlich, habe mich da wohl in etwas "verannt"... Probiere ich mal aus, melde mich dann wieder!

Zitat von: MzKlMu am Mai 20, 2019, 10:38:20Zeige mal ein Bild es Beziehungsfensters ?
Ich hab nur eine Tabelle...
Grüße, Joe

PhilS

Zitat von: Lkwjoe am Mai 20, 2019, 10:29:06
Versuche ich das Ganze mit der zweiten Abfrage für den zweiten Kunden, dann bekomme ich die Meldung "Parameterwert eingeben" "SummeBewertungKundeB".
Ob eine Union-Abfrage hier tatsächlich sinnvoll ist, halte ich auch eher für fragwürdig.
Davon abgesehen, die Namen der Ausgabespalten werden bei einer Union-Abfrage nur über das erste Select-Statement definiert. Eine Spalte SummeBewertungKundeB gibt es somit nicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Lkwjoe

Hallo zusammen,

vielen Dank für Euren Denkanstoss!
Habe das Ganze jetzt mit DAO-Recordsets umgesetzt, funktioniert wie gewünscht.

Grüße, Joe

MzKlMu

Hallo,
das DAO Recordset war aber in den Denkanstößen nicht enthalten. Das dürfte genau so überflüssig sein wie die Union.
Gruß Klaus

ebs17

ZitatFreue mich über jede Hilfe!
Ein Kern des Problems: Die Tabellenstruktur.
WHERE AuftragNr Like 'YAP5*'

Wenn man hier einen zusätzlichen Normalisierungsschritt einführt und die farbig gekennzeichnete atomare Information in ein eigenes Feld selektiert, kann man einfach über dieses Feld gruppieren und hätte eine sehr simple Abfrage.

Ansonsten:
Die Kombination von DISTINCT und Aggregaten wirkt sehr merkwürdig.

... AND Format$([Freigabedatum],'mm')=" & AuswMonat & " ...
Der Umgang mit Datentypen ist sehr unsauber (Fehlerquelle).
Mit freundlichem Glück Auf!

Eberhard