FOXdbe und Anfangswert in Sequence-Feld
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
FOXdbe und Anfangswert in Sequence-Feld
Ein Sequence-Feld dient ja dazu, automatisch bei jedem Append hochzuzählen und damit Eindeutige Werte zu erhalten. Dabei können beim Anlegen der Datenbank Anfangswert und Sprungweite angegeben werden.
Soweit so gut.
Leider ist es so, daß die Datenbank sich den letzten Wert grundsätzlich merkt. Bei einem ZAP wird nach einem neuen Append einfach weitergezählt. Dumm gelaufen. Oder auch gut, jenachdem, wie man das sieht. Und wie man das eben braucht. Ich brauch jedenfalls immer ein Zurücksetzen auf 1.
Aber da gibt es ja FieldInfo(). Damit kann man lt. Onlinehilfe einen neuen Startwert setzen (wobei man lt. Onlinehilfe aufpassen soll, da nicht kontrolliert wird, ob dieser Wert nicht bereits existiert).
Also schnell einbauen, und alles ist in Ordnung. Oder auch nicht. Das funktioniert nämlich nicht. Jedenfalls nicht wie gebraucht. Ein höherer Wert als der zuletzt vergebene funktioniert. Ein niedrigerer aber nicht. Also wieder nichts mit zurücksetzen. Stellt sich mir die Frage: Warum bitte schön sollte ich denn dann aufpassen, wenn ohnehin nur höher geht?
Also: Entweder ist da ein Bug drin (verglichen jedenfalls mit der Onlinehilfe), oder ich hab da was mißverstanden. Weiß da jemand von Euch weiter?
Jan
Soweit so gut.
Leider ist es so, daß die Datenbank sich den letzten Wert grundsätzlich merkt. Bei einem ZAP wird nach einem neuen Append einfach weitergezählt. Dumm gelaufen. Oder auch gut, jenachdem, wie man das sieht. Und wie man das eben braucht. Ich brauch jedenfalls immer ein Zurücksetzen auf 1.
Aber da gibt es ja FieldInfo(). Damit kann man lt. Onlinehilfe einen neuen Startwert setzen (wobei man lt. Onlinehilfe aufpassen soll, da nicht kontrolliert wird, ob dieser Wert nicht bereits existiert).
Also schnell einbauen, und alles ist in Ordnung. Oder auch nicht. Das funktioniert nämlich nicht. Jedenfalls nicht wie gebraucht. Ein höherer Wert als der zuletzt vergebene funktioniert. Ein niedrigerer aber nicht. Also wieder nichts mit zurücksetzen. Stellt sich mir die Frage: Warum bitte schön sollte ich denn dann aufpassen, wenn ohnehin nur höher geht?
Also: Entweder ist da ein Bug drin (verglichen jedenfalls mit der Onlinehilfe), oder ich hab da was mißverstanden. Weiß da jemand von Euch weiter?
Jan
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Jan.
Ich würde erwarten, daß der Sequence-Wert auch nach einem DbZap() weiterzählt. Wenn Du das nicht willst, solltest Du die Tabelle physikalisch mit FErase() löschen und mit DbCreate() neu erzeugen. Vorher Struktur mit DbStruct() einlesen, dann geht's auch allgemeingültig und ohne Kenntnisse der Datenbankstruktur. Oder - eleganter und immer empfehlenswert - mit einem eigenen Datenbank-Dictionary, das auch die Indexausdrücke usw. enthält.
Ich würde erwarten, daß der Sequence-Wert auch nach einem DbZap() weiterzählt. Wenn Du das nicht willst, solltest Du die Tabelle physikalisch mit FErase() löschen und mit DbCreate() neu erzeugen. Vorher Struktur mit DbStruct() einlesen, dann geht's auch allgemeingültig und ohne Kenntnisse der Datenbankstruktur. Oder - eleganter und immer empfehlenswert - mit einem eigenen Datenbank-Dictionary, das auch die Indexausdrücke usw. enthält.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hi,
ich weiß nicht warum man bei dem Sequence Feld überhaupt eine Startnummer und Schrittweite festlegen kann. Es soll ja nur sicherstellen, dass eine eindeutige Nummer erzeugt wird. Diese darf dann auch nach dbZAP() oder dbAppend() nicht im bisherigen Bereich liegen, sonst müsste ja die DBE jeden Datensatz durchsuchen ob die Nummer schon vergeben ist.
Auch ich empfehle löschen und neu erzeugen.
ich weiß nicht warum man bei dem Sequence Feld überhaupt eine Startnummer und Schrittweite festlegen kann. Es soll ja nur sicherstellen, dass eine eindeutige Nummer erzeugt wird. Diese darf dann auch nach dbZAP() oder dbAppend() nicht im bisherigen Bereich liegen, sonst müsste ja die DBE jeden Datensatz durchsuchen ob die Nummer schon vergeben ist.
Auch ich empfehle löschen und neu erzeugen.
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Hallo Tom und Hubert,
der Gedanke ist mir auch schon gekommen. Aber ZAPPen und neuen Startwert angeben ist aber eben einfacher. Und mir ging es ja auch darum, ob ich bei FieldInfo() irgendetwas falsch verstanden hatte. Denn eigentlich sollte es ja damit gehen. Wenn ich die Onlinehilfe richtig verstanden habe.
Jan
der Gedanke ist mir auch schon gekommen. Aber ZAPPen und neuen Startwert angeben ist aber eben einfacher. Und mir ging es ja auch darum, ob ich bei FieldInfo() irgendetwas falsch verstanden hatte. Denn eigentlich sollte es ja damit gehen. Wenn ich die Onlinehilfe richtig verstanden habe.
Jan
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Jan.
Weil die Ein-Eindeutigkeit sonst nicht gegeben wäre. Ist doch logisch. Und es macht Sinn, den Wert höher anzusetzen, wenn es zum Beispiel um Rechnungsnummern geht, die bei einem bestimmten Wert einsteigen sollen (z.B. erste Rechnungsnummer für 2008: 200800001 oder so), aber andersherum wäre es inkonsistent. Wie gesagt, ich würde erwarten, daß ein Wert keinesfalls zweimal vergeben werden kann, egal wie, ansonsten wäre die Konsistenz dieser Systematik nicht gewährleistet.Stellt sich mir die Frage: Warum bitte schön sollte ich denn dann aufpassen, wenn ohnehin nur höher geht?
Herzlich,
Tom
Tom
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Hallo Tom,
Du hast ja Recht. Aber die Onlinehilfe sagt:
Jan
Du hast ja Recht. Aber die Onlinehilfe sagt:
Das heißt doch, daß auch ein niedrigerer sprich eventuell vorhandener Wert vorgegeben werden kann. Und genau das wollte ich erreichen. Denn ich weiß ganz sicher, das es den vorgegebenen Wert nicht gibt. Weil es überhaupt keinen Wert mehr nach ZAP gibt.Mit der Konstante FOXFLD_SEQUENCE_NEXTVAL kann der Wert, den ein Sequenz Datenbankfeld mit der nächsten "append" Operation erhält, ermittelt oder vorgegeben werden. Es muß jedoch größtmögliche Vorsicht beim Vorgeben eines neuen Wertes angewandt werden, denn die FOXDBE ist nicht in der Lage zu prüfen, ob der neue Vorgabewert bereits in der Tabelle verwendet worden ist. Dies muß durch den Entwickler sichergestellt werden, andernfalls verliert das Sequenz Datenbankfeld den Charakter der Eindeutigkeit und damit die Fähigkeit als Primärschlüssel dienen zu können.
Jan