4D WritePro wird durch ak compute expressions nicht aktualisiert

Hallo Mitstreiter,

ich bin auf ein recht kurioses Problem gestoßen, das ich leider nicht zu lösen vermag.
In 4D Write Pro funktioniert ak compute expressions nicht, wenn danach in ein anderes Feld gesprungen wird, also:

GOTO OBJECT(*;“oAngebot_4DW”)
INVOKE ACTION(ak compute expressions;ak main form)
GOTO OBJECT([ANGEBOTE]Lieferzeit_Wochen_Von)

Wenn die letzte Zeile weggelassen wird, funktioniert alles wie gewünscht.

Wie kann ich das Problem beheben? Dummerweise bin ich auf den nachfolgenden Befehl angewiesen…
Ich stelle gerade eine Datenbank auf 4D Write Pro und habe daher v17.2 noch im 32 bit modus unter OSX laufen.

Danke für jede Hilfe

Das liegt am “Execution stack”. Die Befehle werden nicht sofort ausgeführt, sondern auf einen Stack gesetzt und am Ende (wenn kein Code mehr läuft) ausgeführt. Dadurch wird “flackern” verhindert, z. B. weil ein Objekt erst verschoben, dann vergrößert wird.

Das Problem hier ist, das Invoke Action wieder ein Stack, ein Event ist. Somit wird es auf das falsche Objekt (Lieferzeit) ausgeführt.

Sie müssen Call Form verwenden und die Operationen gruppieren. Alternativ könnte man auch On Timer verwenden und somit eine Gruppierung erreichen, je nach Anzahl Aufgaben kann das aber schnell unübersichtlich werden.

Danke Thomas, sowas habe ich mir schon gedacht. Aber ich hatte auch vermutet, da INVOKE ACTION ohne zusätzliche Parameter synchron laufen sollte, und ich sowohl den Zusatz ak current form und ak main form ausprobiert habe, das es vielleicht irgend einen Weg drumherum geben würde.

Ich hatte auch schon ST COMPUTE EXPRESSIONS([ANGEBOTE]oAngebot_4DW) versucht, das scheint unter 32 bit aber gar nicht zu gehen.

Gibt es in der 32 bit Variante einen anderen Weg, eine 4D Write Pro Area direkt aktualisieren zu lassen? Ansonsten bin ich ziemlich aufgeschmissen…

Vielleicht klappt das ja auch so:
<code 4D>
GOTO OBJECT(;“oAngebot_4DW”)
ST COMPUTE EXPRESSIONS(
;“oAngebot_4DW”;ST Start text;ST End text)
GOTO OBJECT([ANGEBOTE]Lieferzeit_Wochen_Von)

</code 4D>

: Marc MENNIGMANN

Ich hatte auch schon ST COMPUTE EXPRESSIONS([ANGEBOTE]oAngebot_4DW)
versucht, das scheint unter 32 bit aber gar nicht zu gehen.

Ja das klappte bei meinen früheren Tests auch nicht, laut Doku sollte es aber. Da scheinen die letzten beiden Parameter zwingend zu sein. Also so wie in meinem Beispiel.

Noch lustiger wird es beim Einfrieren von Ausdrücken.

Da muss man dann schon so was bauen:

<code 4D>
// WP_FreezeExpressions
// $1=WP Objekt ist optional, sonst wird das WP Standardobjekt WParea verwendet.

// Force freeze all expressions and references on all pages, header and footers

C_OBJECT($obj;$obj_section;$1;$wp_freezeobj;WParea)
C_COLLECTION($collection)
C_LONGINT($i;$n;$index)
If (Count parameters=1)
$wp_freezeobj:=$1
Else
$wp_freezeobj:=WParea
End if

ST FREEZE EXPRESSIONS($wp_freezeobj;ST Start text;ST End text)

$collection:=WP Get sections($wp_freezeobj)
$i:=0
$n:=$collection.length

For ($i;0;$n-1)
$obj:=$collection[$i]
$index:=$obj.sectionIndex

$obj_section:=WP Get header($wp_freezeobj;$index)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

$obj_section:=WP Get footer($wp_freezeobj;$index)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

$obj_section:=WP Get header($wp_freezeobj;$index;wk first page)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

$obj_section:=WP Get header($wp_freezeobj;$index;wk left page)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

$obj_section:=WP Get header($wp_freezeobj;$index;wk right page)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

$obj_section:=WP Get footer($wp_freezeobj;$index;wk first page)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

$obj_section:=WP Get footer($wp_freezeobj;$index;wk left page)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

$obj_section:=WP Get footer($wp_freezeobj;$index;wk right page)
If ($obj_section#Null)
	ST FREEZE EXPRESSIONS($obj_section;ST Start text;ST End text)
End if 

End for
</code 4D>

Es läuft nicht synchron sondern emuliert eine Benutzer-Aktion. Es ist das gleiche wie einem Menü oder Button zugewiesene Aktion. Und Benutzer-Aktionen (egal welcher Art) werden erst ausgeführt wenn der gesamte Code abgelaufen ist. Deshalb muss man (in diesem bestimmten Beispiel) das zweite Goto Object verzögern.

Danke Armin, nach ersten Tests hat genau das die Lösung gebracht.

ST COMPUTE EXPRESSIONS(*;“oAngebot_4DW”;ST Start text;ST End text)
Scheint sofort zu greifen und aktualisiert das gesamte Dokument. Ohne die start-end parameter führt es nicht zum gewünschten Ergebnis.

Vielen Dank für die zielführende Hilfe. Tolles Formum! :smiley: