Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Vergabe einer Nummer (https://www.delphipraxis.net/186550-vergabe-einer-nummer.html)

Rippo 10. Sep 2015 13:14

Datenbank: Firebird • Version: 2.5 • Zugriff über: SQL

Vergabe einer Nummer
 
Hallo

Ich habe ein Grid, das Grid enthält ein Feld namens Schlüsselnummer. Dieses Feld habe ich mit einem UNQ bestückt. Die nummer darf nur einmal vorkommen. Wenn ich die Anwendung öffne und ein neuen datensatz einfügen möchte, wie schaffe ich es das wenn ich eine neue zeile erschaffe das Feld Schlüsselnummer bereits eine neue nummer vergeben bekommen hat und diese nicht mehr überschreibbar ist?.

mkinzler 10. Sep 2015 13:18

AW: Vergabe einer Nummer
 
Eigentlich wird die Nummer erst beim Post neu erzeugt. Du kannst diese abe auch vorab holen:

SQL-Code:
select GEN_ID( <Generatorname>, <Schrittweite>) from rdb$database;
(Voraussetzung das der Trigger nur bei NULL-Werten eine neue Nummer erzeugt, sonst wird beim Einfügen eine weitere Nummer geholt).

Im Grid müsste diese Spalte dann readonly sein

Der schöne Günther 10. Sep 2015 13:18

AW: Vergabe einer Nummer
 
Wird der Wert nicht vom DBMS automatisch erzeugt oder soll das wirklich deine Anwendung machen?

Ich kenne Firebird jetzt nicht, aber wie verlässlich ist das denn, sich den Schlüssel im Vorab zu holen und darauf zu hoffen, dass in der Zwischenzeit niemand anderes einfügt und diesen Wert schon "verbraucht"?

Nersgatt 10. Sep 2015 13:21

AW: Vergabe einer Nummer
 
Mit den Generatoren kann man das machen. Der nächste würde dann die nächsthöhere Nummer holen, auch wenn der erste noch nicht gespeichert hat. So könnte es natürlich zu Lücken in der Nummernvergabe kommen, aber das ist ja bei Primärschlüsseln meistens egal.
Kann man auch per Trigger + Generator lösen, dann hat man quasi ein Autoinc-Feld.

nahpets 10. Sep 2015 13:39

AW: Vergabe einer Nummer
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1315464)
Wird der Wert nicht vom DBMS automatisch erzeugt oder soll das wirklich deine Anwendung machen?

Ich kenne Firebird jetzt nicht, aber wie verlässlich ist das denn, sich den Schlüssel im Vorab zu holen und darauf zu hoffen, dass in der Zwischenzeit niemand anderes einfügt und diesen Wert schon "verbraucht"?

Wenn ich mir mit 'ner Sequenz einen Wert hole, dann ist er vergeben. Für immer.
Es ist dabei dann egal, ob ich ihn heute oder morgen oder nächstes Jahr in die Datenbank schreibe, vergeben ist vergeben. Das Einzige, was zwingend ist: Jeder, alle ... wie auch immer... müssen sich den Wert über die Sequenz holen.

Und wenn ich mir einen Wert hole und diesen dann nicht nutze, dann ist in der Tabelle für diesen Wert halt eine Lücke, die nie wieder aufgefüllt werden wird.

Eine Sequenz liefert bei jedem Zugriff einen neuen Wert, unabhängig davon, ob irgendeiner der vorher erzeugten Werte jemals genutzt wurde.

Wenn natürlich irgendwer einfach so irgendwelche Werte nutzt, die er sich selbst erfindet, so kann es zu doppelten Werten kommen, das heißt aber auch: Da hat jemand nicht regelkonform mit der Datenbank gearbeitet.

Über eine Sequenz ist eine doppelte Vergabe eines Wertes nicht möglich, von daher kann es die Situation: aber wie verlässlich ist das denn, sich den Schlüssel im Vorab zu holen und darauf zu hoffen, dass in der Zwischenzeit niemand anderes einfügt und diesen Wert schon "verbraucht"? nicht geben.

Ähnlich wie bei einer GUID. Die ist (per Definition) eindeutig, wenn Du sie nutzt, dann schön, wenn nicht, wird niemand mehr diese GUID (zufällig) erzeugen und verwenden können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 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