Saltar para o conteúdo principal
Versão: 20 R6

Function

A 4D.Function object contains a piece of code that can be executed from an object, either using the () operator, or using the apply() and call() functions. 4D propõe três tipos de objetos Function:

  • as funções nativas, ou seja, funções incorporadas de várias classes 4D, como collection.sort() ou file.copyTo().
  • as funções usuário, criadas nas [classes usuário] (Concepts/classes.md) usando a palavra-chave Function.
  • funções de fórmula, ou seja, funções que podem executar qualquer fórmula 4D.

Objetos de formulários

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

Objetos formulário podem ser encapsulados em propriedades objeto:

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

Essa propriedade é uma "função objeto" ou seja uma função que é restrita a seu objeto pai. Para executar uma função armazenada em uma propriedade objeto, use o operador () depois do nome propriedade, tal como:

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

Também se admite a sintaxe com parênteses:

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

Note que mesmo se não tiver parênteses (ver abaixo), uma função objeto a ser executada deve ser chamda com () parênteses. Chamar só a propriedade de objeto devolverá uma nova referência à fórmula (e não a executará):

 $o:=$f.message //devolve o objeto fórmula em $o

Você também pode executar uma função usando as funções apply() e call():

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

Utilização de parâmetros

You can pass parameters to your formulas using the sequential parameter syntax based upon $1, $2...$n. Por exemplo, pode escrever:

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

Ou usando a função .call():

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

Parâmetros a um único método

Para mais conveniência, quando a fórmula é feita de um único método de projeto, parâmetros podem ser omitidos na inicialização do objeto fórmula. Pode ser passado quando a fórmula for chamada. Por exemplo:

 var $f : 4D.Function

$f:=Formula(myMethod)
//Writing Formula(myMethod($1;$2)) is not necessary
$text:=$f.call(Null;"Hello";"World") //returns "Hello World"
$text:=$f.call() //returns "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

Parâmetros são recebidos dentro do método, na ordem que são especificados na chamada.

Resumo

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

executes the formula object to which it is applied and returns the resulting value
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any

executes the formula object to which it is applied and returns the resulting value
.source : Text
contains the source expression of the formula as text

Formula

História
ReleaseMudanças
17 R6Renomeado (New formula -> Formula)
17 R3Adicionado

Formula ( formulaExp : Expression ) : 4D.Function

ParâmetroTipoDescrição
formulaExpExpression->Fórmula a ser retornada como objeto
Resultados4D. Function<-Função nativa encapsulando a fórmula

Descrição

The Formula command creates a 4D Function object based upon the formulaExp expression. formulaExp can be as simple as a single value or complex, such as a project method with parameters.

Ter uma fórmula como se fosse um objeto permite que seja passada como um parâmetro (atributo calculado) para comandos ou métodos, ou para ser executado a partir de vários componentes, sem precisar declará-los como "partilhados por componentes e database host". Quando chamado, o objeto fórmula é avaliado sem o contexto do banco de dados ou componente que o criou.

A fórmula retornada pode ser chamada com:

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

//três formas diferentes de chamar a fórmula
$f.call($o) //retorna 3
$f.apply($o) //retorna 3
$o.myFormula() //retorna 3

Você pode passar parâmetros para Formula, como visto abaixo no exemplo 4.

Você pode especificar o objeto no qual a fórmula é executada, como visto em exemplo 5. As propriedades do objeto podem ser acessadas via o comando This.

If formulaExp uses local variables, their values are copied and stored in the returned formula object when it is created. Quando executados, a fórmula usa esses valores copiados ao invés do valor atual da variável local. Note que usar arrays como variáveis locais não são compatíveis.

The object created by Formula can be saved, for example, in a database field or in a blob document.

Exemplo 1

Uma fórmula simples:

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

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

$result:=$o.f() // devoluções 3

Exemplo 2

Uma fórmula usando um método projeto com parâmetros:



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

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

Exemplo 3

Uma fórmula usando variáveis locais:

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

Exemplo

Uma fórmula simples usando parâmetros:

 $o:=New object("f";Formula(myMethod))
$result:=$o.f("param1";"param2") // equivalent to $result:=myMethod("param1";"param2")

Exemplo 2

Usando This:

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

Exemplo 6

Chamar uma fórmula usando notação de objeto:

 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)

//estabelece a fórmula às propriedades objeto
$feta.calc:=$calc
$robot.calc:=$calc

//chame a 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

História
ReleaseMudanças
20 R3Suporte do parâmetro context
17 R6Renamed New formula from string -> Formula from string
17 R3Adicionado

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

ParâmetroTipoDescrição
formulaStringText->Fórmula texto a ser retornada como objeto
contextNumber->sk execute in current database (por padrão) ou sk execute in host database
Resultados4D. Function<-Objeto nativo encapsulando a fórmula

Descrição

The Formula from string command creates a 4D.Function object based upon the formulaString and, optionnally, a context. formulaString can be as simple as a single value or complex, such as a project method with parameters.

This command is similar to Formula, except that it handles a text-based formula and allows to define an execution context. It is usually recommended to use the Formula command, except if the original formula was expressed as text (e.g., stored externally in a JSON file), or if you want to create a formula in a host database while calling Formula from string from a component. É altamente recomendável usar a sintaxe com tokens com esse comando.

Because local variable contents can not be accessed by name in compiled mode, they can not be used in formulaString. An attempt to access a local variable with Formula from string will result in an error (-10737).

If the formula is created in a component, you might consider using the context parameter. Por padrão, dado que as fórmulas são executadas no contexto em que foram criadas, não conseguirá chamar uma variável, uma função ou um método não compartilhado do banco de dados host. In this case, you can pass the sk execute in host database constant in the context parameter to execute the 4D.Function object in the context of the host database. Estão disponíveis as seguintes constantes:

ParâmetrosTipoDescrição
sk execute in current databaseLongint(padrão) A fórmula será executada no contexto em que foi criada
sk execute in host databaseLongintA fórmula será executada no contexto do banco de dados do host

Exemplo

O código abaixo cria um diálogo aceitando uma fórmula em 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

...e executa a fórmula:

.apply()

História
ReleaseMudanças
17 R3Adicionado

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

ParâmetroTipoDescrição
thisObjObject->Objeto a ser retornado pelo comando This na fórmula
formulaParamsCollection->Collection of values to be passed as $1...$n when formula is executed
Resultadosany<-Valores de execução de fórmula

Descrição

The .apply() function executes the formula object to which it is applied and returns the resulting value. The formula object can be created using the Formula or Formula from string commands.

In the thisObj parameter, you can pass a reference to the object to be used as This within the formula.

You can also pass a collection to be used as $1...$n parameters in the formula using the optional formulaParams parameter.

Note that .apply() is similar to .call() except that parameters are passed as a collection. Isso pode ser útil para passar resultados calculados.

Exemplo 1

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

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

Exemplo 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()

História
ReleaseMudanças
17 R3Adicionado

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

ParâmetroTipoDescrição
thisObjObject->Objeto a ser retornado pelo comando This na fórmula
paramsany->Valores a serem passados como $1...$n quando a fórmula for executada
Resultadosany<-Valores de execução de fórmula

Descrição

The .call() function executes the formula object to which it is applied and returns the resulting value. The formula object can be created using the Formula or Formula from string commands.

In the thisObj parameter, you can pass a reference to the object to be used as This within the formula.

Você também pode passar valores para serem usados como parâmetros $1...$n na fórmula usando os parâmetros params opcionais.

Observe que .call() é semelhante a .apply(), exceto pelo fato de que os parâmetros são passados diretamente.

Exemplo 1

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

Exemplo 2

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

.source

História
ReleaseMudanças
18 R2Adicionado

.source : Text

Descrição

The .source property contains the source expression of the formula as text.

Essa propriedade é somente leitura.

Exemplo

 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)"