Function
Un objeto 4D.Function contiene un trozo de código que puede ser ejecutado desde un objeto, ya sea utilizando el operador (), o utilizando las funciones apply() y call(). 4D propone tres tipos de objetos Function:
- funciones nativas, es decir, funciones integradas de varias clases 4D tales como
collection.sort()ofile.copyTo(). - funciones usuario, creadas en clases usuario utilizando la palabra clave Function.
- funciones de fórmula, es decir, funciones que pueden ejecutar cualquier fórmula 4D.
Objetos fórmula
Los comandos Formula y Formula from string le permiten crear objetos4D.Function para ejecutar cualquier expresión 4D o código expresado como texto.
Los objetos Formula pueden encapsularse en las propiedades de objeto:
var $f : 4D.Function
$f:=New object
$f.message:=Formula(ALERT("Hello world"))
Esta propiedad es una "función objeto", es decir una función que está vinculada a su objeto padre. Esta propiedad es una "función objeto", es decir una función que está vinculada a su objeto padre.
$f.message() //muestra "Hello world"
También se admite la sintaxis con paréntesis:
$f["message"]() //muestra "Hello world"
Tenga en cuenta que, aunque no tenga parámetros (ver arriba), una función objeto a ejecutar debe ser llamada con paréntesis ( ). Llamar sólo a la propiedad del objeto devolverá una nueva referencia a la fórmula (y no la ejecutará):
$o:=$f.message //devuelve el objeto fórmula en $o
También puede ejecutar una función utilizando las funciones apply() y call():
$f.message.apply() //muestra "Hello world"
Paso de parámetros
Puede pasar parámetros a sus fórmulas utilizando una sintaxis secuencial de parámetros basada en $1, $2...$n. Por ejemplo, puede escribir:
var $f : Object
$f:=New object
$f.message:=Formula(ALERT("Hello "+$1))
$f.message("John") //muestra "Hello John"
O utilizando la función .call():
var $f : Object
$f:=Formula($1+" "+$2)
$text:=$f.call(Null;"Hello";"World") //devuelve "Hello World"
$text:=$f.call(Null;"Welcome to";String(Year of(Current date))) //devuelve "Welcome to 2019" (por ejemplo)
Parámetros de un solo método
Para mayor comodidad, cuando la fórmula se compone de un único método proyecto, se pueden omitir los parámetros en la inicialización del objeto fórmula. Simplemente se pueden pasar la fórmula se llama. Por ejemplo:
var $f : 4D.Function
$f:=Formula(myMethod)
//Escribir Formula(myMethod($1;$2)) no es necesario
$text:=$f.call(Null;"Hello";"World") //devuelve "Hello World"
$text:=$f.call() //devuelve "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
Los parámetros se reciben en el método, en el orden en que se especifican en la llamada.
Resumen
| .apply() : any .apply( thisObj : Object { ; formulaParams : Collection } ) : any ejecuta el objeto formula al que se aplica y devuelve el valor resultante |
| .call() : any .call( thisObj : Object { ; ...params : any } ) : any ejecuta el objeto formula al que se aplica y devuelve el valor resultante |
.source : Text contiene la expresión fuente de formula como texto |
Formula
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 R6 | Renombrado (New formula -> Formula) |
| 17 R3 | Añadidos |
Formula ( formulaExp : Expression ) : 4D.Function
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| formulaExp | Expression | -> | Fórmula a devolver como objeto |
| Resultado | 4D.Function | <- | Función nativa que encapsula la fórmula |
Descripción
El comando Formula crea un objeto 4D Function basado en la expresión formulaExp. formulaExp puede ser tan simple como un valor único o complejo, como un método proyecto con parámetros.
Tener una fórmula como objeto permite pasarla como parámetro (atributo calculado) a los comandos o a los métodos o ejecutarla desde varios componentes sin necesidad de declararla como "compartida por los componentes y la base de datos local". Cuando se llama, el objeto fórmula se evalúa en el contexto de la base de datos o del componente que lo creó.
La fórmula devuelta puede ser llamada con:
- los métodos
.call()o.apply(), o - object notation syntax (see formula objects).
var $f : 4D.Function
$f:=Formula(1+2)
$o:=New object("myFormula";$f)
//tres formas diferentes de llamar a la fórmula
$f.call($o) //devuelve 3
$f.apply($o) //devuelve 3
$o.myFormula() //devuelve 3
Puede pasar parámetros a Formula, como se muestra a continuación en el ejemplo 4.
Se puede especificar el objeto sobre el que se ejecuta la fórmula, como se ve en ejemplo 5. Se puede acceder a las propiedades del objeto mediante el comando This.
Si formulaExp utiliza variables locales, sus valores se copian y almacenan en el objeto fórmula devuelto durante su creación. Cuando se ejecuta, la fórmula utiliza estos valores copiados en lugar del valor actual de las variables locales. Tenga en cuenta que no se soporta el uso de arrays como variables locales.
El objeto creado por Formula puede guardarse, por ejemplo, en un campo de base de datos o en un documento blob.
Ejemplo 1
Una fórmula simple:
var $f : 4D.Function
$f:=Formula(1+2)
var $o : Object
$o:=New object("f";$f)
$result:=$o.f() // devuelve 3
Ejemplo 2
Una fórmula utilizando variables locales:
$value:=10
$o:=New object("f";Formula($value))
$value:=20
$result:=$o.f() // devuelve 10
Ejemplo 3
Una fórmula sencilla que utiliza parámetros:
$o:=New object("f";Formula($1+$2))
$result:=$o.f(10;20) //devuelve 30
Ejemplo 4
Una fórmula utilizando un método proyecto con parámetros:
$o:=New object("f";Formula(myMethod))
$result:=$o.f("param1";"param2") // equivalente a $result:=myMethod("param1";"param2")
Ejemplo 5
Utilizando This:
$o:=New object("fullName";Formula(This.firstName+" "+This.lastName))
$o.firstName:="John"
$o.lastName:="Smith"
$result:=$o.fullName() //devuelve "John Smith"
Ejemplo 6
Llamar a una fórmula utilizando la notación de objetos:
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)
//define la fórmula de las propiedades del objeto
$feta.calc:=$calc
$robot.calc:=$calc
//llama la fórmula
$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
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 R6 | Renombrado: New formula from string -> Formula from string |
| 17 R3 | Añadidos |
Formula from string( formulaString : Text ) : 4D.Function
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| formulaString | Text | -> | Fórmula texto a devolver como objeto |
| Resultado | 4D.Function | <- | Objeto nativo que encapsula la fórmula |
Descripción
The Formula from string command creates a 4D.Function object based upon the formulaString. formulaString puede ser tan simple como un valor único o complejo, como un método proyecto con parámetros.
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). En este contexto, el uso de la sintaxis con tokens es muy aconsejable.
Dado que no se puede acceder al contenido de las variables locales por su nombre en el modo compilado, no se pueden utilizar en formulaString. Un intento de acceder a una variable local con
Formula from stringgenerará un error (-10737).
Ejemplo
El siguiente código creará un diálogo que acepta una fórmula en formato texto:
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
...y ejecuta la fórmula:
.apply()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 R3 | Añadidos |
.apply() : any
.apply( thisObj : Object { ; formulaParams : Collection } ) : any
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| thisObj | Object | -> | Objeto a devolver por el comando This en la fórmula |
| formulaParams | Collection | -> | Colección de valores que se pasan como $1...$n cuando se ejecuta formula |
| Resultado | any | <- | Valor obtenido de la ejecución de la fórmula |
Descripción
La función .apply() ejecuta el objeto formula al que se aplica y devuelve el valor resultante. El objeto formula puede ser creado utilizando los comandos Formula o Formula from string.
En el parámetro thisObj, puede pasar una referencia al objeto que se utilizará como This en la fórmula.
También puede pasar una colección que se utilizará como parámetros $1...$n en la fórmula utilizando el parámetro opcional formulaParams.
Tenga en cuenta que .apply() es similar a .call() excepto que los parámetros se pasan como una colección. Esto puede ser útil para pasar los resultados calculados.
Ejemplo 1
var $f : 4D.Function
$f:=Formula($1+$2+$3)
$c:=New collection(10;20;30)
$result:=$f.apply(Null;$c) // devuelve 60
Ejemplo 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()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 R3 | Añadidos |
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| thisObj | Object | -> | Objeto a devolver por el comando This en la fórmula |
| params | any | -> | Valor(es) que se pasa(n) como $1...$n cuando se ejecuta la fórmula |
| Resultado | any | <- | Valor obtenido de la ejecución de la fórmula |
Descripción
La función .call() ejecuta el objeto formula al que se aplica y devuelve el valor resultante. El objeto formula puede ser creado utilizando los comandos Formula o Formula from string.
En el parámetro thisObj, puede pasar una referencia al objeto que se utilizará como This en la fórmula.
También puede pasar valores para ser utilizados como parámetros $1...$n en la fórmula utilizando el parámetro opcional params.
Tenga en cuenta que .call() es similar a .apply() excepto que los parámetros se pasan directamente.
Ejemplo 1
var $f : 4D.Function
$f:=Formula(Uppercase($1))
$result:=$f.call(Null;"hello") // devuelve "HELLO"
Ejemplo 2
$o:=New object("value";50)
$f:=Formula(This.value*2)
$result:=$f.call($o) // devuelve 100
.source
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 18 R2 | Añadidos |
.source : Text
Descripción
La propiedad .source contiene la expresión fuente de formula como texto.
Esta propiedad es de solo lectura.
Ejemplo
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)"