sexta-feira, 2 de março de 2012

Link Target

Links aparentemente são métodos de chamada que poderiam ser completamente ignorados se não fosse por uma característica muito interessante: permitir abrir um objeto em uma nova janela.  Muitos poderiam argumentar que abrir novas janelas no navegador não é coisa muito inteligente, mas certos objetos se dão melhor em janelas novas, como é o caso de planilhas e relatórios PDF.   Portanto, esse post tem por objetivo explorar um pouco a respeito da programação do Link e também compará-lo com os demais recursos que também abrem janelas no Genexus.


Link.Target e Events
Esse é o diferencial, pois é possível definir o target do link, o alvo, que podem ser os tradicionais: blank, self, parent, , e por ai vai.

Mas para que o mesmo funcione, a primeira coisa a ser considerada é que essa propriedade deve ter sido previamente programada e disponibilizada na interface do usuário.   Portanto, o LinkTarget já deve ter sido definido quando o usuário executar o clique sobre o controle cujo link foi programado.  Isso pode soar meio estranho para a maioria, mas existem casos em que se programa (erroneamente, diga-se de passagem) o link e o target no evento do usuário, tipo o pressionamento de um botão, e ai, claro a coisa não funciona corretamente.

Desta forma, os melhores lugares para se programar Link e Link Target são os eventos Start, Refresh e Load.  Evitar eventos de usuário, ou seja, aqueles que você programa livremente nos controles da interface, tipo Event &ClienteId.Click ou Event ‘FacaAlgo’. Muitos confundem esse conceito porque no caso dos métodos UDP, CALL, ..., são exatamente nesses eventos que se programam as chamadas.

Vamos aos Exemplos
Confuso? Então vamos aos exemplos práticos. E nesse contexto programei alguns casos que funcionam e outros que não funcionam para que você entenda a diferença.

Em todos o que temos é um WebPanel qualquer com uma imagem isolada ou em um grid, que ao ser pressionada, objetiva-se abrir um relatório PDF definida em uma tal Procedure1.  Passa-se um parâmetro numérico para essa Procedure1 cujo valor é apresentado.

1) Links dinâmicos
Nesse caso, observe que o Link Target foi definido em uma imagem (Bitmap) que foi incluída em um Grid, para se abrir em uma nova janela, e o evento Load é utilizado para se definir o parâmetro a ser passado para a Procedure1 a ser aberta.  

Event Start
    &imagem.LinkTarget = 'blank'
    &imagem = ActionUpdate.Link()
EndEvent

Event Load
    for &i=1 to 10
         &imagem.Link = Procedure1.Link(&i)
         load
    endfor
EndEvent

Nesse caso quando se clica na imagem abre-se uma nova janela com o PDF definido na Procedure1, mostrando-se o valor definido de &i.

2) Link Estático

Programando as propriedades do Link e Link Target, com valores fixos e pré-determinados. Como foi definido no evento Start, esse processo funcionará porque essas propriedades já estarão programadas na interface do usuário.

Event Start
    image1.LinkTarget     = 'blank'
    image1.Link = Procedure1.Link(12)
EndEvent


Observe que no exemplo acima o que temos é um controle Image isolado na WebPanel1, não mais uma imagem em um Grid.

3) Link Target que não funciona

A programação do Link Target está correta, mas observe que foi programado um chamado Link para a Procedure1 no evento, e não se está utilizando a propriedade do controle Image1, portanto, a chamada será no estilo Link tradicional e uma nova janela não aberta.

Event Start
    image1.LinkTarget     = 'blank'
EndEvent

Event Image1.Click
    Procedure1.Link(12)
EndEvent

O mesmo ocorre no exemplo a seguir.

Event Image1.Click
    image1.LinkTarget     = 'blank'
    Procedure1.Link(12)
EndEvent

E o exemplo a seguir também não funcionaria, e a Procedure1 nem seria chamada, uma vez que a definição da propriedade link somente é realizada quando o usuário clica na imagem.

Event Image1.Click
    image1.LinkTarget     = 'blank'
    image1.Link = Procedure1.Link(12)
EndEvent

Entenda que essas propriedades seriam efetivas somente quando o usuário pressiona sobre a Image1, o evento ao link seria programado na próxima chamada, mas mesmo assim não funcionaria corretamente.

4) Janelas em outros estilos

Nos exemplos apresentados anteriormente objetivava-se abrir uma nova janela no navegador, mas muitos não apreciam esse estilo, preferem abrir janelas do tipo Popup.  Então para os mais exigentes temos ai dois exemplos simples.

Nesse primeiro o que temos é uma janela estilo Popup modal com a abertura do relatório PDF definido na Procedure1.

Event Image1.Click
    &window.Object = Procedure1.create()
    &window.Height = 500
    &window.Width  = 500
    &window.Open()
EndEvent

E no próximo e último exemplo temos uma chamada Popup tradicional, que também abre uma janela modal, mas ao contrário do exemplo anterior não possibilita o dimensionamento correto de PDF´s.

Event Image1.Click
     Procedure1.Popup()
EndEvent

Finalizando
Simples e fácil, somente um pouco de atenção no momento da programação. Mas cuidado, não substitua todos os seus Call´s e Udp´s por Link´s, pois os primeiros são chamadas internas de processos e o Link chamadas externas com URL, ou seja, a menos que você goste de sair passeando pela Web, é sempre melhor chamar os objetos no mesmo ciclo interno de processamento.