Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: datekk am November 05, 2014, 17:23:39

Titel: Kunden filtern speziell
Beitrag von: datekk am November 05, 2014, 17:23:39
Hi,

mal wieder ein Abfrage Thema. Ich habe eine Tabelle mit Aufträgen und eine Tabelle mit Auftragsinhalten sowie eine Kundentabelle.

Die Kunden sind dem Auftrag zugeordnet und die Auftragsinhalte dem Auftrag. Tabelle Auftragsinhalte beinhaltet ein Ausführungsdatum.

Ein Auftrag kann mehrere Ausführungsdaten beinhalten (ist sogar eher die Regel). Ein Auftrag kann auch als Angebot geführt werden. Hierfür gibt es in der Vertragstabelle ein Feld für Status.

Ich möchte nun die Kunden via einer Abfrage filtern, welche ein Ausführungsdatum in 2014 haben aber noch keine Angebot oder Auftrag für 2015 ausgelöst haben.. Also die kein Ausführungsdatum in 2015 haben. Also ungefähr wie folgt:

im Datumsbereich >=01.01.2014 UND <=31.12.2014 ist ein Vertrag mit Ausführungsdaten dieser Zeitspanne enthalten UND im Datumsbereich >=01.01.2015 UND <=31.12.2015 ist KEIN Angebot oder Vertrag mit Ausführungsdaten in dieser Zeitspanne enthalten.


Wie baue ich die Abfrage auf? Ich nutze dafür kein SQL sondern das grafische Abfragetool. Bitte beachten.


Besten Dank schon mal.
Titel: Re: Kunden filtern speziell
Beitrag von: ebs17 am November 05, 2014, 18:18:36
ZitatIch nutze dafür kein SQL sondern das grafische Abfragetool.
Der Abfrageeditor erzeugt aber eine SQL-Anweisung, und jene wird letztlich ausgeführt. Wenn Du also konsequent wärst, müsstest Du die Finger ganz davon lassen.

Auch: Der Abfrageeditor ist ein Assistent. Er ermöglicht jenen, die überhaupt keine Kenntnisse haben, halbwegs funktionierende Abfragen zu erstellen. Ansonsten ist er auch geeignet, Routinearbeiten mit weniger Aufwand zu erledigen.

Aber: Ein Assistent bleibt ein Assistent. Er ist auch nicht ganz fehlerfrei, und seine Möglichkeiten liegen deutlich unter dem, was SQL eigentlich kann. Wer sich auf den Assistent beschränkt, begrenzt sich selber auf Assistenten-Niveau.

Zur angefragten Thematik: Siehe Abfrage Kundennummer nach Zeit (http://www.ms-office-forum.net/forum/showpost.php?p=1623266&postcount=4)
Titel: Re: Kunden filtern speziell
Beitrag von: MaggieMay am November 05, 2014, 18:26:28
Hallo,

dazu müsstest du bspw. ein Kriterium mit Unterabfrage ala "Where Not Exists (Select ... From ... Where ...)" einsetzen, aber wie man eine solche Abfrage über den Entwurf erstellt kann ich dir nicht sagen.

Am besten, du fügst erstmal die benötigten Tabellen im Abfrageentwurf hinzu und verknüpfst sie. Dann wählst du die Felder aus, die du brauchst und wechselst anschließend in die SQL-Ansicht.

Wenn du dann nicht weiter kommst, kannst du den bisherigen Code der Abfrage mal zeigen, damit wir eine gemeinsame Grundlage haben.
Titel: Re: Kunden filtern speziell
Beitrag von: datekk am November 06, 2014, 09:36:20
@ ebs 17... ok ich versuchs... Ich erhalte aber schon beim ersten Teil einen Syntaxfehler

SELECT Kundenliste.Firmenname, AngebotAuftrag.Art, AngebotAuftrag_Inhalte.ET
FROM Kundenliste INNER JOIN (AngebotAuftrag INNER JOIN AngebotAuftrag_Inhalte ON AngebotAuftrag.ID_AngebotAuftrag = AngebotAuftrag_Inhalte.AngebotAuftrag_ID) ON Kundenliste.ID_Kunde = AngebotAuftrag.Kunden_ID

WHERE Exists(Select ALL From Angebotauftrag_Inhalte Where Angebotauftrag_Inhalte.ET Between >=#1/1/2014# And <= #12/31/2014#);


Den SQL Code erfasse ich wenn ich bei der Abfrage auf Ansicht auf SQL gehe. Ist das dort richtig? Wo liegt der Fehler?
Titel: Re: Kunden filtern speziell
Beitrag von: DF6GL am November 06, 2014, 10:11:23
Hallo


entweder benutzt Du "between" oder(!)  die Vergleichs-Operatoren.. Beides zusammen geht nicht.

Zudem dürfte "ALL" kein Tabellenfeld sein und sollte ein "*", bzw. existierendes Tabellenfeld oder "NULL" sein...
Titel: Re: Kunden filtern speziell
Beitrag von: ebs17 am November 06, 2014, 10:16:07
Zusätzlich (ohne Anspruch auf Vollständigkeit):
- Es gibt keinen Bezug zwischen Haupt- und Unterabfrage, den ein EXISTS-Konstrukt aber zwingend benötigt.
- Die Abfrage bildet wohl kaum Deine oben genannten Anforderungen ab (siehe auch Fettdruck).
Titel: Re: Kunden filtern speziell
Beitrag von: MaggieMay am November 06, 2014, 10:22:11
Hallo,

schau mal, ob du hiermit weiter kommst:
SELECT Kundenliste.Firmenname, AngebotAuftrag.Art, AngebotAuftrag_Inhalte.ET
FROM Kundenliste INNER JOIN (AngebotAuftrag INNER JOIN AngebotAuftrag_Inhalte ON AngebotAuftrag.ID_AngebotAuftrag = AngebotAuftrag_Inhalte.AngebotAuftrag_ID) ON Kundenliste.ID_Kunde = AngebotAuftrag.Kunden_ID
WHERE Angebotauftrag_Inhalte.ET Between #1/1/2014# And #31/12/2014# AND
NOT EXISTS
(Select NULL FROM AngebotAuftrag As a INNER JOIN AngebotAuftrag_Inhalte As ai
  ON a.ID_AngebotAuftrag = ai.AngebotAuftrag_ID Where ai.ET Between #1/1/2015# And #31/12/2015# AND a.Kunden_ID = AngebotAuftrag.Kunden_ID);


{Edit: Vergleichsoperatoren im ersten Kriterium entfernt und Datum in Form von mm/dd/jjjj}
Titel: Re: Kunden filtern speziell
Beitrag von: datekk am November 06, 2014, 10:33:19
@MaggyMay:

Vielen Dank für den Code. Leider bekomme ich wieder einen Syntaxfehler

Syntaxfehler (fehlender Operator) in Abfrageausdruck...

und dann wird der Code ab "Angebotauftrag_Inhalte.ET Between >=#1/12014... bis zum Codeende angezeigt.

???
Titel: Re: Kunden filtern speziell
Beitrag von: MaggieMay am November 06, 2014, 10:46:08
Sorry, das habe ich übersehen, die Vergleichsoperatoren müssen - wie bereits gesagt wurde - beim Einsatz von BETWEEN weggelassen werden.
Titel: Re: Kunden filtern speziell
Beitrag von: ebs17 am November 06, 2014, 10:50:52
ZitatWie baue ich die Abfrage auf?
...
Tabelle Auftragsinhalte beinhaltet ein Ausführungsdatum
Kleiner Exkurs, wie man mit Kopf statt mit Editor arbeitet:
Ein JOIN ist aufwändiger als Filtern. Daher ist es regelmäßig einfacher in der Abfrageerstellung und effizienter in der Abfrageausführung, erst zu filtern (rechnen) und danach zu joinen.
Laut der Aufgabenstellung ist diese Filterung auf genau eine Tabelle vorzunehmen:

SELECT A.AngebotAuftrag_ID, A.ET
FROM AngebotAuftrag_Inhalte AS A
EXISTS
(SELECT NULL FROM AngebotAuftrag_Inhalte AS B
WHERE B.Vertrag?? = A.Vertrag??
AND B.ET BETWEEN 1/1/2014 AND 12/31/2014)
AND NOT EXISTS
(SELECT NULL FROM AngebotAuftrag_Inhalte AS C
WHERE C.Vertrag?? = A.Vertrag??
AND C.ET BETWEEN 1/1/2015 AND 12/31/2015)


Diese Abfrage verknüpfst Du jetzt statt der Tabelle AngebotAuftrag_Inhalte mit den anderen beiden Tabellen.

Das fiktive Feld Vertrag?? verweist darauf, dass mir der Tabellenaufbau nicht klar ist.
Titel: Re: Kunden filtern speziell
Beitrag von: datekk am November 06, 2014, 11:10:17
Da ich schon wieder nen Syntaxfehler erhalte mache ich anscheinend irgendwas komplett falsch... Daher die Frage: Wo genau in Access gebe ich denn den Code ein?
Titel: Re: Kunden filtern speziell
Beitrag von: ebs17 am November 06, 2014, 11:39:48
ZitatWo genau in Access gebe ich denn den Code ein?
Die gezeigte vollständige Abfrage? In die SQL-Ansicht einer (neuen) Abfrage.

Zitatnen Syntaxfehler erhalte
Es hilft meistens, wenn man sich den Inhalt der Fehlermeldung näher zu Gemüte führt.
Titel: Re: Kunden filtern speziell
Beitrag von: datekk am November 06, 2014, 12:57:37
Die Fehlermeldung lautet: "Syntaxfehler in der FROM-Klausel."

Beim drücken auf OK ist das erste "EXISTS" markiert.
Titel: Re: Kunden filtern speziell
Beitrag von: ebs17 am November 06, 2014, 13:00:26
Ja, da fehlt noch ein WHERE davor.
Titel: Re: Kunden filtern speziell
Beitrag von: datekk am November 06, 2014, 13:11:58
Ok. Das war der Fehler.. Nun ist das Problem, dass das Feld "Vertrag" in einer übergeordneten Tabelle namens "AngebotAuftrag" ist.

Es ist glaub ich besser, wenn ich etwas näher auf die Struktur eingehe:

"AngebotAuftrag" enthält u.a. die Spalten:

IDAuftrag|KundenID|Status
Status = Vertrag oder Angebot

Die Tabelle "AngebotAuftrag_Inhalt" die Spalten:
IDInhalt|ET|ProduktID|AuftragsID
ET = das besprochene Ausführungsdatum

Die Tabelle "Kunde" vereinfacht
IDKunde | Kundenname

Die Verknüpfungen sind denke ich aus den Namen abzuleiten.
Titel: Re: Kunden filtern speziell
Beitrag von: datekk am November 06, 2014, 13:37:46
....ääähm,,, ich mach mal ne Beispieldatei...
Titel: Re: Kunden filtern speziell
Beitrag von: ebs17 am November 06, 2014, 13:42:13
ZitatEs ist glaub ich besser, wenn ich etwas näher auf die Struktur eingehe:
... ich mach mal ne Beispieldatei ...
Wenn dieser letzte Gedanke bereits der erste gewesen wäre (= vollständige Aufgabenstellung), wäre man - vor allem Du - schon ein Stück weiter.
Titel: Re: Kunden filtern speziell
Beitrag von: datekk am November 06, 2014, 13:43:29
Ich hab mal eine Beispieldatei erstellt. Darin ist eine Abfrage aufgebaut. Diese gibt als Ergebnis Kunde A und Kunde C aus.

Im Gegensatz zu Kunde C hat Kunde A auch Inhalte in 2015. Dieser soll also mittels einer gesuchten Lösung rausfliegen, sodass nur noch Kunde C angezeigt wird. Hierbei ist es unerheblich ob in 2015 der Status Angebot oder Auftrag ist, aber erheblich, dass 2014 der Status Auftrag ist.

Vieleicht hilft dies ja weiter.
Titel: Re: Kunden filtern speziell
Beitrag von: ebs17 am November 07, 2014, 09:40:57
ZitatVieleicht hilft dies ja weiter.
Habe ich was verpasst? Wem soll geholfen werden?

Dein Tabellenkonzept finde ich unschlüssig:

SELECT Auftrag.*, AuftragsInhalte.Ausführungsdatum
FROM Auftrag INNER JOIN AuftragsInhalte ON Auftrag.ID_Auftrag = AuftragsInhalte.AuftragsID;

Wenn man sich das anschaut, wird der gleiche Auftrag zu verschiedenen Tagen ausgeführt, das gleiche Angebot zu verschiedenen Tagen unterbreitet, ein Angebot kann nicht zum Auftrag werden ohne selber zu verschwinden usw.
Nebenbei wäre eine Abfrage, die die genannte Aufgabenstellung erfüllen soll, etwas sehr komplex (wie das bei falschen Strukturen häufiger passieren kann).

In meiner Vorstellung müsste die Tabelle Auftrag eigentlich Vorgänge abbilden, und in der Tabelle AuftragsInhalte könnte man dann dazu Angebot1, Angebot2, Auftrag, Nachauftrag usw. darstellen, sprich das Feld Status (bzw. ein Fremdschlüssel aus einer Tabelle tblStatus) gehört mM nach in die Tabelle AuftragsInhalte.
Auch: Beziehungen ohne referentielle Integrität sind ziemlich umsonst, zumindest habe ich da noch keine spürbaren Auswirkungen kennengelernt (von der Vorbelegung von Tabellenverknüpfungen im Abfrageeditor sehe ich da ab).
Mit der geänderten Struktur würde mein oben gezeigter Ansatz auch wieder funktionieren, es müsste nur in den Unterabfragen ein zusätzlicher Filter auf Angebot/Auftrag eingebaut werden.