Saltar para o conteúdo principal
Versão: v19

Function

Acerca dos objectos 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:

  • funções nativas, ou seja, funções integradas, built-in, de várias classes 4D tais como collection.sort() ou file.copyTo().
  • funções usuário, ciradas em classes usuário usanod a palavra chave Function.
  • funções fórmula, ou seja funções que podem executar qualquer fórmula 4D.

Objetos Formula

Os comandos Formula e Formula from string permitem criar objetos 4D. Function para executar expressões ou códigos 4D expressos como texto.

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

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

Pode passar parâmetros para suas fórmulas usando o parâmetro sequencial syntax baseado em $1, $2...$n. For example, you can write: Por exemplo, pode escrever: 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)
//Não é necessário escrever Formula(myMethod($1;$2))
$text:=$f.call(Null;"Hello";"World") //retorna "Hello World"
$text:=$f.call() //retorna "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
    executa a fórmula objecto a que é aplicado e devolve o valor resultante
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
    executa a fórmula objecto a que é aplicado e devolve o valor resultante
.source : Text     contém a expressão de origem da fórmula como texto

Formula

Histórico
VersãoMudanças
v17 R6Renomeado (New formula -> Formula)
v17 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

O comando Formula cria um objecto 4D Função com base na expressão formulaExp. formulaExp pode ser tão simples quanto um único valor ou tão complexo quanto um método projeto com parâmetros.

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

Pode passar parametros para a Formula, como visto em exemplo 4.

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.

Se formulaExp usar variáveis locais, seus valores são copiados e armazenados no objeto fórmula retornados quando forem criados. 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.

Os objetos criados por Formula podem ser salvos, por exemplo, em um campo de database ou em um documento blob.

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

Usar 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órico
VersãoMudanças
v17 R6Renomeado New formula from string -> Formula from string
v17 R3Adicionado

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

ParâmetroTipoDescrição
formulaStringText->Fórmula texto a ser retornada como objeto
Resultados4D. Function<-Objeto nativo encapsulando a fórmula

|

Descrição

O comando Formula from string cria um objecto 4D. Function baseado na formulaString. formulaString pode ser tão simples quanto um único valor ou tão complexo quanto um método projeto com parâmetros.

Esse comando é similar a Formula, exceto que maneja uma fórmula baseada em texto. Na maioria dos casos, é recomendado usar o comando Formula. Só se deve usarFormula from string quando a fórmula original for expressa como texto (por exemplo armazenada externamente em um arquivo JSON). Nesse contexto, usar sintaxe com tokens é aconselhado.

Como conteúdos de variáveis locais não podem ser acessados por nome em modo compilado, não podem ser usados em formulaString. Tentar acessar uma variável local com Formula from string vai causar um erro (-10737).

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órico
VersãoMudanças
v17 R3Adicionado

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

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

|

Descrição

A função .apply() executa a fórmula objecto a que é aplicado e devolve o valor resultante. O objeto fórmula pode ser criado usando os comandos Formula or Formula from string.

No parâmetro thisObj pode passar uma referência ao objeto a ser usada como This dentro da fórmula.

Também pode passar uma coleção a ser usada como parâmetros $1...$n na fórmula usando o parâmetro opcional formulaParams.

Note que .apply() é similar a .call() exceto que parâmetros são passados como coleção. 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órico
VersãoMudanças
v17 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

A função .call() executa a fórmula objecto a que é aplicado e devolve o valor resultante. O objeto fórmula pode ser criado usando os comandos Formula or Formula from string.

No parâmetro thisObj pode passar uma referência ao objeto a ser usada como This dentro da fórmula.

Pode passar valores a serem usados como parâmetros $1...$n na fórmula usando os parâmetros opcionais params.

Note que .call() é similar a .apply() exceto que 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órico
VersãoMudanças
v18 R2Adicionado

.source : Text

Descrição

A propriedade .source contém a expressão de origem da fórmula como texto.

Essa propriedade é apenas 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)"