none
Inkonsistenz-Abfrage macht mir Schwierigkeiten.

    Frage

  • Hallo.

    Nachdem man mir hier im Forum so toll geholfen hat, wofür ich echt super dankbar bin, hätte ich da doch noch eine Frage.

    Ich arbeite im Sicherheitsgewerbe für ein Logistik-Unternehmen und zu meinem Aufgabenbereich gehört es auch, die Vorlogistik der an- und abfahrenden LKW´s zu machen.

    Alle Fahrzeuge werden zurzeit in div. Excel Tabellen erfasst.

    Grausam ;-)

    Nun habe ich endlich Access auf dem Rechner und möchte nun ein vernünftiges Werkzeug schaffen, mit dem man ordentlich arbeiten kann.

    Bei der Einfahrt wird z.B. das Kennzeichen von dem Fahrzeug erfasst. Es muss nicht unbedingt sein, dass ein Fahrer mit dem selben Fahrzeug das Gelände wieder verlässt, deshalb musste ich in der Datenbank ein weiteres Feld erzeugen, wo die Kennzeichen eingetragen werden, die das Gelände verlassen.

    Nun möchte ich wissen, welche Fahrzeuge sich im Augenblick auf dem Gelände befinden.

    Ich dachte, dass sei einfach. Ich bräuchte nur eine Abfrage zu erstellen, wo die Eingänge ermittelt werden und eine Abfrage zu erstellen, wo die Ausgänge ermittelt werden und diese beiden Abfragen dann durch eine Inkonsistenzen Abfrage laufen zu lassen. Wie es z.B. bei http://www.donkarl.com/ beschrieben ist.

    Zitat Anfang:


    SELECT A.*
    FROM A LEFT JOIN B ON A.Id = B.Id
    WHERE B.Id Is Null

    Zitat Ende:

    Funktionier auch erst einmal wunderbar. Nur wenn ein Kennzeichen ca. vier mal ein und ausgebucht wurde, verhaspelt sich Access und zeigt mir dieses Kennzeichen bei weiteren Datensätzen nicht mehr an.

    Woran könnte das liegen?

    Fragender Gruß, Klaus.

    Freitag, 16. Januar 2015 05:41

Antworten

  • Hallo Klaus,

    ich denke, dein Tabellendesign ist hier einfach falsch.

    Du solltest pro Fahrzeug und Vorgang einen Datensatz erzeugen, also sowohl für die Einfahrt als auch für die Ausfahrt.

    Den Fahrer kannst Du mit in diese Zeile speichern.

    Wenn man richtig machen möchte, gäbe es eine Tabelle "Fahrzeuge", ggfs. auch eine Tabelle "Anhänger" (wobei ich die als Fahrzeug mit einem Flag "IstAnhaenger" versehen würde) und dann die Protokolltabelle für die Vorgänge.

    Ich würde dann letzendlich in die Tabelle "Fahrzeuge" ein Flag "IstAnwesend" einfügen und nicht versuchen, diese Angabe dynamisch zu ermitteln.

    Sprich: Wenn ein Protokoll "Einfahrt" geschrieben wird, wird automatisch das Flag "IstAnwesend" in der Tabelle "Fahrzeuge" gesetzt. Bei einer Ausfahrt entsprechend ebenfalls.

    Also in etwa so:

    [Fahrzeuge]
    ID (int -> Autowert)
    Kennzeichen (String)
    IstAnhaenger (Bit/Bool)
    IstAnwesend (Bit/Bool)

    [Fahrer]
    ID (int -> Autowert)
    Name (String)
    IstAnwesend (Bit/Bool)

    [Protokoll]
    ID (int -> Autowert)
    FahrzeugId (int -> FK zu Fahrzeuge.ID)
    AnhaengerId (int -> FK zu Fahrzeuge.ID, Prüfung auf "IstAnhaenger" = True)
    FahrerId (int -> FK zu Fahrer.ID)
    Typ (1 = Einfahrt, 2 = Ausfahrt)

    Das ist jetzt nur ein Schnellschuss und sicher nicht zu Ende gedacht aber dennoch würde ich damit denken, dass Du eher ans Ziel kommst als mit deiner Struktur.

    Du könntest auch SQL Server als Datenquelle nutzen und Access lediglich als Frontend. Dann hättest Du auch problemlos die Möglichkeit, die Prüfung und Aktualisierung der Fahrzeuge und Fahrer Datensätze per Trigger zu automatisieren.

    Eine Ausfahrt sollte bspw. ja auch nur dann möglich sein, wenn sich das Fahrzeug noch auf dem Gelände befindet. Sollte das nicht der Fall sein, wurden entweder falsche Daten für das Protokoll erfasst oder eine Ausfahrt wurde vergessen, ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Freitag, 16. Januar 2015 18:40
    Moderator

Alle Antworten

  • Bitte gib die Struktur der beteiligten Tabellen  (Tabellennamen, Feld-Namen und -Typen und Primärschlüssel) sowie ein paar Beispieldaten an. Es ist sonst schwierig, eine konkrete Antwort auf deine Frage zu geben.

    Ein Ansatz wäre, die Anzahl Einfahrten und Anzahl Ausfahrten zu vergleichen. Ist die Anzahl Einfahrten grösser, ist das Fahrzeug da.

    Matthias Kläy, Kläy Computing AG

    Freitag, 16. Januar 2015 10:53
  • Hallo

    Wenn du ausserdem das Datum und die Uhrzeit der Einfahrt erfassen würdest könntest du schauen ob es nach der grössten Einfahrt eine Ausfahrt für das gleiche Kennzeichen hat oder nicht.

    Ein 16.01.2015 16:00   Aus 16.01.2015 18:30    der ist weg

    Ein 16.01.2015 16:00   Aus 15.01.2015 18:30    der ist da er ging zuletzt gestern weg

    Vielleicht ist das ein Ansatz...

    Gruss Markus

    Freitag, 16. Januar 2015 15:10
  • Hallo Matthias, hallo Markus.

    Danke, dass ihr mir helfen wollt.

    Habe Markus seinen Vorschlag mal überprüft. Doch nur die letzten Einträge verschwinden irgendwie im Nirwana.

    Habe auf Sky Drive eine Muster-Datei abgelegt. http://1drv.ms/1CwvdMW

    Der Übersicht halber, habe ich die Abfragen nummeriert,

    damit man die einzelnen Schritte von mir besser nachvollziehen kann.

    Dankender Gruß, Klaus.

    Freitag, 16. Januar 2015 16:50
  • Hallo Klaus,

    ich denke, dein Tabellendesign ist hier einfach falsch.

    Du solltest pro Fahrzeug und Vorgang einen Datensatz erzeugen, also sowohl für die Einfahrt als auch für die Ausfahrt.

    Den Fahrer kannst Du mit in diese Zeile speichern.

    Wenn man richtig machen möchte, gäbe es eine Tabelle "Fahrzeuge", ggfs. auch eine Tabelle "Anhänger" (wobei ich die als Fahrzeug mit einem Flag "IstAnhaenger" versehen würde) und dann die Protokolltabelle für die Vorgänge.

    Ich würde dann letzendlich in die Tabelle "Fahrzeuge" ein Flag "IstAnwesend" einfügen und nicht versuchen, diese Angabe dynamisch zu ermitteln.

    Sprich: Wenn ein Protokoll "Einfahrt" geschrieben wird, wird automatisch das Flag "IstAnwesend" in der Tabelle "Fahrzeuge" gesetzt. Bei einer Ausfahrt entsprechend ebenfalls.

    Also in etwa so:

    [Fahrzeuge]
    ID (int -> Autowert)
    Kennzeichen (String)
    IstAnhaenger (Bit/Bool)
    IstAnwesend (Bit/Bool)

    [Fahrer]
    ID (int -> Autowert)
    Name (String)
    IstAnwesend (Bit/Bool)

    [Protokoll]
    ID (int -> Autowert)
    FahrzeugId (int -> FK zu Fahrzeuge.ID)
    AnhaengerId (int -> FK zu Fahrzeuge.ID, Prüfung auf "IstAnhaenger" = True)
    FahrerId (int -> FK zu Fahrer.ID)
    Typ (1 = Einfahrt, 2 = Ausfahrt)

    Das ist jetzt nur ein Schnellschuss und sicher nicht zu Ende gedacht aber dennoch würde ich damit denken, dass Du eher ans Ziel kommst als mit deiner Struktur.

    Du könntest auch SQL Server als Datenquelle nutzen und Access lediglich als Frontend. Dann hättest Du auch problemlos die Möglichkeit, die Prüfung und Aktualisierung der Fahrzeuge und Fahrer Datensätze per Trigger zu automatisieren.

    Eine Ausfahrt sollte bspw. ja auch nur dann möglich sein, wenn sich das Fahrzeug noch auf dem Gelände befindet. Sollte das nicht der Fall sein, wurden entweder falsche Daten für das Protokoll erfasst oder eine Ausfahrt wurde vergessen, ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Freitag, 16. Januar 2015 18:40
    Moderator
  • Hallo Stefan.

    Auch dir möchte ich für deine Hilfe, Mühe und guten Ratschläge danken.

    Wenn ich das jetzt alles richtig verstanden habe, ist das Zauberwort: "Aufteilung" bzw.: "Teile und beherrsche ;-)"

    Alles in eine Tabelle zu packen war nach meiner Vorgeschichte nur verständlich.

    Wie ich grob beschrieben hatte, fahren bei mir alle Sorten von Fahrzeugen rein und raus.

    Einige liefern, einige holen ab. Liefern tun sie zu Lande, zu Wasser und aus der Luft. Vom einem Produzenten oder von einem Lager zum anderen. Die Abholer fahren verschiedene Abladestellen an. Plombennummern müssen erfasst werden. Leergut und Retouren und und und und....Von Ankunft bis Abfahrt sind das 64 Fragen pro Fahrzeug.

    Bis jetzt arbeiten wir deswegen mit unzähligen Excel Tabellen, damit die einzelnen Stellen im Objekt die passenden Daten zur Verfügung haben. Tabellen über Tabellen und davon wollte ich instinktiv weg ;-)

    Bei Access sind Tabellen wohl nicht der Feind sondern, dein Freund. Auf die Formulare kommt es wohl an.

    Zwei Tabellen zu vergleichen macht dank deiner Antwort für mich jetzt mehr Sinn, als zwei Abfragen von ein und der selben Tabelle.

    Ich nehme mir jetzt erst mal Papier und Stift und visualisiere mir mal, was ich eigentlich jetzt machen muss.

    Ich werde hier berichten, wenn ich nach dem Umbau ein neues Ergebnis zu meinem Problem habe.

    Erst einmal großen Dank!

    Gruß, Klaus.

    Samstag, 17. Januar 2015 02:50
  • Hallo!

    Ich würde das von Stefan vorgeschlagene Datenmodell noch um einen Timestamp in der Tabelle Protokoll erweitern. So kannst Du später ermitteln, seit wann der Wagen auf dem Gelände steht bzw. wann er das Gelände zuletzt verlassen hat.

    Ich wette mit Dir, irgendwann kommen diese Fragen auf Dich zu. ;-)

    CU


    Thomas@Team-Moeller.de
    Blog: Blog.Team-Moeller.de
    Homepage: www.Team-Moeller.de


    Samstag, 17. Januar 2015 09:37
  • Hallo Thomas.

    Diesem Ansatz gehe ich gerade nach.

    Hörte sich einfacher an, als es für meine beschiedenen Fähigkeiten ist.

    Für LKW, Anhänger und andere Daten eine extra Tabelle zu erstellen klingt logisch und effizienter.

    Problem derzeit ist, die Tabellen in ein Formular zu bekommen. Mit zig Unterformularen zu arbeiten ist weniger schön.

    Wie man in einem Formular verschiedene Steuerelemente von verschiedenen Tabellen unterbringt muss ich noch googlen :-) 

    Samstag, 17. Januar 2015 10:07
  • Hallo!

    Das ist am Ende gar nicht so schwer. Du brauchst drei Formulare, keine Unterformulare.

    Ein Formular zur Pflege der Fahrzeugdaten. Dann noch ein Formular zur Pflege der Daten der Fahrer.

    Als drittes ein Formular zu Pflege des Protokolls. Dort verwendest Du für die Auswahl der Fahrer und der Fahrzeuge jeweils ein Kombinationsfeld. Dieses Kombinationsfeld hat als Datenquelle die jeweilige Tabelle. Fertig!

    CU


    Thomas@Team-Moeller.de
    Blog: Blog.Team-Moeller.de
    Homepage: www.Team-Moeller.de


    Samstag, 17. Januar 2015 11:00
  • Hallo Thomas.

    Dies umzusetzen war auch nicht das Problem.

    Da ich aber nur zu 60 % mit Stammfahrern und Stammfahrzeugen zu tun habe und die restlichen 40 % unbekannte Fahrer und Fahrzeuge sind, müsste ich sie bei der Ankunft erst in den ersten beiden Tabellen erfassen, bevor sie mir in der dritten Tabelle zur Verfügung stehen. Wobei das Kombinationsfeld ja auch fremde Werte zulassen kann....

    Wird schon ;-)

    Foreigen Keys kannte ich noch nicht und lese und spiele mich gerade da ein.

    Übrigens deine Seite  http://www.team-moeller.de/ ist auch echt gut. Und der Link zu Folke Kieseler ;-)

    Ihn hatte ich 1998 im Netz kennen gelernt als wir beim Betatest von Windows 2000 teilnehmen durften ;-) 

    Dankender Gruß, Klaus.

    Samstag, 17. Januar 2015 14:59
  • Hallo.

    Ich habe eure Ratschläge mal umgesetzt: http://1drv.ms/1wjwh1y

    Foreign Key ist schon eine feine Sache!

    Datenbank ist auf die Dauer schlanker und schneller und über Abfragen komme ich an die Informationen.

    Nur eine kleine Frage hätte ich da doch noch.

    In der Abfrage oder dem Formular: "Datenerfassung" kann ich nur Fahrzeuge nehmen, die in der Tabelle Fahrzeuge erfasst wurden.

    Wenn nun ein Fahrzeug kommt, welches unbekannt ist und dieses auch noch von einer unbekannten Spedition ist, wird es kompliziert. Dann müsste man zuerst die Spedition anlegen, dann das Fahrzeug und erst dann kann man die Ankunft in der Datenerfassung eintragen.

    Gibt es da eine elegantere Lösung?

    Wenn ein neues Fahrzeug kommt, dass das automatisch bei der Datenerfassung den richtigen Tabellen übergeben wird?

    Irgendwie habe ich da einen Knoten im Hirn und Google und Youtube können nicht viel mit meiner, wohl falschen, Fragestellung anfangen.

    Ansonsten erst einmal vielen Dank für eure Hilfe bisher.

    Hat mich echt weiter gebracht!

    Gruß, Klaus. 

    Sonntag, 18. Januar 2015 09:35
  • Hallo Klaus,

    welche Version von Access hast Du denn im Einsatz?

    Ab Access 2007 gibt es da eine relativ einfache Möglichkeit. Schau Dir beim Kombinationsfeld mal die Eigenschaften "Wertlistenbearbeitung zulassen" und "Bearbeitungsformular für Listenelemente" näher an.

    HTH


    Thomas@Team-Moeller.de
    Blog: Blog.Team-Moeller.de
    Homepage: www.Team-Moeller.de


    Sonntag, 18. Januar 2015 12:55
  • Hallo Stephan.

    Ich arbeite mit Access 2013.

    Mit "Wertlistenbearbeitung zulassen" und "Bearbeitungsformular für Listenelemente" habe ich schon experimentiert. Ist eine Möglichkeit.

    Ich hatte nur gehofft, dass Einträge von einem Steuerelement in einem Formular direkt dem Tabellen durchgereicht werden können.

    Geht natürlich mit Hilfe von einem Unterformular. Doch ein Formular mit etlichen Unterformularen...

    Aber erst einmal Danke :-) Es gibt erst einmal genug für mich zu lesen und zu lernen.

    Dankender Gruß, Klaus.


    Sonntag, 18. Januar 2015 15:38
  • Hallo Klaus!

    Wenn Du keine weitere Informationen zu einem Fahrer oder einem Kennzeichen speichern willst, dann hilft Dir dieser Artikel:

    http://www.donkarl.com?FAQ4.13

    HTH


    Thomas@Team-Moeller.de
    Blog: Blog.Team-Moeller.de
    Homepage: www.Team-Moeller.de



    Sonntag, 18. Januar 2015 17:08
  • Hallo Thomas.

    Und wie das hilft!!!

    Absolut genial der Link.

    Ich kenne doncarl.com aber da kann man wochenlang lesen und hat nur einen Bruchteil erfasst :-)

    DANKE!!!

    Jetzt komme ich super weiter.

    Dankender Gruß, Klaus.

    Montag, 19. Januar 2015 18:34