FOXdbe und Anfangswert in Sequence-Feld

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
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

Beitrag von Jan »

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
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

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
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

Hallo, Jan.
Stellt sich mir die Frage: Warum bitte schön sollte ich denn dann aufpassen, wenn ohnehin nur höher geht?
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.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

Ergänzung: Es gibt sicher irgendeine Möglichkeit, den Dateiheader zu manipulieren. Da muß der Wert ja irgendwo stehen. Ich schaue gleich mal im Handbuch der Dateiformate.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Tom,

Du hast ja Recht. Aber die Onlinehilfe sagt:
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.
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.

Jan
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

Hallo, Jan.

Widersprüchliche Doku hin oder her - wir müssen mit den Fakten leben. 8)

Also einfach neu erzeugen.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Tom,

ja, werd ich wohl machen müssen.

Aber ich hab jetzt mal Alaska gefragt, ob das nun von Doku- oder von Compilerseite ein Fehler ist.

Jan
Antworten