Frage zu "Best Practice" VB->mySQL Rechnungsnummer

05/01/2008 - 09:22 von Harald Bacik | Report spam
Hallo NG

Ich nutze VB.NET 2005 mit einer Anbindung an mySQL 5.1.
Folgende Situation:
Ich habe in meinem Projekt die Aufgabe, Rechnungsnummer erstellen zu lassen,
was an und für sich nicht das Problem ist. - Aber in folgender Konstellation:
Ich habe 4 verschiedene Auftragstabellen (weil 4 unterschiedliche Auftràge
für den Kunden gemacht werden können) - Jeder Auftrag kann einzeln oder mit
einem anderen Auftrag fakturiert werden.
Das bedeutet z.B. folgendes:

Tabelle A : Rechnungsnummer 3
Tabelle B : Rechnungsnummer 2
Tabelle C : Rechnungsnummer 1
Tabelle D : Rechnungsnummer 3

So, ich hatte 2 Überlegungen: Die Rechnungsnummer in eine eigene Tabelle
auslagern & per AutoIncrement die Nummer zu vergeben.
Das geht aber leider nicht, weil mein Auftraggeber jedes Jahr bei der
Rechnungsnummer 1 beginnen möchte
Zweite Möglichkeit (die ich jetzt auch vorbereitet habe): Die
Rechnungsnummer wird in den Auftragstabellen selbst mitgespeichert & per Max
& Union ermittelt. - Ist das eine Möglichkeit, die man nutzen kann, oder
spricht aus irgendwelchen Gründen etwas gegen dieses System!?

Danke im Voraus
 

Lesen sie die antworten

#1 Armin Zingler
05/01/2008 - 11:20 | Warnen spam
"Harald Bacik" schrieb
Hallo NG

Ich nutze VB.NET 2005 mit einer Anbindung an mySQL 5.1.
Folgende Situation:
Ich habe in meinem Projekt die Aufgabe, Rechnungsnummer erstellen zu
lassen, was an und für sich nicht das Problem ist. - Aber in
folgender Konstellation: Ich habe 4 verschiedene Auftragstabellen
(weil 4 unterschiedliche Auftràge für den Kunden gemacht werden
können) - Jeder Auftrag kann einzeln oder mit einem anderen Auftrag
fakturiert werden.
Das bedeutet z.B. folgendes:

Tabelle A : Rechnungsnummer 3
Tabelle B : Rechnungsnummer 2
Tabelle C : Rechnungsnummer 1
Tabelle D : Rechnungsnummer 3

So, ich hatte 2 Überlegungen: Die Rechnungsnummer in eine eigene
Tabelle auslagern & per AutoIncrement die Nummer zu vergeben.
Das geht aber leider nicht, weil mein Auftraggeber jedes Jahr bei
der Rechnungsnummer 1 beginnen möchte
Zweite Möglichkeit (die ich jetzt auch vorbereitet habe): Die
Rechnungsnummer wird in den Auftragstabellen selbst mitgespeichert &
per Max & Union ermittelt. - Ist das eine Möglichkeit, die man
nutzen kann, oder spricht aus irgendwelchen Gründen etwas gegen
dieses System!?



Letzteres würde ich ablehnen. Hast du keine Tabelle "Rechnungen"? Ist es
nicht so, dass die Rechnungsnummer auch über die Jahre hinweg eindeutig sein
muss? Selbst wenn du mit 2008/1 neu beginnst ist die von 2007/1
unterscheidbar. Möglichkeiten gibts mehrere. Auf jeden Fall brauchst du
einen Rechnungstabelle. Die Rechnungsnummer könnte auch 20080001, 20080002,
... sein. Du musst auch beachten, ob die Rechnungsnummern lückenlos sein
müssen. Davon gehe ich aus. Die Frage ist auch, wann die Rechnungsnummer
vergeben werden soll.

Kurz: Wenn kein AutoIncrement möglich ist, verwende ich eine
Nummern-Tabelle. In dem speziellen Fall mit dem zusàtzlichen Kriterium
"Jahr". Doppelte Vergabe, d.h. konkurrierende Änderungen müssen natürlich
vermieden werden:

1. Select nummer from nummern where jahr=...
2a) Wenn satz gefunden:
1. NàchsteNummer=nummer+1
2. update nummern set nummer=nàchstenummer
where jahr=...
AND nummer=nummer 'Variable Nummer
3. Anzahl aktualisierter Sàtze prüfen. Wenn 0, dann konkurrierende
Änderung. => Goto 1.
(nein, kein Goto buchstàblich sondern eine Schleife; mit Auszeit
und ggf. Fehlerrückmeldung)

2b) Satz nicht gefunden:
1. NàchsteNummer=1
2. insert into nummern (jahr, nummer)
values (jahr, 1)
3. Exception abfangen, falls konkurrierend zwischenzeitlich eingefügt
=> goto 1.


Sieht kompliziert aus, ist aber nicht. Das Laufzeitverhalten ist sehr gut,
denn i.d.R. findet keine konkurrierende Änderung statt. Tabelle Nummern hat
einen eindeutigen Index auf Jahr+Nummer. Ach so, natürlich muss die
"NàchsteNummer" in die Rechnung (DataRow etc.) eingetragen werden. Dringend
rate ich auch dazu, das ganze in einer Transaktion laufen zu lassen, um die
Lückenlosigkeit zu gewàhrleisten, d.h. keine vergebene Nummer ohne
gespeicherte Rechnung.

Wie gesagt, das ist nur eine mögliche Lösung.


Armin

Ähnliche fragen