Tenho um arquivo com informações em fomato texto a ser importado. Ele não possui um
formato específico (xml, csv). Então fiz a leitura e recuperei as informações para um
padrão, salvando em uma tabela.
Analisando a uma tabela, as informações (resumo) estariam nesta forma:
ANO | COD_ESCOLA | NOME_ESCOLA | COD_ALUNO | NOME_ALUNO | DEFICIENCIA
Preciso de um relatorio semelhante a uma pivot table do excel onde nas colunas
eu teria os valores referentes as deficiências dos alunos (cegueira, baixa visão,
mental) e nas linhas a identificação as escolas para poder contar o tipo de deficiencia
por escola.
Por ser um pequeno módulo do sistema, dividi em:
- Importação - Leitura do arquivo e recuperação das informações importantes
- Padronização - DE/PARA para converter informações para o padrão
- Relatório - criação e exibição do pivot table ou cross table
Tudo isso fiz de forma estruturada e a montagem do pivot table foi através de uma
montagem do SQL no código da aplicação dividido em duas partes:
- Primeiro pego as informações sobre as Deficiencias existentes (com select distinct deficiencia)
- Segundo monto o SQL do cross table usando linguagem
Exemplo do SQL montado:
SELECT nome_escola,
sum(if(deficiencia=‘CEGUEIRA’,1,0)) as ‘CEGUEIRA’,
sum(if(deficiencia=‘BAIXA VISÃO’,1,0)) as ‘BAIXA VISÃO’,
sum(if(deficiencia=‘MENTAL’,1,0)) as ‘MENTAL’,
sum(if(deficiencia<>’’,1,0)) as 'TOTAL’
FROM situacaoescolar
GROUP BY nome_escola
ORDER BY nome_escola;
Aí é percorrer o resultset e montar o relatório.
O resultado esperado pelo cliente está Ok.
O desempenho do relatório está Ok.
Dúvidas:
Alguém tem alguma sugestão de modelagem/implementação para uma situação assim? Ou é melhor fazer na forma estrutural?
Até que ponto em um relatório pode ser interessante trabalhar diretamente com SQL ao invés de utilizar regras de domínio ou Value Objects (VOs) para obter informações desejadas?
Jeferson,
Como você está montando seu relatório? Está usando alguma ferramenta?
Nenhum framework nem ferramenta.
Trabalho somente com o SQL direto nesse módulo (gero o preparedstatement) e gero uma saida (varrendo o resultset) em html.
Digamos que é a forma mais rápida de obter a resposta mas talvez não seja a mais elegante a nível de código.
Gostaria de saber se tem uma forma mais elegante de fazer isso via OO ou se existe uma forma de montar um relatório utilizando conceitos de OO.
Vejo a OO mais voltada para a parte CRUD do sistema e as vezes quando os relatórios são mais dinâmicos como pivot tables não vejo uma forma de ganho em utilizar OO.
Cara, eu recomendo o JasperReports que é totalmente orientada a objeto.
E com o iReport você consegue montar (criar layout) de forma bem amigável, sendo que existem vários modelos pré-definidos.
http://jasperforge.org/projects/jasperreports
o jasper eu utilizaria na hora de apresentar o relatório.
Mas e na hora de recuperar as informações?
Em SQL puro eu recebo as seguinte informações montando uma pivot table:
DEFICIENCIAS
ESCOLA | CEGUEIRA | BAIXA VISÃO | TOTAL
AAA 2 1 3
BBB 0 1 1
CCC 0 0 0
Preciso fazer alguma alteração de modelagem para obter o resultado esperado?
A classe Escola possui Alunos c/ a propriedade DEFICIENCIA.
Vou ter que recuperar todos alunos de cada escola e, para cada tipo de deficiencia, ficar varrendo a coleção para contar a deficiencia em específico na coluna ou existe outra forma para obter essa informação?
Você pode usar o Hibernate para facilitar a parte das buscas usando mapeamento objeto-relacional.
Introdução ao Hibernate 3
Não sei se é isso que você está procurando.
Se não for, posta mais detalhes do teu projeto (tabelas, resultados…) que eu tento te ajudar.
Obrigado Isaias pela ajuda.
Segui o tutorial http://ireport-tutorial.blogspot.com/2008/10/ireport-crosstab-report.html
com o componente crosstab dentro do ireport e tive o resultado esperado.
Mas tive que adicionar o SQL (select nome_escola, def from situacaoescolar) e depois configurar NOME_ESCOLA como linhas, DEF como colunas e mensurar o count de DEF.
Sendo a persistencia realizada via Hibernate dos relacionamentos CRUD, fazer um acesso via SQL puro não “quebrando” o modelo de desenvolvimento OO?
Porque você teve que adicionar o SQL? Por causa da crosstab?
Sim. Só uso o SQL para recuperar as informações do crosstab. Só que agora é um select simples sem o uso de funções.
Eu nunca usei o recurso de crosstab do Jasper/iReport, mas eu sei que existem outras formas de fazer esta busca sem usar SQL puro.
Vou ficar te devendo esse help