Autowert bekommen

Status
Nicht offen für weitere Antworten.

Thomas223

Mitglied
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

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

Thomas223

Mitglied
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:

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

gruß
 

Bleiglanz

Gesperrter Benutzer
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

Mitglied
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

Gesperrter Benutzer
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

Mitglied
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

Gesperrter Benutzer
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben