Seite 1 von 1

XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 10:31
von andreas
Hallo,

ich habe bei mir einen Fehler, bei dem ich nicht auf die Lösung komme.

Wenn ich folgenden Code schreibe, funktioniert alles:

Code: Alles auswählen

::sleName:dataLink := {|x| IIf( x==NIL, ::Data:RecData:Name, ::Data:RecData:Name := x ) }
::sleName:setdata()
Wenn ich es versuche über Macro zu generieren

Code: Alles auswählen

cVar := "Name"
cMacro := "{|x| IIf( x==NIL, ::Data:RecData:" + cVar  + ", ::Data:RecData:" + cVar  + " := x ) }"
::sleName:dataLink := &cMacro 
::sleName:setdata()
bekomme ich einen Fehler in der SetData-Zeile:
oError:args :
-> NIL
oError:canDefault : N
oError:canRetry : J
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Unbekannte Variable
oError:filename :
oError:genCode : 22
oError:operation : SELF
oError:osCode : 0
oError:severity : 2
oError:subCode : 2000
oError:subSystem : BASE
oError:thread : 1
oError:tries : 1
Was kann man hier machen?

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 11:36
von georg
Hallo, Andreas -


wenn das Makro zur Laufzeit erstellt wird, kann es sich nicht auf lokale Variable beziehen, wie self. Dann sind nur PRIVATE und PUBLIC Variablen möglich.

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 13:51
von Tom
Genau. Du müsstest die SELF-Referenz (den Doppelpunkt) durch einen Variablennamen ersetzen, und der müsste dann mindestens PRIVATE sein. In der Variable müsste das SLE stecken.

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 14:27
von andreas
Ich habe jetzt in der Methode, die diese Macro-Zuweisungen macht, eine PRIVATE-Variable für deklariert und der das SELF zugewiesen.
Leider bekomme ich wieder den gleichen Fehler, nur jetzt auf die neue Variable.
Wo soll dann diese Variable in einer Klasse definiert werden, damit es funktioniert?

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 14:36
von georg
Hallo, Andreas -


dann poste doch mal den Code.

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 15:33
von andreas
Den Code muss ich erstmals als Beispiel zusammenstellen.

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 18:12
von AUGE_OHR
und was ist wenn du den Codeblock über eine Function zusammen baust ?

Code: Alles auswählen

cVar := "Name"
cMacro := MakeBlock(Self,cVar)
::sleName:dataLink := &cMacro 

FUNCTION MakeBlock(oSelf,cVar)
LOCAL cMacro := "{|x| IIf( x==NIL, oSelf:Data:RecData:" + cVar  + ", oSelf:Data:RecData:" + cVar  + " := x ) }"
RETURN cMacro

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 19:08
von georg
Hallo, Jimmy -


irgendwie habe ich das Gefühl, dass das auch nicht klappen wird.

oSelf wird in MakeBlock() nicht verwendet, und daher wird auch die Codeblock-Umwandlung nicht funktionieren.

Ich verstehe im Moment nicht, was Andreas eigentlich will, daher meine Frage. Ich vermute, dass er Eingabefelder hat, die mit iVars in :recData korrespondieren. Dafür will er einen Zuweisungscodeblock haben, der immer auf das jeweilige Feld abgestimmt ist.

Also in der Art:

Code: Alles auswählen

cName := "Feld1"
cBlock := {|x| IIf( x==NIL, ::Data:RecData:Feld1, ::Data:RecData:Feld1 := x ) }
...
cName := "Feld2"
cBlock := {|x| IIf( x==NIL, ::Data:RecData:Feld2, ::Data:RecData:Feld2 := x ) }
...
Und das Ganze wahrscheinlich in einer Schleife?

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 19:24
von AUGE_OHR
georg hat geschrieben: Do, 14. Jun 2018 19:08 oSelf wird in MakeBlock() nicht verwendet, und daher wird auch die Codeblock-Umwandlung nicht funktionieren.
:?:
ich übergebe "self" als Parameter "oSelf" da ich "::" nicht übergeben kann.
nun kann aber das "::" genau das Problem sein da es zur Laufzeit nichts davon weiss.

Re: XbpSle - Datalink

Verfasst: Do, 14. Jun 2018 19:42
von georg
Hallo, Jimmy -


Deine Ansatz löst nicht das Problem.

Code: Alles auswählen

cVar := "Name"
cMacro := MakeBlock(Self,cVar)
::sleName:dataLink := &cMacro 

FUNCTION MakeBlock(oSelf,cVar)
LOCAL cMacro := "{|x| IIf( x==NIL, oSelf:Data:RecData:" + cVar  + ", oSelf:Data:RecData:" + cVar  + " := x ) }"
RETURN cMacro
Spielen wir das Ganze mal durch. Unterstellen wir mal, das wir genau das durchspielen. Wir erhalten dann eine Variable cMacro mit folgendem Inhalt:

Code: Alles auswählen

"{|x| IIf( x==NIL, oSelf:Data:RecData:Name, oSelf:Data:RecData:Name := x ) }"
Dieser String wird von MakeBlock() zurückgegeben, und in der aufrufenden Funktion wird es wieder (!) knallen, da z.B. oSelf nicht bekannt ist. Einverstanden?

Re: XbpSle - Datalink

Verfasst: Fr, 15. Jun 2018 1:28
von AUGE_OHR
ok ... nächster Versuch

Code: Alles auswählen

cVar := "Name"
oSelf := self
cMacro := MakeBlock(oSelf,cVar)
::sleName:dataLink := &cMacro

Re: XbpSle - Datalink

Verfasst: Fr, 15. Jun 2018 9:43
von andreas
Hallo Georg,

du hast mit deiner Vermutung recht! Ich möchte eine Automation erreichen, in dem die Namen von SLE als Bezug genommen und automatisch auf die entsprechende Daten gelinkt werden. Das gleiche soll auch mit den Methode passieren.
Ich möchte eine Standardklasse, von der ein Dialog zus. erbt und diese Zuweisungen durchführt.

Re: XbpSle - Datalink

Verfasst: Fr, 15. Jun 2018 9:46
von andreas
Die Möglichkeit über zus. Funktion habe ich schon gestern ausprobiert, was aber leider zum gleichen Ergebnis führt.
Ich werde mal Support anschreiben, sobald ich die Zeit dafür finde, wahrscheinlich am WE.

Re: XbpSle - Datalink

Verfasst: Fr, 15. Jun 2018 9:54
von georg
Hallo, Andreas -


m.E. solltest Du den Codeblock durch den Aufruf einer Funktion ersetzen. Da es sicher aber wohl um eine Schleifen handeln soll, musst Du mit Detached Locals arbeiten:

Code: Alles auswählen

bBlock := MakeBlock(self, cName)
...

FUNCTION MakeBlock(oSelf, cName)
LOCAL bBlock
bBlock := {|x| RufeMeineFunktion(oSelf, cName)}
RETURN (bBlock)
Das sollte so funktionieren.