MS Access Abfrage fehlende Zahlen in Zahlenfolge: Eine Tabelle besteht aus ca 4000 Datensätzen. Ein Feld X dieser ca 4000 Datensätze hat Zahlen: z. B. 2000993, 2000994, 2000996, 2000997, 2000998, 2000999, 2001001, 2001002, 2001004, 2001005 usw.
Es fehlen hier die Datensätze mit der Zahl 2000995 und 2001003.
Welches Kriterium für das Feld X muß ich in der Abfrage eingeben, damit mir angezeigt wird, daß diese beiden Datensätze fehlen?
Ich kann Dir leider nicht weiterhelfen!
Schade! Vielleicht ein anderes Mal.
Dazu musst Du eine Liste (VollstaendigeListe) mit einem Feld (dieZahl) schaffen, das alle Zahlen hintereinander enthält (mach ich in Excel mit Autoausfüllen nach unten und importiere sie)
Dann vergleichst Du mit deiner Liste (hier Zahl_Luecke) mit dem dortigen lückenhaften Feld (LfdNr) mittels SQL-Abfrage
SELECT VollstaendigeListe.\*
FROM VollstaendigeListe LEFT JOIN Zahl\_Luecke ON VollstaendigeListe.dieZahl = Zahl\_Luecke.LfdNr
WHERE (((Zahl\_Luecke.LfdNr) Is Null));
Also Abfrage im Entwurfsmodus öffnen und auf die SQL-Ansicht gehen. Das macht man oben links mit Ansicht und den Code eintragen
Hi Peter, schön, dass mal ne Frage kommt, die nicht durch n Blick in die Hilfe geklärt werden kann.
Du kannst die Tabelle abgleichen mit dem korrekten Zahlenbereich.
Dazu erstellst du eine Tabelle N mit den Werten Y= 2000993 bis 2005000 oder wie weit es eben geht.
Das kann VBA übernehmen.
Wenn dir das zu mühsam ist, kannst du auch fast korrekte Zahlen nehmen, nämlich die deiner Tabelle. Wie das?
Suche alle Zahlen X, für die die nächsthöhere X+1 nicht in der Tabelle steht.
Diese X+1 sind es. 2 Schönheitsfehler:
- Die Abfrage spuckt immer max(X)+1 aus, dafür
- versagt sie bei direkt aufeinander folgenden Fehlstellen.
Wenn du die Abfrage von Hand auswertest, ist das kein Problem,
ansonsten musst du eben doch ein paar Minuten Arbeit investieren.
Durchführung: Sei T deine Tabelle mit dem Feld X.
Dann gib folgendes in die SQL-Ansicht einer neuen Abfrage ein:
SELECT [X]+1 FROM T
WHERE ([X]+1) Not In
(SELECT X From T);
Die Klammer in der 3. Zeile nennt sich übrigens Unterabfrage.
Wenn du tatsächlich die Tabelle N verwendest, steht da
SELECT Y FROM N
WHERE Y Not In
(SELECT X From T);
Alles klar?
Alles Gute!
Hi,
diese Anforderung hatte ich so noch nicht… Klar ist eine SQL-Lösung (fast) immer die beste, aber mir fällt da jetzt nichts ein.
Du bräuchtest eine Hilfs-Abfrage, die so viele „Datensätze“ simuliert anzeigt, wie es der Differenz aus der höchsten und der niedrigesten Zahl aus dem Feld X entspricht. Die dann mit Laufnummern zu füllen, die beim kleinesten gefundenen Wert von X beginnt, und daraus mit einer zweiten Abfrage die Differenz all der Zahlen ausgeben zu lassen, die in der Abfrage, nicht aber in (Feld X) der Tabelle vorkommen, das wäre kein Problem.
Ich würde sowas halt mit VisualBasic machen, in einem Modul in der Access-Datenbank.
Alternativ wäre wohl noch (umständlich und unschön, aber funktionierend) möglich, eine Hilfs-Tabelle zu benutzen, die vor jedem Ausführen der Abfrage mit Laufnummern gefüllt wird. Dann könnte man die Differenz s.o. - also die Zahlen, die in (Feld X) der Tabelle fehlen - ohne die Hilfs-Abfrage ausgeben lassen, indem man statt dieser Abfrage die Hilfs-Tabelle verwendet.
Ich würde Dir raten, Dich mit diesem Problem mal an ein echtes Forum von Access-Fachleuten zu wenden, wie www.donkarl.com/forum, www.freeaccess.de, www.ms-office-forum.net/forum oder www.access-o-mania.de.
lg
Liebe Wer-Weiß-Was-Experten! Ich bin überwältigt über so viel Hilfsbereitschaft durch die vielen Antworten in so kurzer Zeit. Ich hätte aber nicht gedacht, daß eine Abfrage zu meiner Problemstellung so kompliziert ist. Erscheint sie mir als Laie vielleicht auch nur so kompliziert? Ich will die einzelnen Lösungsvorschläge, die aber in etwa alle auf das Gleiche herauslaufen, in Ruhe ausprobieren; Und auch den Vorschlag von „micmen“ aufgreifen, in einem der genannten Access-Foren zu stöbern. Nochmals vielen Dank an all die guten Ratgeber. Peter Fleck
Liebe Wer-Weiß-Was-Experten! Ich bin überwältigt über so viel Hilfsbereitschaft durch die vielen Antworten in so kurzer Zeit. Ich hätte aber nicht gedacht, daß eine Abfrage zu meiner Problemstellung so kompliziert ist. Erscheint sie mir als Laie vielleicht auch nur so kompliziert? Ich will die einzelnen Lösungsvorschläge, die aber in etwa alle auf das Gleiche herauslaufen, in Ruhe ausprobieren; Und auch den Vorschlag von „micmen“ aufgreifen, in einem der genannten Access-Foren zu stöbern. Nochmals vielen Dank an all die guten Ratgeber. Peter Fleck
.
Liebe Wer-Weiß-Was-Experten! Ich bin überwältigt über so viel Hilfsbereitschaft durch die vielen Antworten in so kurzer Zeit. Ich hätte aber nicht gedacht, daß eine Abfrage zu meiner Problemstellung so kompliziert ist. Erscheint sie mir als Laie vielleicht auch nur so kompliziert? Ich will die einzelnen Lösungsvorschläge, die aber in etwa alle auf das Gleiche herauslaufen, in Ruhe ausprobieren; Und auch den Vorschlag von „micmen“ aufgreifen, in einem der genannten Access-Foren zu stöbern. Nochmals vielen Dank an all die guten Ratgeber. Peter Fleck
…
vielen Dank, aber was für „viele Antworten in so kurzer Zeit“, oder war das ironisch gemeint?
Ich sehe nur eine einzige Frage von Dir (eben hier die) und in dieser nur eine einzige Antwort (und das ist meine)…
So lange ich hier auch dabei bin, muß ich gestehen, daß ich durch das hiesige System noch nicht durchgestiegen bin.
Ich weiß gar nicht, ob eine neue Frage an nur einen weitergeleitet wird, oder an wieviele.
Und A) ist das hier eine völlig universelle, unspezifische Plattform, B) ist MsAccess eine unter Entwicklern nicht so sehr weit verbreitete Software, und C) ist Deine Anforderung wirklich etwas sehr spezielles/untypisches und Dein Wunsch, das (wenn ich es richtig verstanden habe?) rein in SQL ohne VBA zu lösen, eine ziemlich drastische Einschränkung.
Darum ist das echt was für Cracks…
Ich habe was ähnliches schonmal gemacht, aber da rein über ein Formular und VBA-Code, ganz ohne Abfragen.
Damals war die Anforderung, neuen Datensätzen jeweils eine eindeutige ID zu geben, die innerhalb eines bestimmten Nummernbereichs liegen mußte. Da sollte ein Kombinationsfeld alle noch freien IDs auflisten, also alle „Zahlen, die in der Tabelle fehlen“, um es an die Anforderung hier anzulehnen. Der User konnte dann einfach mit der Maus eine ID aus der Liste wählen, statt von Hand eine freie Zahl suchen und eintippen zu müssen.
Hallo micmen,
nein! mein Erstaunen über die vielen Antworten war nicht ironisch gemeint, allenfalls etwas übertrieben, da ich von einem anderen Forum in Sachen Computer früher einmal sehr enttäuscht war, weil dort die Resonanz auf meine Fragen gleich Null war.
Ich möchte Ihnen an dieser Stelle den Hintergrund für meine Frage zu den fehlenden Zahlen beschreiben: Ich bin Musikwissenschaftler und arbeite an der Deutschen Oper Berlin, wo ich unter anderem die hausinterne Bibliothek vor Jahren, als die ersten Computer angeschafft wurden, mit MS-Access (damals noch unter Windows 3.11) zu strukturieren begonnen habe. D. h. ich habe eine Datenbank eingerichtet, die unseren Zwecken, u. a. ein Zugangsbuch (Anschaffungskatalog) genügt. Diese Datenbank mit der Tabelle enthält als allererstes Feld eine Zugangsnummer, die in Anlehnung unseres papierenen Zugangsbuchs, welches von da an nicht weitergeführt wurde, die Jahreszahl der Anschaffung und direkt daran die fortlaufende 3-Stellige Nummer in der Reihenfolge der Anschaffung eines Notenheftes oder einer Partitur oder einer CD usw anschließt. Die Zugangsnummer 1994657 bedeutet also daß es sich bei diesem Datensatz um die 657. Anschaffung im Jahre 1994 des Gegenstandes handelt. Somit ist die Zahl der Anschaffungen zwar auf 999 pro Jahr begrenzt, aber nach genauer Recherche haben wir seit Bestehen des Opernhauses, also seit 1912 diese Anzahl an Anschaffungen pro Jahr niemals erreicht. Angesichts der ständigen Kürzungen im Kulturetat wird die Zahl der Anschaffungen in Zukunft auch eher ab- als zunehmen.
Nun kommt es vor, daß Zugangsnummern frei werden, weil z. B. das Notenexemplar so verschlissen ist, oder, was leider auch vorkommt, unauffindbar ist (weil es vielleicht „für immer ausgeliehen ist“) und somit ausgebucht werden muß. Das heißt das Exemplar wird makuliert und der Datensatz in eine andere Tabelle „Ausbuchungen“ kopiert, sodaß der Katalog aktuell ist, und jederzeit für einen Wirtschaftsprüfer nachzuvollziehen ist, was mit dem Inventar aus dem Jahre soundso und der Zugangsnummer soundso geschehen ist, sprich daß es vernichtet wurde.
Aus diesem Grund fehlen einige Datensätze mit diesen Zugangsnummern. Wenn ich neue Anschaffungen mache, also Zugangsnummern vergeben möchte, so möchte ich zunächst die Fehlenden auffüllen und dann Neue, des aktuellen Jahres vergeben. Dazu möchte ich mit dem Klick auf das Ausführen-Zeichen (!) einer Abfgrage genau diese fehlenden Zugangsnummern (Datensätze) anzeigen lassen.
Und an diesem Punkt komme ich allein mit meinem Interesse und meinem derzeitigen minimalen Wissensstand über MS-Access nicht weiter. Ich wundere mich auch, daß in der Hilfe von MS-Access darüber nichts zu finden ist. Da ist nur von Minimal- und Maximalwert etwas zu finden, aber nichts über eine m. E. so grundlegende Abfrageformulierung.
Noch etwas zu meinem Wissensstand: was ist SQL und VBA? Brauche ich das in diesem Zusammenhang?
Herzlichen Dank für Ihre Geduld und Hilfe.
Peter Fleck
Ja nun, min und max sind fertige Elemente von SQL, die kann man einfach benutzen. Für die hier gewünschte Sache gibt es keine fertige SQL-Funktion, so eine Lösung muß man sich basteln. Und eigentlich sind Abfragen gedacht, auf Daten von Tabellen zu basieren, aber hier wird ja quasi das exakte Gegenteil benötigt: Eine Abfrage, die alles das ausgibt, was in keiner Tabelle enthalten ist. Quasi Datensätze anzeigen, die nirgendwo existieren… Darum ist das auch keine so einfache Sache
SQL ist die Datenbanksprache von Abfragen. Wann immer man eine Abfrage erstellt hat, kann man zwischen Datenblattansicht (Ergebnis), Entwurfsansicht (Baukasten) und SQL-Ansicht (Programmcode der Abfrage) umschalten. Das, was einem in der SQL-Ansicht als „Text“ gezeigt wird, ist der SQL-Code der Abfrage. Früher gab es nur das, man mußte seine Abfragen ohne Assistenten zu Fuß so schreiben…
VBA ist eine von Access unterstützte Programmiersprache, eine Variante von Visual Basic (VB). Im Gegensatz zu SQL ist das eine Microsoft-interne Programmiersprache.
Mit VBA kann man alle in Access verwendbaren Objekte ansprechen, somit dann auch Tabellen und deren Datensätze. Und man kann damit auf sehr viele Betriebssystem-Funktionen (von Windows also) zugreifen. Darum kann man sich damit „zu Fuß“ Sachen zusammenbauen, statt sie von einer (SQL-)Abfrage auf einen Schlag geliefert zu bekommen - mühsamer, aber beliebig komplex möglich.
In dem Fall könnte man Code verwenden, der die niedrigeste und die höchste Zugangsnummer sucht, dann alle Zahlen von der kleinsten bis zur größten durchläuft, und dabei für jede Zahl schaut, ob die als Zugangsnummer existiert. Alle nicht existierenden läßt man in ein Variablenfeld schreiben und am Ende hat man seine gewünschte Liste in einer Variable gespeichert und kan die dann beliebig verwenden. Hier unrelevant, aber nur als Beispiel: Man könnte zum Schluß sagen, daß die Liste als MS-Excel-Tabelle auf der Festplatte gespeichert werden soll (nur mal um die Möglichkeiten anzudeuten).
OK, war nicht ironisch gemeint - aber sehe ich das richtig, daß es nur eine einzige Antwort gab, nämlich meine?
Hallo micmen,
das finde ich wirklich toll, daß Sie mir das so erklären, sodaß ich es auch verstehen kann. Jetzt sind mir die Zusammenhänge zwischen Access, VBA (Visual Basic Access) und SQL einigermaßen klar geworden. Also ich rekapituliere: Access ist ein Datenbankprogramm, VBA eine Programmiersprache von Microsoft und SQL eine Art Programmiersoftware für Datenbanken generell.
Bedeutet das jetzt für meine Zwecke, daß ich diese Progrmmiersprachen erst erlernen muß, um weitergehende Abfragen wie z. B. die nach den laut fehlenden Zugangsnummern auch fehlenden Datensätzen zu suchen? Das wäre nicht schön und mir ehrlich gesagt, dann zuviel. Oder kennen Sie evtl. bereits vorgefertigte Datenbanken mit derlei Abfrage(n)? Es gibt ja auch für private Sammler solche Datenbanken für z. B. CD-Sammlungen, private Bbibliotheksdatenbanken mit Ausleihdatenbank-(Tabelle).
Ach übrigens: Es gab insgesamt drei Antworten und eine vierte mit den Worten: „Kann Dir leider nicht weiterhelfen“
Danke für Ihre Antwort. Vielleicht wäre es an dieser Stelle wirklich sinnvoll - da das für das Forum eher uninteressant ist - weitere Kommunikation auf e-mail-basis laufen zu lassen. also: (…)
Mit herzlichem Gruß
Peter-Fleck
[Team] E-Mail-Adresse entfernt.
bin im Urlaub, kann daher leider nicht anworten