Vorschlag zu increment Feld gesucht

11/02/2009 - 11:37 von Peter Haus | Report spam
Hallo NG

Ich habe ein Problem, bei dem ich im eine Idee bitte,
wie eine Lösung aussehen könnte.
Hintergrund ist die Portierung einer Access DB nach SQL-Server.

In einer der Datenbank habe ich die Felder
"ID" int Autoincrement Primary
"A_ID"
"A_Jahr"
...

Das Feld "A_ID" soll bei jedem neuen Auftrag um eins erhöht werden.
In das Feld "A_Jahr" wird die aktuelle Jahreszahl (2009) eingetragen.
Das Feld "A_ID" soll mit Beginn eines neuen Jahres mit 1, als Startwert
belegt werden.
Mehrere Benutzer können Daten erfassen.

Als Aufrag-Nr erhàlt man somit z.B. 2376/2009 jedes
Jahr wieder neu beginnend mit z.B. 1/2010 .

Ich habe nicht wirklich eine gute Idee wie das "richtig" zu
lösen ist.
Ich würde eine "leere" Tabelle machen, nur um einen
Autoincremnet Wert zu erhalten und diese am Anfang eines
Jahres wieder löschen.

Ich denke ein Profi würde es ab soviel Dilettantismus nur wundern.

Hàtte mir jemand einen Vorschlag?

Danke und Grüsse
Peter
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
12/02/2009 - 00:34 | Warnen spam
Hallo Peter,

"Peter Haus" schrieb:

Das Feld "A_ID" soll bei jedem neuen Auftrag um eins erhöht werden.
In das Feld "A_Jahr" wird die aktuelle Jahreszahl (2009) eingetragen.
Das Feld "A_ID" soll mit Beginn eines neuen Jahres mit 1, als Startwert
belegt werden.



Letzteres làsst sich über die Anwendung, einen Trigger oder auch direkt
im INSERT Statement lösen lassen. Den Wert für A_Jahr mit

YEAR( GETDATE() )

oder

DATEPART( yy, GETDATE() )

als Defaultwert ist ja nicht das Problem. ID als IDENTITY auch nicht. A_ID
müsstest Du dann bspw. so ermitteln:

SELECT MAX( A_ID ) + 1 AS Auftragsnummer
FROM <Tabelle>
WHERE A_Jahr = YEAR( GETDATE() )

Allerdings musst Du hier natürlich darauf achten, dass in der Zwischenzeit
bis zur effektiven Speicherung keiner einen Datensatz einfügt, sonst ist
deine A_ID wieder hinfàllig. Am einfachsten dürfte es werden, wenn Du den
Wert direkt im INSERT Statement unterbringst. Allerdings weiß ich grade
nicht, ob das wirklich 100%ig sicher bzgl. anderen, gleichzeitigen INSERT
Statements ist. (Wenn Du nen Database- oder Tablelock machst, ist es sicher
^^, kleiner Scherz am Rande :)

INSERT INTO <Tabelle>
(
A_ID,
...
)
SELECT ISNULL( MAX( A_ID ), 0 ) + 1,
...
FROM <Tabelle>
WHERE A_Jahr = YEAR( GETDATE() )

Das muss natürlich noch erweitert werden und dient nur zur Veranschaulichung
einer Màglichkeit.

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen