sexta-feira, 5 de agosto de 2011

Start somente no Start


Tem conceitos que soam de forma estranha quando estamos na Web, um deles é que o evento Start não ocorre somente quando a página 'inicia', pois toda vez que ocorre uma comunicação com o servidor, que não seja AJAX, isso fará com que o evento Start seja executado novamente.
 

Desta forma todo o conteúdo programado no evento Start seria executado novamente a cada recarga da interface, incluindo-se acessos às tabelas, cálculos, definição de valores, entre outras.  Você entende isso, tudo seria calculado novamente, cada vez que a pagina retornasse ao servidor, muitas vezes representando algo inútil, dispensioso em termos de processamento, tempo,.... 

Para tentar melhorar um pouco isso poderíamos atentar para outra característica a ser compreendida nas interfaces web que é: se o valor definido na primeira carga da interface (no primeiro evento Start, por exemplo) fosse colocado em uma variável na tela, oculta ou não, então, em uma segunda carga da mesma interface esse valor já estaria disponível antes do evento Refresh, mesmo se Start não fosse re-executado. 

Juntando as duas coisas teríamos uma situação em que na segunda carga da interface, não seria necessário acessar o banco para obter as definições iniciais, visto que essas já estariam disponíveis na interface.

Soa confuso? Simplificando nosso objetivo seria:
  1. Ler o valor de alguma coisa, a partir do banco de dados, na primeira carga da interface no evento Start
  2. Em seguida coloque esse valor em uma variável na interface, tornando-a oculta se necessário
  3. Daí pra frente, ou seja, nas próximas recargas não precisaríamos ler novamente o valor no banco, pois esse já estaria na interface.
Então, o problema é que o Start, querendo ou não é executado. A menos que... O Luis Alexandre (*) te ajude te dando uma dica espetacular.

Controlando o Start com o HttpRequest
Existem dois métodos de chamada da interface Web no servidor, um GET e outro POST. O primeiro é realizado quando a interface é aberta na primeira vez, e o segundo quando pressionamos algum controle que gera um evento no servidor, tipo um botão Confirmar, por exemplo.  Para entender isso, recomendo ler: Interface Web na base do Fórceps (http://profdouglasoliveira.blogspot.com/2011/06/interfaces-web-na-base-do-forceps.html )

Nosso objetivo aqui é controlar a primeira chamada, ou seja, somente carregar o valor de alguma coisa no database, uma única vez, e quando a mesma for do tipo GET.  Para isso programariamos:

Event Start
     // carrega o Cliente
     if &HttpRequest.Method = 'GET'
&ClienteId = GetCliente.Udp()
     endif
EndEvent

Esse trecho de código é muito interessante, pois permite definir o que queremos carregar apenas uma vez na interface.  A variável &HttpRequest  do tipo HttpRequest possui uma propriedade Method que se GET nos informa que a interface está sendo carregada pela primeira vez.

Se a variável &ClienteId for colocada na interface, como um controle (Visible=true ou false) então no evento Refresh, teríamos o valor da mesma disponível para realizar qualquer outra ação.

Event Refresh

     // utiliza o ClienteId carregado (no Start ou na Tela)
     AlgumaCoisa.Call(&ClienteId)

EndEvent

Com essa programação teríamos o acesso ao banco somente na primeira vez.





Apesar de tantos conceitos, espero que esse post seja tão útil pra você quanto foi pra mim, rs... Veja só como foi importante conversar com o Luis Alexandre, né.

_____
(*) Luis Alexandre de Oliveira, é desenvolvedor do projeto SIGA no Centro Paula Souza.