Hallo Zusammen,
ich hoffe ich bin hier richtig und mache kein doppeltes Thema auf.
Folgendes Problem:
Ich habe mehrere Tabellen erstellt, unter anderem eine Tabelle mit Fahrzeugen, Fahrern und Aufträgen.
Ich habe jeweils ein Fahrzeug und ein Fahrer in einem Feld in der Tabelle Auftrag zu einem Auftrag zugeordnet. Als Werte: die ID des Fahrzeuges(gleichzeitig das KFZ-Kennzeichen) und die ID des Fahrers.
In der Tabelle sind mehrer Felder inbegriffen sowie auch das Auftragsdatum.
Nun habe ich eine Abfrage erstellt, die mir alle Inforamtionen bezügliche der anderen Tabellen filtert, allerdings bekomme ich es einfach nicht hin, dass mir nur die Fahrzeuge und Fahrer anzeigt werden, die zu einem bestimmten Auftragsdatum keinem Auftrag zugeordnet sind.
Hat Jemand vieleicht eine Idee, wie man dies lösen könnte?
Ich bedanke mich für jede Hilfe. :)
(Im Anhang einige Screenshots für ein besseres Verständnis)
LG
Amo1453
Du brauchst im Auftragsbuch jeweils einen Fremdschlüssel auf Fahrzeug und Fahrer.
Das Kennzeichen würde ich aber nicht als PK verwenden, weil Text. Spendiere der
Tabelle ruhig einen AutoWert als PK. Das KZ kannst du ja trotzdem als eindeutig
indizieren.
Hallo,
wieso hat die Abfrage keine Verknüpfung der Tabellen?
Ohne Verknüpfungen hast Du eine Multiplikation der Datensätze.
So wie das aussieht gibt es keine Fremdschlüsselfelder, also können auch keine Verknüpfungen angelegt werden.
Zeige mal ein Bild des Beziehungsfensters.
Eine Datenbank braucht zwingend Beziehungen.
Da liegt auch noch mehr im Argen.
- Wieso gibt es eine FahrerId und eine ID ?
- Keine Leer und Sonderzeichen in Feldnamen
- Für die Adressen sollte es Tabellen geben, oder willst Du jedes mal die Adressen eingeben (mit den dann möglichen Fehlern?).
- Auch für die Kunden ist eine TAbelle erforderlich.
Du solltest Dich mit den Grundlagen zu Access beschäftigen, Access muss man lernen, da geht nix intuitiv.
Hier etwas mehr Theorie:
https://www.hdm-stuttgart.de/~riekert/lehre/db-kelz/
Und hier etwas mehr Praxis:
https://www.access-tutorial.de/
Hier die gewünschte Beziehungsliste:
Zitat von: Beaker s.a. am März 16, 2023, 19:00:30Du brauchst im Auftragsbuch jeweils einen Fremdschlüssel auf Fahrzeug und Fahrer.
Das Kennzeichen würde ich aber nicht als PK verwenden, weil Text. Spendiere der
Tabelle ruhig einen AutoWert als PK. Das KZ kannst du ja trotzdem als eindeutig
indizieren.
Ertmal herzlichen Dank für die Info.
Das habe ich jetzt gemacht. Und wie binde ich nun das Datum mit in die Abfrage ein? Damit nur die Kennzeichen angezeigt werden die diesem Datum nicht zugordnet sind. (Gleiches gilt natürlich auch für Fahrer).
LG
Amo1453
Zitat von: MzKlMu am März 16, 2023, 19:02:12Du solltest Dich mit den Grundlagen zu Access beschäftigen, Access muss man lernen, da geht nix intuitiv.
Danke für deinen Beitrag.
Die Adresse wird später von einer API übernommen. Ich wollte nur intuitiv dieses Problem lösen, um es dann sauber in meiner eigentlichen Arbeit einzupflegen. Aber ja, ich bin noch am lernen und weiterbilden.
LG
amo1453
Anmerkung:
Bitte keine vollständigen Beiträge zitieren. MzKlMu
Hallo,
Deine Abfrage braucht die Verknüpfungen über die Schlüsselfelder.
.
Zitat von: MzKlMu am März 16, 2023, 19:49:19Hallo,
Deine Abfrage braucht die Verknüpfungen über die Schlüsselfelder.
Das habe ich nun hinbekommen, kriege nur das mit dem Datum nicht hin in der Abfrage.
Hallo,
zeige die Abfrage (SQL).
Bitte immer alles zeigen und erklären, wie sonst soll man helfen können.
In den Beziehungen sollte immer referentielle Integrität eingestellt werden, bitte noch nachholen. Wenn das nicht geht, gibt es Fehler in der Struktur und/oder in den Daten.
Hallo Klaus,
hier die SQL.
Wenn die Beziehungen bestehen gibt mir die Abfrage keine Ergebnisse. Wenn ich sie lösche, liefert es Ergebnisse.
Es soll halt wiklich alle Fahrzeuge und Fahrer ausgeben, die nicht zu dem im Feld Datum eingetragenem Datum zugordnet sind. Falls ein anderes Datum abgefragt wird, sollen das Fahrzeug und auch der Fahrer wieder in der Abfrage mitgelistet werden.
z.B. steht im Auftrag als Datum der 01.04.2023 eingtragen. und als zugeteiltes Fahrzeug die ID "1" und als zugeteilter Fahrer ebenfals die ID "1" als Fremdscglüssel:
jetzt sollen, wenn ich den 01.04.2023 eingbe als Datum, diese beiden IDs nicht aufgelistet werden.
Sollte ich aber z.B. den 05.05.2023 als Datumwert in die Abfrage stellen, sollen sie wieder gelistet werden, mit allen anderen Fahrern und Fahrzeugen auch.
Ich hoffe ich konnte es ausführlich erklären.
Hallo,
SQL bitte immer als Text, niemals als Bild. Aus einem Bild kann man nichts kopieren.
Bezüglich Deiner PN: Wir bleiben hier im Forum.
SELECT tblFahrzeugliste.IDFahrzeug, tblFahrzeugliste.Kennzeichen, tblFahrzeugliste.Fahrzeugklasse, tblFahrzeugliste.In_Wartung, tblFahrerliste.FahrerID, tblFahrerliste.Vorname, tblFahrerliste.Nachname, tblFahrerliste.Führerscheinklasse, tblFahrerliste.Schicht
FROM tblAuftragsbuch, tblFahrerliste, tblFahrzeugliste
WHERE (((tblFahrzeugliste.IDFahrzeug)<>[FREMDfaz]) AND ((tblFahrzeugliste.Fahrzeugklasse)=[Führerscheinklasse]) AND ((tblFahrzeugliste.In_Wartung)=2) AND ((tblFahrerliste.FahrerID)<>[FREMDfa]) AND ((tblFahrerliste.Schicht)=[Schicht eingeben Früh gleich 4, Spät gleich 5, Nacht gleich 6]));
Ich habe die Abfrage oben überarbeitet. Nun sieht sie so aus (unten) und funktioniert genauso, wie ich es wollte (Nach 9 Stunden nonstop :o ) Allerdings frage ich mich, warum ich die Beziehungen im Abfragenentwurf entfernen musste. Denn bestehen die Beziehungen im Abfrageentwurf, geht es nicht. (In der Beziehungstabelle sind die Verbindungen aber Vorhanden, lediglich in dem Abfrageassistenten muss ich sie entfernen.)
Vielleicht weiss ja Jemand warum.
SELECT tblFahrzeugliste.IDFahrzeug, tblFahrzeugliste.Kennzeichen, tblFahrzeugliste.Fahrzeugklasse, tblFahrzeugliste.In_Wartung, tblFahrerliste.FahrerID, tblFahrerliste.Vorname, tblFahrerliste.Nachname, tblFahrerliste.Führerscheinklasse, tblFahrerliste.Schicht
FROM tblAuftragsbuch, tblFahrerliste, tblFahrzeugliste
WHERE (((tblFahrzeugliste.Fahrzeugklasse)=[Führerscheinklasse]) AND ((tblFahrzeugliste.In_Wartung)=2) AND ((tblFahrerliste.Schicht)=[Schicht eingeben Früh gleich 4, Spät gleich 5, Nacht gleich 6]) AND ((tblAuftragsbuch.FREMDfaz)<>[IDFahrzeug]) AND ((tblAuftragsbuch.FREMDfa)<>[FahrerID])) OR (((tblFahrzeugliste.Fahrzeugklasse)=[Führerscheinklasse]) AND ((tblFahrzeugliste.In_Wartung)=2) AND ((tblFahrerliste.Schicht)=[Schicht eingeben Früh gleich 4, Spät gleich 5, Nacht gleich 6]) AND ((tblAuftragsbuch.FREMDfa)<>[FahrerID]) AND ((tblAuftragsbuch.[Datum])<>[Datum eingeben]));
ok geht doch nicht. Sobald ein zweiter Datensatz in der Tabelle Aufträge vorhanden ist, ist Feierabend.
Wo ist der Fehler :-\
ZitatAllerdings frage ich mich, warum ich die Beziehungen im Abfragenentwurf entfernen musste. Denn bestehen die Beziehungen im Abfrageentwurf, geht es nicht.
In einer Abfrage hat man keine Beziehungen, sondern lediglich Verknüpfungen. Bei der Arbeit mit dem Abfrageeditor werden solche Tabellenverknüpfungen vorbelegt, die Beziehungen nachahmen (was oft sinnvoll ist, aber nun nicht immer einem eigenen benötigtem Abfragedesign entspricht).
Beziehungen wirken auch ohne eigene Anwesenheit, z.B. bei eingestellter referentieller Integrität gibt es kein Vorbei.
ZitatAbfrage ... funktioniert genauso, wie ich es wollte
Ist das so?
Derzeit hast Du ein kartesisches Produkt vorliegen (jeder Datensatz jeder Tabelle wird mit jedem Datensatz der weiteren Tabellen kombiniert). Jeder weitere Datensatz in tblAuftragsbuch, der die Filterung übersteht, wird selbstverständlich Deine Ergebnismenge vervielfachen.
//OT: Wer sich wiederholt vollständig selber zitiert, muss sehr von der Wichtigkeit seiner Aussagen halten. Dass da gegebene Antworten nicht zu unbedeutenden und zu ignorierten Randnotizen verkommen, möchte man hoffen.
Zitat... dass mir nur die Fahrzeuge und Fahrer anzeigt werden, die zu einem bestimmten Auftragsdatum keinem Auftrag zugeordnet sind.
Hat Jemand vieleicht eine Idee, wie man dies lösen könnte?
Unbedingt.
Und diese Idee ist wichtig. Aus Deiner Praxis sollte Dir vertraut sein, dass man erst ein Ziel braucht, ehe Fahrzeuge und Fahrer irgendwie lostoben.
Eine fehlende/offene Menge (Abfragen sind Mengenoperationen) ermittelt man, indem man von einer vollständigen Menge die vorhandene Menge abzieht.
Datensätze aus A, die nicht in B sind (https://www.donkarl.com?FAQ3.16)
Vorhandene Menge: tblAuftragsbuch
Dort sind Fahrer und Fahrzeug mit Datum zusammengeführt, die beschäftigt sind.
Vollständige Menge: Einmal Fahrertabelle, also alle Fahrer (die zum Zeitraum arbeitsfähig sind).
Zum zweiten die Fahrzeugtabelle => alle Fahrzeuge, die bewegt werden können und dürfen.
Damit hätte man also zwei Abfragen.
Womöglich fährt aber nicht jeder Fahrer jedes Fahrzeug, sondern es gibt Zuordnungen. Dann wären diese Zuordnungen die vollständige Menge.
Selbstverständlich hat man nun die Hoffnung, dass Dein durchdachtes Datenmodell das Benötigte einfach bereitstellt.
Hallo,
@amo
ohne ein Mindestmaß an Grundlagenwissen zu Access wirst Du nicht zum Ziel kommen.
Mit Access kann man nicht einfach mal loslegen.
Die Abfrage braucht zwingend die Verknüpfungen die hier so angelegt werden müssen wie die Beziehungen.
Ohne Verknüpfungen erstellst Du (wie bereits gesagt) ein ein kartesisches Produkt.
Hast Du z.B. 200 Fahrten und 10 Fahrzeuge und 10 Fahrer, erzeugt diese Abfrage 200*10*10 = 20.000 Datensätze.
Du solltest auch erst mal in allen Beziehungen referentielle Integrität einstellen.
Links zu den Grundlagen habe ich Dir in #2 schon gezeigt.
Und wenn dann die Struktur passt (und nur dann), kannst Du den Link von Eberhard in #16 (Datensätze aus A, die nicht in B sind) anwenden.
PS:
Bitte unterlasse diese großen Zitate, das ist Platzverschwendung. Ich lösche sie ohnenhin wieder raus.