AutoReport: mudanças entre as edições

De BIS Wiki
Ir para navegação Ir para pesquisar
Linha 81: Linha 81:
     BISOrderBy orderBy = BISOrderBy.createInstance(v_.date());
     BISOrderBy orderBy = BISOrderBy.createInstance(v_.date());
     def.setOrderBy(orderBy);
     def.setOrderBy(orderBy);
</syntaxhighlight>}}
=== GROUP BY ===
O GroupBy tem exatamente a mesma funcionalidade do GROUP BY no SQL.
Para configurar o GroupBy no AutoReportDefinition utilizaremos a mesma sintaxe utilizada na parte do SELECT. O GroupBy aceita as mesmas funções e colunas definidas pela estrutura do BISField.
{{java|Definindo colunas de GroupBy para a consulta|<syntaxhighlight lang="java">
    def.addGroupBy(BISField.field(v_.id()));
</syntaxhighlight>}}
</syntaxhighlight>}}

Edição das 21h06min de 23 de dezembro de 2019

O AutoReport é um serviço do BIS com a finalidade de criar relatórios e gráficos de forma automatizada utilizando a estrutura de dados do BIS.

Funcionamento e Objetivos

A finalidade desta ferramenta é permitir que o desenvolver simplesmente passe uma consulta, similar à um SQL mas utilizando a estrutura do BIS, para que a própria ferramente recupere os dados. E depois disso, a partir de algumas informações de estrutura a própria ferramente estrutura os dados retornados do banco de forma coerente e gera objetos que possam ser traduzidos em diversas interfaces para o usuário. Onde interface neste caso pode ser um Grid/Tabela/Tree na UI, um gráfico na UI com opções de iteração, ou mesmo as informações impressas em PDF, exportar para arquivos como Excel, CSV, etc..

Como utilizar o AutoReport

Para criar um relatório, o primeiro passo é criar um AutoReportDefinition. Esta classe de nome sugestivo, tem as definições do relatório. Nela montamos o que seria similar ao SELECT para ser utilizado no banco de dados e recuperar as informações para serem exibidas.

AutoReportDefinition

SELECT

Imagine que desejamos criar um relatório com os dados dos lançamentos financeiros das conta do BIS. Para isso precisamos definir com o AutoReport buscará os dados:

Exemplo de criação do Definition:

Criando o AutoReportDefinition
final AccountBankStatementVO_ v_ = AccountBankStatementVO_.VO;

AutoReportDefinition<AccountBankStatementVO> def = new AutoReportDefinition<AccountBankStatementVO>(AccountBankStatementVO.class);

Note que o definition é instanciado com a classe que servirá de referência (tabela principal do Select) para que o BISDAO faça os joins e buscas no banco de dados.


Uma vez criado o definition, precisamos agora informar que colunas desejamos que sejam recuperadas. Similar ao SELECT do banco de dados, aqui selecionamos os campos dos VOs que queremos para que esses dados estejam disponíveis no relatório.

Note que é possível utilizar a estrutura do BISField para definir funções e outras operações para serem executadas diretamente no banco de dados.

Seleção das Colunas
AutoReportColumn columnID = def.addSelect(BISField.field("id"));
AutoReportColumn columnDate = def.addSelect(BISField.field(v_.date()));
AutoReportColumn columnDisplayline = def.addSelect(BISField.field(v_.displayLine()));
AutoReportColumn columnOperation = def.addSelect(BISField.field(v_.operation()));

AutoReportColumn columnValue = def.addSelect(BISField.field(v_.value()));
AutoReportColumn columnDisplayline = def.addSelect(BISField.field(v_.accountStatementList().displayLine()));
AutoReportColumn columnCatMapID = def.addSelect(BISField.field(v_.accountStatementList().billPaymentVO().categoryMapList().id()));
AutoReportColumn columnCat = def.addSelect(
    BISField.coalesce(
        BISField.field(v_.accountStatementList().categoryMapList().categoryVO().name()),
        BISField.field(v_.accountStatementList().billPaymentVO().categoryMapList().categoryVO().name())));
AutoReportColumn columnCatValue = def.addSelect(
    BISField.coalesce(
        BISField.field(v_.accountStatementList().categoryMapList().value()), 
        BISField.field(v_.accountStatementList().billPaymentVO().categoryMapList().value())));


Utilizando a estrutura dos MetaObject para selecionar o campo SEMPRE a partir do objeto utilizado como raiz, o AutoReport utilizará o BISDAO para unir as tabelas e trazer os dados coerentemente. Portanto, a parte do "FROM" do SQL é criada automaticamente pelo BISDAO.


Utilização do BISDAO
Note que apesar do AutoReport utilizar a estrutura de objetos do BISDAO o conteúdo da consulta é retornado uma lista de Object[] com os objetos retornados diretamente do banco de dados. Assim, é necessário solicitar cada campo do VO que se deseja no relatório (cada coluna da tabela). Diferentemente das consultas por objeto do BISDAO, em que solicitar um campo do VO já trás todo o objeto populado.

Há alguns motivos para esse funcionamento:

  • A consulta completa e a montagem dos objetos é muito mais "cara" em questão de processamento e memória. Muitas vezes o relatório manipula muitos dados de uma única vez, assim precisaríamos de máquinas mais potentes e caras para rodar os relatórios.
  • Outro problema seriam colocar as colunas que foram manipuladas com as funções do BISField, por exemplo: Imagine uma coluna do banco de dados "X" que é do tipo data. Mas recuperamos ela com a função BISField.month("X"). Essa função retornaria um valor inteiro com o número do mês da data, o que já não seria possível fazer um cast para o tipo do campo existente no objeto para a coluna X.


WHERE

Uma vez familiarizado com a estrutura do BISMO, a parte de "WHERE" (filtro dos dados do relatório) não tem nenhum segredo. Basta criar o BISMO e associa-lo ao AutoReportDefinition para que ele seja utilizado. Exemplo:

Filtrando os dados do AutoReport
    BISMO mo = new BISMO();
    mo.greaterThanOrEqualTo(v_.date(), LocalDate.of(2019, 11, 1));
    mo.lessThan(v_.date(), LocalDate.of(2019, 12, 1));
    mo.equal(v_.accountVO().id(), 1);
    def.setBISMO(mo);


ORDER BY

Assim como a parte do WHERE, a parte do ORDER BY no AutoReport não tem segredos em relação à estrutura já utilizada no BISDAO.

Ordenando os dados do AutoReport
    BISOrderBy orderBy = BISOrderBy.createInstance(v_.date());
    def.setOrderBy(orderBy);

GROUP BY

O GroupBy tem exatamente a mesma funcionalidade do GROUP BY no SQL.

Para configurar o GroupBy no AutoReportDefinition utilizaremos a mesma sintaxe utilizada na parte do SELECT. O GroupBy aceita as mesmas funções e colunas definidas pela estrutura do BISField.

Definindo colunas de GroupBy para a consulta
    def.addGroupBy(BISField.field(v_.id()));