PDA

Vollständige Version anzeigen : Autowertfeld initialisieren


BodoM
13.07.2005, 13:55
Es tauchen immer wieder Fragen auf, wie ein Feld, das als Autowert deklariert wurde initialisiert werden kann.
Häufig ist beabsichtigt, den Startwert und/ oder die Schrittweite vorzugeben. Manchmal soll auch der nächste Autowert und/ oder die Schrittweite geändert werden, wenn sich bereits Datensätze in der Tabelle befinden (z.B. wenn eine Lücke in der laufende Numerierung geschlossen werden soll).

Hierzu hat Sascha Trowitzsch eine Lösung aufgezeigt, wie das sehr einfach zu realisieren ist.

Die Lösung funktioniert über DML (data manipulation language). Es wird lediglich ein SQL-Statement abgesetzt und sieht wie folgt aus:

Alter Table [Tabellenname] Alter Column [Feldname] Counter(n,m)
n=Startwert
m=Schrittweite

Wenn das Autowertfeld so manipuliert wurde, werden die folgenden Werte auf der Grundlage der Änderungen automatisch vergeben, unabhängig von den bestehenden Einträgen in dem Feld. Autowertfelder sind in der Regel Primärschlüssel. Insofern muss berücksichtigt werden, dass nachfolgend keine doppelten Werte generiert werden.

Beim Absetzen des SQL-Statements darf niemand die Tabelle benutzen, da sonst die Tabellenänderung nicht möglich ist.

Leider funktioniert das SQL-Statement nicht unter Access 97 und der JetEngine 3.5., da die Anweisung Alter Column nicht verarbeitet werden kann.

Funktion unter Verwendung von DAO bzw. ADO und eines Backends
Public Function AutowertÄndernDAO_BE(Datenbank As String, Tabelle As String, Feld As String, _
Startwert As Long, Optional Schrittweite As Long = 1) As Boolean
On Error GoTo Fehler
Dim db As DAO.Database
Set db = DBEngine(0).OpenDatabase(Datenbank)
db.Execute ("Alter Table [" & Tabelle & " ] Alter COLUMN [" & Feld & "] " & _
"COUNTER (" & Startwert & "," & Schrittweite & ");")
AutowertÄndernDAO_BE = True
db.Close
Set db = Nothing
Exit Function
Fehler:
MsgBox Err.Description
End Function

Public Function AutowertÄndernADO_BE(Datenbank As String, Tabelle As String, Feld As String, _
Startwert As Long, Optional Schrittweite As Long = 1) As Boolean
On Error GoTo Fehler
Dim cnn As New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Datenbank
cnn.Execute ("Alter Table [" & Tabelle & " ] Alter COLUMN [" & Feld & "] " & _
"COUNTER (" & Startwert & "," & Schrittweite & ");")
AutowertÄndernADO_BE = True
Set cnn = Nothing
Exit Function
Fehler:
MsgBox Err.Description
End Function


Wird kein Backend verwendet können folgende ADO- bzw. DAO-Varianten zum Einsatz kommen

Public Function AutowertÄndernADO(Tabelle As String, Feld As String, Startwert As Long, _
Optional Schrittweite As Long = 1) As Boolean
On Error GoTo Fehler
Dim cnn As ADODB.Connection
Set cnn = CurrentProject.Connection
cnn.Execute ("Alter Table [" & Tabelle & " ] Alter COLUMN [" & Feld & "] " & _
"COUNTER (" & Startwert & "," & Schrittweite & ");")
AutowertÄndernADO = True
Set cnn = Nothing
Exit Function
Fehler:
MsgBox Err.Description
End Function

Public Function AutowertÄndernDAO(Tabelle As String, Feld As String, Startwert As Long, _
Optional Schrittweite As Long = 1) As Boolean
On Error GoTo Fehler
Dim db As DAO.Database
Set db = CurrentDb
db.Execute ("Alter Table [" & Tabelle & " ] Alter COLUMN [" & Feld & "] " & _
"COUNTER (" & Startwert & "," & Schrittweite & ");")
AutowertÄndernDAO = True
db.Close
Set db = Nothing
Exit Function
Fehler:
MsgBox Err.Description
End Function

Lanz Rudolf
24.10.2006, 12:51
Hallo

@Sascha, Sory nicht ab mir Aufregen, es ist alles Richtig und Das ursprünglich von Dir beschriebene vorgehen führt auch zum erfolg doch folgendes möchte ich anfühgen ist auch nicht sicher das das 100%ig richtig ist:
Access 2003 ohne SP2: Leider läuft das ganze nur zwischen 32.768 und +32.767
da n und m Integer sind.

Prian0815
16.07.2007, 13:33
Schön, wenn man eben mal LöschLücken schließen will, was aber passiert wenn das Autowertfeld in anderen Tabellen als Fremdschlüßel genützt wird. was bei Access wohl meistens so sein wird. Werden die Fremdschlüßel automatisch mitaktualkisiert, wenn ich die Aktualisierungsweitergabe bei der Beziehungserstellung gesetzt habe. Hat da jemand Erfaghrung und eine verlässliche Aussage. Denn ansonsten macht der Einsatz ja wohl wirklich keinen Sinn.

Sascha Trowitzsch
18.09.2007, 19:34
Verspätet, aber wichtig: @Ruedi: Nein, n und m sind nicht VBA-Integer, sondern Long-Werte. So setzt es Bodo oben im Code auch ein (Parameter Startwert, Schrittweite = Long). Und das funktioniert damit auch über 2^15 hinaus.

Ciao, Sascha

Lanz Rudolf
19.09.2007, 17:17
Hallo
@Sascha
ih habe geasagt Access 2003 ohne SP2 und ich glaube das das so war
ich habe es auf zwei PC's zu dieser Zeit getestet und dem wahr so.
und Jetzt gibt es ja SP3
aber was sols das ist ja so oder so Schnee von gestern ;)