Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: dobby110 am Mai 13, 2014, 09:09:20

Titel: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 13, 2014, 09:09:20
Hallo zusammen,

ich habe ein kleines Problem mit einer Abfrage, die nicht so richtig will.
Folgendes würde ich gerne machen:

Ich habe eine Tabelle mit Bewertungen. Diese kommen immer zum letzten des Monats und werden eingetragen. Nun möchte ich gerne wissen, für welche Kunden noch keine Bewertung eingetragen ist.
Dazu habe ich eine weitere Tabelle angelegt, in der ich bis zum Jahr 2039 den jeweils Monatsletzten eingetragen habe.
Dies sollte dazu dienen, dass ich eine Inkonsistenzabfrage anlegen kann, die mir ausweisen soll, für welche Kunden noch keine Bewertung eingetragen ist.
Aber irgendwie geht das nicht. Ich bekomme ständig falsche Ergebnisse.

Hat jemand eine Idee, wo der Fehler liegt?

Ich habe zunächst die Tabelle mit den Terminen genommen, diese dann mit der Bewertungstabelle verknüpft und als Auswahlkriterium das Datum genommen.
Es gibt natürlich Kunden, für die der Termin eingetragen ist. Für andere aber nicht. Und die würde ich gerne mit der Abfrage rausfiltern.
Ich musste dazu natürlich auch den Kundennamen mit im Abfrage Entwurf aufnehmen.
Als Kriterium ist "Ist Null" hinterlegt.
Aber egal wie ich es mache, es funktioniert nicht.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: DF6GL am Mai 13, 2014, 09:21:00
Hallo,

dies:  http://www.donkarl.com/?FAQ3.16
sollte helfen...
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: MzKlMu am Mai 13, 2014, 09:22:22
Hallo,
und warum fängst Du das Ganze noch mal an:

http://www.access-o-mania.de/forum/index.php?topic=19382.msg106628#msg106628 (http://www.access-o-mania.de/forum/index.php?topic=19382.msg106628#msg106628)
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 13, 2014, 09:33:36
habs ja nicht nochmal angefangen.
Ich habe den Aufbau etwas anders gemacht, aber das ist mein aktuelles Problem. Ich versuche es nochmal mit der Antwort von DF6GL

Bin leider noch nicht so versiert, da es meine erste Datenbank ist.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 13, 2014, 09:47:11
Ich hab mal ein Screenshot meiner Abfrage.

Termine: Hier stehen alle Termine 31.12.2013 - 31.01.2014 - 28.02.2014 ... usw.

Bewertungen: Hier steht die Bewerung mit gleichem Datum unter "Bewertung per"

Jetzt will ich die Investments, für die noch kein Datum zu den Ultimoterminen in Tabelle "Termine" eingetragen ist.

So wie die Abfrage jetzt ist, bekomme ich eine leere Abfrage. Wenn ich aus "Ist Null" eine "Ist nicht Null" mache, bekomme ich die Werte, für die eine Bewertung eingetragen ist. Demnach bin ich ja nicht auf dem falschen Weg. Aber ich brauche halt die Investments, für die noch kein Datum eingetragen ist.
Den Termin gibt es in Tabelle Termine nur einmal. In Tabelle Bewertugen aber mehrmals unter dem jeweiligen Investment.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: DF6GL am Mai 13, 2014, 10:14:56
Hallo,


vielleicht sollte die Verknüpfung(slinie) an die Datumsfelder gelegt werden.....

Wenn nur die Bewertungen angezeigt werden sollen, bei denen das Datum leer ist, dann reicht doch:

Select * from Bewertungen where [Datum] is null

Welchen Datentyp hat denn  "Bewertung per"  und was steht da genau drin?
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 13, 2014, 10:27:42
"Bewertung per" ist ein Datum/Uhrzeit Feldtyp.

"Ultimotermin" genau so.

Ich bekomme jeden Monat einen Bericht mit der Bewertung. Als Beispiel habe ich für ein Investment die Bewertungen für den 31.12. / 31.01. und für den 30.04.2014 vorliegen.
Für den 28.02. und für den 31.03. fehlt diese noch.

Über die Abfrage sollten mir dann diese Termine rausgefiltert werden, damit ich auf einen Blick sehe, wo welcher Bericht noch fehlt.

Im Anhang sieht man, wie das Formular aussieht, in dem die eingetragenen Termine vorhanden sind.
In dem Beispiel würde der Bericht für 31.01. / 28.02. und 31.03. fehlen.

31.12. und 30.04. liegt vor und ist eingetragen, wie man sieht.

Deswegen hab ich eine Tabelle angelegt (Termine) wo alle diese Datümer eingetragen sind, für die etwas vorliegen sollte. Aber wie beschrieben ist mein Abfrageergebnis leer.
Egal wie ich es drehe.
Hab auch schon auf der Verknüpfungslinie jeden einzelnen Punkt (1-3) ausprobiert. Aber mit dem Kriterium "Ist Null" kommen keine Ergebnisse.
Mit "Ist Nicht Null" kommen die Investments, für die ein Bericht vorliegt. Und das verstehe ich nicht, warum es nicht anders herum funktioniert.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 13, 2014, 10:45:23
als kleine Hilfe auch nochmal die Entwurfsansichten für die beiden Tabellen.


Kann es sein, dass es nicht funktioniert, weil ich mehrere Investments habe und bei mindestens einem das gesuchte Datum eingetragen ist?
In der Tabelle "Termine" steht das Datum nur einmal.
In Bewertungen muss ich das gleiche Datum für jedes Investment eingetragen haben.
Meine Vermutung wäre, dass er das Datum bei einem Investment findet und deswegen das Kriterium nicht mehr greift, weil er ja ein Datensatz gefunden hat.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: DF6GL am Mai 13, 2014, 19:08:19
Hallo,

was willst Du denn mit "Monat-Jahr" (von den Sonderzeichen im Namen mal abgesehen, die man tunlichst vermeiden sollte)  als Textfeld anfangen?

Außderdem versteh ich nicht die "Beziehungen" zu den Datumswerten.

Zitatfür den 31.12. / 31.01. und für den 30.04.2014 vorliegen.
Für den 28.02. und für den 31.03. fehlt diese noch.

Heißt doch, es soll nicht nach Datum verknüpft werden, sondern nach der Monatszahl des entspr. Datums und damit fehlende Monate erkannt werden...
Dabei ist zusätzlich das Jahr zu berücksichtigen.

Wenn das so wie vorstehen ist, erzeug eine "Kalendertabelle" für die benötigten Jahre, die pro Datensatz ein Feld ("Jahrmonat") mit einer Zahl  (!) enthält, die sich aus Jahreszahl und Monatszahl zusammensetzt  (--> 20105  für Mai 2014).

Sodann verknüpf eine left, bzw. right join -Abfrage etwa so:

... on Year(Bewertungen.[Bewertung per]) & Month(Bewertungen.[Bewertung per]) = Kalendertabelle.JahrMonat  Where [Bewertung per] is Null


(Auch hier ist das Leerzeichen im Namen destruktiv!)
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 15, 2014, 08:47:24
Danke für deine Antwort.

Monat Jahr ist in diesem Fall eigentlich nicht von Bedeutung und soll lediglich zur Anzeige dienen.
Entscheidend ist das Datum.

Prinzipiell könnte man es so machen, wie du geschrieben hast. Ich muss mich aber auf den Monatsletzten beziehen, weil ich für jeden Monat auch noch zusätzliche Bewertungen bekommen kann, die aber nur informativ aufgenommen werden. Entscheidend ist der Bericht zum Monatsletzten.

In der Tabelle "Termine" habe ich alle Ultimotermine inkl. Jahr gepflegt. Das heißt da steht dann wirklich der exakte Datumswert 31.12.2013 / 31.01.2014 / 28.02.2014 usw. drin.

Genau das gleiche Datum sollte sich dann nochmals in der Tabelle Bewertungen finden (im Feld Bewertung per)
Daher habe ich diese beiden miteinander verknüpft.

Was ist denn eine left bzw. right join Abfrage und wie erstelle ich die? Evtl. kann ich ja über diese Schiene das ganze versuchen, nur mit einem leicht abgeänderten Code?
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 15, 2014, 08:54:06
hier zwei Screenshots der beiden Tabellen Termine und Bewertungen.

Unter "Bewertung per" wird das Berichtsdatum eingetragen, welches ich abgleichen will. Unter Datum steht lediglich das Eingangsdatum des Berichts.

Also will ich abgleichen, für welche Investments das Feld "Bewertung per" noch fehlt.

ist das so verständlich?
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 15, 2014, 09:20:16
ich denke das Problem ist folgendes.

Ich habe in der Tabelle Bewerungen alle Investments mit den Bewertungen und dem Datum, welche Bewertung vorliegt.

Mit meiner Abfrage prüfe ich ja eigentlich nur, ob bspw. der 31.01.2014 in der Tabelle Bewertungen zu finden ist.
Da das der Fall ist, bekomme ich kein Ergebnis mit der Abfrage "Ist Null"
Dafür sollte es doch aber eine Lösung geben?


Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: ebs17 am Mai 15, 2014, 09:52:05
Richtig. Wenn Du mehrere Investments hast, muss die Inkonsistenzabfrage pro Investment erfolgen und nicht auf die Gesamtmenge.

Das Bild einer Lösung habe ich gerade im Kopf, ich kriege es aber gerade nicht in die Forensoftware. Wenn Du statt Bildern von der Abfrage einfach die SQL-Anweisung (als Text + codeformatiert) zeigen würdest, könnte man aber da ganz einfach eine Korrektur/Vervollständigung vornehmen.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: DF6GL am Mai 15, 2014, 10:24:53
Hallo,

wenn, so wie anfänglich (unvollständig) gefragt, diejenigen Termine gesucht sind, für die Bewertungen (gekennzeichnet durch das Datum im Feld "[Bewertung per]") nicht vorhanden sind, dann hilft   http://www.donkarl.com/?FAQ3.16


oder seh ich das falsch?

Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 15, 2014, 11:44:30
SELECT Bewertungen.[Bewertung per], Bewertungen.Investment
FROM Bewertungen LEFT JOIN Termine ON Bewertungen.[Bewertung per] = Termine.[Ultimotermin]
WHERE (((Termine.Ultimotermin) Is Null));


So ist meine jetzige Abfrage als Code.
@ebs17 - war es das was ich posten sollte?

@DF6GL: so hab ich die Abfrage ja aufgebaut.
Aber ich bekomme kein Ergebnis, weil ja für mind. ein Investment das gesuchte Datum eingetragen ist. Die Abfrage soll das Datum aber über alle Investments suchen. Und mir die Termine und die Investments nennen, für die der Bericht noch fehlt.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: ebs17 am Mai 15, 2014, 13:08:14
FAQ3.16 ist eine der möglichen Gestaltungen einer Inkonsistenzprüfung.

In der gezeigten Abfrage (noch ohne Berücksichtigung von mehreren Investments) sind die Tabellen bzw. der OUTER JOIN vertauscht:
=> VollstaendigeMenge LEFT JOIN Teilmenge

Hieraus kann man dann auch gleich den Lösungsweg ableiten: Es ist eine vollständige Menge zu erzeugen, die hier alle Monatsletzten pro Investment beinhaltet. Das erreicht man durch ein Kreuzprodukt:
SELECT
    X.Investment,
    T.[Ultimotermin]
FROM
    (
        SELECT DISTINCT
            Investment
        FROM
            Bewertungen
    ) AS X,
    Termine AS T

Jetzt kann man darauf die Inkonsistenzprüfung aufbauen:
SELECT
    V.Investment,
    V.[Bewertung per]
FROM
    (
        SELECT
            X.Investment,
            T.[Ultimotermin]
        FROM
            (
                SELECT DISTINCT
                    Investment
                FROM
                    Bewertungen
            ) AS X, Termine AS T) AS V
                LEFT JOIN Bewertungen AS B
                ON V.[Ultimotermin] = B.[Bewertung per]
                    AND
                V.Investment = B.Investment
WHERE
    B.[Bewertung per] Is Null
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: MaggieMay am Mai 15, 2014, 13:13:01
Hallo,
ZitatAlso will ich abgleichen, für welche Investments das Feld "Bewertung per" noch fehlt.
wieso dann überhaupt die Einbeziehung der Termintabelle, es sollte doch genügen, nach leeren "Bewertung per"-Feldern zu suchen.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 15, 2014, 13:28:10
sorry das ich nochmal fragen muss.

Schreibe ich den Code genau so wie aufgeführt in die SQL - Ansicht?
Hab mal ein Screenshot beigefügt, wie ich es gemacht habe.

Wenn ich den Code ausführe, öffnet sich ein Fenster mit Datenquelle ?? Screenshot ist auch anbei

ich kann nicht nach den leeren Feldern suchen, weil für die gesuchten Einträge noch kein Eintrag erfolgt ist. Der Eintrag kommt ja erst, wenn der Bericht vorliegt.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: DF6GL am Mai 15, 2014, 13:38:06
Hallo,


eieieiei.... was willst Du mit "Datenquelle auswählen"?


Öffne in Access den Abfrageentwurf, dort das SQL-Ansicht-Fenster und kopiere den SQL-Code dort hinein.

Zudem mein Vorschlag einer Abfrage (SQL-String, SQL-Code):

SELECT Investment, Month([Datum]) & "/" & Year([Datum]) AS MonatJahr
FROM Bewertung
WHERE [Bewertung Per]<>DateSerial(Year([Datum]),Month([Datum])+1,0)
GROUP BY Investment, Month([Datum]) & "/" & Year([Datum])


Die Abfrage liefert die Investments bezogen auf den jeweiligen Monat aus Feld "Datum", die noch kein  "Bewertung Per"- Datum als Monatsletzten besitzen.  Die Termine-Tabelle ist  hier nicht verwendet.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: dobby110 am Mai 15, 2014, 14:05:33
Datenquelle auswählen ist automatisch erschienen, als ich deinen ersten Code ausprobieren wollte. Diesen habe ich in die SQL-Ansicht kopiert.
Beide Teile untereinander.

Der Abfrage-Code funktioniert, liefert aber leider falsche Ergebnisse die ich nicht nachvollziehen kann.
Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: DF6GL am Mai 15, 2014, 16:23:45
Hallo,

und was ist nun falsch?


Welchen SQL-Code aus den Posts hast Du probiert?


Mach doch mal ein Beispiel (mit vollständiger Ansicht der Tabelle) , was Du anhand der Daten nun erwartest....

Titel: Re: Abfrage Problem - falsches Ergebnis
Beitrag von: ebs17 am Mai 15, 2014, 22:57:51
ZitatBeide Teile untereinander.
Eine Accessabfrage mag nur eine SQL-Anweisung.

Liest Du auch Text oder kopierst Du nur Anweisungen? Die Beschreibung sollte eigentlich erkennen lassen, dass die erste gezeigte Anweisung (die man auch mal für sich ausprobieren kann, um zu sehen, was passiert) Teil der zweiten Anweisung ist.