Hallo zusammen,
ich habe mal wieder eine kleine Frage bzgl. meines vba codes, welcher eine SQL-Abfrage generiert. Ich versuche hier zwei Mal "AND" einzubinden. Die ersten vier Zeilen des SQL Strings scheinen wunderbar zu funktionieren. Mir wird immer eine entsprechende SQL Abfrage erstellt die dann bspw. "qry_ktg1_ktg2_ktg3" heißt. Leider wird aber die letzte Bedingung nicht berücksichtigt, d.h. der letzte AND Satz wird nicht miteinbezogen.
Da der Rest wunderbar funktioniert, gehe ich stark davon aus, dass es an einem Notationsfehler liegt, den ich aber grade selbst nicht finden kann. Ich tippe auf die Klammern, da ich mir nicht sicher war, wie man zwei AND Satzteile zusammen mit mehreren OR Bedingungen verbindet.
Hier der Code:
Set qd = CurrentDb().CreateQueryDef("qry_" & ktg1 & "_" & ktg2 & "_" & ktg3)
strSQL = "SELECT [Vorname], [Nachname], [E-Mail]" & _
"FROM tbl_Kontakte " & _
"WHERE Kategorie1 = '" & ktg1 & "' OR Kategorie2 = '" & ktg1 & "' OR Kategorie3 = '" & ktg1 & "' OR Kategorie4 = '" & ktg1 & _
"' AND (Kategorie1 = '" & ktg2 & "' OR Kategorie2 = '" & ktg2 & "' OR Kategorie3 = '" & ktg2 & "' OR Kategorie4 = '" & ktg2 & "') " & _
"AND (Kategorie1 = '" & ktg3 & "' OR Kategorie2 = '" & ktg3 & "' OR Kategorie3 = '" & ktg3 & "' OR Kategorie4 = '" & ktg3 & "');"
qd.SQL = strSQL
Set qd = Nothing
DoCmd.OpenQuery ("qry_" & ktg1 & "_" & ktg2 & "_" & ktg3)
Würde mich über eure Hilfe freuen. Vielen Dank!
Grüße
Manu
Bei der Logikumsetzung muss man beachten, dass AND mehr bindet als OR. Also müsste man OR-Ketten extra klammern, die erste ist es nicht.
Insgesamt weist die ganze Kaskade darauf hin, dass da Strukturreserven vorliegen.
In einer normalisierten Struktur (EIN Feld Kategorie statt 4) würde eine UND-Verknüpfung von mehreren Werten etwa so aussehen:
SELECT
ID
FROM
tbl_Kontakte
WHERE
Kategorie IN ('A', 'D', 'F')
GROUP BY
ID
HAVING
COUNT(*) = 3
Hallo Eberhard,
vielen Dank erstmal für die Antwort.
Zitat von: ebs17 am Januar 15, 2021, 15:07:59Bei der Logikumsetzung muss man beachten, dass AND mehr bindet als OR. Also müsste man OR-Ketten extra klammern, die erste ist es nicht.
Wie kann ich das verstehen? Muss jedes OR Argument nochmal extra geklammert werden? Wie würde das in meinem Fall aussehen?
Zitat von: ebs17 am Januar 15, 2021, 15:07:59Insgesamt weist die ganze Kaskade darauf hin, dass da Strukturreserven vorliegen.
Sorry für meine Unverständnis, was kann ich unter Strukturreserven verstehen?
Kurz zur Erklärung des Vorgehens: Die Variablen ktg1, ktg2, ktg3, und ktg4 bezeichnen den Inhalt und von vier Feldern in einem Formular. In der zugrundeliegenden Tabelle tbl_Kontakte, gibt es vier Spalten mit Kategorien. Demnach hat der User die Möglichkeit bis zu vier Kategorien pro Kontakt festzulegen.
Anschließend wird durch die Felder im Formular und den obigen Code eine Abfrage erstellt, in der genau die Personen ausgesucht werden, bei denen die gewählte Kombination an Kategorien zutrifft. Dabei kann die Konstellation also die Reihenfolge in der die Felder im Formular angegeben werden variieren.
Deswegen muss bspw. geschaut werden ob der Wert von dem Feld ktg1 in einer der vier Spalten der Tabelle zu finden ist. Anschließend passiert dasselbe eben mit ktg2,3,4.
Letztendlich muss ich die Bedingungen logisch so verknüpfen, dass nach Bedingung 1 UND Bedingung 2,3,4 gesucht wird.
Eventuell ist das alles etwas überkompliziert gedacht, aber der Code funktioniert wie gesagt bis zur vierten Zeile, dabei wird alles nach dem zweiten AND leider nicht berücksichtigt.
Freue mich weiterhin über eure Hilfe!
Zitatvier Spalten mit Kategorien. Demnach hat der User die Möglichkeit bis zu vier Kategorien pro Kontakt festzulegen
Das ist strukturell ein Fehler. SQL arbeitet datensatzorientiert (zeilenorientiert). Daher sind gleiche Inhalte in mehreren Feldern (Spalten) schon mal ungünstig, fixiert dann auch in Normalisierungsregeln.
Daher sind Aufzählungsspalten in Datensätze (=> zusätzliche Tabelle) aufzulösen.
Gleichlautend liegt auch ein systematischer Fehler vor: Wenn die Anforderungen steigen - und wer funktionierende Anwendungen über mehrere Jahre kennt, erlebt das - und somit zusätzliche Kategoriezuweisungen benötigt werden, hast Du das Problem, ggf. eine völlige Neuprogrammierung einleiten zu müssen. Das ist um so schmerzhafter, je umfangreicher man sein Projekt vorangetrieben hat. Dafür sind dann regelmäßig nicht ausreichend Wille, Zeit und Geld vorhanden ...
Systematisch richtig wäre eine m:n-Beziehung zwischen Kontakt und Kategorie. Davon leiten sich dann auch zielführende Abfragen und zu verwendende Formulare und Gestaltungen ab.