Aller au contenu principal
Version : 20

Function

Un objet 4D.Function contient un morceau de code qui peut être exécuté à partir d'un objet, soit en utilisant l'opérateur (), soit en utilisant les fonctions apply() et call(). 4D propose trois types d'objets Function :

  • les fonctions natives, c'est-à-dire les fonctions intégrées des diverses classes 4D telles que collection.sort() ou file.copyTo().
  • les fonctions utilisateur, créées dans les classes utilisateur à l'aide du mot-clé Function.
  • les fonctions de formule, c'est-à-dire les fonctions qui peuvent exécuter n'importe quelle formule 4D.

Objets Formula​

The Formula and Formula from string commands allow you to create 4D.Function objects to execute any 4D expression or code expressed as text.

Les objets Formula peuvent être encapsulés dans des propriétés d'objet :

var $f : 4D.Function
$f:=New object
$f.message:=Formula(ALERT("Hello world"))

Cette propriété est une "fonction objet", c'est-à-dire une fonction qui est liée à son objet parent. Cette propriété est une "fonction objet", c'est-à-dire une fonction qui est liée à son objet parent.

$f.message() //affiche"Hello world"

La syntaxe avec des crochets est également prise en charge :

$f["message"]() //affiche "Hello world"

A noter que, même si elle n'a pas de paramètres (voir ci-dessous), une fonction objet à exécuter doit être appelée avec des parenthèses (). Appeler uniquement la propriété retournera une nouvelle référence à la formule (elle ne sera pas exécutée) :

$o:=$f.message //retourne l'objet formule en $o

Vous pouvez également exécuter une fonction en utilisant les fonctions apply() et call() :

$f.message.apply() //affiche "Hello world"

Passer des paramètres​

Vous pouvez passer des paramètres à vos formules en utilisant la syntaxe séquentielle des paramètres basée sur $1, $2...$n. Par exemple, vous pouvez écrire :

var $f : Object
$f:=New object
$f.message:=Formula(ALERT("Hello "+$1))
$f.message("John") //affiche "Hello John"

Ou en utilisant la fonction .call() :

var $f : Object
$f:=Formula($1+" "+$2)
$text:=$f.call(Null;"Hello";"World") //retourne "Hello World"
$text:=$f.call(Null;"Welcome to";String(Year of(Current date))) //retourne "Welcome to 2019" (par exemple)

Paramètres d'une seule méthode​

Pour plus de commodité, lorsque la formule est constituée d'une seule méthode projet, les paramètres peuvent être omis dans l'initialisation de l'objet formule. Ils peuvent simplement être passés lorsque la formule est appelée. Par exemple :

var $f : 4D.Function

$f:=Formula(myMethod)
//Ecrire Formula(myMethod($1;$2)) n'est pas nécessaire
$text:=$f.call(Null;"Hello";"World") //retourne "Hello World"
$text:=$f.call() //retourne "How are you?"

//myMethod
#DECLARE ($param1 : Text; $param2 : Text)->$return : Text
If(Count parameters=2)
$return:=$param1+" "+$param2
Else
$return:="How are you?"
End if

Les paramètres sont reçus dans la méthode, dans l'ordre où ils sont spécifiés dans l'appel.

Sommaire​

.apply() : any
.apply( thisObj : Object { ; formulaParams : Collection } ) : any
    exécute l'objet formula auquel elle est appliquée et retourne la valeur résultante
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
    exécute l'objet formula auquel elle est appliquée et retourne la valeur résultante
.source : Text     contient l'expression source de formula sous forme de texte

Formula​

Historique
ReleaseModifications
17 R6Renommée (New formula -> Formula)
17 R3Ajout

Formula ( formulaExp : Expression ) : 4D.Function

ParamètresTypeDescription
formulaExpExpression->Formule à retourner comme objet
Résultat4D.Function<-Fonction native encapsulant la formule

Description​

La commande Formula crée un objet 4D Function basé sur l'expression formulaExp. formulaExp peut être simple comme une valeur unique ou complexe comme une méthode projet avec des paramètres.

Le fait d'avoir une formule en tant qu'objet permet de la passer en tant que paramètre (champ calculé) à des commandes ou à des méthodes ou de l'exécuter à partir de divers composants sans avoir à les déclarer comme "partagés par les composants et la base de données hôte". Lorsqu'il est appelé, l'objet formula est évalué dans le contexte de la base de données ou du composant qui l'a créé.

La formule retournée peut être appelée avec :

var $f : 4D.Function
$f:=Formula(1+2)
$o:=New object("myFormula";$f)

//trois façons différentes d'appeler la formule
$f.call($o) //retourne 3
$f.apply($o) //retourne 3
$o.myFormula() //retourne 3

Vous pouvez passer des paramètres à Formula, comme le montre l'exemple 4 ci-dessous.

Vous pouvez indiquer l'objet sur lequel la formule est exécutée, comme le montre l'exemple 5. Les propriétés de l'objet sont alors accessibles via la commande This.

Si formuleExp utilise des variables locales, leurs valeurs sont copiées et stockées dans l'objet formule retourné lors de sa création. Lors de son exécution, la formule utilise ces valeurs copiées plutôt que la valeur courante des variables locales. A noter que l'utilisation de tableaux comme variables locales n'est pas prise en charge.

L'objet créé par Formula peut être enregistré, par exemple, dans un champ de base de données ou dans un document blob.

Exemple 1​

Une formule simple :

var $f : 4D.Function
$f:=Formula(1+2)

var $o : Object
$o:=New object("f";$f)

$result:=$o.f() // retourne 3

Exemple 2​

Une formule utilisant des variables locales :



$value:=10
$o:=New object("f";Formula($value))
$value:=20

$result:=$o.f() // returns 10

Exemple 3​

Une formule simple utilisant des paramètres :

$o:=New object("f";Formula($1+$2))
$result:=$o.f(10;20) //retourne 30

Exemple 4​

Une formule simple utilisant des paramètres :

$o:=New object("f";Formula(myMethod))
$result:=$o.f("param1";"param2") // équivalent à $result:=myMethod("param1";"param2")

Exemple 5​

Avec l'utilisation de This :

$o:=New object("fullName";Formula(This.firstName+" "+This.lastName))
$o.firstName:="John"
$o.lastName:="Smith"
$result:=$o.fullName() //retourne "John Smith"

Exemple 6​

Appeler une formule à l'aide de la notation objet :

var $feta; $robot : Object
var $calc : 4D.Function
$robot:=New object("name";"Robot";"price";543;"quantity";2)
$feta:=New object("name";"Feta";"price";12.5;"quantity";5)

$calc:=Formula(This.total:=This.price*This.quantity)

//affecte la formule aux propriétés d'objet
$feta.calc:=$calc
$robot.calc:=$calc

//appel de la formule
$feta.calc() // $feta={name:Feta,price:12.5,quantity:5,total:62.5,calc:"[object Formula]"}
$robot.calc() // $robot={name:Robot,price:543,quantity:2,total:1086,calc:"[object Formula]"}

Formula from string​

Historique
ReleaseModifications
17 R6Renommée : New formula from string -> Formula from string
17 R3Ajout

Formula from string( formulaString : Text ) : 4D.Function

ParamètresTypeDescription
formulaStringText->Formule texte à retourner comme objet
Résultat4D.Function<-Objet natif encapsulant la formule

Description​

The Formula from string command creates a 4D.Function object based upon the formulaString. formulaString peut être simple comme une valeur unique ou complexe comme une méthode projet avec des paramètres.

This command is similar to Formula, except that it handles a text-based formula. In most cases, it is recommended to use the Formula command. Formula from string should only be used when the original formula was expressed as text (e.g., stored externally in a JSON file). Dans ce contexte, l'utilisation de la syntaxe avec des tokens est fortement conseillée.

Le contenu des variables locales n'étant pas accessible par nom en mode compilé, il ne peut pas être utilisé dans la formulaString. Si vous tentez d'accéder à une variable locale avec Formula from string, cela génèrera une erreur (-10737).

Exemple​

Le code suivant permettra de créer un dialogue acceptant une formule dans un format texte :

var $textFormula : Text
var $f : 4D.Function
$textFormula:=Request("Please type a formula")
If(ok=1)
$f:=Formula from string($textFormula)
ALERT("Result = "+String($f.call()))
End if

... et exécute la formule :

.apply()​

Historique
ReleaseModifications
17 R3Ajout

.apply() : any
.apply( thisObj : Object { ; formulaParams : Collection } ) : any

ParamètresTypeDescription
thisObjObject->Objet à retourner par la commande This dans la formule
formulaParamsCollection->Collection des valeurs à passer en tant que $1...$n lorsque formula est exécuté
Résultatany<-Valeur obtenue à partir de l'exécution de la formule

Description​

La fonction .apply() exécute l'objet formula auquel elle est appliquée et retourne la valeur résultante. L'objet formula peut être créé à l'aide des commandes Formula ou Formula from string.

Dans le paramètre thisObj, vous pouvez passer une référence à l'objet à utiliser en tant que This dans la formule.

Vous pouvez également passer une collection à utiliser comme paramètres $1...$n dans la formule à l'aide du paramètre facultatif formulaParams.

Notez que .apply() est similaire à .call() à la différence près que les paramètres sont passés en tant que collection. Cela peut être utile pour passer des résultats calculés.

Exemple 1​

var $f : 4D.Function
$f:=Formula($1+$2+$3)

$c:=New collection(10;20;30)
$result:=$f.apply(Null;$c) // retourne 60

Exemple 2​

var $calc : 4D.Function
var $feta; $robot : Object
$robot:=New object("name";"Robot";"price";543;"quantity";2)
$feta:=New object("name";"Feta";"price";12.5;"quantity";5)

$calc:=Formula(This.total:=This.price*This.quantity)

$calc.apply($feta) // $feta={name:Feta,price:12.5,quantity:5,total:62.5}
$calc.apply($robot) // $robot={name:Robot,price:543,quantity:2,total:1086}

.call()​

Historique
ReleaseModifications
17 R3Ajout

.call() : any
.call( thisObj : Object { ; ...params : any } ) : any

ParamètresTypeDescription
thisObjObject->Objet à retourner par la commande This dans la formule
paramsany->Valeur(s) à passer en tant que $1...$n lorsque formula est exécuté
Résultatany<-Valeur obtenue à partir de l'exécution de la formule

Description​

La fonction .call() exécute l'objet formula auquel elle est appliquée et retourne la valeur résultante. L'objet formula peut être créé à l'aide des commandes Formula ou Formula from string.

Dans le paramètre thisObj, vous pouvez passer une référence à l'objet à utiliser en tant que This dans la formule.

Vous pouvez également passer des valeurs à utiliser comme paramètres $1...$n dans la formule à l'aide du paramètre facultatif params.

Notez que .call() est similaire à .apply() à la différence près que les paramètres sont passés directement.

Exemple 1​

var $f : 4D.Function
$f:=Formula(Uppercase($1))
$result:=$f.call(Null;"hello") // retourne "HELLO"

Exemple 2​

$o:=New object("value";50)
$f:=Formula(This.value*2)
$result:=$f.call($o) // retourne 100

.source​

Historique
ReleaseModifications
18 R2Ajout

.source : Text

Description​

La propriété .source contient l'expression source de formula sous forme de texte.

Cette propriété est en lecture seule.

Exemple​

var $of : 4D.Function
var $tf : Text
$of:=Formula(String(Current time;HH MM AM PM))
$tf:=$of.source //"String(Current time;HH MM AM PM)"