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()
oufile.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ão | Mudanças |
---|---|
v17 R6 | Renomeado (New formula -> Formula) |
v17 R3 | Adicionado |
Formula ( formulaExp : Expression ) : 4D. Function
Parâmetro | Tipo | Descrição | |
---|---|---|---|
formulaExp | Expression | -> | Fórmula a ser retornada como objeto |
Resultados | 4D. 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:
- métodos
.call()
ou.apply()
, ou - sintaxe notação objeto (ver formula object).
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ão | Mudanças |
---|---|
v20 R3 | Suporte do parâmetro context |
v17 R6 | Renomeado New formula from string -> Formula from string |
v17 R3 | Adicionado |
Formula from string( formulaString : Text ) : 4D.Function
Formula from string( formulaString : Text ; context : Longint ) : 4D.Function
Parâmetro | Tipo | Descrição | |
---|---|---|---|
formulaString | Text | -> | Fórmula texto a ser retornada como objeto |
context | Number | -> | sk execute in current database (por padrão) ou sk execute in host database |
Resultados | 4D. 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âmetros | Tipo | Descrição |
---|---|---|
sk execute in current database | Longint | (padrão) A fórmula será executada no contexto em que foi criada |
sk execute in host database | Longint | A 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ão | Mudanças |
---|---|
v17 R3 | Adicionado |
.apply() : any
.apply( thisObj : Object { ; formulaParams : Collection } ) : any
Parâmetro | Tipo | Descrição | |
---|---|---|---|
thisObj | Object | -> | Objeto a ser retornado pelo comando This na fórmula |
formulaParams | Collection | -> | Coleção de valores a serem passados como $1...$n quando formula for executado |
Resultados | any | <- | 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ão | Mudanças |
---|---|
v17 R3 | Adicionado |
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
Parâmetro | Tipo | Descrição | |
---|---|---|---|
thisObj | Object | -> | Objeto a ser retornado pelo comando This na fórmula |
params | any | -> | Valores a serem passados como $1...$n quando a fórmula for executada |
Resultados | any | <- | 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ão | Mudanças |
---|---|
v18 R2 | Adicionado |
.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)"