[gelöst]Var in Funktion

24. September 2009 09:04

Guten Morgen zusammen,

Kann mir jemand erläutern was in Funktionsparametern Var bedeutet?
Wenn ich eine neue Funktion eintrage und dort dann die Parameter in den Locals zuweise habe ich die Möglichkeit die erste Zeile "Var" true zu setzen,
habe das mal ausprobiert aber ich konnte keine unterschied Feststellen.
Ob das Feld True oder False war an der vorgehensweise der Funktion hat sich nichts geändert.
Wozu dient dieses Feld?

Vielen Dank im Vorraus.

MFG John
Zuletzt geändert von John Wayne am 24. September 2009 10:43, insgesamt 1-mal geändert.

Re: Var in Funktion

24. September 2009 09:22

Ohne Var ist es ein call by value, mit var ist es ein call by reference.

Re: Var in Funktion

24. September 2009 09:42

w1w1adg.pdf Seite 285 (Version 5) hat geschrieben:4
You must specify the calling method, name, and data type of each parameter. You
can also specify a subtype and a length, but this is optional.

The calling method can be specified as Var, which means that the parameter is
passed by reference rather than by value. The value of a variable can only be
changed by a function when it is passed to the function by reference. When the
parameter is not specified as Var, only a copy of the variable is passed to the
function. If the function changes that value, the change only affects the copy and
not the variable itself


Zu Deutsch, ob der Wert per Referenz oder Wert übergeben wird (also nur eine kopie des Ursprungswertes).
Wenn du nur an die Funktion einen Wert übergeben willst (und keinen zu diesen Parameter zurückerwartest), lass den Haken weg.
Wenn ein Rückgabewert erwartet wird (zur weiteren Verarbeitung), setzte das Häckchen.

Wenn nur ein Rückgabewert (z.B. TRUE/FALSE) erwartet wird, kann der ReturnValue im nächsten Register genutzt werden.

**Edit by Mikka**
@McClane, nun mal nicht so schreibfaul :mrgreen:

Re: Var in Funktion

24. September 2009 09:47

mikka hat geschrieben:@McClane, nun mal nicht so schreibfaul

Als ob ich das hätte erklären können :mrgreen:

Re: Var in Funktion

24. September 2009 10:10

McClane hat geschrieben:
mikka hat geschrieben:@McClane, nun mal nicht so schreibfaul

Als ob ich das hätte erklären können :mrgreen:


Ok, ich erwarte bis morgen Mittag ein Referat, zu Ohne Var ist es ein call by value, mit var ist es ein call by reference. :lol:

BTW: Als ich das erste mal davon gehört habe, dachte ich nur "watt fürn Sch..." (ich meine natürlich "Schönes ding"). Sowas können doch nur C Entwickler (vieleich auch A oder B) der ersten Generationen sich ausgedacht haben, etwas "so" zu bezeichnen.
(Ich glaube spätestens bei diesem Thema und bei Pointer-Arithmetik, sind die Kurse nur noch halb so voll)

Re: Var in Funktion

24. September 2009 10:20

Naja, das sind eigentlich Basics :wink:

Allerdings kommen die Bezeichnungen tatsächlich aus C, wenn ich mich richtig erinnere. Und Pointer fand ich klasse :)

Re: Var in Funktion

24. September 2009 10:26

Bei Record-Variablen ist mit Var schneller, weil dann nicht der komplette Datensatz an die Funktion übergeben werden muss. Man muss dann allerdings prüfen, ob in der Funktion die Werte geändert werden, das ist dann auch ohne MODIFY sofort wirksam. Das gilt noch verschärft, wenn eine temporäre Recordvariable übergeben wird und in der Funktion ein DELETEALL stattfindet. Dann wird der Inhalt der nichttemporären Tabelle gleich mitgelöscht :!:

Re: Var in Funktion

24. September 2009 10:31

Kowa hat geschrieben:Das gilt noch verschärft, wenn eine temporäre Recordvariable übergeben wird und in der Funktion ein DELETEALL stattfindet. Dann wird der Inhalt der nichttemporären Tabelle gleich mitgelöscht

Meinst du: ich übergebe eine temporäre Item an eine Funktion als Referenz, lösche diese komplett und dann ist die Tabelle Item in der DB auch leer?¿ Das stimmt nämlich auf keinen Fall.

Re: Var in Funktion

24. September 2009 10:42

danke für die schnellen Antworten, jetzt weiß was gemeint ist.

kommt mir auch aus .net so bekannt vor (call by val, call by ref)

Re: Var in Funktion

24. September 2009 11:02

John Wayne hat geschrieben:danke für die schnellen Antworten, jetzt weiß was gemeint ist.

kommt mir auch aus .net so bekannt vor (call by val, call by ref)


Jepp, und .NET hat z.T. seine Wurzeln im C++
(Ich denke das es aber in fast allen gänigen Sprachen vorhanden sein dürfte!)

@McClane
Ich würde darauf tippen, das "call by val, call by ref" schon älter ist als "C". (konnte aber nichts dazu finden)

-->Zu DELETEALL, ich glaube Kowa meinte wenn DELETEALLE(TRUE) ausgeführt wird. Werden die Trigger der Tabelle abgefeuert und das kann Konsequenzen haben.
Zum zweiten, ist das nicht auch von der Definition der zweiten Tabelle abhängig.
Tabelle1 = Temp.JA
Tabelle2 = Temp.Nein
Dann währe es auch kritisch!

@Kowa
Schneller? -->Danke für den Tipp, werde ich bei Gelegenheit testen (von der Logik her macht das Sinn)

Re: [gelöst]Var in Funktion

24. September 2009 11:07

mikka hat geschrieben:Zu DELETEALL, ich glaube Kowa meinte wenn DELETEALLE(TRUE) ausgeführt wird. Werden die Trigger der Tabelle abgefeuert und das kann Konsequenzen haben.
Zum zweiten, ist das nicht auch von der Definition der zweiten Tabelle abhängig.

Ein Deleteall(true) auf einer temporären Tabelle ist immer Harakiri, ob sie nun by ref oder value aufgerufen wird.

mikka hat geschrieben:Tabelle1 = Temp.JA
Tabelle2 = Temp.Nein
Dann währe es auch kritisch!

Wieso das denn?

Re: [gelöst]Var in Funktion

24. September 2009 12:06

McClane hat geschrieben:
mikka hat geschrieben:Tabelle1 = Temp.JA
Tabelle2 = Temp.Nein
Dann währe es auch kritisch!

Wieso das denn?


Na weil der temporäre aus Tabelle1 einen nicht Temporären aus Tabelle2 aufruft.
Oder sehe ich das falsch?

Re: [gelöst]Var in Funktion

24. September 2009 12:13

Das ist doch gerade call by reference. Wenn du in den Locals der Funktion einen Parameter mit var angibst, wird der so verwendet, wie er definiert ist.

Anderes Beispiel: eine Funktion mit einem Parameter a: Text30, Var=Yes. Wenn du da einen String mit Länge 100 rein schickst, bleibt das Länge 100.

Re: [gelöst]Var in Funktion

24. September 2009 12:18

McClane hat geschrieben:Das ist doch gerade call by reference. Wenn du in den Locals der Funktion einen Parameter mit var angibst, wird der so verwendet, wie er definiert ist.

Anderes Beispiel: eine Funktion mit einem Parameter a: Text30, Var=Yes. Wenn du da einen String mit Länge 100 rein schickst, bleibt das Länge 100.


Nee, das macht Bumms :lol:
Das wird sich nicht Kompilieren lassen (werde es gleich testen).

Das mit den "call by ref" muss ich auch mal checken.

Re: [gelöst]Var in Funktion

24. September 2009 12:21

mikka hat geschrieben:Nee, das macht Bumms
Das wird sich nicht Kompilieren lassen (werde es gleich testen).

Das mit den "call by ref" muss ich auch mal checken.

Dann hau rein :wink:

Re: [gelöst]Var in Funktion

24. September 2009 12:39

:shock:
Das war Lehrreich.
Ich habe die Möglichkeiten von Var unterschätzt / nicht gekannt.

zu1.:
Der Temporär übergebene Rec (bei mir Artikel) an einen nichtTemporären in einer Funktion löscht den Artikel nicht.
(In der Funktion war ein SETRANGE, mit DELETEALL)

zu2.:
A. Es lässt sich kompilieren
B. Er verarbeitet die gesammte länge obwohl die Var-Variable kürzer war.
In meinen Beispiel war Var = Text10 und über geben habe ich Text30. Es wurden alle 20 Zeichen übergeben und kammen auch zurück.

Ein dankeschön für diesen kleinen Exkurs :-)

Re: [gelöst]Var in Funktion

24. September 2009 12:46

Das kann sehr praktisch sein, wenn man eine Funktion haben möchte, die zB Textvariablen jeder Länge bearbeiten können soll. Allerdings muss man darauf achten, die Funktion auch wirklich mit einer Variablen aufzurufen (eine TextConstant geht nicht), auch wenn diese gar nicht verändert wird.

Re: Var in Funktion

24. September 2009 13:59

McClane hat geschrieben:
Kowa hat geschrieben:Das gilt noch verschärft, wenn eine temporäre Recordvariable übergeben wird und in der Funktion ein DELETEALL stattfindet. Dann wird der Inhalt der nichttemporären Tabelle gleich mitgelöscht

Meinst du: ich übergebe eine temporäre Item an eine Funktion als Referenz, lösche diese komplett und dann ist die Tabelle Item in der DB auch leer?¿ Das stimmt nämlich auf keinen Fall.

War etwas mißverständlich, sorry. Ich wollte nur davor warnen, eine Funktion, die für die Übergabe einer temporären Tabelle geschrieben wurde ( z.B. FindSalesPrice in Sales Price Management), für andere Zwecke zu nutzen oder diese zu kopieren. Wenn man dann ohne Prüfung des Codes innerhalb der Funktion (was ja nach den theoretischen Grundsätzen, die gelehrt werden, normalerweise überflüssig sein sollte) eine normale Tabelle übergibt, sind die Daten weg. Das ist eine der bösesten Fallen in Navision (in die ich vor etlichen Jahren auch mal getappt bin :roll:, damals war es die Artikeltabelle...)

Re: [gelöst]Var in Funktion

24. September 2009 16:51

Kowa hat geschrieben:(in die ich vor etlichen Jahren auch mal getappt bin , damals war es die Artikeltabelle...)

Gratuliere, das war dann ein Volltreffer :mrgreen: