Autowert ermitteln

Hallo,

eine Datenbank unter Access 97 arbeitet mit Auto-Werten als Schlüssel im Multi-User-Zugriff.

Ich muß nun nach erfolgreicher Speicherung des Datensatzes den Auto-Wert ermitteln (Alle Daten werden über VBA eingetragen, der Datensatzzeiger steht nach dem Speichern möglicherweise nicht mehr auf dem zuletzt gesicherten Datensatz).

Gibt es in Access eine Möglichkeit den eingetragenen Auto-Wert abzufragen?

Dirk

Du könntest in Deiner Tabelle ein Hilfsfeld anlegen, in das Du beim AddNew eine Mehrstellige Zufallszahl (z.B. auf Grundlage der Systemzeit) ablegst oder einen anderen eindeutigen Wert. Anschließend liest Du den Recordsatz auf Grundlage dieses Feldes wieder aus und erhälst damit auch den entsprechenden Autowert.

Mitsch

Du könntest in Deiner Tabelle ein
Hilfsfeld anlegen, in das Du beim AddNew
eine Mehrstellige Zufallszahl (z.B. auf
Grundlage der Systemzeit) ablegst oder
einen anderen eindeutigen Wert.
Anschließend liest Du den Recordsatz auf
Grundlage dieses Feldes wieder aus und
erhälst damit auch den entsprechenden
Autowert.

Wenn man einen eindeutigen Schlüssel selbst vergibt, ist das in einer normalisierten Tabelle auch gleichzeitig der Primärschlüssel - wozu braucht man dann noch den Autowert?

Reinhard

Wenn man einen eindeutigen Schlüssel
selbst vergibt, ist das in einer
normalisierten Tabelle auch gleichzeitig
der Primärschlüssel - wozu braucht man
dann noch den Autowert?

Reinhard

Da gebe ich Dir grundsätzlich recht. Allerdings gehe ich aufgrund der Problemschilderung davon aus, dass es sich um eine ‚gewachsene‘ DB-Anwendung handelt, deren Tabelle(n) nun mal mit Autowert-Primärschlüssel aufgebaut wurde(n). Da kann man nicht einfach zwischendurch den Primärschlüssel ändern. Unter Umständen muss man danach die gesamte Anwendung anpassen. Ein zusätzliches Hilfsfeld ist dabei das kleinere Übel und könnte dem Anfrager bei seinem konkreten Problem hilfreich sein.

Mitsch

Na ja, wenn Dirk erst jetzt überlegt, wie er den Primärschlüssel wieder in die Applikation bekommt, kann da wohl noch nicht so viel gewachsen sein.
Aber wie so oft: Wir sind mal wieder am mutmaßen ;=)

Reinhard

Ich muß nun nach erfolgreicher Speicherung
des Datensatzes den Auto-Wert ermitteln
(Alle Daten werden über VBA eingetragen,
der Datensatzzeiger steht nach dem
Speichern möglicherweise nicht mehr auf
dem zuletzt gesicherten Datensatz).

Direkt nach dem Aufruf von AddNew kannst du das Feld auslesen, in dem der AutoWert steht. Gilt IMHO allerdings nur für Jet-Datenbanken, beim SQL Server sieht das anders aus (Reinhard, dein Einsatz…).

Gruß Tobias

Ich muß nun nach erfolgreicher
Speicherung
des Datensatzes den Auto-Wert ermitteln
(Alle Daten werden über VBA eingetragen,
der Datensatzzeiger steht nach dem
Speichern möglicherweise nicht mehr auf
dem zuletzt gesicherten Datensatz).

Direkt nach dem Aufruf von AddNew kannst
du das Feld auslesen, in dem der AutoWert
steht. Gilt IMHO allerdings nur für
Jet-Datenbanken, beim SQL Server sieht das
anders aus (Reinhard, dein Einsatz…).

Gruß Tobias

So ist es, bei SQL Server empfiehlt sich folgendes (geht auch bei Jet):

Dim RS As Recordset
Set RS = …
RS.AddNew
'…
RS.Update
RS.MoveLast
Ergebnis = RS!MeinAutowertFeld

Reinhard

Hallo,

erst mal vielen Dank für eure Antworten. Mein Problem ist aber der Multi-User-Zugriff.
Es kann also sein, daß ein anderer Benutzer auch bereits einen neuen Datensatz eingefügt hat. In diesem Fall würde das mit MoveLast nicht funktionieren.
Gibt es noch eine andere Lösung?

Dirk

Ich muß nun nach erfolgreicher
Speicherung
des Datensatzes den Auto-Wert ermitteln
(Alle Daten werden über VBA eingetragen,
der Datensatzzeiger steht nach dem
Speichern möglicherweise nicht mehr auf
dem zuletzt gesicherten Datensatz).

Direkt nach dem Aufruf von AddNew kannst
du das Feld auslesen, in dem der AutoWert
steht. Gilt IMHO allerdings nur für
Jet-Datenbanken, beim SQL Server sieht
das
anders aus (Reinhard, dein Einsatz…).

Gruß Tobias

So ist es, bei SQL Server empfiehlt sich
folgendes (geht auch bei Jet):

Dim RS As Recordset
Set RS = …
RS.AddNew
'…
RS.Update
RS.MoveLast
Ergebnis = RS!MeinAutowertFeld

Reinhard

Hallo,

erst mal vielen Dank für eure Antworten.
Mein Problem ist aber der
Multi-User-Zugriff.
Es kann also sein, daß ein anderer
Benutzer auch bereits einen neuen
Datensatz eingefügt hat. In diesem Fall
würde das mit MoveLast nicht
funktionieren.

Wenn Du den Recordset mit dbSeeChanges öffnest, solltest Du die Änderungen des anderen Benutzers mitbekommen…

Ansonsten würde ich die Schlüsselvergabe halt ohne Autowert realisieren - dann ist man ohnehin flexibler.

Reinhard

Das war nix…
Pardon, da hab ich nicht nachgedacht - Du willst die Änderungen des anderen Benutzers ja gerade nicht mitbekommen…

Du könntest die Tabelle solange exklusiv sperren, wie das Eintragen dauert - dann kannst Du sicher sein, daß kein anderer etwas hinzugefügt hat, müßtest dann aber auch den Sperrfall abfangen, damit die Benutzer nicht irritiert werden.

Einfacher ist es aber wohl, die Nummernvergabe selbst vorzunehmen, und auf die dämlichen Autowerte zu verzichten …

Reinhard

Das klappt allerdings nicht…
… wenn das Autowert-Feld nicht der Primärschlüssel ist. Aber wer macht schon so etwas…

Reinhard