Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Kunden filtern speziell

Begonnen von datekk, November 05, 2014, 17:23:39

⏪ vorheriges - nächstes ⏩

datekk

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.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

ebs17

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
Mit freundlichem Glück Auf!

Eberhard

MaggieMay

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.
Freundliche Grüße
MaggieMay

datekk

@ 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?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

DF6GL

#4
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...

ebs17

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).
Mit freundlichem Glück Auf!

Eberhard

MaggieMay

#6
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}
Freundliche Grüße
MaggieMay

datekk

@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.

???
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MaggieMay

Sorry, das habe ich übersehen, die Vergleichsoperatoren müssen - wie bereits gesagt wurde - beim Einsatz von BETWEEN weggelassen werden.
Freundliche Grüße
MaggieMay

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

datekk

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?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

datekk

Die Fehlermeldung lautet: "Syntaxfehler in der FROM-Klausel."

Beim drücken auf OK ist das erste "EXISTS" markiert.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

ebs17

Ja, da fehlt noch ein WHERE davor.
Mit freundlichem Glück Auf!

Eberhard

datekk

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.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps