PDA

Vollständige Version anzeigen : Startwert für Primärschlüssel festlegen.


wmayer1000
20.03.2003, 10:59
Hallo Gemeinde!

In meinen Tabellen arbeite ich mit AutoNumbers als Primärschlüssel.
Dabei wird der Schlüssel bei Neuanlegen eines Datensatzes immer um eins inkrementiert. Kann man einen Startwert für den Primärschlüssel festlegen, ab dem dann bei neuen Datensätzen weitergezählt wirde??

Danke schon mal!

Gruß
Wolfi!

A.S.
20.03.2003, 11:08
Eine generelle Einstellungsoption gibt es dafür AFAIK nicht.

Du kannst allerdings über eine VBA-Schleife n Datensätze anfügen und anschließend über eine Abfrage wieder löschen. Sofern die DB anschließend nicht sofort komprimiert wird, setzt Access dann mit dem auf den letzten DS folgenden Autowert auf.

Gruß

Arno

strausto
20.03.2003, 11:11
Und dann?
Wenn Du bsp. den letzten DS löschst und einen neuen hinzufügst entsteht eine "Lücke".
Ein Autowert sollte nicht als fortlaufende Nummer im Sinne einer Kundennummer verwendet werden.
Der AutoWert ist ein nicht natürliches Attribut und dient lediglich dem Zweck einen DS eindeutig zu identifizieren damit eine Datenkonsistenz sichergestellt wird.

A.S.
20.03.2003, 11:19
Hallo Torsten

Original geschrieben von strausto
Und dann?
Wenn Du bsp. den letzten DS löschst und einen neuen hinzufügst entsteht eine "Lücke".

Und? Wer die Lücke haben möchte, der bekommt sie ;)

a) habe ich lediglich seine Frage beantwortet

und

b) Wo steht bitte schön, das ein Autowert keine Kundennummer sein darf?

Ich weiß das sich hier einige immer wieder auf den Standpunkt stellen, bin jedoch anderer Meinung. Wenn man sich mal die rechtlichen Verpflichtungen zur Datenaufbewahrung ansieht, ist es naheliegend eine durch die Löschung eines Autowertes entstehende Lücke nicht schließen zu können, damit die Kundennummer - zumindest innerhalb der Aufbewahrungsfristen - nicht nochmals vergeben werden kann. Würde die Kundennummer erneut vergeben, führte das dazu das die Aktenlage nicht mehr eindeutig währe denn im Archiv oder den noch im Büro vorhandenen Ordnern währen nun ggf. Unterlagen zu zwei Kunden mit derselben Kundennummer vorhanden. Die Beispiele lassen sich beliebig fortsetzen.

Ob ich jetzt einen manuell programmierten oder systemintegrierten Autowert benutze ist dabei IMHO völlig unerheblich.

Gruß

Arno

strausto
20.03.2003, 11:33
@Arno


a) habe ich lediglich seine Frage beantwortet




Und dann?
Wenn Du bsp. den letzten DS löschst und einen neuen hinzufügst entsteht eine "Lücke".


Das galt nicht Dir!!
Zu dem Zeitpunkt als ich meine Antwort geschrieben habe, war Dein Beitrag noch gar nicht zu lesen. Nahdem ich dann meinen Thread gesetzt hatte, habe ich gesehen, dass Du mir zuvor gekommen bist.
Eigentlich wollte ich gleich darauf reagieren und meinen Beitrag überarbeiten, aber ich dachte mir schon, dass Du mich eh wieder zitieren wirst.



b) Wo steht bitte schön, das ein Autowert keine Kundennummer sein darf?


Da steht nirgendwo. Ich persönlich habe damit aber wirklich schlechte Erfahrungen gemacht, weil aus unerklärlichen Gründen der Autowert ins negative abrutschte. Aber vielleicht hast Du ja eine Erklärung dafür.
Mittlerweise arbeite ich mit dem Setzen des Defaults eines gebundenen Textfeldes im Formular, das den letzten Wert zugewiesen bekommt un um eins hochzählt.

Was hälst Du von meiner Methode?

An Deiner Meinung habe ich ehrlich Interesse und bei der Gelegenheit möchte ich nochmals zum Ausdruck bringen, dass ich Dein Engagement hier im Forum wirklich zu schätzen weißt. Jedoch solltest Du nicht unbedingt alles als persönlichen Vorwurf werten.

A.S.
20.03.2003, 11:54
Original geschrieben von strausto
Eigentlich wollte ich gleich darauf reagieren und meinen Beitrag überarbeiten, aber ich dachte mir schon, dass Du mich eh wieder zitieren wirst. ..... An Deiner Meinung habe ich ehrlich Interesse und bei der Gelegenheit möchte ich nochmals zum Ausdruck bringen, dass ich Dein Engagement hier im Forum wirklich zu schätzen weißt. Jedoch solltest Du nicht unbedingt alles als persönlichen Vorwurf werten.

Sorry, wenn hier ein falscher Eindruck entsteht / entstanden ist. Bin ein wenig übermüdet (Vollmondschlaflosigkeit) und dem Trugschluß aufgesessen, das Du genauso schnell tipperst wie ich ;) Als persönlichen Angrif habe ich das nicht gesehen.

Da steht nirgendwo. Ich persönlich habe damit aber wirklich schlechte Erfahrungen gemacht, weil aus unerklärlichen Gründen der Autowert ins negative abrutschte. Aber vielleicht hast Du ja eine Erklärung dafür.

Da mir diese Problematik noch nicht untergekommen ist, kann ich da nur Mutmaßen das Access sich mit seinen temporären Objekten während der Bearbeitung einer DB dann selbst immer wieder die entsprechenden Datenstellen in der .mdb-Datei zerschießt. Vielleicht würde es helfen die DB immer automatisch zu komprimieren.

Mittlerweise arbeite ich mit dem Setzen des Defaults eines gebundenen Textfeldes im Formular, das den letzten Wert zugewiesen bekommt un um eins hochzählt.

Was hälst Du von meiner Methode?[/B]

Es gibt vielerlei Workarounds für dieses Problem ;) Einer davon ist Deine Methode, ein anderer führt über "NZ(DMax("[ID]","tabelle1"),0)+1" oder eine entsprechende Abfrage. Generell neige ich hier dazu eine Abfrage über Recordset zu ziehen.

Gruß

Arno

A.S.
20.03.2003, 12:00
PS

Original geschrieben von A.S.
Es gibt vielerlei Workarounds für dieses Problem ;) Einer davon ist Deine Methode, ein anderer führt über "NZ(DMax("[ID]","tabelle1"),0)+1" oder eine entsprechende Abfrage. Generell neige ich hier dazu eine Abfrage über Recordset zu ziehen.

Das ist für den Fall gemeint, das ich a) mit einer internen VerknüpfungsID arbeiten will um die DS eindeutig einander zuordnen zu können und b) vom "Kunden" vorgegebene Nummernkreise oder -formate habe, bei denen manuelle Schlüsseleinpflegung notwendig ist - ich also für die eigentliche Identifikation keinen Autowert nutzen kann.

Gruß

Arno

strausto
20.03.2003, 12:01
@Arno

Gönne Dir doch ein bißchen Schlaf...


Als persönlichen Angrif habe ich das nicht gesehen.


Es freut mich, dass Du das nicht als Vorwurf empfunden hast. Es ist auch nicht meine Art anderen Vorwürfe zu machen, da ich dafür auch viel zu wenig von Access verstehe.

Deine Methode

NZ(DMax("[ID]","tabelle1"),0)+1"

scheint für die hier beschriebene Problematik wohl am einfachsten. Insofern sich wmayer1000 mit Recordsets auskennt kann er die andere von Dir vorgeschlagene Methode versuchen.

jhb
20.03.2003, 12:46
Hallo,

ich hätte zu diesem Thema auch noch eine kleine Frage:
Beim Entwickeln einer Datenbank für meine Dias, habe ich zum Testen ein paar willkürliche Datensätze angelegt. Dadurch wurde natürlich der autowert jedes Mal inkrementiert.
Wenn ich jetzt jedoch meine Daten aus der alten Datenbank importiere, hätte ich gerne, dass der autowert wieder bei Null anfängt.

Ist das möglich?

Vielen Dank
Jan

A.S.
20.03.2003, 12:51
Alle Datensätze löschen und die Datenbank komprimieren.

Gruß

Arno

jhb
20.03.2003, 13:07
Super, danke schön.

Da ich erst recht neu in Access eingestiegen bin, habe ich mich noch nie um das Komprimieren einer DB gekümmert.
Als ich jetzt mal noch in der Hilfe unter 'Komprimieren' nachgeguckt habe, kam sogar zur Auswahl (Access97):
'Ändern des Anfangswertes eines AutoWert-Feldes'

Dort steht auch noch eine etwas kompliziertere Möglichkeit. Aber für mich ist Deine auf alle Fälle die beste.

Viele Grüße
Jan

A.S.
20.03.2003, 13:15
Der Tip aus der Hilfe ist IMHO aber wesentlich unkomplizierter, als das was ich oben angeraten habe:

Ändern des Anfangswertes eines AutoWert-Feldes
Bei einer neuen Tabelle, die keine Datensätze enthält, können Sie den Anfangswert eines Feldes vom Typ AutoWert ändern, sofern seine Eigenschaft NeueWerte auf Inkrement eingestellt ist. Bei einer Tabelle, die Datensätze enthält, können Sie mit Hilfe dieses Verfahrens auch den nächsten, einem Feld vom Typ AutoWert zugewiesenen Wert in einen anderen Wert ändern.

Erstellen Sie eine temporäre Tabelle mit einem einzigen Feld des Datentyps Zahl. Stellen Sie dessen Eigenschaft Feldgröße auf Long Integer ein, und geben Sie ihm denselben Namen wie dem Feld vom Typ AutoWert in der Tabelle, dessen Wert Sie ändern möchten.
Wie wird's gemacht?

Geben Sie in der Datenblattansicht einen Wert in das Zahlenfeld der temporären Tabelle ein, der um 1 niedriger ist als der Anfangswert, den Sie dem Feld vom Typ AutoWert zuweisen möchten. Möchten Sie z.B., dass das Feld vom Typ AutoWert mit 100 beginnt, geben Sie in das Zahlenfeld 99 ein.


Erstellen Sie eine Anfügeabfrage, und führen Sie sie aus, um die temporäre Tabelle an die Tabelle anzufügen, deren AutoWert-Wert Sie ändern möchten.
Wie wird's gemacht?

Anmerkung Verfügt Ihre Originaltabelle über einen Primärschlüssel, müssen Sie diesen vorübergehend löschen, bevor Sie die Anfügeabfrage ausführen. Enthält Ihre Originaltabelle ferner Felder, deren Eigenschaft EingabeErforderlich auf Ja eingestellt ist, deren Eigenschaft Indiziert auf Ja (Ohne Duplikate) eingestellt ist und deren Eigenschaft Gültigkeitsregel (gilt auch für Datensätze) so eingestellt ist, dass Nullwerte in Feldern verhindert werden, müssen Sie diese Einstellungen vorübergehend deaktivieren.

Löschen Sie die temporäre Tabelle.


Löschen Sie den durch die Anfügeabfrage angefügten Datensatz.


Mussten Sie in Schritt 3 Eigenschafteneinstellungen deaktivieren, kehren Sie wieder zu den ursprünglichen Einstellungen zurück.
Wenn Sie einen Datensatz in die verbleibende Tabelle eingeben, verwendet Microsoft Access ein Feld vom Typ AutoWert, dessen Wert um 1 größer ist als der Wert, den Sie in die temporäre Tabelle eingegeben haben.

Anmerkung Möchten Sie die Datenbank komprimieren, nachdem Sie den Anfangswert für AutoWert geändert haben, fügen Sie der Tabelle zunächst unbedingt mindestens einen Datensatz hinzu. Unterlassen Sie dies, wird beim Komprimieren der Datenbank der AutoWert für den nächsten hinzugefügten Datensatz auf 1 höher als der höchste vorhergehende Wert gesetzt. Enthielt die Tabelle keine Datensätze, als Sie den Anfangswert neu eingestellt haben, wird durch das Komprimieren der AutoWert für den nächsten hinzugefügten Datensatz auf 1 gesetzt; enthielt die Tabelle Datensätze, als Sie den Anfangswert neu eingestellt haben, und war der höchste vorangehende Wert 50, wird das Komprimieren den AutoWert für den nächsten hinzugefügten Datensatz auf 51 setzen.

Gruß

Arno

jhb
20.03.2003, 13:25
Wieso soll Deine Version komplizierter sein?

Ich hab' die gerade mit einer kleinen DB ausprobiert. Da hat es mit einmal Komprimieren sofort funktioniert.
Und eine kleine VBA-Prozedur zum Löschen sämtlicher Datensätze ist ja schnell geschrieben.

Die Methode aus der Hilfe, kann ich (als Anfänger) nicht so ohne weiteres sofort nachvollziehen, was da eigentlich gemacht wird. Ich könnte wohl Schritt für Schritt alles ausführen, aber das Komprimieren ist mir wenigstens klar.

Gruß Jan

PS: Nach nun weiteren zwei, drei Minuten, habe ich dann auch die Hilfe-Version verstanden. Mich hatte nur diese Anfügeabfrage ziemlich verwirrt, weil ich auch von der noch nie etwas gehört hatte.

A.S.
20.03.2003, 13:34
Hallo Jan,

das bezog sich in erster Linie auf Wolfis Problem - dem Ursprungsthema dieses Threads ;)

Gruß

Arno

jhb
20.03.2003, 13:50
Hi Arno,

da muss ich allerdings zustimmen. Das find' sogar ich einfacher, als die obigen Vorschläge.

Gruß Jan