[Gelöst] CLEAR und RESET bei Records?

3. Januar 2008 12:50

Hallo Allerseits,
Ich versuche gerade, Code zu verstehen und stoße auf folgendes Problem:

In einer Tabelle wird validiert, ob ein Datensatz mit dem Schlüsselfeld "No." existiert. Ist dies nicht der Fall, folgt in der IF-Schachtel der Befehl CLEAR(rsRecord).

Danach läuft das Progrämmle weiter und setzt sogar rsRecord."No." weiter ein.

Die Record-Variable ist keine temporäre Variable.

Soweit ich die Hilfe-FUnktion zum Clear richtig verstanden habe, löst das Clear doch nur alle Filter und setzt des Key auf den Primary Key zurück oder? Demnach hätte doch dann in diesem Falle (d.h. bei Anwendung auf eine Record-Variable) die gleiche Funktion wie das RESET, oder?

Wenn dem so ist, dann würde stünde doch durch das CLEAR wieder die ganze Tabelle im Zugriff, und der Zeiger müsste doch dann schlicht auf dem ERSTEN Datensatz der Tabelle stehen. Im weiteren Verlauf des Programmes würde dann mit der No. weitergearbeitet, die zufällig an erster Stelle steht.

Sehe ich da irgendetwas falsch??

Viele Grüße,
SF
Zuletzt geändert von SafetyFirst am 12. Februar 2008 19:30, insgesamt 3-mal geändert.

Re: Unterschied und Auswirkungen CLEAR und RESET bei Records

3. Januar 2008 14:31

SafetyFirst hat geschrieben:Soweit ich die Hilfe-FUnktion zum Clear richtig verstanden habe, löst das Clear doch nur alle Filter und setzt des Key auf den Primary Key zurück oder? Demnach hätte doch dann in diesem Falle (d.h. bei Anwendung auf eine Record-Variable) die gleiche Funktion wie das RESET, oder?


Nee, das CLEAR geht viel weiter. Hast du einen Record, der so aufgebaut ist:
Feld1 = 'ABC'; // PK
Feld2 = 1.2;
Feld3 = Opt2;
so bewirkt das CLEAR folgendes:
Feld1 = '';
Feld2 = 0;
Feld3 = Opt1;

CLEAR ist quasi die härtere Version zu INIT. INIT löscht nicht die Primärschlüsselfelder und setzt die Felder auf den INIT-Value zurück. Dieser Wert muss bei einem decimal-Feld nicht zwingend 0 entsprechen.

Wenn dem so ist, dann würde stünde doch durch das CLEAR wieder die ganze Tabelle im Zugriff, und der Zeiger müsste doch dann schlicht auf dem ERSTEN Datensatz der Tabelle stehen. Im weiteren Verlauf des Programmes würde dann mit der No. weitergearbeitet, die zufällig an erster Stelle steht.

Nein, das CLEAR wirkt sich nur auf den Record aus, auf dem der Zeiger gerade steht.

3. Januar 2008 14:46

Hallo Natalie,

habe mich da wohl unklar ausgedrückt: Das CLEAR wurde nicht auf ein dezidiertes Feld angewandt, sondern auf die komplette Record-Variable. Das Leeren einer Variablen mit einem dezidierten Eintrag war wir soweit schon halbwegs klar. Unklar war mir vor allem die Auswirkung auf den komplexeren Variablen-Typ Record als Ganzes

Hab's aber gerade mal ausprobiert:

Wenn ich einen Record mit einem gefilterten Ergebnis habe, dann ist nach dem Clear nur noch ein Leerwert abgreifbar (für mich bildlich formuliert: Der Datensatzzeiger steht auf dem nullten Datensatz; nach einem NEXT steht er dann tatsächlich auf dem ersten Datensatz).

Nach dem RESET ist zwar der Filter des Records gelöst, aber der Zeiger steht noch auf einem realen Datensatz, sodaß die über die Record-Variablen auch noch reale Werte zurückgegeben werden.

Versuch macht kluch! :-D

Vielen Dank nochmals für Deine Hilfe. Manchmal hilft's dem eigenen Denkprozess, wenn man mal drüber redet!

Übrigens: Steht Dir gut, das Weihnachts-Outfit ;-)

Viele Grüße,

SF

3. Januar 2008 15:05

SafetyFirst hat geschrieben:habe mich da wohl unklar ausgedrückt: Das CLEAR wurde nicht auf ein dezidiertes Feld angewandt, sondern auf die komplette Record-Variable.

Habe nirgends das Gegenteil behauptet ;-)
Ich habe bewusst von den beispielhaften Auswirkungen auf einen gesamten Recordinhalt gesprochen ;-)

Ein CLEAR auf eine Recordvariable ist aber auch ein CLEAR auf jedes Einzelne Recordfeld - vielleicht liegt da das Missverständnis.

Übrigens: Steht Dir gut, das Weihnachts-Outfit ;-)

Danke, aber ich sollte es so langsam wieder ablegen ;-)

3. Januar 2008 15:36

OK, bin da in der Nomenklatur noch nicht so ganz sicher. Ich hatte ja schon erwähnt, daß ich Programmierung eigentlich nie "richtig gelernt" habe und mir meine Vorstellungswelt noch ein wenig an die Denkweise der gelernten Programmierer anpassen muss.

Im Visual Basic ist es ja so, daß ich wirklich zunächst eine leere Recordset-Variable habe, die ich durch eine Code-Zuweisung fülle. Eine solche Variable kann ich dann auch entsprechend gänzlich von Inhalten befreien.

Im Navision setze ich die Variable ja schon bei der Deklaration auf die Tabelle, und diese Tabelle, stelle ich mir vor, hab ich dann mehr oder weniger immer im Zugriff.

Ich stelle mir vor, die Record-Variable "enthält" grundsätzlich die ganze Tabelle (wenngleich auch nicht komplett zur Laufzeit, aber so prinzipiell) und merkt sich mit einem Zeiger, auf welchem Datensatz man gerade steht. Über die Angabe des Feldnamens spreche ich dann die konkrete Zelle meiner Tabelle an.

Ein CLEAR auf eine Recordvariable ist aber auch ein CLEAR auf jedes Einzelne Recordfeld - vielleicht liegt da das Missverständnis.


Yep! Wobei dabei aber nicht das Tabellenfeld geleert wird (oder? :shock: ),
sondern der entsprechende Platz in der Variable. In meiner Vorstellung wird der Zeiger auf den "nullten" DS gesetzt - und da steht noch nix drin. Die Vorstellung erscheint mir plausibel, weil ich nach dem "NEXT" (d.h. "schiebe den Zeiger eine Zeile nach unten") dann wirklich auf dem ersten DS stehe.

Mensch, klasse, daß hier selbst ein Anfänger wie ich seine Fragen so gut beantwortet bekommt.

Viele Grüße,

SF

3. Januar 2008 15:49

SafetyFirst hat geschrieben:Im Navision setze ich die Variable ja schon bei der Deklaration auf die Tabelle, und diese Tabelle, stelle ich mir vor, hab ich dann mehr oder weniger immer im Zugriff.

Jein ;-)
Die Zuweisung zu einer Tabelle bewirkt per se erst einmal gar nichts.
Die Recordvariable wird per Quelltext erst durch die Befehle Record.FIND oder Record.GET gefüllt (also eine DB-Abfrage durchgeführt).
Eine Ausnahme bildet Rec auf Forms (die Form führt die Anfragen automatisch selbst aus und übergibt den Inhalt direkt an Rec) und Reports (der Trigger OnAfterGetRecord enthält bereits die gefüllte Recordvariable = DataItem).

Ich stelle mir vor, die Record-Variable "enthält" grundsätzlich die ganze Tabelle (wenngleich auch nicht komplett zur Laufzeit, aber so prinzipiell) und merkt sich mit einem Zeiger, auf welchem Datensatz man gerade steht. Über die Angabe des Feldnamens spreche ich dann die konkrete Zelle meiner Tabelle an.

Kann man so gelten lassen ;-)

Yep! Wobei dabei aber nicht das Tabellenfeld geleert wird (oder? :shock: ), sondern der entsprechende Platz in der Variable.

Korrekt! Wird jedoch danach ein Record.MODIFY ausgeführt und die Variable ist NICHT temporär - dann hast du einen echten Datensatz geleert (aber nicht gelöscht).

3. Januar 2008 16:24

Korrekt! Wird jedoch danach ein Record.MODIFY ausgeführt und die Variable ist NICHT temporär - dann hast du einen echten Datensatz geleert (aber nicht gelöscht).


Guuuut, daß Du mir DAS sagst!

Hab ich zwar noch nicht gemacht, ist aber gut, zu wissen!

Ich glaube, jetzt hab ich eine Menge dazugelernt.

Viele Grüße,

SF

3. Januar 2008 16:33

Hmmm, da fällt mir ein ....
Ein MODIFY auf eine geCLEARte Recordvariable wird wahrscheinlich nicht funktionieren. Du würdest zur Laufzeit die Fehlermeldung erhalten:
"TabellennameXY PKFeld1= '' existiert nicht."
(Man kann nur einen Datensatz ändern, der mit genau den Primärschlüsselfeldern auch existiert)

Und der Vollständigkeit halber sei gesagt, dass die gleiche Gefahr auch von Nachfolgenden Record.DELETEs und Record.INSERTs ausgeht.

3. Januar 2008 18:40

Hab's gerade getestet: Modify und Delete führt zu der von Dir beschriebenen Fehlermeldung.

Mit dem Init - CLEAR - Insert hab mich mir einen Leerdatensatz angelegt.

Ich wünsch einen schönen Feierabend,

SF
Zuletzt geändert von SafetyFirst am 4. Januar 2008 14:38, insgesamt 2-mal geändert.

3. Januar 2008 19:24

Ts ts, hat er mir nicht geglaubt ;-)