Neuigkeiten:

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

Mobiles Hauptmenü

Abfrage liefert falsche Werte

Begonnen von derilzemer, Januar 01, 2025, 15:36:00

⏪ vorheriges - nächstes ⏩

derilzemer

Hallo,

zuerst allen alles gute im Neuen Jahr 2025!
Was kann man am 1.1. schon gleich für Probleme haben in Abfragen?

Über einen Bericht lass ich mir bestimmte Datensätze ausgeben. Die Felder die im Bericht als Grundlage dienen sind in tblQuartette & tblQuKarten das Feld Druckdatum. Hier ein Screenshot der Abfrage
Sie dürfen in diesem Board keine Dateianhänge sehen.
Der sql-Query zur aktuell funktionale Abfrage:
SELECT tblVerlag.Verlag, tblSpiele.SpielID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, tblSpiele.SpTitel, [QuartettKz] & [KartenNr] AS Karte, tblQuKarten.Druckdatum
FROM tblVerlag INNER JOIN ((tblSpiele INNER JOIN tblQuartette ON tblSpiele.[SpielID] = tblQuartette.[SpielID_F]) INNER JOIN tblQuKarten ON tblQuartette.[QuartettID] = tblQuKarten.[QuartettID_F]) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F
WHERE (((tblVerlag.Verlag) Like [Welcher Verlag soll es sein (Platzhalter wie * ist moeglich)]) AND ((tblQuKarten.Druckdatum) Is Not Null))
ORDER BY tblSpiele.Ausgabejahr;

Aktuell habe ich in der tblQuKarten nur 3 Felder mit einem aktiven Druckdatum gepflegt, die durch die Abfrage auch gefunden werden. Aber in tblSpiele gibt es aber ebenfalls noch das Feld Druckdatum in Form eines Kontrollkästchen/Checkbox. Da sind 290 Datensätze "markiert". Genau dieses Feld wollte ich jetzt in der Abfrage integrieren
Sie dürfen in diesem Board keine Dateianhänge sehen.
Im SQL-Query dachte ich zuerst, dass ich lediglich eine OR-Verknüpfung hinzufügen muss, sodass es der SQL-Query so aussieht
SELECT tblVerlag.Verlag, tblSpiele.SpielID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, tblSpiele.SpTitel, [QuartettKz] & [KartenNr] AS Karte, tblQuKarten.Druckdatum, tblSpiele.Druckdatum
FROM tblVerlag INNER JOIN ((tblSpiele INNER JOIN tblQuartette ON tblSpiele.[SpielID] = tblQuartette.[SpielID_F]) INNER JOIN tblQuKarten ON tblQuartette.[QuartettID] = tblQuKarten.[QuartettID_F]) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F
WHERE (((tblVerlag.Verlag) Like [Welcher Verlag soll es sein (Platzhalter wie * ist moeglich)]) AND ((tblQuKarten.Druckdatum) Is Not Null) OR ((tblSpiele.Druckdatum) Is Not Null))
ORDER BY tblSpiele.Ausgabejahr;

Leider hat es so nicht funktioniert, da er 4120 statt 290 mögliche Datensätze gefunden hat.

Muss der Query auf WAHR oder FALSCH statt Null umgestellt werden? Wer kann mir da HIlfestellung geben?
Ich hoffe alle relevante Informationen hier zur Verfügung gestellt zu haben.

viele Grüße aus der Pfalz
Andreas
 
Grüße und Dank im voraus
Andreas

PhilS

#1
Ich sehe da drei Punkte, die du prüfen/hinterfragen solltest:

Zitat von: derilzemer am Januar 01, 2025, 15:36:00Aber in tblSpiele gibt es aber ebenfalls noch das Feld Druckdatum in Form eines Kontrollkästchen/Checkbox. Da sind 290 Datensätze "markiert". Genau dieses Feld wollte ich jetzt in der Abfrage integrieren
Du gibst in deiner Abfrage ja Karten aus. Wenn in der tblSpiele 290 Spiele markiert sind, ergibt das ja wesentlich mehr Karten (bis zu 32 pro Spiel?) in der Ergebnismenge.

Zitat von: derilzemer am Januar 01, 2025, 15:36:00Im SQL-Query dachte ich zuerst, dass ich lediglich eine OR-Verknüpfung hinzufügen muss,
Dabei ist die Klammerung wichtig. Du willst ja (vermutlich) dass entweder das eine oder das andere Druckdatum gesetzt sein muss, aber das Kriterium des Verlags immer geprüft wird. Dann muss die Klammerung in der Where-Bedingung so aussehen:
WHERE tblVerlag.Verlag LIKE [Welcher Verlag soll es sein (Platzhalter wie * ist moeglich)]
  AND (tblQuKarten.Druckdatum IS NOT NULL
       OR tblSpiele.Druckdatum IS NOT NULL)
(Ich habe alle unnötigen Klammern, die Access automatisch gesetzt hat, entfernt.)

Zitat von: derilzemer am Januar 01, 2025, 15:36:00Muss der Query auf WAHR oder FALSCH statt Null umgestellt werden?
Wahrscheinlich ja, je nachdem was du genau erreichen willst. NOT NULL bei einer Checkbox bedeutet, dass die entweder angekreuzt oder explizit nicht angekreuzt ist, nur die Checkboxen die weder eines noch das andere sind, sind NULL.



Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

derilzemer

Hallo Phil,

da hast du wohl recht. Wenn ich jetzt den SQL-Query entsprechend umstelle
SELECT tblVerlag.Verlag, tblSpiele.SpielID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, tblSpiele.SpTitel, [QuartettKz] & [KartenNr] AS Karte, tblQuKarten.Druckdatum, tblSpiele.Druckdatum
FROM tblVerlag INNER JOIN ((tblSpiele INNER JOIN tblQuartette ON tblSpiele.[SpielID] = tblQuartette.[SpielID_F]) INNER JOIN tblQuKarten ON tblQuartette.[QuartettID] = tblQuKarten.[QuartettID_F]) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F
WHERE tblVerlag.Verlag LIKE [Welcher Verlag soll es sein (Platzhalter wie * ist moeglich)]
  AND (tblQuKarten.Druckdatum IS NOT NULL
       OR tblSpiele.Druckdatum IS NOT NULL);

dann bekomme ich 4102 als Ergebnis, was den 290 Spielen entspricht mit entsprechender Kartenanzahl (24-36 Karten je Spiel). Du hast es ja angesprochen, zum einen Frage ich Einzelkarten ab die ein Druckdatum enthalten und zum anderen suche ich aber auch nach Spielen, die Karten mit Druckdatum enthalten (in der Regel immer nur eine Karte). Bekommt man das mit einem Query hin, dass er beides abgefragt werden kann oder muss ich den "Bericht" in 2 Abfragen ändern was mir natürlich nicht wirklich gelegen käme  :-\

Kannst du mir da eventuell die Richtung geben bzw. zumindest sagen ob es möglich ist?
mfG
Andreas
Grüße und Dank im voraus
Andreas

PhilS

Zitat von: derilzemer am Januar 01, 2025, 16:50:30zum einen Frage ich Einzelkarten ab die ein Druckdatum enthalten und zum anderen suche ich aber auch nach Spielen, die Karten mit Druckdatum enthalten
Diese Aussage ergibt für mich nicht so recht Sinn.
Die Spalte tblQuKarten.Druckdatum markiert eine einzelne Karte. Das entspricht dem ersten oben zitierten Halbsatz.
Die Spalte tblSpiele.Druckdatum markiert ein komplettes Spiel, d.h. alle Karten die zu dem Spiel gehören, egal ob der Karten-Datensatz ein Druckdatum=Ja hat, oder nicht. Das ist in meinem Verständnis etwas anderes als "Spiele, die Karten mit Druckdatum enthalten".

Nebenbei: Den Name Druckdatum für eine Ja/Nein-Spalte finde ich schlecht gewählt, weil ich da anhand des Namens von einem Datumswert ausgehen würde. 

Ob und wie das gewünschte mit einer Abfrage zu erzielen ist, kann ich die aufgrund der oben angesprochenen Unklarheit nicht beantworten. Du solltest aber mal die bereits angesprochene Änderung der Kriterien auf True/False probieren:
AND (tblQuKarten.Druckdatum = True
       OR tblSpiele.Druckdatum = True);

Das könnte dir bereits das gewünschte Ergebnis liefern.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

derilzemer

Hallo Phil,

ja, die Benamung kann natürlich für "außenstehende" verwirrend wirken und ist unglücklich gewählt.
Ich könnte/sollte das Feld SpielmDD (Spiel mit Druckdatum) nennen und es etwas klarer zu gestalten. Ich habe jetzt aber mal den Query gemäß deiner Ansage angepasst, da kam auch was dabei heraus, nämlich 92. Das sind die 3 Spiele, welche je eine Karte mit Druckdatum enthalten, je einmal 36, 32 und 24 Karten starke Spiele, also 92. Ergo hat er das True bezüglich tblSpiele.Druckdatum nicht berücksichtigt.
Ich habe dann mal auf die schnelle den Query abgesetzt, da kommen dann 290 Spiele heraus

SELECT tblVerlag.Verlag, tblSpiele.SpielID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, tblSpiele.SpTitel, tblSpiele.Druckdatum
FROM tblVerlag INNER JOIN tblSpiele ON tblVerlag.VerlagID = tblSpiele.VerlagID_F
WHERE (((tblVerlag.Verlag) Like [Welcher Verlag soll es sein (Platzhalter wie * ist moeglich)]) AND ((tblSpiele.Druckdatum)=True));

Die Frage die sich mir jetzt weiterhin stellt ist, ob mein "Wunsch" mit einem Query so abbildbar ist oder nicht. Wenn ja, muss ich das Feld Druckdatum in tblSpiele eindeutiger machen oder umstellen oder was auch immer?

Viele Grüße Andreas 
Grüße und Dank im voraus
Andreas

PhilS

Zitat von: derilzemer am Januar 01, 2025, 17:47:14Ich habe jetzt aber mal den Query gemäß deiner Ansage angepasst, da kam auch was dabei heraus, nämlich 92. Das sind die 3 Spiele, welche je eine Karte mit Druckdatum enthalten, je einmal 36, 32 und 24 Karten starke Spiele, also 92. Ergo hat er das True bezüglich tblSpiele.Druckdatum nicht berücksichtigt.
Ich habe dann mal auf die schnelle den Query abgesetzt, da kommen dann 290 Spiele heraus
Ich kann dir immer weniger folgen.
Wenn du 3 Spiele mit je einer gedruckten Karte (tblQuKarten.Druckdatum=True) hast, sollte das 3 Datensätze ergeben, nicht 92.
Zusätzlich sollten in dem Abfrageergebnis (das der vorigen Abfrage) die Karten aller Spiele sein für die tblSpiele.Druckdatum=True ist.
Wieviele Datensätze das ergibt (ergeben soll), ist mir unklar. Oben schriebst du von 4102 Karten aus 290 Spielen. - Da war aber das Kriterium "tblSpiele.Druckdatum IS NOT NULL". Wenn der vorhergehende Satz den Sachverhalt richtig beschreibt, kann es eigentlich nicht sein, dass du jetzt auch 290 Spiele mit tblSpiele.Druckdatum=True hast.

Prüfe die Situation in deinem Datenbestand nochmal genau nach. - Ich denke weiterhin, dass das vorgeschlagene Kriterium aus meinem vorigen Post das richtige Ergebnis liefern sollte.




Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

derilzemer

Hi Phil,
hmmm, ich kann dir ja nur das schreiben, was ich hier bei der Ausgabe vom Report mit dem Query erhalte
SELECT tblVerlag.Verlag, tblSpiele.SpielID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, tblSpiele.SpTitel, [QuartettKz] & [KartenNr] AS Karte, tblQuKarten.Druckdatum, tblSpiele.Druckdatum
FROM tblVerlag INNER JOIN ((tblSpiele INNER JOIN tblQuartette ON tblSpiele.[SpielID] = tblQuartette.[SpielID_F]) INNER JOIN tblQuKarten ON tblQuartette.[QuartettID] = tblQuKarten.[QuartettID_F]) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F
WHERE tblVerlag.Verlag LIKE [Welcher Verlag soll es sein (Platzhalter wie * ist moeglich)]
AND (tblQuKarten.Druckdatum = True
       OR tblSpiele.Druckdatum = True);
Sie dürfen in diesem Board keine Dateianhänge sehen.

Dann ist das Ergebnis gefundener Datensätze 92.
Sie dürfen in diesem Board keine Dateianhänge sehen.

Die 92 kommen wie oben geschildert zustande. Es werden im Quey also die 3 Karten mit Druckdaten gefunden, die sich in je einem Spiel mit 9, 8 und 6 Quartetten befinden, insgesamt 92 Karten die durch die Abfrage als 92 Datensätze resultieren.

Aber ich habe jetzt das ganze getrennt, also Query für Einzelkarten mit Datum und Query für Spiele die Karten mit Druckdatum enthalten. Das ist auch okay für mich und ich vergeude eure Zeit nicht durch eventuell falsch beschriebene Dinge. Vielen Dank aber für die Ansätze der Fehlerfindung Phil.


Viele Grüße
Andreas
   
Grüße und Dank im voraus
Andreas

PhilS

Zitat von: derilzemer am Januar 01, 2025, 21:03:06hmmm, ich kann dir ja nur das schreiben, was ich hier bei der Ausgabe vom Report mit dem Query erhalte
Naja, du hast im Gegensatz zu mir auch die Möglichkeit direkt in den Tabelle zu schauen, was dort an Daten enthalten ist.

Zitat von: derilzemer am Januar 01, 2025, 21:03:06Es werden im Quey also die 3 Karten mit Druckdaten gefunden, die sich in je einem Spiel mit 9, 8 und 6 Quartetten befinden, insgesamt 92 Karten die durch die Abfrage als 92 Datensätze resultieren.
Das ist streng genommen nicht richtig. Dein 2. Screenshot zeigt, dass hier für das Spiel Druckdatum=Ja gesetzt ist. Die Abfrage findet 3 Spiele mit insgesamt 92 Datensätzen (=Karten).
Das Druckdatum der Karten wirkt sich nur dann aus, wenn tblQuKarten.Druckdatum=Ja und für das Spiel zu dem die Karte gehört tblSpiele.Druckdatum=Nein gespeichert ist. Dann hättest du nur die eine markierte Karte aus dem Spiel in den Ergebnissen, aber nicht alle übrigen Karten aus demselben Spiel.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor