Hallo zusammen,
ich bin neu hier und ersuche Hilfe. Also erstmal : Hallo zusammen :)
Ich möchte gerne ein Tabellenfeld mit einem Standardwert versehen, der auf einem Select Statement basiert, mein bisheriger Versuch scheitert wie folgt:
=(SELECT TOP 1 ID_FreieZahlen.Zahlenstrahl, ID_FreieZahlen.Reserviert
FROM ID_FreieZahlen
WHERE (((ID_FreieZahlen.Reserviert)=False));)
Dieses Select lässt mich die Tabelle aber gar nicht erst abspeichern. Das ist aber noch nicht alles, ich erkläre vielleicht mal was ich machen möchte ...
Wenn ein Datensatz in einer Tabelle angelegt wird, soll für eine bestimmte Spalte der Wert per Select selektiert werden. Die Tabelle, aus der dieser Wert kommt, hat eine Spalte FreieZahlen und ein Ja/Nein Feld "Reserviert".
Hier soll der erste Datensatz ohne "reserviert Flag" selektiert werden - sobald die Zahl dann selektiert wurde, soll auch der reserviert Flag gesetzt werden.
Dann wäre es natürlich von Vorteil, wenn ich den Datensatz in der Tabelle wieder lösche, auch das Feld reserviert zu dieser Zahl ebenfalls "rückgängig" gemacht wird.
Wie mache ich das nur auf Basis von Tabellen? Ich verwende Access 2013. Irgenwie komme ich auf keinen grünen Zweig.
Gruß
Landlord
Hi,
siehe Beispiel im Anhang.
Gibt zwei Tabellen. In der ersten sind die möglichen Zahlen drin, in der zweiten die Daten, die ausgewählt wurden.
Weiterhin gibt es ein Formular:
In die "Spalte" können nur Zahlen eingetragen werden, die in der ersten Tabelle vorkommen und die noch nicht in de zweiten verwendet wurden. Geregelt wird das durch eine Abfrage, die eine Unterabfrage enthält.
Diese Abfrage wird immer dann aktualisiert, wenn man in das Feld reingeht.
Hilft das?
Harald
Hallo,
wenn es nur darum geht, die nächste "freie" (nicht vorhandene) Zahl mit aufsteigender Sortierung in einer Tabelle zu finden, dann braucht es keine "Zahlenstrahl"-Tabelle und deren Verwaltung.
select top 1 b.FreieZahl from
(select a.Spalte_x +1 as FreieZahl from Tabelle1 as a) as b
left join Tabelle1 as c on b.FreieZahl = c.spalte_x
where c.spalte_x is null
order by b.FreieZahl
Hallo zusammen,
erstmal Danke für die Anworten, leider hilft das noch nicht weiter.
Die DB ist mit ZIP noch 900KB deshalb musste ich auf einen Filehoster ausweichen:
Ich möchte das ganze eigentlich gerne als Autowert haben (eventuell habe ich mich da falsch ausgedrückt), wenn ich dann in die Tabelle Reservierung gehe soll die Spalte DocID wie beschrieben mit unreservierten Werten der ID_FreieZahlen Tabelle gefüllt werden, aber erst natürlich wenn ich einen Datensatz anlege, die dann verwendeten Werte sollen dann den Reserviert Flag in der Quell Tabelle (ID_FreieZahlen) bekommen.
Die Dropdowns der Tabelle Reservierung definiere ich ja auch direkt in der Tabellen Definition, dort wollte ich auch den Autowert irgendwie realisieren.
Und nein, die Zahlen, die jetzt enthalten sind, sind fortlaufen - jedoch sind die "live" Daten nicht fortlaufend.
Gruß
Landlord
Hallo,
schaue mal in das angehängte Beispiel.
Hallo,
erklär doch mal, was das Ganze insgesamt soll...
Wozu brauchst Du die "Zahlenstrahl"-Tabelle mit dem "reserviert"-Feld?
Einen Autowert(Feld) kannst Du nicht permanent manipulieren..
Zudem ist es db-technisch äußerst fragwürdig, einmal vergebene, dann aber gelöschte Nummern wieder neu zu belegen/verwenden, besonders wenn diese Nummern eine Kennzeichnungsbedeutung (z. B. Primärschlüssel) haben sollen.
Hallo,
der Quasi Autowert funktioniert bei mir nicht, aber da fehlen auch die wichtigen Teile.
Ich versuchs mal zu beschreiben, ich weiß auch das es teils Normalisierungstechnisch und DB technisch normalerweise keinen Sinn macht.
Eventuell sollte es via Logik Nach Aktualisierung (AfterUpdate) für einen bestimmten Feldnamen funktionieren, der Teil den ersten freien Datensatz ohne Reserviert Flag zu selektieren funktioniert ja schon. Mit einer Aktualisierungsabfrage bekomme ich auch den reserviert Flag gesetzt, es soll aber wie durch einen Trigger automatisch passieren, der halt ausgelöst wird, wenn ich den Wert (DocID_Zahl) in einem neuem Datensatz auswähle. Es müsste auch funktionieren das ein Trigger den reserviert flag wieder löscht, sobald ich den Datensatz mit dieser DocID_Zahl lösche.
DB ist noch mal anbei:
Link gelöscht - Landlord
Ich bekomme es leider selbst noch nicht hin. Könnt Ihr denn .accdb öffnen? Dann müsste sich auch der Sinn meiner Datenbank ergeben.
Gruß
Landlord
Hallo,
ich halte das Vorhaben mit dem Flag für komplett überflüssig. Du musst nur in einer Abfrage beide Tabelle (die Daten und die Zahlenreihe) mit einem Left Join (oder Right) verknüpfen und schon hast Du stets aktuell die nicht verwendeten Nummern.
ZitatKönnt Ihr denn .accdb öffnen?
ich nicht, daher ist es sinnvoll die DB nach Access2003 (MDB) zu konvertieren, es gibt immer noch viele, die nur Access2003 haben.
Hi,
gesagt getan, 2003er Format.
Ein Left Join würde zwar falsche Datensätze ausschließen, aber der Flag lässt mich via Select im Dropdown den nächsten freien Wert selektieren. (Schau mal die Tabelle Reservierung, Feld DocID_Zahl --> dieses Feld müsste dann mit dem Feld ID_FreieZahlen --> Zahlenstrahl verknüpft sein.
Lasse mich gerne eines besseren belehren :) aber ich denke ein Join hilft mir nicht beim Dropdown. Kannst ja mal schauen wie es funktionieren soll, neuen Datensatz anlegen in Reservierung & die Aktualisierungsabfrage für den Zahlenstrahl - die Tabelle muss man nach dem einfügen leider speichern und zu machen, die abfrage ausführen und dann wird auch der nächste Wert in Reservierung selektiert.
Gruß
Landlord
Gruß
Landlord
Hallo,
ich hasse diese Seiten da weiß man nicht, welchen Button man drücken muss und sammelt sich dann noch einen Virus ein. Siehe Bild.
Die Virenwarnung kommt übrigens bei jedem Button und das Zip File ist in eine EXE verpackt was auch schon mehr als bedenklich ist.
Bitte lösche den Link wieder.
Verwende
https://www.dropbox.com
garantiert seriös und fallstrickenfrei.
Hi,
aufbauend auf dem schon zuvor gezeigten Beispiel hier eine Variante, in der beim Erstellen eines neuen Datensatz die "Spalte" mit einem Defaultwert belegt wird, der aus der Stammdatentabelle stammt und bislang noch nicht in der aktuellen Tabellen ist.
Das Beispiel kommt ohne jeglich Reservierungsanweisungen aus.
Wird in der aktuellen Tabelle ein Datensatz gelöscht (da bäumen sich bei mir die Nägel auf, aber egal), steht die Zahl wieder zur Verfügung.
Harald
Hallo zusammen,
hatte die Links hier vorher getestet, sorry, kann ein Admin bitte alle bisherigen Links rauslöschen.
Hier jetzt via Dropbox.
https://www.dropbox.com/s/u3cw1nun46v1vrx/Nummernvergabe_2003.zip?dl=0 (https://www.dropbox.com/s/u3cw1nun46v1vrx/Nummernvergabe_2003.zip?dl=0)
Gruß
Landlord
Hallo,
wie kann man nur eine so überladene Beispieldb machen. Ich weiß überhaupt nicht wo Du jetzt was machen willst. Und 175000 Datensätze in eine Beispieldb, da fehlen mir fast die Worte. 10 DS hätten es auch getan.
Ich bin auch der Meinung mein obiges Beispiel mit dem Quasiautowert trifft Dein Problem exakt. Es wird die nächste freie Zahl ermittelt und eingetragen.
Im übrigen, halte ich das Datenmodell für völlig unbrauchbar. In keiner !! Tabelle gibt es einen Primärschlüssel, keinen Fremdschlüssel und demzufolge auch keine Beziehungen. Beziehungen mit referentieller Integrität sind aber in einer Datenbank unerlässlich. Was Du hier hast ist ein undurchsichiger Datenhaufen in dem nicht die Spur von Datenkonsistens vorhanden ist.
Z.B. Eine UserID als Text und indiziert mit Duplikaten, das ist gelinde gesagt Unsinn. Du solltest Dich unbedingt mit den Grundlagen zu Datenbanken beschäftigen, so wird das nichts, so kann man keine Datenbank machen.
Sorry, aber das ist so drastisch, ich wollte das nicht schön reden.
Hallo zusammen,
@Harald
Super, vielen Dank, ein Schritt weiter! Aber ein Problem ist noch vorhanden. Ich habe es jetzt in die Tabelle integriert, das Problem ist ich muss die Tabelle speichern, schließen, neu öffnen - erst dann bekomme ich den nächsten Wert. Ansonsten wird immer der selbe Wert angezeigt.
@MzKlMu
Habe ich doch oben geschrieben, das es nahezu gegen jede Regel einer Normalisierten Datenbank verstößt. Das es auch an der Integretät hapert, wenn ich Datensätze lösche ist mir klar.
Ich habe das Beispiel jetzt auf das WESENTLICHE reduziert :) oh wunder ... es sind nur noch 19kb
Zum eigentlichen Einsatz:
Wir haben ca. 800.000-900.000 Dokumente, bei denen in diesem Zahlenstrahl Löcher entstanden sind. Diese möchte ich gerne füllen.
Die eigentliche DokumentenID ist wie folgt aufgebaut:
AAAZZZZZZZXXXYYY
A: Prefix (Buchstaben und Zahlen)
Z: Der besagte Zahlenstrahl
X: Post (Buchstaben und Zahlen)
Y: Post Index (laufende Zahl von 001-999 für eine Seitenzahl)
Diese selektiere ich und ermittle die fehlenden Zahlen, diese können dann mit diesem kleinen Helfer gefüllt werden, bzw. reserviert. Da keine direkte Systemverbindung besteht, ist die Integrität sowieso nicht gewährleistet, wenn sich einer nicht an den kleinen Helfer hält.
Deshalb hatte ich im Zahlenstrahl auch 175.000 Zahlen ... bei dieser Menge ist der Select, besonders der geschachtelte, schon ziemlich langsam.
Gruß
Landlord
Hi,
Zitat von: landlord am November 29, 2014, 22:21:47
ich muss die Tabelle speichern, schließen, neu öffnen - erst dann bekomme ich den nächsten Wert. Ansonsten wird immer der selbe Wert angezeigt.
hast Du im Formular beim Ereignis "beim Anzeigen" einen Code in der Art hinterlegt:
Private Sub Form_Current()
Me.Spalte_x.DefaultValue = Chr(34) & DLookup("Meine_Zahlen", "Abfrage1") & Chr(34)
End Sub
Damit sollte der Default-Wert neu belegt werden, ohne dass etwas verlassen werden muss?
Du setzt doch ein Formular ein, oder?
Ok, nach dem Download ist mir klar, dass Du kein Formular verwendest. Grober Verstoss gegen die guten Sitten! ;D {üblicherweise werden Daten nicht direkt in eine Tabelle eingetragen}
Der Einsatz vom Formular bietet viele Vorteile, u.a. dass Du bestimmte Anweisungen ablaufen lassen kannst.
Harald
Hallo Harald,
Nein, kein Formular, direkt in der Tabellen Entwurfsansicht (Unter Nachschlagen), am einfachsten ... guck doch mal in meine Datenbank. Dann haben wir auch einen Nenner.
Ansonsten, anbei ein Screenshot, ich weiß nicht warum du sie nicht öffnen möchtest.
Gegen die Sitten habe ich ja jetzt schon diverse male verstoßen ;D
Gruß
Landlord
Hallo,
mein Quasiautowert erfüllt exakt Deine Anforderungen. Hast Du es überhaupt schon mal versucht, mein Beispiel zu übertragen?
Wenn ja, woran hapert es ?
Hi,
ich habe Deine Datenbank geöffnet. Daher die Aussage, dass Du kein Formular verwendest.
Das mit den Sitten war heiter bis ironisch gemeint.
Wenn Du aber etwas Brauchbares erarbeiten willst, wirst Du um ein Formular nicht herumkommen.
Nur damit sind bestimmte Aufgaben (z.B. Aktualisieren von Abfragen nach bestimmten Ereignissen: konkret das Ermitteln der nächsten freien Zahl in Deinem Fall) machbar. Die weitere Auflistung von Vorteilen von Formularen würde jetzt das Thema sprengen.
Harald
Hallo zusammen,
hat etwas länger gedauert, aber ich habe jetzt Zeit gefunden. Vielen Dank für die Hilfe, ich habe es jetzt mit dem Quasi Autowert (Die Ausschlussabfrage) und einem Formular gelöst :).
Nochmals Danke für die Denkanstöße.
Gruß
Landlord
ZitatDeshalb hatte ich im Zahlenstrahl auch 175.000 Zahlen ... bei dieser Menge ist der Select, besonders der geschachtelte, schon ziemlich langsam.
Nun, Deine "Zahlen" sind Texte , die Ziffern als Zeichen enthalten. Wenn man einen Unterschied zwischen Text und Zahl erfassen und dann auch anwenden kann, wäre man schon einen Schritt weiter.
Zweitens gibt es zur Bewältigung von größeren Datenmengen Indizes. Man muss sie aber haben und anwenden. Wenn man sein Auto nur im ersten Gang fährt, muss man sich nicht wundern, wenn man sogar von Fahrrädern überholt wird.
Mit anderen Worten: Ein paar Grundkenntnisse sind auch schon anfänglich hilfreich.