Access Tabellen Inhalt ändern

werner_sg

Erfahrenes Mitglied
Hallo, habe nach längerem mal wieder eine Frage :-) ich habe eine Access Tabelle in welcher sich in einer Spalte nicht fortlaufende Zahlen befinden. Diese müssen jetzt fortlaufend Nummeriert werden wobei aber doppelte Zahlen auch wieder die gleichen Nummern bekommen müssen. Als Beispiel: vorhandene Nummern 2, 5, 7, 7, 8, 9, 9, 9, 13 müssen zu 1, 2, 3, 3, 4, 5, 5, 5, 6 werden.
Derzeit erledige ich das per Hand die Tabelle enthält aber rund 3000 Einträge, wäre daher aber über jede Lösung Dankbar.

Werner
 
Hab rasch auf die Schnelle eine VBA-Methode geschreiben.
Du musst natürlich noch die Tabellen/Spaltennamen anpassen
Visual Basic:
Public Sub TestW()
    'SQL um die Tabelle nach id Sortiert auszulesen
    Dim sql As String: sql = "SELECT [old_id], [new_id] FROM [t_werner_sg] ORDER BY [old_id]"
    'Tabelle öffnen
    Dim rs As DAO.Recordset: Set rs = CurrentDb.OpenRecordset(sql)
    
    'Ids merken
    Dim newId As Long: newId = 0
    Dim lastId As Long: lastId = 0
    
    rs.MoveFirst
    'Alle Datensätze durchgehen
    Do While Not rs.EOF
        'Prüfen, ob die id der Tabelle grösser als die letzte Id war. Wenn ja, neue ID um 1 erhöhen
        If rs!old_id > lastId Then newId = newId + 1
        'id für den nächsten Lauf merken
        lastId = rs!old_id
        'Zeile editieren
        rs.Edit
        rs!new_id = newId
        rs.Update
        'Nächster Datensatz
        rs.MoveNext
    Loop
    rs.Close
End Sub
 
Access und VBA voll nicht meine Welt :( bei t_werner_sg kommt der Spalten Name rein schätze ich mal, und wie wende ich das Script auf die Tabelle an?

Auf jeden Fall schon mal ein dickes Danke
 
Ich rate dir eine weitere Spalte anzulegen. Diese wird mit der neuen ID abgefüllt. Und wenn du siehst das es so richtig ist, kannst du die alte Spalte löschen und die neue umbenennen. So bist du auf der sicheren Seite
Ich habe die neue Spalte mal new_Buchungsnummer genannt.
Visual Basic:
Public Sub TestW()
    'SQL um die Tabelle nach id Sortiert auszulesen
    Dim sql As String: sql = "SELECT [Buchungsnummer], [new_Buchungsnummer] FROM [Buchungen] ORDER BY [old_id]"
    'Tabelle öffnen
    Dim rs As DAO.Recordset: Set rs = CurrentDb.OpenRecordset(sql)
    
    'Ids merken
    Dim newId As Long: newId = 0
    Dim lastId As Long: lastId = 0
    
    rs.MoveFirst
    'Alle Datensätze durchgehen
    Do While Not rs.EOF
        'Prüfen, ob die id der Tabelle grösser als die letzte Id war. Wenn ja, neue ID um 1 erhöhen
        If rs!Buchungsnummer > lastId Then newId = newId + 1
        'id für den nächsten Lauf merken
        lastId = rs!Buchungsnummer
        'Zeile editieren
        rs.Edit
        rs!new_Buchungsnummer = newId
        rs.Update
        'Nächster Datensatz
        rs.MoveNext
    Loop
    rs.Close
End Sub
 
Ok den Code habe ich dann nun verstanden, wie kann ich denn nun in Access einbauen, sagte ja das die Kombi Access und VB nicht so gamz meine Welt sind, muss da aber ja durch. Habe gerade maö gegoogelt aber nicht die passende Läsung gefunden.
 
In Access neues "Modul" erstellen, und Yaslaw's Code in das Modul kopieren.
Irgendwo in Access gibts dann den Befehl "Makro ausführen" oder sowas
 
ja soweit war ich schon, gehe ich dann auf Makro ausführen wird mir das Modul aber nicht angezeigt. Und bei Macro erstellen habe ich nix gefunden wo ich den Code einfügen könnte. Gehe icj über VB und führe dann aus bricht er ab mit einem Laufzeitfehler
 
@Zvoni Mit Macro Asuführen kannst du noch keine Funktion ausführen. Dazu muss man zuerst ein Macro erstellen, das die Funktion ausführt

Dazu geht man folgendermasen vor:
1) Ändere im Code die Sub in eine Funktion
Einfach im Modul in der ersten Zeile des eingefügten Codes das Wort Sub durch Function ersetzen
Visual Basic:
Public Function TestW()

2) Erstellen ein Makro
Erstelle ein neues Makro. Dort wählst du RunCode als Aktion aus (ist möglich, dass das im deutschen Access anderst heisst). Dann hast due den Parameter [Funktion Name]. In dieses Feld schreibst du "TestW()". Also den Funktionsnamen inkl. den Klammern für einen AUfruf ohne Argumente


Gehe icj über VB und führe dann aus bricht er ab mit einem Laufzeitfehler
Den Code aus meiner ersten Antwort habe ich mit einem Testbeispiel bei mir getestet. Der Funktioniert.
Du bekommst ein Laufzeitfehler. Im Laufzeitfehler hat es ein Fehlercode und eine Fehlertext. Diese helfen dem Programmierer das Problem zu finden. Darum kann ich nur sagen, ohne Code und Fehlertext können wir dir nicht helfen
 
Zurück