Thema: Delphi Kundennummer generieren?

Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#26

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 12:58
Also es gibt verschiedene Verfahren, um Kundennummern bzw. andere Zähler zu generieren.

1.) Autoincrement-Felder
Davon würde ich abraten. Das Problem ist, dass die Nummer dann zwar im Feld steht, aber die Anwendung bekommt die Nummer nicht zurück; weiss also nicht welche Kundennummer gerade neu vergeben wurde.
Es gibt zwar Möglichkeiten, die letzte Autoincrement-Nr zurück zu erhalten (INSERT INTO x RETURNING y) aber das ist nicht standardisiert und beherrscht nicht jede Datenbank.

2.) Generatoren
Ein Generator liefert immer ein garantiert eindeutige Nummer zurück (auch im Multiuserbetrieb).
Man fragt also einen Generator mit einem best. Namen ab und bekommt so eine eindeutige Nummer.
Das Verfahren ist technisch sauber aber leider haben nicht alle Datenbanken Generatoren.

3.) Maxwert + 1
Man holt sich die höchste Nummer + 1 mit
SELECT (MAX(Kundennr)+1) AS NewKundennr FROM Tabelle Problem: beim Muliuserbetrieb kann es zu Kollisionen kommen, weil 2 Clients die gleiche Nummer gezogen haben
Sehr einfaches Verfahren - empfehlenswert, bei wenig konkurierenden Zugriff
Bei einer Kollision; also es gibt schon einen Datensatz mit der Nummer muss der Client einfach nochmal den Maxwert +1 holen. (nach 20 Fehlversuchen Fehlermeldung ausgeben)

4.) Reservierung über eigene Tabelle
In einer speziellen Tabelle wird die nächste freie Nummer gespeichert
Die Zugriffe Lesen - Nummer erhöhen und zurückschreiben müssen über Transaktionen abgesichert werden
Im Prinzip kann man so fehlende Generatoren nachbilden

5.) Mehrfach - Reservierung über eigene Tabelle
wie 4.) nur dann ganze Blöcke reserviert werden.
Ein Client kann sich z.B. die Werte 500 bis 531 reservieren.
Damit muss er erst wieder neue Werte reservieren wenn die 32 Zahlen verbraucht sind.

6.) out-of Band Kommunikation
Auf dem Server läuft zusätzlich noch ein Dienst, über den die Clients ihre Nummern ziehen können ohne dass es zur doppelten Vergaben kommen kann.
Dieser Dienst wird z.B. über TCP/IP oder Named Pipes angesprochen.
Im Prinzip werden Generatoren ausserhalb der Datenbank nachgebildet.
Nachteil: sehr aufwändig

7.) Random Werte
Der Client zieht ein Zufallszahl und schaut nach ob es dazu schon einen Datensatz gibt
Vorteil: sehr einfach zu implementieren
Nachteile: Nummer werden zufällig und nicht aufsteigend vergeben,
bei zunehmendem Füllungsgrad der Tabelle muss der Client immer öfters feststellen, dass seine Zufallszahl schon vergeben ist und erneut eine neue Zufallszahl testen.
Im Extremfall ist der Client dauerhaft blockiert

Geändert von sx2008 (15. Feb 2013 um 15:22 Uhr) Grund: typo
  Mit Zitat antworten Zitat