[Gelöst] Unterschied zwischen COPY-Funktion und direkter...

14. September 2011 14:48

Hallo zusammen,

ähm, bitte brecht jetzt nicht ob der (etwaigen) Lächerlichkeit meiner Frage in Lachkrämpfe aus - aber ich steh grad total auf dem Schlauch: :oops:

Was genau ist der Unterschied zwischen der Kopie einer Record-Variablen mittels der COPY-Funktion und mittels direkter Zuweisung? Nur der Umstand dass COPY eine etwaige Filterung mitkopiert?

Anders ausgedrückt - wo ist hier der Unterschied?
Code:
Newrec.Copy(Rec)
bzw.
Code:
Newrec := Rec


Ich weiß dass ich es schon mal wusste und dass ich es vor allem wissen sollte, aber ich krieg's nicht mehr zusammen und der Reference Guide sowie die Forumssuche hier und bei mibuso haben mich leider nicht weitergebracht. Seufz. :cry:
Zuletzt geändert von Alex Gilch am 14. September 2011 16:47, insgesamt 1-mal geändert.

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 14:57

Hallo,

sagt die Hilfe zu COPY nichts? (F1 im C/AL Editor)

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 15:02

JanGD hat geschrieben:sagt die Hilfe zu COPY nichts? (F1 im C/AL Editor)


Hi JanGD,

doch doch, da hab ich - wie erwähnt - auch schon nachgeguckt, die COPY-Funktion wird dort erklärt, jedoch wird die Möglichkeit der direkten Zuweisung von Records in dem Reference Guide mit keinem Wort erwähnt. Ich möchte aber gerade den exakten Unterschied zwischen COPY und der direkten Zuweisung kennen.

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 15:14

Was den Inhalt der Recordfelder angeht, arbeiten COPY und := identisch.
Der Unterschied ist, dass COPY auch Filter, Schlüssel etc. mitnimmt.

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 15:35

Hi Natalie,

danke für die Info! :-D Also wenn das der einzige Unterschied ist dann hab ich direkt noch ne Folgefrage: Wofür verwendet man folgendes Zuweisungskonstrukt?

Code:
DuplRec := Rec;
SomeWeirdFunction(DuplRec);
Rec := DuplRec;


Wobei die "SomeWeirdFunction"-Funktion den Parameter "DuplRec" by reference übernimmt. Ich hab jetzt kein konkretes Beispiel zur Hand, bin aber schon des öfteren über ein derartiges Gebilde gestolpert. Hat das irgendwas mit Zeigern zu tun oder so? Ich weiß, das sind Anfängerfragen...aber ist irgendwie nicht mein Tag heute... :roll:

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 16:06

Code:
DuplRec := Rec;
SomeWeirdFunction(DuplRec);
Rec := DuplRec;

macht Datentechnisches nichts anderes als
Code:
SomeWeirdFunction(Rec);


Ich denke, so ein Konstrukt verwendet man nur, wenn man der Funktion SomeWeirdFunction keine Filter und Schlüssel übergeben möchte, die noch im Rec drinstecken.




EDIT
Das Nachfolgende war Quatsch, lasse ich aber trotzdem stehen, vielleicht nützt das mal jemanden etwas.
Ich bezog mich aus Versehen auf folgendes Codebeispiel:

Code:
DuplRec := Rec;
SomeWeirdFunction(Rec);
Rec := DuplRec;

Könnte folgenden Anwendungsfall haben:
Stell dir vor, du hast die Aufgabe bekommen, eine Funktion zu schreiben, welche aus einem Record eine E-Mail erzeugt.
Du findest irgendwo SomeWeirdFunction. Diese Funktion führt genau das aus, wonach du gesucht hast. Das Problem: Die macht auch ein bisschen mehr, nämlich Ergebniswerte in den Record zurückschreiben. Das möchtest du aber nicht.

Mit dem o.g. Codeconstrukt erreichst du, dass aus dem Rec eine E-Mail erzeugt wird, der Record selbst aber nicht verändert wird.

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 16:13

Danke Natalie,

das verstehe ich prinzipiell soweit - bis auf folgenden Satz:

Natalie hat geschrieben:Mit dem o.g. Codeconstrukt erreichst du, dass aus dem Rec eine E-Mail erzeugt wird, der Record selbst aber nicht verändert wird.


Wieso wird denn der DuplRec nach dem Funktionsaufruf wieder in den ursprünglichen Rec zurückgeschrieben?
Code:
Rec := DuplRec;


Bedeutet das nicht, dass alle Änderungen die die Funktion an DuplRec vorgenommen hat auch in den ursprünglichen Rec wandern? Dann könnte ich doch auch gleich den ursprünglichen Rec übergeben, oder? :?:

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 16:24

Alex Gilch hat geschrieben:Hallo zusammen,

ähm, bitte brecht jetzt nicht ob der (etwaigen) Lächerlichkeit meiner Frage in Lachkrämpfe aus - aber ich steh grad total auf dem Schlauch: :oops:

Was genau ist der Unterschied zwischen der Kopie einer Record-Variablen mittels der COPY-Funktion und mittels direkter Zuweisung? Nur der Umstand dass COPY eine etwaige Filterung mitkopiert?

Anders ausgedrückt - wo ist hier der Unterschied?
Code:
Newrec.Copy(Rec)
bzw.
Code:
Newrec := Rec


Ich weiß dass ich es schon mal wusste und dass ich es vor allem wissen sollte, aber ich krieg's nicht mehr zusammen und der Reference Guide sowie die Forumssuche hier und bei mibuso haben mich leider nicht weitergebracht. Seufz. :cry:


Ich wüßte das auch gern.

Ferner kenne ich noch TRANSFERFIELDS, aber weiß nimmer, ob es genauso wie COPY funktioniert?

Sonst empfehle ich diese Seite, dort steht auch einiges über beide Befehle (das lese ich irgendwann auch noch nach *g*)

http://www.navision24.de/befehle/index.html

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 16:29

Freestyler hat geschrieben:Ferner kenne ich noch TRANSFERFIELDS, aber weiß nimmer, ob es genauso wie COPY funktioniert?

Ich kenne jedenfalls einen Fall, wo man TRANSFERFIELDS ggü. COPY und ":=" vorziehen muss:
Wenn man nämlich einen Record durch zig Funktionsinstanzen reicht und dieser Record verändert wird, kann am Ende ein "ein anderer Anwender hat ... geändert" herauskommen. TRANSFERFIELDS belässt den Zeitstempel des Datensatzes und verhindert so den Fehler.

Anders als COPY & Co. kann man mit TRANSFERFIELDS das Überschreiben der Primärschlüsselfelder unterdrücken.

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 16:36

Natalie hat geschrieben:TRANSFERFIELDS belässt den Zeitstempel des Datensatzes und verhindert so den Fehler.


Das kann man übrigens wiederum mit dem Parameter InitPrimaryKeyFields manipulieren. [Edit:]Genaueres steht im Reference Guide[/Edit]. Zudem kann man TRANSFERFIELDS auch auf Records mit unterschiedlichem Subtype anwenden, sofern es im Ziel-Record korrespondierende Felder mit gleicher Field No.-Property gibt.

Hat eventuell noch jemand eine Idee zu der Frage in meinem letzten Posting? Wieso schreibt man den kopierten Record wieder in den ursprünglichen zurück? :-?

[Edit:] Hab grad erst gesehen dass Natalie meine Frage inzwischen beantwortet hat. Danke Natalie! :-D [/Edit]

Re: Unterschied zwischen COPY-Funktion und direkter Zuweisun

14. September 2011 17:51

Beispiel aus Codeunit 13:
Code:
OnRun(VAR Rec : Record "Gen. Journal Line")
GenJnlLine.COPY(Rec);
Code;
Rec := GenJnlLine;


Das Konstrukt ist in vielen Codeunits zu finden, da man hier in den Eigenschaften eine Tabelle hinterlegen kann, um direkt einen Record beim Aufruf der Codeunit mitgeben zu können. Problem dabei ist, dass man dann nur Zugriff im OnRun-Trigger auf diesen übergebenen Record hat. Deswegen wird der Record (mit oder ohne Filter, je nach Übertragung [per COPY oder mit direkter Zuweisung]) meistens in eine globale Variable übertragen. Dann wird mit dieser weiter gearbeitet und am Ende das Ergebnis zurück an den ursprünglichen Record gegeben.

Re: [Gelöst] Unterschied zwischen COPY-Funktion und direkter

14. September 2011 17:54

Ok, das klingt einleuchtend. Danke für Deine Hilfe!