AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Kundennummer generieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Kundennummer generieren?

Ein Thema von AlexII · begonnen am 14. Feb 2013 · letzter Beitrag vom 16. Feb 2013
Antwort Antwort
Seite 3 von 4     123 4      
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#21

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 11:37
Danke für eure Posts

Kann mir vllt jemand ein gutes SQLite-Buch < 20€ empfehlen?
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#22

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 11:38
Ok, ist ein wichtiger Grund. Aber mir geht's jetzt um's Prinzip, wie kann ich vermeiden, dass ne Zahl wiederholt vergeben wird...
Wenn die Zahl als Primärschlüssel einer Tabelle verwendet wird, ist Wiederholung nicht möglich, ein Primärschlüssel ist in der Regel durch eine "Unique Constraint" (eindeutiger Index) abgesichert.
Michael Justin
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#23

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 11:41
Ok, ist ein wichtiger Grund. Aber mir geht's jetzt um's Prinzip, wie kann ich vermeiden, dass ne Zahl wiederholt vergeben wird...
Wenn die Zahl als Primärschlüssel einer Tabelle verwendet wird, ist Wiederholung nicht möglich, ein Primärschlüssel ist in der Regel durch eine "Unique Constraint" (eindeutiger Index) abgesichert.
Hast recht, aber wenn du den letzten Schlüssel löschst und nen neuen einfügst, wird dieser genau das sein, was du vorher gelöscht hast.
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
khh

Registriert seit: 18. Apr 2008
Ort: Südbaden
1.903 Beiträge
 
FreePascal / Lazarus
 
#24

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 11:49

Hast recht, aber wenn du den letzten Schlüssel löschst und nen neuen einfügst, wird dieser genau das sein, was du vorher gelöscht hast.
nein, nicht wenn du das per DB-Trigger machst.

Trotzdem nochmal:
Kundennummern löscht man nicht, Primärschlüssel erst recht nicht!
Karl-Heinz
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#25

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 12:29
nur mal ein Gedankenspiel...

Du hast einen Kundennummernkreis 1000-1999.
Hieraus vergibst Du Kundennummern.
Sollte ein Kunde nicht mehr Dein Kunde sein wollen - kannst Du die entsprechende Kundennummer mit einem "to delete" Flag versehen.

Ist dann die Kundennummer 1999 erreicht.
Fängt ein neuer Kundennummernkreis an (2000-2999).
Aud dem alten Kundennummernkreism kannst Du nun die Kundennummern die mit dem "to delete" Flag versehen sind löschen.
Neue Kundennummern werden nur noch aus dem neuen Kundennummernkreis vergeben.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
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
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#27

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 14:24
Trotzdem nochmal:
Kundennummern löscht man nicht, Primärschlüssel erst recht nicht!
Pack einen Löschvermerk dahinter, nimm ein Endedatum oder sonst irgendwas, aber nicht löschen!
(was meint Ihr wohl wieviele Doppelbelegungen es bei einer 6Stelligen Personalnummer gibt, wenn nach 6 Jahren diese Nummer wieder vergeben wird? durchschn. 7000 Personen) nach 10 Jahren ca. 250.

Jetzt hat sie 8 Stellen und wird nur einmal vergeben.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#28

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 15:18
@sx2008 thx...
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#29

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 20:00
Trotzdem nochmal:
Kundennummern löscht man nicht, Primärschlüssel erst recht nicht!
Pack einen Löschvermerk dahinter, nimm ein Endedatum oder sonst irgendwas, aber nicht löschen!
(was meint Ihr wohl wieviele Doppelbelegungen es bei einer 6Stelligen Personalnummer gibt, wenn nach 6 Jahren diese Nummer wieder vergeben wird? durchschn. 7000 Personen) nach 10 Jahren ca. 250.

Jetzt hat sie 8 Stellen und wird nur einmal vergeben.

Gruß
K-H
So, sollte man es machen
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#30

AW: Kundennummer generieren?

  Alt 15. Feb 2013, 20:19
Also wir erlauben auch das Löschen von Kunden. Natürlich macht das auf dem ersten Blick wenig Sinn, doch aus 20+ Jahren Erfahrungen kommt irgendwann ein Anwender an und möchte einen Kunden tatsächlich löschen. Warum er es möchte, ist nicht unbedingt wichtig, doch um mal ein paar Gründe zu nennen:
- DAU-Bedingte Falschbedienung. Der Anwender klickt einfach zig mal auf "Neuen Kunden anlegen" und "abspeichern".
Hier wäre es natürlich möglich, die gleichen Kundennummern für Produktivdatensätze zu verwenden. Also ein "Kunden bearbeiten" > Daten eintragen > "Speichern", doch viele Anwender denken da nicht so weit und klicken lieber direkt ein weiteres Mal auf "Neuen Kunden anlegen".
- Expliziter Wunsch des Kunden, alle Daten aus dem System zu löschen
Meiner Meinung Nach sollte das in Zeiten von Datenschutzskandalen möglich sein.
- Zusammenfassung mehrerer Kunden
- Testdatensätze
...

Damit eine KundenNr nicht 2x vorkommt, würde ich eine Sequenz verwenden. Alternativ kann man auch eine weitere Tabelle nehmen, und diese als Zähler verwenden.
Der Vorteil einer weiteren Tabelle wäre, dass man die KundenNr auch Alphanumerisch hochzählen kann, bzw. dort x-beliebige Logik verwenden kann.
Die Vergabe der KundenNr gehört natürlich in einen Trigger.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz