PDA

Vollständige Version anzeigen : Abfrage ob Kunde in Zeitraum kontaktiert


Michi
09.05.2001, 21:37
Hallo!
Ich möchte abfragen können, welcher Kunde von uns IN EINEM BESTIMMTEN ZEITRAUM, z. B. innerhalb des letzten Monats, von uns noch nicht kontaktiert worden ist. Alle Daten sind in der Kundentabelle (Tabelle 1) und der Kontaktetabelle (Tabelle 3) enthalten. Diese sind 1:n als Hauptformular (Kunden) und Unterformular (Kontakte) verknüpft. Eine Abfrage, welcher Kunde NOCH NIE von uns kontaktiert worden ist, hat mit folgender SQL funktioniert:

SELECT [1].Kundennummer, [1].Firma1, [1].Firma2, [1].Ort, [1].Name, [1].Kategorie
FROM 1
WHERE (((Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer))=False));

Wie kann ich das Ergebnis jetzt von einem bestimmten Zeitraum (z. B. vorherige Eingabe in 2 ungebundene Felder ("von" und "bis")) abhängig machen? Vielen Dank im voraus!

Axel37
10.05.2001, 18:53
hallo michi,
leg die zwei ungebundenen felder (datum) an und löse dann die abfrage aus. die abfrage erweiterst du vorher um zwei kriterien, indem du über den wizard das form und die zwei felder auswählst. danach erweiterst du die kriterien so, dass du den zeitraum erfasst:
zwischen formulare![deinform]![feld1] und formulare![deinform]![feld2]
dann zeigt dir die abfrage das gewünschte ergebnis

Michi
15.05.2001, 20:34
Hallo!
Leider wirft die Abfrage keine Ergebnisse aus, obwohl es eindeutig Kunden gibt, die z. b. im Jahr 2000 besucht worden sind aber in 2001 noch nicht. Genau diese möchte ich angezeigt haben.
Ich habe 2 ungebundene Textfelder eingebaut (hier Text1 und Text3) und bin so verfahren, wie von Axel37 vorgeschlagen. Hier mein SQL-Text:

SELECT [1].Kundennummer, [1].Firma1
FROM (1 INNER JOIN 2 ON [1].Kundennummer = [2].Kundennummer) INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer
WHERE (((Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer))=False) AND (([3].Datum) Between [Formulare]![Niekontjezeitr]![Text1] And [Formulare]![Niekontjezeitr]![Text3]));

Wie bereits gesagt ist das Ergenis aber leer! Wer kann mir helfen? Vielen Dank!

holgii
15.05.2001, 22:58
Hallo,

ich meine, die Einschränkung auf das Datum gehört mit in die Unterabfrage hinein, etwa so:

SELECT [1].Kundennummer, [1].Firma1
FROM (1 INNER JOIN 2 ON [1].Kundennummer = [2].Kundennummer) INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer
WHERE (Exists (select 1 from [3]
where [1].Kundennummer=[3].Kundennummer AND [3].Datum Between [Formulare]![Niekontjezeitr]![Text1] And [Formulare]![Niekontjezeitr]![Text3])=False);

...damit die Funktion Exists nur dann "FALSE" liefert, wenn Kundennummer innerhalb des Zeitraums nicht existiert.

Gruß
holgii

Michi
16.05.2001, 20:41
Hallo zusammen!
Jetzt funktioniert die Sache! Ich bekomme alle Kunden, die im eingegebenen Zeitraum nicht kontaktiert wurden.
Allerdings: Kunden, die NOCH NIE kontaktiert wurden werden nicht angezeigt. Aber diese erfüllen doch auch das Kriterium "im gewünschten Zeitraum nicht kontaktiert" weil sie eben NIE kontaktiert wurden.
Ich habe schon versucht, in der gleichen Abfrage bei "oder" folgende SQL einzufügen:

SELECT [1].Kundennummer, [1].Firma1
FROM (1 INNER JOIN 2 ON [1].Kundennummer = [2].Kundennummer) INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer
WHERE (((Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer))=False)

Was ja alle NIE kontaktierten Kunden abfragen müßte. Aber Kunden, die NIE konatktiert wurden werden immer noch nicht angezeigt; nur Kunden, die im gewählten Zeitraum nicht besucht wurden.

Wie kann ich die Abfrage erweitern? Im voraus Danke!

holgii
17.05.2001, 18:58
Hallo Michi,

ich will mal versuchen, Dich anhand Deiner Überlegungen auf den richtigen Weg zu bringen:

...
Allerdings: Kunden, die NOCH NIE kontaktiert wurden werden nicht angezeigt. Aber diese erfüllen doch auch das Kriterium "im gewünschten Zeitraum nicht kontaktiert" weil sie eben NIE kontaktiert wurden.
...

So, HIER musst Du ansetzen:
Kunden, die NOCH NIE kontaktiert wurden, haben doch überhaupt GAR KEINEN Eintrag in der Kundenkontakt-Tabelle !

In dem Moment, wo Du das Datumfeld in der Kundenkontakt-Tabelle auf einen bestimmten Inhalt abfragst, ignoriert ACCESS alle Datensätze Deiner Kundentabelle, die KEINEN Eintrag in der Kundenkontakt-Tabelle haben...

...Ich habe schon versucht, in der gleichen Abfrage bei "oder" folgende SQL einzufügen:

SELECT [1].Kundennummer, [1].Firma1
FROM (1 INNER JOIN 2 ON [1].Kundennummer = [2].Kundennummer) INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer
WHERE (((Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer))=False)

Was ja alle NIE kontaktierten Kunden abfragen müßte. Aber Kunden, die NIE konatktiert wurden werden immer noch nicht angezeigt; nur Kunden, die im gewählten Zeitraum nicht besucht wurden.
...


Hierzu mein Vorschlag (ich kann es leider auf die Schnelle nicht selbst testen):

SELECT [1].Kundennummer, [1].Firma1
FROM (1 INNER JOIN 2 ON [1].Kundennummer = [2].Kundennummer) INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer
WHERE (Exists (select 1 from [3]
where [1].Kundennummer=[3].Kundennummer AND [3].Datum Between [Formulare]![Niekontjezeitr]![Text1] And [Formulare]![Niekontjezeitr]![Text3])=False)
OR
(Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer)=False);


Ich meine, dass dann beide "Sorten" Kunden angezeigt werden müssten...

Gruß
holgii

Michi
17.05.2001, 20:21
Hallo zusammen!
Funktioniert leider noch immer nicht! Ich komme mit meiner Logik hier nicht mehr weiter! Ich habe bereits eine Abfrage, die alle NOCH NIE kontaktierten Kunden abfragt (siehe oben) und auch eine Abfrage, die alle Kunden abfragt, die IN EINEM BESTIMMTEN ZEITRAUM noch nicht kontaktiert wurden. Klappt alles für sich alleine bestens. Will ich die beiden SQL's jetzt in einer Abfrage mit OR kombinieren, damit die Abfrage "sowohl als auch" abfragt, stimmt das Ergebnis nicht mehr. Ich bekomme nur die Kunden, die in einem bestimmten Zeitraum nicht kontaktiert wurden, die Kunden, die überhaupt noch nie kontaktiert wurden fehlen - obwohl die ja auch in dem Zeitraum nicht kontaktiert wurden und in meiner Abfrage unter OR eindeutig danach gefragt wird. Wer kann mir das noch begreiflich machen?

WAG
18.05.2001, 07:55
Hi Michi,
vielleicht hab ich Dich am frühen Morgen falsch verstanden, aber ich denke so funktioniert es (Datumse durch Parameter ersetzen)

SELECT kunde.Kunde, Kontakte.Kontakt
FROM kunde LEFT JOIN Kontakte ON kunde.Kunde = Kontakte.Kunde
WHERE (((Kontakte.Kunde) Is Not Null) AND ((Kontakte.Kontakt) Is Null)) OR (((Kontakte.Kunde) Is Not Null) AND ((Kontakte.Kontakt) Not Between #1/1/2001# And #5/1/2001#));

oder

SELECT kunde.Kunde, Kontakte.Kontakt
FROM kunde LEFT JOIN Kontakte ON kunde.Kunde = Kontakte.Kunde
WHERE (((Kontakte.Kontakt) Is Null)) OR (((Kontakte.Kontakt) Not Between #1/1/2001# And #5/1/2001#));

je nach dem ob Du Kunden ohne Kontaktsatz haben willst oder nicht.

Dieter

Michi
19.05.2001, 23:45
Hallo zusammen!
Tut mir leid Dieter, aber auch mit deiner SQL funktionierts nicht so richtig. Ergebnis: die Abfrage wirft zwar einerseits alle Kunden aus, die NOCH NIE kontaktiert wurden, aber bei der Abfrage, welchen Kunden in einem BESTIMMTEN ZEITRAUM nicht kontaktiert wurden haperts. Access wirft nämlich alle Kontakte aus, die außerhalb des eingegebenen Zeitraums liegen. Rein von der Logik her richtig, denn ich will ja alle Kunden, die in einem bestimmten Zeitraum nicht kontaktiert wurden; aber meine Abfrage wirft nur die Kontakte aus, die eben nicht in dem Zeitraum liegen. Kunden, die also in der Vergangenheit schon einmal kontaktiert wurden werden genauso ausgeworfen, da ihr Datum ja nicht im gewählten Zeitraum liegt. Wie kann ich das umgehen? Und vielen Dank an alle bisher!

Michi
20.05.2001, 18:44
Hier noch mal ein Beispiel zur Verdeutlichung der momentanen Situation: Der Kunde Meier wurde am 15.12.2000 und am 23.04.2001 kontaktiert. Wenn ich jetzt in meine Abfrage den Zeitraum der nicht kontaktierten Betriebe von 01.01.2001 bis 15.05.2001 eingeben, wird der Kunde Meier trotzdem als "nicht kontaktiert" ausgeworfen. Access erkennt anscheinend, dass ein anderer Kontakt AUßERHALB meines gewählten Zeitraums vorliegt; und das ist eigentlich falsch.

MarioR
20.05.2001, 19:27
Hallo Michi,

ich habe Deine erste Abfrage und die Abfrage von holgii vom 17. mal verglichen. Kann es sein, daß die Klammern unterschiedlich gesetzt sind?

Vielleicht muß die Abfrage so aussehen:

SELECT [1].Kundennummer, [1].Firma1 FROM (1 INNER JOIN 2 ON [1].Kundennummer = [2].Kundennummer) INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer WHERE (Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer AND [3].Datum Between [Formulare]![Niekontjezeitr]![Text1] And [Formulare]![Niekontjezeitr]![Text3])=False)
OR
((Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer))=False);

Michi
20.05.2001, 22:22
Hallo zusammen!
Tip von Mario zeigt leider auch keine Wirkung. Kunden, die nie kontaktiert wurden, fehlen nach wie vor auf der Liste. Kunden, bei denen keine Kontakte im gewählten Zeitraum vorliegen, werden einwandfrei ausgeworfen. Ich nix mehr verstehen!!!

Access hat auf Marios Tip hin die SQL so verändert:
SELECT DISTINCT [1].Kundennummer, [1].Firma1
FROM (1 INNER JOIN 2 ON [1].Kundennummer = [2].Kundennummer) INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer
WHERE (((Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer AND [3].Datum Between [Formulare]![Niekontjezeitr]![Text1] And [Formulare]![Niekontjezeitr]![Text3]))=False)) OR (((Exists (select 1 from [3] where [1].Kundennummer=[3].Kundennummer))=False));

Michi
21.05.2001, 19:19
Hallo zusammen!
Danke, WAG, für Deinen Tip. Aber bei der Eingabe der SQL gibt's ein Problem. Access wirft "Syntaxfehler in FROM-Klausel" aus. Meine SQL sieht so aus:

SELECT [1].Kundennummer
FROM 1 LEFT JOIN [SELECT [1].Kundennummer FROM 1 LEFT JOIN 3 ON [1].Kundennummer=[3].Kundennummer
WHERE ((([3].Datum) Between #1/1/2001# And #5/1/2001#))
GROUP BY [1].Kundennummer]. AS [1]sum ON [1].Kundennummer=[1]sum.Kundennummer
WHERE ((([1]sum.Kundennummer) Is Null));

Wahrscheinlich hab ich irgend etwas falsch verstanden. Ich habe folgende Objekte:

Die Tabelle 1 in der die Kunden gespeichert sind. Die Tabelle 3 in der die Konatkte mit den Kunden gespeichert sind. Beide sind mit 1:n über das Feld Kundennummer (=ID-Schlüssel) verknüpft (1 ist Hauptformular). Das Kontakt-Datum wird im Feld "Datum" der Tabelle 3 gespeichert.

Hab ich die Werte richtig eingesetzt, wo ist der Syntaxfehler? Vielen Dank!!!

MarioR
21.05.2001, 19:27
Hallo Michi,

auch wenn mein letzter Tip daneben ging, ich versuch's einfach noch mal...

Ich denke vor SELECT gehört eine runde Klammer auf und vor WHERE die runde Klammer wieder zu. :)

Michi
21.05.2001, 20:52
Hallo Mario!
Egal vor welches SELECT und WHERE ich Deine zusätzliche runde Klammer einsetze, ich bekomme immer Syntaxfehler. Anscheinend war der Text bisher schlüssig. Bekomme aber noch immer die NIE kontaktierten Kunden nicht. Sorry! Vielen Dank bisher!

MarioR
21.05.2001, 21:33
Hallo Michi,

in Zukunft werde ich wohl doch erst testen, bevor ich was poste. ;)

Hier meine Lösung (diesmal getestet!):

(SELECT [1].Kundennummer,[1].Firma1 FROM (1 INNER JOIN 3 ON [1].Kundennummer = [3].Kundennummer) WHERE (Exists (select Kundennummer from [3] where [1].Kundennummer=[3].Kundennummer AND [3].Datum Between [Text1] And [Text3])=False)) Union (SELECT [1].Kundennummer,[1].Firma1 FROM 1 WHERE (Exists (select Kundennummer from [3] where [1].Kundennummer=[3].Kundennummer)=False));

In der Hoffnung, daß ich mich nicht vertippt habe

Michi
21.05.2001, 22:09
ES FUNKTIONIERT!!!
Der Weg führt also über eine Union-Abfrage! Die letzte SQL von Mario hat tatsächlich funktioniert! Vielen Dank Mario und natürlich an alle anderen. Viele Grüße, Michi

WAG
23.05.2001, 07:48
Hi Michi,
ACCESS ist schon merkwürdig. Meine SQL stimmt, hab es überprüft. Allerdings funktioniert sie auch bei mir nicht mit den Tabellennamen 1 und 3. Es geht aber wenn Du das in eckige Klammern eingeschlossene Select als separate Abfrage speicherst.

Dieter