Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage funktioniert nach mehreren Eingaben nicht mehr

Begonnen von tianshiwen, Januar 23, 2025, 15:06:00

⏪ vorheriges - nächstes ⏩

tianshiwen

Hallo,

ich habe ein Problem mit meiner Datenbank mit dem ich nicht weiterkomme.

Es ist eine Datei für Besucher, in welcher die Besucher zusammen mit ihrem ausgegebenen Ausweisen eingetragen werden.
Hierzu habe ich eine Abfrage erstellt, welche anzeigt welche Ausweise noch zur Verfügung stehen, und die ausgegebenen Ausweise ausblendet.
Das funktioniert erstmal. Doch nach einigen Eingaben passiert es das die Abfrage plötzlich leer bleibt und nichts mehr anzeigt.

Leider kann ich nicht herausfinden an was es liegt. Ich meine, entweder funzt es, oder nicht. Warum erst nach einiger Zeit?

Anbei einmal ein Paar Bilder vom Aufbau und der Formel. Fall nötig kann ich auch die Datei gezippt anhängen wenn das weiterhilft. Wäre für Hilfe sehr dankbar, da ich wie gesagt nicht mehr weiterkomme.

Gruß Jürgen

Knobbi38

Lade mal die DB hoch, die Bilder sagen nichts aus.

tianshiwen


Bitsqueezer

Hallo,

also die Abfrage funktioniert schon. Sie zeigt, wie gewünscht, nur die verbeleibenden Ausweise an.

Wenn Du mit "die Abfrage bleibt leer" eigentlich die Kombobox im Formular meinst, dann liegt das daran, daß die Kombobox einen vorher gewählten Eintrag nur dann anzeigt, wenn er in der Liste noch enthalten ist.

Der Dropdown zeigt ja, daß es weiterhin eine Liste der verbleibenden Ausweise gibt, aber da es dort den Ausweis nicht mehr gibt, der als ausgegeben markiert wurde, wird er in der Kombobox auch nicht mehr angezeigt (obwohl die ID weiterhin im Datensatz vorhanden ist).

Darüber hinaus wird die Liste auch nicht automatisch bei Datensatzwechsel aktualisiert. Wenn Du also Ausweise auswählst, bleibt der gewählte Eintrag in der Kombobox sichtbar, weil er noch nicht als ausgegeben ausgefiltert wird (weil die Kombobox nicht aktualisiert wird). Wenn Du F5 drückst, verschwindet dann auch dieser.

Man kann das lösen, indem man mit einer UNION-Abfrage die ID des Datensatzes der Abfrage hinzufügt, die in dem aktuellen Besucher-Eintrag vorhanden ist. Dann muß nach Auswahl bzw. bei GotFocus die Liste in der Kombobox aktualisiert werden.

Ich würde dementgegen einfach eine zweite Spalte neben den Ausweisnamen setzen, in der der Ausweisstatus angezeigt wird. Wenn der Status "verfügbar" ist, kann er ausgewählt werden, ansonsten kannst Du in BeforeUpdate der Kombobox "Cancel=True" setzen, wenn der Status etwas anderes ist, ggf. mit einer Meldung und einem Undo.
Die Liste muß so nicht dauernd aktualisiert werden und man vermeidet Hinzufügen der aktuellen ID mit UNION, die ja in einer Liste der verfügbaren Ausweise eigentlich nicht enthalten sein dürfte.

Du kannst dann auch die Liste so sortieren, daß alle verfügbaren Ausweise zuerst und dann nach Namen sortiert werden. So stehen die verfügbaren Ausweise gleich oben in der Liste.

Gruß

Christian

tianshiwen

Hallo Bitsqueezer,

danke erstmal für die Ausführliche Antwort.

Aber das ist nicht das eigentlich Problem. Das die Ausweise aus der Liste verschwinden wenn sie ausgegeben wurden soll ja so sein.

Das Problem ist das die Abfrage auf einmal komplett Leer bleibt. Das heißt ich habe gar keine Ausweise mehr zur Auswahl.

Ich habe mal zwei Bilder angehängt, damit du siehst was ich meine.

Bitsqueezer

Hallo,

dann solltest Du die Datei mal so hochladen, daß man das Problem nachvollziehen kann. In der hochgeladenen Datei ist das nicht zu sehen.

Gruß

Christian

tianshiwen

Geht leider nicht. Ich hab jetzt mal die Namen und Besucher aus der Original Datei gelöscht (wegen Datenschutz). Danach funzt der Filter wieder...  :o

Das ist es ja was ich mir nicht erklären kann. Das es einmal funzt und einmal nicht.

Bitsqueezer

Hallo,

es war auch nicht gemeint, daß Du die Originaldaten hochlädtst. Du sollst die Datenbank soweit mit Testdaten füllen, daß man nachvollziehen kann, was das Problem ist.

Gruß

Christian

tianshiwen

#8
Hallo,

anbei mal die ältere Version der Datenbank MIT dem Fehler.

Bitsqueezer

Hallo,

also das ist weder das gleiche Datenmodell noch der gleiche Ausdruck...

Aber es zeigt sich wieder einmal: Wenn man die entsprechenden Daten dazu hat, findet man auch das Problem.

Wenn Du Deine Abfrage so umstellst:

SELECT AW.IDAusweis
  ,AW.Ausweis
FROM tblAusweise AS AW
WHERE AW.IDAusweis NOT IN
        (
            SELECT AD.IDAusweisF
            FROM tblAdmin AS AD
            WHERE AD.IDAusweisStatusF > 1
            AND AD.IDAusweisF IS NOT NULL
        )
AND     AW.IDAusweis NOT IN
        (
            SELECT FAW.IDAusweisF
            FROM tblFesteAusweise AS FAW
            WHERE FAW.IDAusweisStatusF IN (2,3)
            AND FAW.IDAusweisF IS NOT NULL           
        )

listet Deine Kombobox auch alle Einträge wieder wie gewünscht.

Das Problem: Es gibt genau einen Eintrag in "tblAdmin", in dem es keine IDAusweisF gibt, also NULL ist.
Operationen mit NULL ergeben NULL, also auch IN. Wenn man die Zeile mit "IS NOT NULL" ausschließt, dann funktioniert die Abfrage. Der Sicherheit wegen auch für die andere Tabelle eingefügt.

Hier zeigen sich dann die Schwächen des Datenmodells:
  • Sowohl die ID des Ausweises sowie des Ausweisstatus-Wertes stehen auf "Eingabe erforderlich: Nein". Also NULL erlaubt.
  • Es wird bei der Eingabe offenbar nicht geprüft, ob bei Auswahl eines Statuswertes auch eine Ausweis-ID vorliegt. Ein Status ohne Ausweis ist ja irgendwie sinnlos.
  • Mehrere Zeilen können die gleiche AusweisID haben, mit jeweils anderem Status. Verschärft dazu auch noch in getrennten Tabellen "tblFesteAusweise" und "tblAdmin".
  • Ein Attribut wie "Fester Ausweis" gehört in die Definition des Ausweises selbst. Die zweite Tabelle erübrigt sich dann, denn ein Ausweis kann nicht gleichzeitig fest und nicht fest sein oder verschiedenen Personen ausgehändigt sein.
  • Du hast bereits außerdem einen Status "Fest ausgegeben". Dieser findet sich sowohl in "tblAdmin" wie auch "tblFesteAusweise". Also entweder man hat eine eigene Tabelle dafür oder einen Status, beides macht keinen Sinn.
  • Du mußt in Deiner Abfrage nach verfügbaren Ausweisen auch berücksichtigen, welchen aktuellen Status ein Ausweis hat. Nimm als Beispiel Ausweis 51 in tblAdmin. Er wird als "nicht verfügbar" in der Abfrage nicht gelistet, was im aktuellen Zustand auch richtig ist: Status 4 ist 10.08.2024 und Status 1 war 16.03.2024. Drehe den Status in den beiden Zeilen um, aus 1 mach 4 und aus 4 mach 1. Jetzt war der frühere Status 4, der aktuelle ist 1. Er wird aber immer noch als "nicht verfügbar" nicht gelistet.
  • Welchen Sinn macht Status 1 in einem Eintrag in tblAdmin bzw. tblFesteAusweise? Der Ausweis ist einem Benutzer zugeordnet, aber er ist dennoch verfügbar. Also besitzt er ihn noch, Du kannst ihn aber dennoch nicht ausgeben... der Ausweis sollte den Status "Zurückgegeben" o.Ä. erhalten, wenn er tatsächlich zurückgegeben wurde. Oder der Eintrag aus der Liste gelöscht werden. Sobald dann kein Eintrag in der Liste ist oder ein vorhandener ungleich "Zurückgegeben", gilt der Ausweis als belegt. Ein Status "frei" ist dann nicht mehr nötig.

Da ein Ausweis zur gleichen Zeit nur einen Status haben kann, würde ich den Ausweisstatus in der Ausweistabelle vorhalten. In der Tabelle, in der der Ausweis mit Datum und Benutzer verwaltet wird, ist dann ein Ausweisstatus nicht mehr notwendig. Der Ausweisstatus für vergangene Ausleihen ist (für meine Begriffe) unwichtig.

Gruß

Christian

tianshiwen

Vielen Dank für die Hilfe  :)

auf die Idee mit dem Nullwert wäre ich nicht gekommen.

Das mit den getrennten Listen habe ich in der neuen Version berücksichtigt, deshalb ist das Datenmodel und die Abfrage auch anders. Aber klar, dass der Fehler hier auch auftritt wenn ich die Nullwerte zulasse.

Mit dem Datenmodell muss ich ein wenig weiter ausholen.

Die Problematik ist, das wir sehr viele Zeit Arbeiter haben, welche in den ersten vier Wochen täglich ihren Ausweis morgens bei uns abholen, und abends wieder abgeben müssen (Ausweisart "Zeitarbeit") wobei die Nummer ständig wechselt. Das sind die "Ausgegebenen" Ausweise.

Wenn sie dann länger als vier Wochen bei uns sind, bekommen sie dann so einen Ausweis ("Zeitarbeit) fest für etwa 9 Monate. Diese sind dann als "Feste Ausweise" eingetragen

Da viele auch bereits am ersten Tag aufhören, und teilweise den Ausweis mitnehmen, oder nach den 9 Monaten vergessen zurückzugeben, müssen wir anhand der Liste nachvollziehen wer wann welchen Ausweis bekommen hat.

Auch Besucher bekommen den Ausweis, und müssen ihn beim Verlassen wieder abgeben. Hier ist es das gleiche, das wir nachvollziehen können wer wann welchen Ausweis bekommen hat.


Außerdem müssen am Ende des Monats die Anzahl der Besucher weitergegeben werden.

Deswegen stehen mehrere gleich Ausweis ID mit verschiedenen Stati in der Tabelle.
Mit Status 1 wird mir dann z. B. angezeigt das der Ausweis wieder verfügbar ist, aber die Daten des Besuchers sind dennoch verfügbar.

Leider wüsste ich jetzt nicht wie ich das umsetzen könnte wenn ich den Status in die Ausweise selbst schreibe. Stehe da jetzt etwas auf dem Schlauch.


Gruß

Jürgen


Knobbi38

Hallo Jürgen,

wie Christian schon sagte, ist dein Datenmodell nicht wirklich brauchbar und führt deshalb zu diesen "Inkonsistenzen". Die Ausweisart und dessen aktueller Status gehören in die Ausweistabelle in nicht verstreut irgendwo in irgendwelchen Tabellen.

Zitat... müssen wir anhand der Liste nachvollziehen wer wann welchen Ausweis bekommen hat.
So etwas kann man z.B. mit einem Buchungsjournal erledigen.

Gruß
Knobbi38

Bitsqueezer

Hallo,

ich habe Dir hier mal ein kleines Modell gemacht, basierend auf Deiner Datenbank.
Sie dürfen in diesem Board keine Dateianhänge sehen.

Du solltest Deinen Anhang oben entfernen, weil er auch Echtnamen enthält. Ich habe sie hier anonymisiert.

Statt x verschiedene Formulare zu verwenden, gibt es jetzt nur noch ein Formular mit Unterformular.

Das HFo zeigt die Liste aller Ausweise an.
Das UFo zeigt die Liste der Vorgänge an, die mit dem aktuellen Ausweis bislang gespeichert wurden. (Ich habe Deine Daten dazu importiert.)

Der Ausweisstatus zeigt sofort an, welche Ausweise Du ausgeben kannst oder welche vorhanden oder gesperrt oder fest vergeben sind. In letzterem Fall kann man den Namen desjenigen direkt in der Ausweisliste auswählen, denn ein Ausweis kann ja zeitgleich nur einem gehören. Ebenso ist hier das Datum/Uhrzeit hinterlegt, wann die Zuordnung stattgefunden hat. Die Daten stammen aus Deiner Tabelle "tblFesteAusweise".
Zusätzlich gibt es ein Feld "MaxZuordnungTage" - wenn Du festlegen willst, wieviele Tage ein Ausweis fest zugeordnet werden kann, statt fix 9 Monate. Damit könntest Du anhand des Zuweisungsdatums auflisten, welche Ausweise demnächst oder bereits überfällig sind, individuell einstellbar für jeden Ausweis. So kannst Du ebenso Dauerausweise oder Tagesausweise konfigurieren.
Eine Checkbox "Defekt" gibt es dann auch noch.

Das Unterformular ist so eingestellt, daß es nur das Anhängen neuer Zeilen erlaubt. Löschen oder Editieren bestehender Zeilen ist gesperrt.

Außerdem gibt es ein Form_AfterUpdate, das nach dem Speichern einer Zeile im Log den Status des Ausweises entsprechend aktualisiert.

Das ganze müßte umgekehrt natürlich auch gemacht werden, aber ein bißchen darfst Du auch noch selbst machen.
Also in Form_AfterUpdate des HFo, wenn der Status geändert wurde, muß ein neuer Eintrag im UFo (also eigentlich in der Tabelle "tblAusweisLog" per INSERT) hinzugefügt werden mit dem neuen Status.

Benutzer und Besuchsgrund müssen dort eingegeben werden, daher würde ich als Besuchsgrund z.B. sowas wie "Ausweisstatus-Update" einfügen und als Name der Name des Bearbeiters der Datenbank. Somit kann ein INSERT dann mit diesen beiden IDs durchgeführt werden. Im Log kann man dann sehen, wenn der Status im HFo geändert wurde.

Im Prinzip werden keine weiteren Funktionen (nachdem Du den INSERT eingebaut hast) mehr benötigt: Filtern kannst Du die Hauptliste mit der rechten Maustaste auf dem Feldinhalt, z.B. auf Status und "Vorhanden". Filter aufheben geht in der Fußleiste durch Anklicken von "Gefiltert".
Datensatznavigation und Anlegen neuer Datensätze im Datensatznavigator. Suchen über alle Felder im Suchfeld dort. Speichern über den Record-Selektor oder durch Verlassen einer Zeile oder eines Formulares.

Einfach zu bedienen, einfach zu warten, ohne Schnickschnack. Du kannst das ganze natürlich dann nach Belieben grafisch aufpeppen.

Deine jetzigen Daten erfassen nicht, wann ein Ausweis zurückgegeben wurde, was für das Log aber ebenso wichtig ist. "Vorhanden" ist dann eigentlich nicht der richtige Begriff, aber "Zurückgegeben" als Extra-Status macht auch keinen großen Sinn (außer Optik), weil der Ausweis dann ja verfügbar ist. Außer, Du willst die Vorgänge trennen und nach Rückgabe explizit auf Vorhanden setzen (was zwei Einträge im Log bedeutet).

Du kannst dann weitere Threshold-Felder wie "MaxZuordnungTage" einfügen in die Ausweistabelle, z.B. wieviele Tage vergehen müssen, bevor eine feste Zuweisung erfolgen soll. Damit kannst Du effektiv die Ausweise verwalten.

Die Anzahl der Besucher kannst Du nun aus dem Log ermitteln, durch Filterung nach Monat und den gewünschten Ausweisstatus und Besuchsgrund.

Das Log kann natürlich auch unabhängig vom HFo aufgerufen werden, wenn Du die Gesamtliste sehen willst.

So, und nun wieder runter vom Schlauch, wie soll man denn sonst Blümchen gießen...tss..

Gruß

Christian






tianshiwen

Hallo Christian,

vielen lieben Dank für deine Mühe. Das sieht dann doch schon etwas anders aus als bei mir.

Muss zugeben, in die Richtung hatte ich nicht gedacht.

Ich schaue es mir mal in Ruhe an.

LG

Jürgen


Bitsqueezer

Hallo Jürgen,

noch zu erwähnen: Viele der Abfragen in der Demodatenbank werden für die eigentliche Datenbank nicht gebraucht. Ich hatte sie gemacht, um Daten aus den alten Tabellen in die neuen zu übernehmen, habe sie aber dringelassen, für den Fall, daß Du sie vielleicht gebrauchen kannst.
Wirklich gebraucht werden vor allem die Abfragen mit FRM und CTL im Namen.

Aber das siehst Du dann schon... :)

Gruß

Christian