Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Kundennummer generieren? (https://www.delphipraxis.net/173270-kundennummer-generieren.html)

AlexII 14. Feb 2013 19:35

Datenbank: SQLite • Version: 3 • Zugriff über: SimpleDelphi-Wrappers von Tim Anderson

Kundennummer generieren?
 
Hallo,

ich möchte in meiner DB die Kundennummern generieren und brauche ein paar Ideen wie ich das machen soll.

Ich kann die letzte Ziffer nehmen und 1 addieren, aber was ist wenn ich die letzte lösche, dann wird zu der vorletzten 1 addiert und ich bekomme schon mal vorhandene Kundennummer, somit wird diese wiederholt, was verboten sein soll.

Würde über eure Ratschläge freuen!

jobo 14. Feb 2013 19:52

AW: Kundennummer generieren?
 
Mit autoincrement z.B.
http://sqlite.org/syntaxdiagrams.html#column-constraint

AlexII 14. Feb 2013 19:56

AW: Kundennummer generieren?
 
Zitat:

Zitat von jobo (Beitrag 1203604)

Autoincrement hat aber genau das Problem was ich beschrieben habe. Löscht man die letzte Zahl, legt neue an, und das wird dasselbe was vorher gelöscht wurde.

BUG 14. Feb 2013 20:12

AW: Kundennummer generieren?
 
Eben nicht. Der Link war irgendwie nicht sehr hilfreich.

Zitat:

If a column has the type INTEGER PRIMARY KEY AUTOINCREMENT then a slightly different ROWID selection algorithm is used. The ROWID chosen for the new row is at least one larger than the largest ROWID that has ever before existed in that same table.

Allerdings würde ich überlegen, das Datenbankdesign so anzupassen, dass zumindest die Nummer (mit Löschungsdatum) eines gelöschten Kunden gespeichert bleibt.
Das erscheint mir robuster.

Also zwei Tabellen:
CUSTOMER(id, created, deleted)
ACTIVE_CUSTOMER(id -> CUSTOMER.id, ...)

AlexII 14. Feb 2013 20:21

AW: Kundennummer generieren?
 
Zitat:

Zitat von BUG (Beitrag 1203611)
Eben nicht. Der Link war irgendwie nicht sehr hilfreich.

Zitat:

If a column has the type INTEGER PRIMARY KEY AUTOINCREMENT then a slightly different ROWID selection algorithm is used. The ROWID chosen for the new row is at least one larger than the largest ROWID that has ever before existed in that same table.

Allerdings würde ich überlegen, das Datenbankdesign so anzupassen, dass zumindest die Nummer (mit Löschungsdatum) eines gelöschten Kunden gespeichert bleibt.
Das erscheint mir robuster.

Also zwei Tabellen:
CUSTOMER(id, created, deleted)
ACTIVE_CUSTOMER(id -> CUSTOMER.id, ...)


Hab ich aber getestet und es läuft wie ich gesagt hab. Also jetzt bin ich verwirrt.

DSCHUCH 14. Feb 2013 20:23

AW: Kundennummer generieren?
 
in postgresql gibt es sequenzen, die garantiert nur einmal die gleiche zahl zurückgeben. (eigentl. bereits wegen transaktionssicherheit notwendig)

in sqllite scheint es sowas auch zu geben, mußt du mal googlen.

http://stackoverflow.com/questions/6...ment-in-sqlite

BUG 14. Feb 2013 20:48

AW: Kundennummer generieren?
 
Zitat:

Zitat von AlexII (Beitrag 1203612)
Hab ich aber getestet und es läuft wie ich gesagt hab. Also jetzt bin ich verwirrt.

Also mir funktioniert es:
Code:
$ sqlite3 test.sqlite
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table miep (id INTEGER PRIMARY KEY AUTOINCREMENT, foo INTEGER);
sqlite> insert into miep values (NULL, 1);
sqlite> insert into miep values (NULL, 2);
sqlite> insert into miep values (NULL, 3);
sqlite> delete from miep where foo = 2;
sqlite> insert into miep values (NULL, 4);
sqlite> select * from miep;
1|1
3|3
4|4
sqlite>
Ich kann mir eigentlich kaum vorstellen, dass es am Wrapper liegt.

Furtbichler 14. Feb 2013 21:14

AW: Kundennummer generieren?
 
Na und wenn doch: Eine Tabelle mit einer Zeile und einer Spalte und dort einen streng monoton steigenden Zähler implementieren. Nicht ganz trivial bei multithread, aber kein Problem.

AlexII 15. Feb 2013 09:12

AW: Kundennummer generieren?
 
Zitat:

Zitat von BUG (Beitrag 1203620)
Zitat:

Zitat von AlexII (Beitrag 1203612)
Hab ich aber getestet und es läuft wie ich gesagt hab. Also jetzt bin ich verwirrt.

Also mir funktioniert es:
Code:
$ sqlite3 test.sqlite
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table miep (id INTEGER PRIMARY KEY AUTOINCREMENT, foo INTEGER);
sqlite> insert into miep values (NULL, 1);
sqlite> insert into miep values (NULL, 2);
sqlite> insert into miep values (NULL, 3);
sqlite> delete from miep where foo = 2;
sqlite> insert into miep values (NULL, 4);
sqlite> select * from miep;
1|1
3|3
4|4
sqlite>
Ich kann mir eigentlich kaum vorstellen, dass es am Wrapper liegt.



Du hast eine Zahl irgendwo mittendrin gelöscht, da funkt alles wie es sein soll. Aber lösche mal die letzte Zahl, also die 3 und füge eine neue hinzu, und das wird wieder die 3 sein. Zumindest bei mir so.

khh 15. Feb 2013 10:20

AW: Kundennummer generieren?
 
Zitat:

Zitat von AlexII (Beitrag 1203597)
Hallo,

ich möchte in meiner DB die Kundennummern generieren und brauche ein paar Ideen wie ich das machen soll.

Ich kann die letzte Ziffer nehmen und 1 addieren, aber was ist wenn ich die letzte lösche, d

Ist doch ganz einfach, wie schon geschrieben, increment.
Bereits genutzte Kundennummern löscht man nicht.
Somit werden doppelte Vergaben vermieden.
Nenne mir einen Grund, weshalb du bereits vergebene Nummern wieder löschen willst?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 Uhr.
Seite 1 von 4  1 23     Letzte »    

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