sexta-feira, 20 de setembro de 2013

Query

Genexus possui recursos surpreendentes que de fato facilitam muito a vida dos desenvolvedores. Talvez você já conheça, mas para aqueles que ainda não tiveram o prazer, vamos falar um pouquinho do objeto Query.  Se você está vivendo o dilema de ter que programar inúmeros relatórios para seus clientes, talvez esse objeto te ofereça uma ajuda.

Primeiro Um Pouquinho de Conceito

Este objeto permite que você construa pesquisas sobre as tabelas do banco de dados e a publicação dos resultados na forma de tabelas (simples ou Pivot) ou gráficos, sendo esta uma operação que consiste em definir os atributos a serem recuperados, que na definição formal Artech, são chamados de eixos.

Neste ponto é necessária certa precaução para a montagem desses eixos, pois há a necessidade de que o modelo proposto tenha solução, significando que os atributos devem estar em uma relação de extensão.  No exemplo a seguir temos uma definição incorreta desses eixos, pois a relação entre a tabela Cidade e Bairro não possibilita resultados satisfatórios quando envolvem Cliente.

 

O resultado desta operação é inclusive um erro de falta de relacionamento, devido a relação entre a tabela Cidade e Bairro (não ser de extensão)

SQL statement generation Failed
error: No relationship found among attributes.

O correto seria envolver o relacionamento direto entre Cliente e Bairro, porém isso levaria a necessidade de rever a tabela Cliente para a inclusão do BairroId.

 
 
Portanto, para utilizar o objeto Query é importante conhecer não apenas as tabelas no Banco de Dados, mas também o conceito de tabelas estendidas. Se a estrutura do banco permitir gerar relacionamentos estendidos, então Query é possivelmente um bom substituto dos tradicionais relatórios.
 

Finalmente o Objeto

Fica a pergunta então: Como construir e utilizar o objeto Query? a resposta agora ficou facil, bastando incluir os atributos em Attributes.  Cada atributo possui propriedades que podem ser ajustadas pressionando-se a tecla F4.
 
 
Nestas propriedades podemos definir se estaremos aplicando ao eixo uma função de agregação Count ou Sum, ou ainda títulos, e totalizações nas tabelas Pivot.
 

Mostrando em um WebPanel

Uma vez construído o objeto Query podemos incluí-lo em nosso projeto através de um WebPanel e o usercontrol QueryViewer, que deve ser adicionado na interface, e em seguida apontando a propriedade Object deste controle para nosso objeto Query recém criado.
 
Existem certas propriedades que provavelmente você estará ajustando, como Autoresize=true, Paging,  e principalmente os tipos de saída, entre outros.
 
(formato Table)
 
(formato Pivot Table)
 
Com isso nossos usuários poderão não apenas visualizar os dados armazenados mas também exportá-los no formato PDF, XML, entre outros.
 

Conjunto de QuerieViewers

A novidade da versão Evolution 2 foi a possibilidade de eventos de filtragem em um QueryViewer influenciar os dados apresentados em outro QueryViewer que se encontra no mesmo WebPanel, possibilitando a construção de Dashboards (BI).
 
Para isso definimos a propriedade Auto Refresh Group com um nome comum entre todos os QuerieViewers da interface, como por exemplo GRUPO.
 
 
É possível que ambos os QuerieViewers apontem para o mesmo objeto Query, neste caso não é necessário fazer mais nada para conectá-los. Ou ainda conectar objetos Query distintos, nesse caso precisamos utilizar uma variável que seja comum entre os dois grupos.
 
 
Caso da Mesma Querie
 
No primeiro caso, poderíamos definer dois QuerieViewers no mesmo Grupo, sendo que um poderia ser apresentado no formato PivotTable e o segundo como Chart
 
 
 
Ao se aplicar um filtro no primeiro QueryViewer, como por exemplo selecionar uma cidade, ambos os QuerieViewers serão filtrados, como apresentado na figura a seguir.
 
 
Caso das Queries Distintas
Para o segundo caso, com Queries distintas, teríamos que passar parâmetros para a segunda Query, e claro, ambas devem ter algo em comum. Na imagem a seguir temos a Query2 que alimenta o primeiro QueryViewer e a Query1 que alimenta o segundo e que apresenta um gráfico de barras.
 
 
O parâmetro passado para Query1 (CidadeNome), é recebido em uma variável utilizada na expressão de filtro: CidadeNome in [&CidadeNome], ou seja, a variável &CidadeNome deve ser definida como uma coleção.
 
Ao realizer um filtro sobre a tabela a esquerda, o gráfico sera também filtrado .
 
 

Conclusão

Acredito que esse objeto representa um dos bons recursos implementados no EV1 e EV2, pois com mínimo esforço se atinge excelentes resultados.
 
Sempre tive dificuldades para conectar mais de um QuerieViewer, mas acredito que esse esquema, passado para vocês, é simples o bastante para desmistificar esse mistério.
 
Resta-nos aguardar o próximo evento Genexus em Motevideo para conferirmos se teremos melhores surpresas relacionadas com esse tema. Você vai?