Neuigkeiten:

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

Mobiles Hauptmenü

Problem bei SQL-Code

Begonnen von Beate1953, November 25, 2013, 12:25:10

⏪ vorheriges - nächstes ⏩

Beate1953

Hallo,

ich habe in der RecordSource eines Berichtes folgenden SQL-Code, der mir alle Geräte (Posten.Barcode) anzeigen soll, die entweder noch nie einen Datensatz in der Tabelle [E-Check] hatten oder die schon einen Datesatz in [E-Check] haben, aber nicht im gewählten Zeitraum.

Der Teil mit den Geräten, die nie einen DS in [E-Check] hatten (Teil nach dem UNION) funktioniert.

Der Teil mit den Geräten, die bereits einen DS in [E-Check] haben, aber außerhalb des gewählten Zeitraumes(Teil vor dem UNION), funktioniert nicht. Diese Geräte zeigt er nicht an.


Hier nun mein Code:
SQLstr = "SELECT DISTINCT p.Barcode, p.[Bezeichnung (Typ, genaue Bezeichnung)] "
SQLstr = SQLstr & "FROM Posten AS p INNER JOIN [E-Check] ON p.Barcode = [E-Check].Barcode "
SQLstr = SQLstr & "WHERE (p.Barcode NOT IN (SELECT Barcode FROM [E-Check] "
SQLstr = SQLstr & "WHERE [E-Check].Datum BETWEEN " & Format(Anfdat, "\#yyyy-mm-dd\#") & " AND " & Format(Enddat, "\#yyyy-mm-dd\#")
SQLstr = SQLstr & ")) AND p.Entfernen = False "
SQLstr = SQLstr & "ORDER BY p.Barcode "
SQLstr = SQLstr & "UNION SELECT Posten.Barcode, Posten.[Bezeichnung (Typ, genaue Bezeichnung)] "
SQLstr = SQLstr & "FROM Posten LEFT JOIN [E-Check] ON Posten.Barcode = [E-Check].Barcode "
SQLstr = SQLstr & "WHERE ((([E-Check].Barcode)=0 Or ([E-Check].Barcode) Is Null))"


Kann mir jemand sagen, was da falsch ist?

Vielen Dank im Voraus für Eure Hilfe
Beate1953


Beate1953

Hallo,

ich habe statt des "Inner" in Inner Join mal "Left" und "Right" probiert und habe beide Male das gleiche Ergebnis erzielt:

Zuerst muss ich sagen, dass ich viele Geräte in Posten habe, die nur einen DS in [E-Check] mit einem Datum in 2012 haben.
Ich habe des Weiteren 3 Geräte in Posten, die in [E-Check] nur einen Datensatz mit einem Datum in 2011 oder 2010 haben.
Außerdem habe ich 2 Geräte in Posten, die keinen DS in [E-Check] haben.

Wenn ich suche nach "Geräte ohne DS in 2012" dann erhalte ich das richtige Ergebnis.
Wenn ich suche nach "Geräte ohne DS in 2013" erhalte ich wieder nur die Ergebnisse aus dem Teil nach UNION. Die ganzen Geräte mit nur einem DS in 2012 werden nicht angezeigt.

Ich hoffe, Ihr könnt Euch das erklären; ich nicht.

Viele Grüße
Beate1953


DF6GL

Hallo,

das xxx Join muss ganz entfallen...  wenn Du mit   In (Select...)   vergleichst.


Teste doch einfach nur mal nach der ersten Teilabfrage und konstruiere so, dass die erwarteten Ergebnisse geliefert werden.

SQLstr = "SELECT DISTINCT p.Barcode, p.[Bezeichnung (Typ, genaue Bezeichnung)] "
SQLstr = SQLstr & "FROM Posten AS p "
SQLstr = SQLstr & "WHERE (p.Barcode NOT IN (SELECT Barcode FROM [E-Check] "
SQLstr = SQLstr & "WHERE [E-Check].Datum BETWEEN " & Format(Anfdat, "\#yyyy-mm-dd\#") & " AND " & Format(Enddat, "\#yyyy-mm-dd\#")
SQLstr = SQLstr & ")) AND p.Entfernen = False "


liefert alle Datensätze aus Tabelle Posten, bei denen der "Barcode" nicht in der Liste der Barcode-Werte vorkommt, die durch den Datumsbereich-Vergleich  eingeschränkt ist  (und bei denen "Entfernen" "falsch" ist)

Wurliwurm

Nimm mal das ORDER BY raus.

Beate1953

Hallo,

mit diesem Vorschlag kommt dasselbe raus, wie oben beschrieben: 2012 klappt, 2013 nicht.

Ich habe aber inzwischen selbst herausgefunden, wie es funktioniert. Allerdings weniger durch Logik als vielmehr durch wildes Herumprobieren.

Also folgendes: Im Subselect wird der Tabellenname [E-Check] durch den Namen einer Abfrage ersetzt, die alle verknüpften Tabellen (einschließlich Posten und [E-Check]) abfragt.

Hier der Code:
SQLstr = "SELECT DISTINCT Posten.Barcode, Posten.[Bezeichnung (Typ, genaue Bezeichnung)] "
SQLstr = SQLstr & "FROM Posten LEFT JOIN [E-Check] ON Posten.Barcode = [E-Check].Barcode "
SQLstr = SQLstr & "WHERE (((Posten.Barcode) Not In (SELECT Posten.Barcode FROM QRYGesamtbericht WHERE [E-Check].Datum "
SQLstr = SQLstr & "Between " & Format(Anfdat, "\#yyyy-mm-dd\#") & " AND " & Format(Enddat, "\#yyyy-mm-dd\#")
SQLstr = SQLstr & ")))"

Hier der Code der QRYGesamtbericht:
SELECT Posten.Barcode, Posten.[Bezeichnung (Typ, genaue Bezeichnung)], Gerätegruppen.Bezeichnung, Posten.Entfernen, [E-Check].Sichtprüfung, [E-Check].Schutzleiter, [E-Check].Isolationswiderstand, [E-Check].Differenzstrom, [E-Check].Ersatzableitstrom, [E-Check].KeineInstandsetzung, [E-Check].Brandgefahr, [E-Check].ElektrSchlag, [E-Check].MechGefahr, [E-Check].[E-Check], [E-Check].Datum, Abteilungen.Ort, [E-Check].Bemerkung, [E-Check].Repariert, [E-Check].Massnahme
FROM Gerätegruppen INNER JOIN (Abteilungen RIGHT JOIN (Posten LEFT JOIN [E-Check] ON Posten.[Barcode] = [E-Check].[Barcode]) ON Abteilungen.ID = [E-Check].Ort) ON Gerätegruppen.GerätegruppeID = Posten.Gerätegruppe;

Vielleicht hätte man im Subselect diesen ganzen Verknüpfungs-Sums eintragen müssen?

Wenn jemand verstanden hat, woran es lag und mir dies einfach verständlich erklären kann, wäre dies nett.

Viele Grüße
Beate1953