ORDA é uma caraterística principal a longo prazo que abre um mundo de novas possibilidades em 4D.
Continuamos a melhorar ORDA para fornecer código poderoso. Então, suas aplicações se tornam fáceis de desenvolver e manter. E especialmente são optimizadas com grande performance para seus usuários finais.
É por isso que temos o prazer de introduzir uma nova caraterística em 4D 20 R10 em relação a eventos em dados na memória.
Em uma jornada típica do usuário, os dados necessários para o usuário são carregados na memória. Depois são submetidos a mudanças de acordo com as ações do usuário e finalmente são salvos quando o usuário clica em um botão Salvar.
Que tal acionar automaticamente a lógica comercial quando alguns dados são alterados na memória? Agora é possível formatar ou preparar os dados o mais cedo possível antes da ação de guardar , para que os dados fiquem num estado pronto a guardar.
Isto é feito graças ao evento ORDA tocado nos dados e as vantagens são consideráveis.
Quer saber mais? Continue a ler!
O ORDA já cobre muitos aspectos detalhados neste blogpost. A camada de abstração ORDA torna-se mais poderosa do que nunca! Ela agora é capaz de reagir a qualquer mudança nos dados em memória.
Lembre-se que, com ORDA, os dados são manipulados através de entidades carregadas na memória por uma ação de leitura (uma consulta, por exemplo).
O 4D 20 R10 introduz o conceito de eventos. O evento de toque é o primeiro de uma série que está por vir e porque não tem equivalente no código 4D clássico, vale a pena usá-lo.
Um evento tocado permite implementar um código centralizado para acionar a lógica de negócios quando valores de atributos são mudados numa entidade carregada na memória.
acionar a lógica de negócios quando um atributo de entidade é alterado
Durante uma viagem do utilizador, pode agora reagir às alterações de dados em memória para acionar alguma lógica empresarial adequada e, eventualmente, mostrar o resultado ao utilizador final.
Ao trabalhar com uma entidade, pode concentrar-se num determinado atributo e acionar algum código quando o seu valor é alterado.
Aqui estão alguns casos de uso em que o benefício será grande:
- colocar dados em maiúsculas ou minúsculas
- propagar algumas actualizações a outros atributos no modelo
exemplo #1
No exemplo abaixo, uma entidade Pessoas é atualizada. O title é truncado para seus primeiros seis caracteres. O lastname + city são maiúsculos.

Anteriormente, para executar um caso de utilização deste tipo, era necessário tratar eventos como “Ao perder o foco” em cada um dos objectos do formulário e executar o código apropriado em muitos locais do código.
Agora, os eventos touched podem ser implementados para alguns atributos graças às palavras-chave touched e event palavras-chave. O código é centralizado na classe Entidade apropriada e executado assim que um valor de atributo é alterado em qualquer lugar do aplicativo.
Neste exemplo, um evento touched foi implementado para alguns atributos na classe PeopleEntity:
Class extends Entity
Function event touched title($event : Object)
This.title:=Substring(This.title; 1; 6)
Function event touched lastname($event : Object)
This.lastname:=Uppercase(This.lastname)
Function event touched city($event : Object)
This.city:=Uppercase(This.city)
exemplo #2
Neste outro exemplo, o evento touched é utilizado para evitar o tratamento de um atributo calculado, o que poderia conduzir a um mau desempenho. Dada uma classe de dados Booking numa aplicação de aluguer de automóveis, é necessário um atributo para saber se as datas de partida e de chegada são as mesmas.
A sua implementação deve ser:
exposed function get sameDay(): Boolean
return (This.departureDate = This. arrivalDate)
Mas a consulta deste atributo não pode utilizar índices, pelo que não é muito optimizada.
Por isso, pode ser criado um atributo sameDay na classe de dados e pode ser implementado um evento touched, tal como acontece com os atributos departureDate e arrivalDate. Para que este atributo sameDay esteja sempre atualizado.
Function event touched departureDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
Function event touched arrivalDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
acionar a lógica comercial quando um atributo é alterado
Precisa de reagir a qualquer alteração de dados na memória durante uma viagem do utilizador? Seja qual for o objetivo: depuração ou atualização de dados em tempo real, agora é possível.
Pode acionar um evento de toque ao nível da entidade. Quando qualquer valor de atributo de entidade é alterado, o evento é acionado e fornece informações úteis.
Como implementar isto
Na classe Entidade, adicione a função touched que recebe o evento como parâmetro do objeto.
Por exemplo, aqui está a classe PeopleEntity.
Class extends Entity
Function event touched($event : Object)
caso de utilização #1
Na sua aplicação, detectou que uma entidade People foi actualizada, mas não sabe onde. Implemente o evento tocado e coloque um ponto de interrupção no interior para verificar a cadeia de chamadas.
Aqui está um simples updatePeople método de projeto:
$people:=ds.People.all().first()
updateCivilInfo($people)
updateAddress($people)
E a janela de depuração mostrando a cadeia de chamadas com o método que aciona o evento touched (updateCivilInfo).
Observe que o objeto Event contém o nome do atributo.

caso de utilização #2
É possível colocar um valor de atributo em maiúsculas se o seu tipo for Text, qualquer que seja o atributo.
Para isso, implemente este código:
Class extends Entity
Function event touched($event : Object)
If (Value type(This[$event.attributeName])=Is text)
This[$event.attributeName]:=Uppercase(This[$event.attributeName])
End if
E verifique se funciona:

Como pode compreender, é provável que o evento touched seja acionado com muita frequência. É por isso que o código implementado deve ser de execução rápida e leve para manter um bom desempenho. O último exemplo acima é relevante se a classe de dados contiver apenas alguns atributos.
Se precisa de saber mais sobre como este evento se comporta em C/S ou usando 4D Qodly pro ou quando trabalha com um datastore remoto, leia este blogpost.
Verifique a documentação e brinque com HDI para aprender mais.
