Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Access: automatisch laufende Nummer einfügen bei neuem Datensatz





Frage

Hallo! Ihr habt mir nun schon viel geholfen, auch in diesem Fall gibt es sicher jemanden, der mir einen Tip geben kann ;-) Ich hab mehrere Adress-Tabellen mit potentiellen Kunden angelegt, die Tabellen unterscheiden sich nach Rubriken der Firmen. Diese Datensätze der unterschiedlichen Tabellen haben unterschiedliche Nummernkreise, die eine Tabelle beginnt z.B. mit 1000, die nächste mit 2000, eine andere mit 6000. Nun hätte ich gerne, dass bei Neuanlage eines Datensatzes die nächste freie Nummer vergeben wird. Leider hab ich keinen brauchbaren Weg gefunden...

Antwort 1 von lleopard

Hallo Sanne,

warum belegst du nicht mal n VBA-Kursus?? *lach*

Neue Abfrage!

Über eine Abfrage legst du den Filter für den Nummernkreis fest, also ob es 1000 oder 2000 .... ist.

Dann gibst du im nächsten Feld, wo die fortlaufenden Nummern sind, ein, daß du den maximalen Wert haben willst.

Option Gruppieren, Wert für das Feld mit den eindeutigen Nummern: Max.

Dann hast du schonmal den 1. Wert, den du ja mit +1 für den nächsten DS brauchst.

Abrufen kannst du das ganz einfach, indem du in einem Formular nun hinter einen Button... irgendwo halt, eine Routine hinterlegst, die in etwa so aussieht:

dim dbs as dao.database
dim rs as dao.recordset

set dbs = currentdb
set rs = dbs.openrecordset ("DeineAbfrage")

diese Abfrage darf eigentlich nur einen und mindestens einen Wert zurückgeben.

Bevor wir da Fehler machen:

if rs.bof then exit sub 'Wenn also die Abfrage keine Ergebnisse liefert

rs.movelast
if rs.recordcount > 1 then
msgbox "Fehler in der Abarbeitung"
exit sub
end if

dim cc as long

cc = rs!Feldwert + 1

diesen Wert übergeben wir nun wieder dem Formular:

NeueAdresseNummer.value = cc

Und schließen das Recordset:

rs.close
set rs = Nothing
set dbs = Nothing

Und bevor du fragst woher die Abfrage nun weiß welcher Nummernkreis überhaupt der gesuchte ist:

Ich nehme an das machst du am besten im Formular, wo du den ja bestimmt aus einer Liste oder einem anderen Feld auswählst, bevor eine neue Adresse angelegt wird. Dann gehst du in deine Abfrage und gehst in dem Feld der Nummernkreise auf die Zeile mit den Kriterien, rechte Maustaste, aufbauen, dort Formulare, geladenen Formulare (du solltest das Formular zwischenzeitlich offen lassen), und dann dort das Feld mit den Nummernkreisen hinterlegen....

Lange Rede, kurzer Sinn: so könnte es klappen ;-)

Gruß Leo

Antwort 2 von Sanne

Leo, Du hast recht, ich sollte wirklich einen Kurs belegen, aber da spielt mein Vorgesetzter nicht mit ;-(((

Und ehrlich gesagt, hab ich nur Bahnhof verstanden... wen wunderts? ;-)))

Ich dachte eigentlich, das ganze geht viiiieeel einfacher...
Werde das aber mal austesten und berichten!

Vielen Dank!

Antwort 3 von Sanne

Schon wieder ich ;-)

Hab ich das nun richtig verstanden? Ich brauche für jedes Formular, das für die entsprechenden Tabellen (momentan sind es vier) erstellt wurde, eine eigene Abfrage zu der Funktion mit der neuen fortlaufenden Nummer?
Geht es nicht vielleicht schneller, wenn ich einen "Befehl" (?) in einem Feld des Formulars festlege, dieses Feld ist bei mir "Datensatz hinzufügen", es ist ein Formularsteuerelement....?

Antwort 4 von Teddy7

wenn Du nur eine eindeutige Nummer bräuchtest gings einfacher - indem Du ein Autowert-Feld in die Tabelle einfügst.


Da Du aber unterschiedliche Nummernkreise haben willst wird´s halt schwieriger.

Alternative zu Leo:
Die DMAX-Funktion nutzen. Ist aber im Prionmzip auch VBA-Programmierung.
in einem passenden Ereignis diesen Code hinterlegen:
nummer = dmax("Nummer","Tabellenname","Nummer between 1 and 1000") + 1

die Funktion besteht also aus einem Feldnamen aus dem der maximale Wert gelesen werden soll, einem Tabellen- oder Abfragenamen, der die Datenquelle ist und einer möglichen Einschränkung - in diesem Fall Bschränkung auf Nummer 1 bis 1000.

!Achtung: diese Variante kann in einer Datenbank die von mehreren Usern gleichzeitig verwendet wird zu Problemen führen !

Gruß
Teddy

Antwort 5 von Sanne

Uuuuhh... halt....
Jeder Nummernkreis ist für sich... jeder hat dozusagen ein eigenes Formular und demnach eine Tabelle mit Datensätzen für sich!

Antwort 6 von lleopard

Hallo Sanne,

ich würde einfach in dem Formular die zugrundeliegende Tabelle über die RowSource-Eigenschaft per VBA neu hinterlegen.

aber so wie ich das sehe kannst du das nicht. Auch der Ansatz von Teddy geht. In jedem Fall aber brauchst du jeweils den aus den entsprechenden Tabellen stammenden Max-Wert +1 und dann eine Routine die den DS in der entsprechenden Tabelle abspeichert.

Dafür würde ein Formular reichen.

Man muß nur wissen wie *lach*

Wie kann man dir das erklären?

Außerdem ist es ungeschickt die Daten in mehreren Tabellen zu haben, denn über die Nummernkreise sind die Daten ja eindeutig.

Nun gäbe es wieder viele Wege dein Problem zu lösen.

ZB könntest du - wenn du das Formular öffnest - die Daten sammeln und dann deinen DS heraussuchen. und und und...

Wie Teddy schon angemerkt hat, in Multiuser-Datenbanken führen manche Methoden zu Fehlern. Also wäre es schon einge gute Info, wenn man wüßte, ob du die einzige Userin bist, oder ob die DB in einer Mehrbenutzerumgebung genutzt wird.

Wenn mehrere user, dann auch mehr vorkehrungen um Fehler abzufangen...

Gruß Leo

Antwort 7 von Sanne

Hi Leo, ich bin die einzige Userin, die hier in der Firma Access nutzt, ist vielleicht nicht ungeschickt ;-)))

Dass es mehrere Tabellen gibt, hat mit dem Umstand zu tun, dass die potentiellen Kunden verschiedenen Geschäftbereichen zugehören. Das sollte also so bleiben.

Du siehst das übrigens ganz korrekt, ich hatte mit VBA seither nix am Hut, daher ist das, was Ihr mir um die Ohren schmeißt, für mich nicht einfach umzusetzen ;-))))

Antwort 8 von lleopard

Hallo Sanne,

daraus sollte man dir natürlich keinen Strick drehen:

Zitat:
Du siehst das übrigens ganz korrekt, ich hatte mit VBA seither nix am Hut, daher ist das, was Ihr mir um die Ohren schmeißt, für mich nicht einfach umzusetzen


;-)

Hast du eigentlich schon die KnowHow.mdb?

(Einfach mal danach Googlen!)

Du wirst dort unheimlich viele Antworten auf deine Fragen finden und sicher auch einiges über VBA lernen, wenn du das willst. Gerade so Datenbankinterne Abfragen sind ja eigentlich recht trivial. Es gibt Assistenten die dir helfen usw...

Ansonsten ist die Lösung, die ich dir oben vorgeschlagen habe schon nicht schlecht. Du mußt das - da du mehrere Tabellen nutzt - natürlich nun auch den Tabellen zuordnen. Also wenn du im Feld Nummernkreis die 1000 auswählst Tabelle XY analysieren... usw. und dann den neuen DS auch an die Tabelle anfügen.

Ich hoffe du schaffst es. Viel Erfolg :-)

Gruß Leo

Antwort 9 von Sanne

Ja, die Knowhow.mdb hab ich mal runtergeladen, aber Du weißt ja, wie das ist.... zu faul zum Lesen! ;-)))))

Ich seh schon, Ihr seid es so langsam leid, so einer Faulen weiterhin Tips zu geben (-> Scherz!).

Naja, es ist wirklich nicht ganz einfach, so ohne Grundwissen in etwas einzusteigen... Muss ich mich eben durchbeissen und hoffen, Ihr helft mir trotzdem hin und wieder! ;-)))

Grüße
Sanne

Antwort 10 von TomG

Hallo Sanne,
also Du könntest einen SQL-Befehl absetzen der Dir mit MAX() die höchste, bereits vergebenen Nummer der aktuell ausgewählten Kategorie zurückgibt und 1 addieren.

Oder wenn SQL-Abfragen nichts für Dich sind, dann erstelle doch einfach eine neue Tabelle mit zwei Feldern: Kategorie und ID. Kategorie ist selbsterklärend und ID ist die zuletzt vergebene Nummer. Dann baust Du Dir nur noch eine Funktion die die Tabelle öffnet, die Kategorie positioniert, 1 addiert und den Wert zurückgibt. Das ist auch im Netzwerk 100% sicher.

Gruß
Thomas