Ao construir uma aplicação Oracle APEX, uma das regiões mais utilizadas é o Classic Report. Esta região permite-nos configurar um report que retorna os resultados de uma qualquer query SQL.
Estes resultados podem ser apresentados ao utilizador de diferentes maneiras, tendo em conta o resultado pretendido. Um dos formatos mais usados é, naturalmente, o report em formato tabular:
Entre as várias opções de configuração de um Classic Report, encontra-se a possibilidade de alterar o formato das colunas retornadas. Uma dessas possibilidades, é a opção de configurar uma, várias ou todas as colunas para o formato Link. Este link pode redirecionar o utilizador para uma página dentro da mesma aplicação, para uma página noutra aplicação dentro do mesmo workspace ou para um link na web.
Esta configuração é bastante simples e com 4 ou 5 cliques, rapidamente se obtém um report com o mesmo aspeto do anterior, mas com todas as suas colunas definidas como Link:
Este link pode ser independente entre as diferentes colunas, podendo, por exemplo, a coluna “Tipo” reencaminhar o utilizador para uma página na aplicação atual, a coluna “Plataforma” para uma página numa outra aplicação e a coluna “Componente” para uma página na web como www.google.pt.
Problema:
E se apenas um link por coluna não for suficiente e o pretendido for algo mais dinâmico, por exemplo, se a coluna “Tipo” tiver o valor de “Boas práticas”, o destino do link ser diferente do destino do link para o valor “FAQ”?
Esta situação já não é assim tão simples, sendo preciso recorrer a outras alternativas mais trabalhosas, fazendo uso da construção de links declarados.
Opção A – Usar um processo Branch
Passo 1: Nas colunas onde se pretende um link dinâmico, definir o “Target” do LINK como sendo do tipo URL e o destino como sendo uma função javascript, neste caso com o nome de “setItems”. Nesta função, define-se como argumentos da mesma os valores das diferentes colunas da linha selecionada. Para isto, utiliza-se o nome da coluna precedido e seguido do sinal #.
Assim, ao clicar numa linha de uma coluna com esta configuração, é chamada a função javascript ao invés do redireccionamento da página.
Passo 2: Definir a função “setItems”
Esta função é uma simples função Javascript, que utiliza os valores recebidos como argumentos e os define como valor de Sessão dos respetivos Items (variáveis de página com valor default null) através da função do APEX “apex.item(ITEM).setValue(VALOR)”:
Passo 3: Criar uma Dynamic Action (DA) associada ao último Item a ser definido na função “setItems”, neste caso o “P532_TYPE”:
Define-se esta DA para ser despoletada no momento em que este item alterar o seu valor, o que ocorrerá assim que a linha “apex.item(“P532_TYPE”).setValue(type);” seja executada:
Definir a condição True desta DA com uma ação Submit Page:
Esta ação simplesmente submete a nossa página web, ou seja, volta a carregar a página com os Items já com os novos valores atribuídos.
Nota: É importante a DA ser associada ao último item a ser alterado na função setItems, porque como os valores são atribuídos pela mesma ordem que está declarada na função, assim garantimos que a DA só é despoletada depois de todos os valores já terem sido alterados.
Passo 4: Criar um processo do tipo Branch (este tipo de processos redireciona a aplicação para diferentes páginas):
Definir o ponto de processamento como “After Submit”, de forma ao processo ser executado logo após a página ser submetida. Definir o tipo de Behavior como “Function Returning a URL (Redirect)”:
Nesta função, são então definidas todas as possibilidades de destino que pretendemos para o nosso report, mediante os valores dos Items e retornando um URL para uma página APEX (diferentes dos URLs “normais”) com a função “APEX_PAGE.GET_URL”.
Resumindo:
Ao clicar numa coluna linkable do nosso report, chamamos uma função Javascript que vai atribuir os valores das colunas da linha selecionada a itens da página. Ao fazê-lo, alteramos o valor do Item P532_TYPE, o que despoleta uma DA que submete a página e a carrega já com estes mesmos itens com os novos valores armazenados. Ao ocorrer a submissão de página, é despoletada a função Branch onde, mediante os novos valores dos Itens, é definida a página de destino para a qual iremos navegar.
Opção B – Definir uma coluna escondida na query do report com o link
Passo 1: Adicionar ao select da query que alimenta o nosso report, uma coluna que guarda o nosso URL de destino mediante as opções definidas:
Passo 2: Esconder esta coluna do utilizador:
Passo 3: Agora que temos o valor do link desejado guardado na coluna URL, definimos que o conteúdo desta coluna é o URL para o qual queremos navegar ao clicar em cada linha:
Resumindo:
Em cada linha do nosso report, temos uma coluna escondida, cujo valor é um URL dinâmico, definido mediante os valores das outras colunas da mesma linha. Ao selecionarmos uma linha do report, a coluna escolhida invoca o link que estiver guardado na respetiva coluna “URL”.
Conclusão:
O Oracle APEX contém várias opções muito úteis, que nos permitem criar aplicações com funcionalidades poderosas e que são facilmente configuráveis. Mas nem sempre conseguimos reproduzir todos os requisitos das nossas aplicações com estas mesmas opções integradas. Quando assim é, com algum conhecimento de HTML, CSS e Javascritp/Jquery, e algum pensamento out of the box, podemos atingir os nossos objetivos. Estes são apenas dois exemplos de como alcançar uma funcionalidade que não está ainda integrada de raiz com o APEX. Outra opção, não descrita, passa pela construção de uma página adicional, cuja única função é receber os valores do report e redirecionar o utilizador para a página final mediante estes mesmo valores. A opção B é, à primeira vista, mais simples que a solução A. O senão, passa por obrigar uma alteração à query do nosso report, o que pode ter maior impacto ao nível da performance da aplicação, para além de que alguns developers podem achar esta solução menos clean. Nenhuma das soluções apresentadas é perfeita, principalmente devido a todos os casos pretendidos terem de estar especificados hardcoded. Mas, para alguns casos, necessariamente mais simples, estas duas opções podem ser uma boa alternativa para quem precisa de navegar para diferentes páginas, mediante o valor de uma coluna dentro de um Classic Report.