Ich bin gerade mit folgendem Bug beschäftigt:
In einer Tabellle ist der Primärschlüssel (ID) ein Autowert.
Werden mehrere Datensätze gelöscht und wieder eingefügt, wird der Autowert fehlerhaft und vergibt bereits vorhandene IDs.
Siehe auch hier im Nachbarforum
Zitathttp://www.ms-office-forum.net/forum/sitemap/index.php?t-277151.html
Dort ist ja auch ein Workaround zu finden:
Dim NextID As Long
NextID = DMax("id", TabName) + 1
db.Execute "alter table " & TabName & " alter column id counter(" & NextID & ", 1)"Nur klappt das nicht für verknüpfte Tabellen. Und nicht für Felder, für die es Beziehungen gibt.
(Beides kommt ja nun nicht sooo selten vor...)
Also müsste ich nun tatsächlich erst die verknüpfte DB öffnen, die betreffenden Beziehungen löschen, den Autowert anpassen und dann die Beziehungen wiederherstellen?
Geht das nicht einfacher? ???
Hallo,
Zitatund vergibt bereits vorhandene IDs.
ich habe das auf verschieden Weise versucht nachzustellen - auch mit verknüpften Tabellen - iss nicht, AutoWert wird regulär vergeben!
"Geht das nicht einfacher"
Ja, kümmere dich nicht um den AutoWert.
Lass die Verwaltung von AutoWert - Werten Access über.
AutoWerte sind die denkbar schlechteste Lösung wenn es darum geht 'sprechende' Nummern für die Darstellung seiner Daten zu haben.
Mit dem in deinem Beitrag zitierten Workarround wird auch nur der Zähler des AutoWertes zurückgesetzt und keine Lücken gefüllt.
Das wird besonders dann schwerst problematisch wenn man z.B. auf die denkbar schlechte Idee kommt Rechnungsnummern aus den AutoWerten zu bilden.
Zitat... den Autowert anpassen ...
Hmmmm, warum meinst du heißt dieser Wert 'AutoWert' ?
Ich empfehle
mit Nachdruck die Finger von Manipulationen am Autowert zu lassen.
Tja, auch wenn Du es nicht nachstellen kannst, muss ich sagen, dass (ohne Deine Fähigkeiten anzweifeln zu wollen) ICH den Fehler habe.
Es lässt sich dadurch kein neuer Datensatz mehr anlegen, da das durch den Primärindex verhindert wird.
Außer mit beschriebenem Code klappt auch "Reparieren und Komprimieren" um das zu beheben.
Ich werde es mal damit versuchen.
Hi,
jaja, ich glaube dir ja schon - nur ich wollte es mal nachstellen - nix da! ;D
Komprimieren und reparieren ist eine Möglichkeit - ja.
Die Verwendung von GUIDs als Primärschlüssel würde die ganze Problematik erst gar nicht aufkommen lassen
Hallo,
wenn der Autowert "falsch" generiert wird, ist die DB im Eimer, zumindest hat die Tabellenverwaltung einen Schuss.
Da hilft auch IMH(orrible)O kein Ändern/Verstellen des Autowertes oder dergleichen.
Einzig der Import der Tabellen ( und evtl. aller anderer Objekte) in eine neu erstellte leere DB könnte Verbesserung bringen.
Es kann aber dann trotzdem sein, dass Datensätze falsche Zuordnungen haben.
Hi,
"Es kann aber dann trotzdem sein, dass Datensätze falsche Zuordnungen haben"
... und das natürlich speziell dann, wenn schon mal am AutoWert herumgedoktert wurde.
Nun ja.
Ich will das nochmal zusammenfassen:
Das Problem betrifft laut dem von mir verlinkten Thema Access2010 bei allen Tabellen und die Vorversionen bei verknüpften Tabellen:
Man entferne einige Datensätze und führe sie anschließend (inkl. der alten ID wieder ein)
Access führt den Autowert dann nicht nach der höchsten ID fort, sondern irgendwo davor.
(Da gibt es wohl auch ein Beispiel zum Download)
Neben der Möglichkeit, das über ALTER TABLE zu lösen kann man die Datenbank auch komprimieren.
Bestehende Verknüpfungen sind nicht betroffen, da keine bestehenden Werte geändert werden.
Ich möchte die Lösung über das Komprimieren verwenden - das schadet mit Sicherheit am wenigsten und hat noch einige positive Nebeneffekte. Da ich das vom Front-End her machen muss, kämpfe ich grade ein wenig:
Ich entferne alle verlinkten Tabellen, komprimiere und stelle dann die Links wieder.
Soviel zur Theorie.
Praktisch scheint es ein paar Haken zu geben, ich bin aber noch dran.
Hallo,
Du musst keine Links zum Komprimieren entfernen.
Backend und Frontend einfach komprimieren/reparieren.
An sich, sollte es genügen nur die DB mit den echten Tabellen zu komprimieren.
Die DB ohne Tabellen sollte nur während der Entwicklung regelmäßig komprimiert werden.
Hallo,
ich befürchte, dass komprimieren/reparieren bei "defektem" Autowert-Verhalten nix nützt....zumindest habe ich noch nie solche Fälle damit "reparieren" können.
Und "Alter Table" am Autowert verschlimmbessert die Situation nur.
Hallo,
ZitatDa ich das vom Front-End her machen muss ...
http://www.donkarl.com?FAQ6.7 (http://www.donkarl.com?FAQ6.7)
;)
Genau diese Funktion nutze ich ja.
Laut Beschreibung dürfen keine Formulare oder Recordsets offen sein, die auf das Backend verweisen
Wäre auch nicht gut, denn die Funktion
DBEngine.CompactDatabase
erstellt ja eine Kopie der Datenbank. Bedeutet: anschließend das Original löschen und die Kopie umbenennen.
Momentan bekomme ich einen Fehler, dass die Datei in Benutzung ist.
Der kommt aber nur, wenn ich vorher ein paar INSERTs mit CurrentDb.Execute gemacht habe.
rätselhaft...
Hallo,
Zitaterstellt ja eine Kopie der Datenbank. Bedeutet: anschließend das Original löschen und die Kopie umbenennen.
Da läuft etwas schief bei Dir. Das läuft doch im Hintergrund. Du musst gar nichts umbenennen. Das macht Access alleine.
Wenn das bei Dir so nicht funktioniert, hast Du einen Fehler in der DB.
Dass das das Problem mit dem Autowert behebt glaube ich auch nicht.
Und wenn ich das jetzt verstanden habe und Du immer umbenennen musst, hat die DB einen Schlag. Und da hilft nur neue DB erstellen und alle Objekte importieren.
Kannst Du eigentlich den VBA Code kompilieren?
ZitatDas läuft doch im Hintergrund. Du musst gar nichts umbenennen.
Sorry, Die Funktion im VBA, die anscheinend für das komprimieren zuständig ist, macht das eben nur so.
Quelle und Ziel sind obligatorische Angaben.
Momentan arbeite ich mit einer 2000er DB- Version unter Access 2010.
Ob das alles nachher noch mit niedrigeren Versionen klappt hoffe ich mal...
Am INSERT scheint es nicht zu liegen.
Teste weiter...
Ich blinde Nuss!
das Formular, mit dem ich die ganze Sache gestartet habe, hatte über ein Kombinationsfeld noch eine Verbindung zum Backend.
Nun habe ich dem Kombinationsfeld als Datenquelle den gewählten Wert zugewiesen und siehe da:
Es klappt.
;D
Noch einmal abschließend zum Thema die neuesten Erkenntnisse:
Das Autowert- Problem wird nur in Access 2010 dorch Komprimieren/Reparieren behoben.
In Vorversionen (nicht sicher bei 2007) ist es so nicht zu beheben.
Siehe dazu auch Microsoft:
http://support.microsoft.com/kb/884185/en-us (http://support.microsoft.com/kb/884185/en-us)
(Da steht auch, wie sich der Fehler reproduzieren lässt)
Ich werde nun also doch den Autowert mit ALTER TABLE korrigieren müssen, damit meine Datenbank unter älteren Versionen läuft.