Genexus possui recursos surpreendentes que de fato facilitam muito a vida dos desenvolvedores. Talvez v
ocê já conheça, mas para aqueles que ainda não tiveram o prazer, vamos falar um pouquinho do objeto Query. Se v
ocê 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?