Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Datensatz einfügen, ID holen

75 views
Skip to first unread message

Andreas Vogt

unread,
Dec 5, 2008, 8:49:07 AM12/5/08
to
Hallo,
über eine Einfügeabfrage db.Execute "..." füge ich einen neuen DS mit
einem AutoWert ID ein.
Gibts eine sichere Methode als direkt danach per Recordset diese ID zu
holen?
Kriterium im Recordset ist eine kennzeichnende Nummer die man mit der
Einfügeabfrage speichert, und nur wenige male vorkommen kann.

Oder doch umsteigen auf Recordset und AddNew-Methode wo ich den ID
direkt bekomme?

Gruß Andreas

Karl Donaubauer

unread,
Dec 5, 2008, 9:07:14 AM12/5/08
to
Hallo, Andreas!

Mir ist nicht so ganz klar, was du machst und mit "sicher" meinst.

Den zuletzt eingefügten Autowert bekommt man normalerweise
per Abfrage mit Max().

Wenn du dich mit "sicher" auf sehr dichten Betrieb beziehst,
gibt's noch @@IDENTITY als Alternative. Das sollte den letzten
_von dir_ d.h. mit der selben Connection vergebenen bringen:
http://groups.google.com/group/microsoft.public.de.access/msg/6b5d595f976ad37b

--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com


Peter Doering

unread,
Dec 5, 2008, 9:11:49 AM12/5/08
to
Hallo,

Andreas Vogt wrote:

Ich wuerde per Recordset.AddNew umsteigen. Der neue Autowert steht sofort
nach AddNew im entsprechenden Feld zur Verfuegung.

Gruss - Peter

--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com

Peter Doering

unread,
Dec 5, 2008, 9:12:52 AM12/5/08
to
Hallo Karl,

Karl Donaubauer wrote:
> Andreas Vogt wrote:
>> über eine Einfügeabfrage db.Execute "..." füge ich einen neuen DS mit
>> einem AutoWert ID ein.
>> Gibts eine sichere Methode als direkt danach per Recordset diese ID zu
>> holen?
>> Kriterium im Recordset ist eine kennzeichnende Nummer die man mit der
>> Einfügeabfrage speichert, und nur wenige male vorkommen kann.
>>
>> Oder doch umsteigen auf Recordset und AddNew-Methode wo ich den ID
>> direkt bekomme?
>
> Mir ist nicht so ganz klar, was du machst und mit "sicher" meinst.
>
> Den zuletzt eingefügten Autowert bekommt man normalerweise
> per Abfrage mit Max().

Ein mutiges Statement. Was ist, wenn der Autowert schon im Minusbereich
liegt? Was, wenn er auf Random statt Increment steht? Was bei Replikation?
;-)

Karl Donaubauer

unread,
Dec 5, 2008, 9:21:46 AM12/5/08
to
Hallo, Peter!

Peter Doering wrote:
> Karl Donaubauer wrote:
>> ...


>> Den zuletzt eingefügten Autowert bekommt man normalerweise
>> per Abfrage mit Max().
>
> Ein mutiges Statement. Was ist, wenn der Autowert schon im
> Minusbereich liegt? Was, wenn er auf Random statt Increment steht?
> Was bei Replikation? ;-)

Gratuliere. Sehr wahrscheinliche Fälle. ;-)
Was denkst du, wieviel Prozent aller Access-Autowerte nicht auf
dem Standardwert "Inkrement" stehen oder gar bereits im negativen
Bereich sind? Und was denkst du soll "normalerweise" bedeuten?

--
cu

Josef Poetzl

unread,
Dec 5, 2008, 9:20:49 AM12/5/08
to
Hallo!

Andreas Vogt schrieb:

Du könntest @@Identity verwenden.

Beispiel:

Public Function GetIdentityFromInsertSQL( _
ByVal sInsertStatement As String, _
Optional ByRef RecordsAffected As Long) As Long

dim db As DAO.Database
Dim rst As DAO.Recordset

Dim lngRecordsAffected As Long
Dim lngIdentity As Long

Set db = CurrentDbC

'Insert-Statement ausführen
db.Execute sInsertStatement
'eventuell: + dbFailOnError und dbSeeChanges

'Anzahl der eingefügten DS ermitteln
lngRecordsAffected = db.RecordsAffected
If lngRecordsAffected > 0 Then 'Insert-Anweisung fügte DS hinzu
Set rst = db.OpenRecordset("SELECT @@IDENTITY", dbOpenForwardOnly)
With rst
lngIdentity = .Fields(0)
'Anm.: es wird imo immer Zahl geliefert,
' daher ist EOF-Prüfung und Nz() nicht notwendig
.Close
End With
Set rst = Nothing
End If

RecordsAffected = lngRecordsAffected
GetIdentityFromInsertSQL = lngIdentity

End Function

mfg
Josef

--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Andreas Vogt

unread,
Dec 5, 2008, 9:57:12 AM12/5/08
to
Hallo,
das Thema ist ja nur deswegen für mich relevant da mehrere User in der
Tabelle arbeiten. Autowert ist wie vermutet AutoIncrement.
Es ist zwar mit an 99,9999999% der Fälle auszuschließen dass 2 User in
der selben Sekunde? ein DS einfügen mit der gleichen Produktnummer,
aber wie man hier im Badischen so treffend formuliert: "der Teufel ist
ein Eichhörnchen"

Ja @@IDENTITY hab ich gesucht, mir ist der Begriff nicht mehr
eingefallen.
Danke an alle

Gruß Andreas

Karl Donaubauer

unread,
Dec 5, 2008, 9:58:50 AM12/5/08
to
Hallo, Peter!

Peter Doering wrote:
> Andreas Vogt wrote:
>
>> über eine Einfügeabfrage db.Execute "..." füge ich einen neuen DS
>> mit einem AutoWert ID ein.
>> Gibts eine sichere Methode als direkt danach per Recordset diese ID
>> zu holen?
>> Kriterium im Recordset ist eine kennzeichnende Nummer die man mit
>> der Einfügeabfrage speichert, und nur wenige male vorkommen kann.
>>
>> Oder doch umsteigen auf Recordset und AddNew-Methode wo ich den ID
>> direkt bekomme?
>
> Ich wuerde per Recordset.AddNew umsteigen. Der neue Autowert steht
> sofort nach AddNew im entsprechenden Feld zur Verfuegung.

Ergänzend sollte man erwähnen, dass man sofort nach dem rs.Update mit

rs.Bookmark = rs.LastModified

_sicher_ zum gerade geänderten oder hinzugefügten Datensatz kommt (s. <F1>).

--
HTH

Peter Doering

unread,
Dec 5, 2008, 10:15:40 AM12/5/08
to
Hallo Karl,

Karl Donaubauer wrote:
> Peter Doering wrote:
>> Karl Donaubauer wrote:
>>> ...
>>> Den zuletzt eingefügten Autowert bekommt man normalerweise
>>> per Abfrage mit Max().
>>
>> Ein mutiges Statement. Was ist, wenn der Autowert schon im
>> Minusbereich liegt? Was, wenn er auf Random statt Increment steht?
>> Was bei Replikation? ;-)
>
> Gratuliere. Sehr wahrscheinliche Fälle. ;-)

Der negative Fall kommt mir zumindest oefters unter. Wenn pro Stunde ein
paar Mio DS durchlaufen, hast du die Situation schon nach einem Monat
erreicht. Mir ging's tatsaechlich darum, Max() in Frage zu stellen.
Verwendest du das wirklich? Waere mir trotz aller Wahrscheinlichkeit zu
riskant.

Andreas Vogt

unread,
Dec 5, 2008, 1:20:21 PM12/5/08
to
Hallo,
Set rs = db.OpenRecordset("SELECT @@IDENTITY AS ID;")
hat aber einige Tücken.
Wenn ich z.B. 2 db.Execute Statement hintereinander habe, und 2x in
Tabellen DS eingefügt werden sollen, und die 2. Abfrage scheitert und
nichts einfügt, dann liefert
Set rs = db.OpenRecordset("SELECT @@IDENTITY AS ID;") mir den ID der
ersten Abfrage.

Andreas

Josef Poetzl

unread,
Dec 5, 2008, 2:09:12 PM12/5/08
to
Hallo!

Andreas Vogt schrieb:

Eine Prüfung von db.RecordsAffected ist oftmals nicht umsonst. ;-)

Andreas Vogt

unread,
Dec 5, 2008, 3:46:12 PM12/5/08
to
Hallo.

> Eine Prüfung von db.RecordsAffected ist oftmals nicht umsonst. ;-)
Ja hast recht.

Danke
Andreas

André Minhorst

unread,
Dec 6, 2008, 8:45:16 AM12/6/08
to
Hi,

> das Thema ist ja nur deswegen für mich relevant da mehrere User in der
> Tabelle arbeiten. Autowert ist wie vermutet AutoIncrement.
> Es ist zwar mit an 99,9999999% der Fälle auszuschließen dass 2 User in
> der selben Sekunde? ein DS einfügen mit der gleichen Produktnummer,
> aber wie man hier im Badischen so treffend formuliert: "der Teufel ist
> ein Eichhörnchen"

SELECT @@IDENTITY bezieht sich auf die aktuelle Sitzung, jeder Benutzer
erhält also seine zuletzt neu hinzugefügte ID. Leicht nachzuvollziehen,
wenn man eine Datenbank zweimal öffnet, in der ersten Datenbank einen
Datensatz per INSERT INTO hinzufügt, dies dann in der zweiten tut und dann
in der gleichen Reihenfolge @@IDENTITY abfragt.

Ciao
André

PS: Stromberg hat das mit den Eichhörnchen auch mal gesagt. ;-)

--
http://www.access-entwicklerbuch.de
http://www.access-im-unternehmen.de

Andreas Vogt

unread,
Dec 6, 2008, 11:43:55 AM12/6/08
to
Hallo André,
danke für deine Erklärung.
BTW: läuft deine Umfrage noch?

Gruß Andreas

André Minhorst

unread,
Dec 6, 2008, 5:13:28 PM12/6/08
to
Hi,

Am Sat, 6 Dec 2008 08:43:55 -0800 (PST) schrieb Andreas Vogt:

> BTW: läuft deine Umfrage noch?

ja.

Ciao
André

0 new messages