Oder doch umsteigen auf Recordset und AddNew-Methode wo ich den ID
direkt bekomme?
Gruß 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
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
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?
;-)
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
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/
Ja @@IDENTITY hab ich gesucht, mir ist der Begriff nicht mehr
eingefallen.
Danke an alle
Gruß Andreas
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
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
Andreas Vogt schrieb:
Eine Prüfung von db.RecordsAffected ist oftmals nicht umsonst. ;-)
Danke
Andreas
> 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
Gruß Andreas
Am Sat, 6 Dec 2008 08:43:55 -0800 (PST) schrieb Andreas Vogt:
> BTW: läuft deine Umfrage noch?
ja.
Ciao
André