# Autowert bekommen



## Thomas223 (26. Feb 2005)

hi,
ich habe ein einfaches programm für rechnungen. die rechnungsnr. soll automatisch als autowert erzeugt werden, d.h. also beim einfügen eines neuen rechnungsdatensatzes wird auch die rechnungsnr. erzeugt. wie kann ich die rechnungsnr. danach sofort auslesen? 

gruß
thomas


----------



## L-ectron-X (26. Feb 2005)

Wer erzeugt denn die Nummer? Der Erzeuger kann doch auch die Nummer zurückgeben.
Verstehe irgendwie die Frage nicht.


----------



## Thomas223 (26. Feb 2005)

ja...die datenbank erzeugt die nummer und zwar nach jedem INSERT INTO blabla VALUES( ). dann wird das erste feld, nämlich das autowert feld, automatisch gesetzt und ich möchte nun diesen autowert erfragen. das sollte dann in java ungefähr so aussehen:


```
result = statement.execute("INSERT INTO Rechnungen VALUES(...)");
long autowertNummer = result.getLong("Gib mir den Autowert aus der Tabelle");
```

gruß


----------



## Bleiglanz (26. Feb 2005)

in jdbc 3.0 gibts dfür eine Funktion - schau in die API und ob dein Treiber das hergibt

ansonsten hat jede DB dafür eine eigene Syntax

SELECT last_inserted_id()

SELECT @@IDENTITY

SELECT lastval FROM seq


----------



## Thomas223 (26. Feb 2005)

vielen dank!
noch mal ne generelle frage: ist es überhaupt sinnvoll rechnungsnummern mit einem autowert zu generieren oder gibt es da vielleicht ne andere technik?

gruß


----------



## Bleiglanz (26. Feb 2005)

in der praxis nicht....

wenn aus irgendeinem grund eine Transaktion schief geht, dann wird bei keiner Datenbank eine Sequenz/Autoinkrement zurückgesetzt

=> also fehlt dann die "NUMMER", und das ist aus rechtlichen gründen eine kleine katastrophe

bei mir werden Rechnungsnummern i.A. durch einen komplizierten Client-Seitigen Code generiert...


----------



## Thomas223 (26. Feb 2005)

mh..dass ist auch mein problem. ich hab vorher durch ein client- seitiges programm die nummer erzeugt. ich hab die höchste rechnungsnummer der tabelle entnommen. die tabelle gesperrt und dann die rechnungsnummer+1 eingefügt. aber irgendwie hatte ich probleme, da ich msaccess verwende und die tabelle nicht wirklich gesperrt wurde... 

wie funktioniert es bei deiner lösung, vielleicht hast du ne bessere lösung?


----------



## Bleiglanz (26. Feb 2005)

nein, leider nicht;

im Prinzip mach ich einen TABLE LOCK, und dann in einer Transaktion (SERIALIZABLE,  wenns die DB hergibt) den üblichen hypervorsichtigen sch*...

SELECT MAX(rechnung_nr)

vorschlag = max +1

INSERT ()

dieneue = SELECT MAX(rechnung_nr)

wenn dieneue <> vorschlag gleich ROLLBACK, sonst

SELECT * FROM RECHNUNGEN WHERE rechnung_nr = dieneue

dann nochmal vergleichen (mit dem zeug vom insert)

wenn OK committen, wenn nicht rollbacken


----------

