Dezember 07, 2021, 13:52:34

Neuigkeiten:

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


Access VBA Abfrage erstellen für Filterung eines Berichtes

Begonnen von lennard1001, Oktober 17, 2021, 18:59:44

⏪ vorheriges - nächstes ⏩

lennard1001

Hi,

Ich habe in meiner Datenbank ein Formular, mit dem die Datensätze (Prüfungsfragen) nach bis zu 3 verschiedenen Kriterien gefiltert werden können.
Bislang habe ich 8 Verschiedene Abfragen + Berichte und eine 8-Fache If-Verkettung fragt anhand der ausgefüllten Kriterienfelder ab, welcher Bericht benötigt wird. Sollte ich jedoch noch weitere Kriterien hinzufügen, würde die Anzahl an kombinationsmöglichkeiten zu groß für diesen Lösungsweg werden.

Nun Versuche ich nur einen Bericht zu erstellen, der auf eine Abfrage zugreift, die dynamisch angelegt wird, je nachdem welche Kriterien angewählt werden.
Ich dachte ich könnte je Filterkriterium einen Textbaustein erstellen, die ich im VBA zusammensetzte.
Hier komme ich jedoch nicht weiter, da der "FROM-Teil" im SQL in inneren Klammern verkettet wird, die sich nicht einfach so zusammensetzen lassen...

Hat jemand eine Idee ob und wie ich das gelöst bekomme?

PhilS

Zitat von: lennard1001 am Oktober 17, 2021, 18:59:44Bislang habe ich 8 Verschiedene Abfragen + Berichte und eine 8-Fache If-Verkettung fragt anhand der ausgefüllten Kriterienfelder ab, welcher Bericht benötigt wird.
[...]
Nun Versuche ich nur einen Bericht zu erstellen, der auf eine Abfrage zugreift, die dynamisch angelegt wird, je nachdem welche Kriterien angewählt werden.
Ich habe den Verdacht, dass du hier nicht auf den richtigen Weg bist.

Worin unterscheiden sich denn die 8 verschiedenen Abfragen und Berichte?

Vielleicht wäre es hilfreich, wenn du mal exemplarisch das SQL von 2 dieser verschiedenen Abfragen hier posten würdest.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

Beaker s.a.

Und ein Bild des Beziehungsfensters. Ein Blick auf das Datenmodell
könnte nützlich für eine Hilfe sein.
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

lennard1001

Hi,

dass die If-Verkettung stümperhaft ist, war mir klar, aber besser konnte ich es bislang nicht und funktioniert hat es ja erstmal.

Hier ein Bild des Formulars, mit dem bislang der passende Bericht rausgesucht wird.: https://ibb.co/nj3XKLN
(für jede kombinationsmöglichkeit gibt es einen gleichartigen Bericht, der auf die passende Abfrage zugreift.)

Und hier ein Bild der Abfrage, für den Fall das nach allen drei Kriterien gefiltert wird.:https://ibb.co/RT9P79Z
Hier sind ja auch die relevanten Beziehungen und der Aufbau zu erkennen.
Hier z.B. eine Abfrage, wenn nur nach einem Kriterium gefiltert werden soll.: https://ibb.co/dGy9zTw

Folgenden Code habe ich mit Hilfe des Internets gebastelt.
Damit kann ich den Kern der Abfrage schon erzeugen.

Private Sub cmdBerichtErstellen_Click()

Dim queryZFrage As DAO.QueryDef
Dim strSQL As String

'Abfrageelemente für Ausbildungsstand
Dim strA As String
strA = ""
  'Abfrage löschen falls vorhanden
  If DCount("*", "MsysObjects", "Name='qryZFrage' And Type = 5") > 0 Then
    DoCmd.DeleteObject acQuery, "qryZFrage"
  End If
  'Abfrage erstellen
  Set queryZFrage = CurrentDb().CreateQueryDef("qryZFrage") 'für Abfrage
  strSQL = _
  "SELECT tblFrage.FrageID, tblFrage.Frage, tblFrage.Antwort, tblFrage.Löschvermerk" & _
  " FROM tblFrage" & _
  " WHERE (((tblFrage.Löschvermerk)=No))" & _
  " ORDER BY tblFrage.FrageID;"
  
  queryZFrage.SQL = strSQL
  Set queryZFrage = Nothing
 
End Sub

Leider kenne ich mich mit SQL nicht gut genug aus.
Die Inner Joins auf tblFrage werden alle ineinander verschachtelt und lassen sich soweit ich das erkennen kann nicht einfach aneinander setzten...

Hier noch der das SQL Beispiel zur Abfrage mit allen drei Kriterien:
SELECT tblFrage.FrageID, tblFrage.Frage, tblFrage.Antwort, tblSchlagwort.Schlagwort, lstThemengebiet.Themengebiet, lstAusbildungsstand.Ausbildungsstand, tblSchlagwort.SchlagwortID, lstAusbildungsstand.AusbildungsstandID, lstThemengebiet.ThemengebietID
FROM tblSchlagwort INNER JOIN (((lstAusbildungsstand INNER JOIN tblFrage ON lstAusbildungsstand.AusbildungsstandID = tblFrage.AusbildungsstandFK) INNER JOIN tblVerbindungSchlagwortFrage ON tblFrage.FrageID = tblVerbindungSchlagwortFrage.FrageFK) INNER JOIN (lstThemengebiet INNER JOIN tblVerbindungThemengebietFrage ON lstThemengebiet.ThemengebietID = tblVerbindungThemengebietFrage.ThemengebietFK) ON tblFrage.FrageID = tblVerbindungThemengebietFrage.FrageFK) ON tblSchlagwort.SchlagwortID = tblVerbindungSchlagwortFrage.SchlagwortFK
WHERE (((tblSchlagwort.SchlagwortID)=[Formulare]![frmZusammenstellungFrage]![cboSchlagwort]) AND ((lstAusbildungsstand.AusbildungsstandID)<=[Formulare]![frmZusammenstellungFrage]![cboAusbildungsstand]) AND ((lstThemengebiet.ThemengebietID)=[Formulare]![frmZusammenstellungFrage]![cboThemengebiet]) AND ((tblFrage.Löschvermerk)=No))
ORDER BY tblFrage.FrageID;

MzKlMu

Oktober 18, 2021, 19:31:24 #4 Letzte Bearbeitung: Oktober 18, 2021, 20:16:48 von MzKlMu
Hallo,
das gleichzeitige Posten der gleichen Frage in mehreren Foren ist unerwünscht. Kann in den Forenregeln nachgelesen werden.
Zumindest sollte es einen Link geben wenn man schon mehrere Foren beschäftigt.

https://www.ms-office-forum.net/forum/showthread.php?t=377350
Gruß
Klaus

lennard1001

Ok, das wusste ich nicht,
aber ich möchte doch auch möglichst jemanden erreichen der mir weiterhilft, da ist es doch nur logisch es in mehreren Foren zu versuchen...

MzKlMu

Hallo,
nein, im allgemeinen ist es in fast allen Foren unerwünscht.
Bei Access speziell ist eher nutzlos, denn es sind die gleichen Leute auf die du triffst.
Gruß
Klaus