Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Automatische Nummerierung Access mit Buchstaben und Zahlen





Frage

Hallo zusammen. Ich habe folgendes Problem: Ich habe eine Access-Datenbank erstellt und möchte nun in meiner Tabelle eine Spalte einfügen, die folgende Eigenschaften besitzt: Sie soll jeden Datensatz automatisch durchnummerieren und zwar im Format "M01". Der Buchstabe steht für den Anfangsbuchstaben der dazugehörigen Firma - z.B. Firma "Muster", die Zahl dahinter besagt, der wievielte Datensatz es innerhalb des Buchstabens ist. Zum Beispiel soll die 8. Firma mit dem Anfangsbuchstaben M die Nummerierung M08 erhalten. Wenn ich in einem Formular eine neue Firma eingebe, sollte Access dann diese Nummer aufgrund des Firmennamens automatisch vergeben können. War das einigermaßen verständlich und vor allem ist das möglich? Für Hilfe wär ich auch wirklich sehr dankbar denn ich bin am Verzweifeln...

Antwort 1 von lleopard

Hallo Sie

ulkige Anrede ... :-D

natürlich ist das möglich!

Du mußt das nur schlau anpacken!

1. Schritt ist schon richtig. Erstmal in der Tabelle die Spalte einfügen: Text und 10 Zeichen sollten wohl reichen.

Den Rest solltest du jetzt an eine kleine VBA-Routine übergeben...

Wir machen es uns jetzt zunutze, daß man die Buchstaben des Alphabets über einen Integerwert durchgehen kann.
also von 65= A bis 90= Z.

Ferner erstellen wir eine Abfrage, die uns die Firmen Gruppiert, also für jede Firma einen Eintrag zurückgibt

SELECT Firmen.Firma, Firmen.lfdNr
FROM Firmen
GROUP BY Firmen.Firma, Firmen.lfdNr
ORDER BY Firmen.Firma;

Wichtig ist das Order By, denn nur so sortieren wir die Datensätze nach einer gewissen Logik!

Die Speichern wir ab als qry_GroupFirmen

Diese Abfrage nutzen wir dann, um in die Tabelle Firmen zu schreiben.

Wir haben jetzt also die Grundlagen geschaffen, für unsere kleine Routine...

Function FirmenZuordnungSchreiben()
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Dim rt As DAO.Recordset
Dim i As Integer, j As Integer
Dim Buchstabe As String
Set dbs = CurrentDb

For i = 65 To 90
'Nun bearbeiten wir erstmal die gruppierten Firmen:
Buchstabe = Chr(i)
Set rs = dbs.OpenRecordset("Select * From qry_GroupFirmen WHERE qry_GroupFirmen.Firma like '" & Buchstabe & "*';")
If rs.BOF Then 'Nix gefunden? Dann tschö und ab zum nächsten...
rs.Close
Else
rs.MoveLast
j = rs.RecordCount 'Nun wissen wieviele Adressen es mit A gibt.
'Und jetzt gehen wir die nacheinander durch:
rs.MoveFirst
Dim k As Integer
For k = 1 To j
Set rt = dbs.OpenRecordset("Select * FROM Firmen WHERE Firmen.Firma = '" & rs!Firma & "';")
Dim l As Integer
rt.MoveFirst
'Die erste Firma bekommt die 1 usw ...
'Schnell durch die Schleife durch:
Do While rt.EOF = False
rt.Edit
rt!lfdNr = Buchstabe & Right("000" & k, 4) 'Also zB "A0001" ... Nicht zu sparsam sein
rt.Update 'Eine Firma bekommt also nur diese Nummer
rt.MoveNext 'Und ab zur nächsten Firma
Loop
rs.MoveNext 'Und die nächste Firma
Next k
rt.Close 'den Buchstaben abschließen und ab zum nächsten
End If
Next i

'Alle Verweise beenden:
Set rs = Nothing: Set rt = Nothing
Set dbs = Nothing
End Function

Wenn du nun in einem Formular einen neuen Kunden anlegst, mußt du - es sollten nach der Routine ja alle Kunden bereits eine Nummer haben - nur noch auf den ersten Buchstaben filtern und suchst die letzte vergebene Nummer raus und um 1 hochsetzen. Das kann man über eine Abfrage filtern. Danach mußt du nur noch das Ergebnis in den Datensatz dieses kunden speichern...

Gruß Leo

Antwort 2 von lleopard

Kleiner Nachtrag:

Da wir ja keine Umlaute berücksichtigen solltest du die vorher umschreiben in Ae oder Oe ...

;-)

Antwort 3 von sie-24

Hallo lleopard,

erstmal vielen dank für deine rasche Antwort :-)
Nach dem ersten Durchlesen hört sich das für mich alles seeeehr kompliziert an ;-) aber ich bin auch ein absoluter access-neuling und arbeite erst seit kurzem mit diesem programm.
Ich werde das morgen auf der Arbeit auf jeden Fall mal Schritt für Schritt nachmachen und ausprobiern und hoffe dass es dann klappt.

Ich danke Dir!

Schöne Woche noch

P.S.: Falls ich es nicht hinkriege muss ich Dich bzw. euch wohl oder übel nochmal belästigen :)

Antwort 4 von sie-24

Guten Morgen!

So jetzt hab ich schon mein erstes Problem: Die Abfrage hab ich ja noch hingekriegt, aber wie gehts dann weiter?
Wo geb ich diesen ganzen Kladderadatsch denn ein? Also ab "Function FirmenZuordnungSchreiben()"
Das muss ich ja alles iiiiirgendwo eintippen - aber wo?
Sorry wenn ich so blöd frage - für mich ist das leider keine kleine Routine ;-)

Antwort 5 von lleopard

Re Guten Morgen :-)

Den Kladderadatsch - wie du es nennst - mußt du nur in ein neues MODUL kopieren. Das speicherst du dann zB als mdl_Firmennummer_vergeben

Die Funktion kannst du nun in einem Makro, in einem anderen Modul oder in einem Formular anstoßen.

Wenn du zB in einem Formular (Entwurfsansicht) eine Befehlsschaltfläche einfügst, dann gehst du auf dessen Eigenschaften (Im Formularentwurf Doppelklick auf die Schaltfläche oder rechte Maustaste => Eigenschaften) und suchst die Zeile wo steht: Beim Klicken. Dort wählst du [Ereignisprozedur] und klickst auf die 3 Punkte (...) rechts daneben. Dann bist du im VBA-Editor und Access hat dír bereits ein bisschen was vorgegeben: Private Sub Befehl1_OnKlick (...) Zwischen der Zeile und End Sub schreibst du nun Call FirmenZuordnungSchreiben

Aber nochmal zur Vorsicht:

1. Mußt du die Namen der Tabellen/Abfragen und die genannten Felder anpassen an deine Tabellen und Abfragen.

2. Der Code vergibt die Nummer jedesmal neu! Mal angenommen du hast einen neuen Kunden Meier, dann bekommt der die Nummer die zB vorher Kunde Meyer hatte. Du darfst den also nicht mehrmals nutzen ohne ihn anzupassen!!

Aber das mußt du nicht, wenn du das einmal anstößt und dann in einem Formular nur noch den letzten Wert für "M" ermittelst und den dann einfach um eins erhöhst...

Gruß Leo

Antwort 6 von sie-24

Danke Dir!
Ich werd es dann gleich ausprobieren.

P.S.: Das mit dem "Kladderadatsch" war net bös gemeint ;-)

Antwort 7 von lleopard

Büdde ;-)

Hoffe es klappt!

Zitat:
P.S.: Das mit dem "Kladderadatsch" war net bös gemeint ;-)


Wär ja noch schöner das! :-D