Saltar para o conteúdo principal
Versão: v20 R4 BETA

Function

Um objeto4D. Function contém um pedaço de código que pode ser executado de um objeto, seja usando o operador () ou usando as funções apply() e call(). 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 de formulários

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
v20 R3Suporte do parâmetro context
v17 R6Renomeado New formula from string -> Formula from string
v17 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

O comando Formula from string cria um objeto 4D.Function com base no formulaString e, opcionalmente, um context. formulaString pode ser tão simples quanto um único valor ou tão complexo quanto um método projeto com parâmetros.

Esse comando é como Formula, exceto pelo fato de que ele lida com uma fórmula baseada em texto e permite definir um contexto de execução. É geralmente recomendado usar o comando Formula, exceto se a fórmula original foi expressa como texto (por exemplo, armazenado externamente em um arquivo JSON), ou se você quer criar uma fórmula no banco de dados de host enquanto chama Formula from string de um componente. É altamente recomendável usar a sintaxe com tokens com esse comando.

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

Se a fórmula é criada em um componente, você pode considerar usar o parâmetro context. 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. Neste caso, você pode passar a constante sk execute in host database no parâmetro context para executar o objeto 4D.Function no contexto do banco de dados host. 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ó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)"