Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: asiat am Januar 11, 2011, 17:42:49

Titel: LAST INCERT ID funktioniert nicht!
Beitrag von: asiat am Januar 11, 2011, 17:42:49
Hallo
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: asiat am Januar 11, 2011, 17:47:51
Ups, habe zuffällig enter gedrückt.

sql abfrage "SELECT LAST INCERT ID() FROM tbl_Kontakt" funktioniert in access 2007 nicht

gibt es eine lösung die mir ID einen gerade importierten Datensatz zurückliefert ?
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: DF6GL am Januar 11, 2011, 17:55:57
Hallo,


was soll "LAST INCERT ID() "  sein?

Wozu brauchst Du die ID?


WIE importierst Du?
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: asiat am Januar 11, 2011, 18:27:02
'DATENSATZ EINFUEGEN
    Dim strsql As String
    DoCmd.SetWarnings False
        strsql = "INSERT INTO tbl_Kontakt (Nachname)" & _
                 " VALUES ('" &  Me.Nachname  & "')"
        DoCmd.RunSQL strsql
    DoCmd.SetWarnings True

ID Auto Wert wird erstellt, und das möchte ich zurückgeben.
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: DF6GL am Januar 11, 2011, 19:54:47
Hallo,

Du beantwortest meine Frage nicht..


Es ist problematisch, den richtigen ID-Wert authentisch auszulesen.


Dim lngID as Long
lngID=Dlookup("ID","tbl_Kontakt","Nachname='" & Me!Nachname & "'")


oder bei inkrementellen PK:

.
.
DoCmd.RunSQL strsql
lngID=DMax("ID","tbl_Kontakt")
.
.
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: asiat am Januar 11, 2011, 20:07:45
Wenn man einen Datensatz einfügt wird automatisch eine ID Nr. erstellt und der letzer Wert ist natürlich auch der größte  von daher

SELECT max(ID) FROM tbl:Kontakt; tut es auch.

Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: Josef P. am Januar 12, 2011, 11:43:04
Hallo!

Falls direkt nach dem Anfügen gefragt werden soll:
select @IDENTITY as LetzterIdWertAusAllenTabellen
Dabei ist zu beachten, dass man bei dieser Anweisung nur den letzten Autowert der Sitzung - aber nicht den letzten Autowert von einer bestimmten Tabelle abfragen kann.

Prinzip (Luftcode!):
strsql = "INSERT INTO tbl_Kontakt (Nachname)" & _
                " VALUES ('" &  Me.Nachname  & "')"
CurrentDb.execute strsql, dbfailonerror
letzterAutowert = CurrentDb.OpenRecordset("select @IDENTITY").Fields(0).Value

Vorteil dieser Variante gegenüber DMax: sie liefert auch in einer Mehrbenutzerumgebung den zuletzt aus dem aktuellen FE erstellen Autowert und nicht den zuletzt erstellen Autowert aller Benutzer.

mfg
Josef
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: DF6GL am Januar 12, 2011, 15:48:50
Hallo Josef,

kennt denn Jet-SQL "@IDENTITY" ?


Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: Josef P. am Januar 12, 2011, 18:06:18
Hallo!

@IDENTITY kennt es nicht aber @@IDENTITY.
(Vielleicht sollte ich doch hin und wieder Code kopieren oder ausprobieren und nicht einfach so in den Beitrag schreiben. :D)

mfg
Josef
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: MzKlMu am Januar 12, 2011, 18:09:22
OT:
Josef P. als Newbie, genial. ;D  ;D

Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: oma am Januar 12, 2011, 18:31:55
Hallo,

es gibt sogar Newbie's, die Live-Meetings zu Access organisieren ;) ;D
Was wird nur aus uns Alten?

Gruß Oma
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: DF6GL am Januar 12, 2011, 19:21:19
Hallo,

wirste alt wie 'ne Kuh, mußte lerne immerzu...   ;D



Mich hat überrascht ,dass es "@@Identity"  überhaupt in  Access geht, wobei der graf. Abfrageentwurf(!) davon nix wissen will , die SQL-Ansicht aber wenigstens nicht meckert.


Trotzdem ist das Ding wegen seiner Restriktionen "schwierig" zu behandeln.


Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: oma am Januar 12, 2011, 19:41:49
Hallo Franz,

ab Jet 4.0;  siehe auch: http://support.microsoft.com/kb/232144/de (http://support.microsoft.com/kb/232144/de)

Gruß Oma
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: database am Januar 12, 2011, 20:56:24
Hallo zusammen,

ich darf mich noch mit einer Wortmeldung anhängen ...

dass es @@Identity für die Jet 4.0 gibt war mir zwar bekannt, in einer Mehrbenutzerumgebung hätte ich die Funktionalität noch nicht einsetzen wollen.

Entgegen der Meinung von Josef sehe ich da den Vorteil nicht - vielleicht habe ich da auch die Scheuklappen zu groß gewählt - ich sehe da viel mehr eine Fehlerquelle.
Wann benötigt man den zuletzt erzeugten ID Wert der durch das aktuelle FE erzeugt wurde?
Also ich habe den Bedarf in meiner gesamten - doch schon einige Jahre andauernden - Tätigkeit noch nie gehabt, sehr wohl aber Bedarf den letzten Autowert der Tabelle zu ermitteln.
Und den mit der DMax - Funktion eben

LG

Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: Josef P. am Januar 12, 2011, 21:04:38
Hallo!

Zitatich sehe da viel mehr eine Fehlerquelle.
Welche Fehlerquelle siehst du dabei?

Zitatsehr wohl aber Bedarf den letzten Autowert der Tabelle zu ermitteln
Diesen Bedarf hatte ich bisher noch nie. :)

Normalerweise benötige ich den zuletzt eingefügten Autowert eigentlich nur, wenn ich einen Datensatz einfüge und direkt danach von genau diesem Datensatz den Autowert haben möchte. DMax oder eine Max(..)-SQL-Anweisung wäre in diesem Fall in einer Mehrbenutzerumgebung ein Murks - zumindest ist es Glückssache den Wert des zuletzt vom FE aus eingefügten Datensatzes zu erhalten, da in der Zwischenzeit auch ein anderer User einen Datensatz eingefügt haben könnte. Es bleibt meiner Ansicht nach nur @@Identity übrig oder man verwendet überhaupt ein Recordset zum Anfügen des einen Datensatzes - solange man Autowerte und keine GUID verwenden will.

mfg
Josef
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: database am Januar 12, 2011, 22:09:40
Hallo Josef,

als Fehlerquelle sehe ich die Möglichkeit, eben einen Wert geliefert zu bekommen der nicht dem tatsächlich höchsten ID-Wert in einer Tabelle entspricht.

Zitatda in der Zwischenzeit auch ein anderer User einen Datensatz eingefügt haben könnte
...eben genau das habe ich dabei auch berücksichtigt -  egal wie auch immer - diesen letzten Wert der Tabelle habe ich des Öfteren benötigt und eben dazu war festgestellter Weise @@Identity nicht geeignet bzw. hätte für MICH einen Wert geliefert, den ich nicht verwenden hätte können / sollen.

ZitatDiesen Bedarf hatte ich bisher noch nie.
...wäre ja auch fad, wenn jeder das Gleiche machen würde  ;) - dann könnt' es ja gleich einer alleine tun   :D ;D
Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: Josef P. am Januar 12, 2011, 22:29:40
Hallo!

Zitatals Fehlerquelle sehe ich die Möglichkeit, eben einen Wert geliefert zu bekommen der nicht dem tatsächlich höchsten ID-Wert in einer Tabelle entspricht.
Wenn der höchste aktuell vorhandene ID-Wert abgefragt werden soll, ist @@Identity keine Fehlerquelle sondern das falsche Instrument. :)

Ich war der Meinung, es geht um den zuletzt eingefügten Autowert der aktuellen Session.

Als Beispiel (nur Prinzip-Code):
Zitatcurrentdb.execute "insert into Bestellungen (..., ..., ...) ...", dbfailonerror
NeueBestellId = Currentdb.OpenRecordset("select @@Identity")

currentdb.execute "insert into BestellPositionen (fiBestellung, ..., ...) Select " & NeueBestellId & ", ... from ... ", dbfailonerror

Für dieses Szenarion ist @@Identity besser geeignet als eine Max(..)-Auswertung, da die Max-Auswertung falsche Werte liefern könnte.
Wenn es aber darum geht, an beliebiger Stelle - ohne direkten Bezug zur letzten Insert-Anweisung o. ä. den Max-Wert zu erhalten ist natürlich @@Identity nicht geeignet - dann muss man Max nutzen, was allerdings meiner Ansicht nach nichts mehr mit "zuletzt eingefügten Autowert" zu tun hat. Dieser Bezug entsteht nur indirekt, wenn man definiert, dass der zuletzt eingefügt Wert dem höchste Wert entspricht. (Das muss aber nicht unbedingt der Fall sein. Man muss dann für die Anwendung zumindest sicherstellen, dass keine DS inkl. Wert für das Autowertfeld eingefügt werden und dadurch die automatische Autowert-Vergabe ausgehebelt wird.)

mfg
Josef



Titel: Re: LAST INCERT ID funktioniert nicht!
Beitrag von: DF6GL am Januar 13, 2011, 14:18:53
Hallo zusammen,

danke für die Infos..