Relatório PDF

28/07/2009

Boa Tarde,

Uso Java 5 + Jboss 4.23 + JSF.

Essa é minha aplicação.
http://150.162.1.32:8080/resultadosead

login: saad
senha: avaliacao

A aplicação é a consulta de respostas de um questionário web.

No próximo post já colocarei os fontes e o arquivo .war

Gostaria que me orientasse em como montar a estrutura de passagem de parâmentros para que eu possa criar 1 ou 2 tipos de relatórios em PDF. Imagino que utilizando iReport.

O que eu preciso? Por onde começar?

Grato.
Lucas


Lucas Zago

Lucas Zago

Curtidas 0

Respostas

Henrique Weissmann

Henrique Weissmann

28/07/2009

Para gerar relatórios no formato PDF há basicamente dois caminhos:

Você pode fazer todo o trabalho "no braço", utilizando uma biblioteca específica para geração de relatórios no formato PDF, como por exemplo a iText http://www.lowagie.com/iText/ (a DevMedia possui inclusive algumas aulas que fiz sobre o uso desta biblioteca, além de alguns artigos também)

A desvantagem é que trata-se de uma situação um pouco mais trabalhosa, e você não terá o feedback visual imediato. No entanto, lhe garante um controle muito maior sobre o documento gerado, além do que, para casos nos quais o número de colunas no relatório variem, trata-se da única solução que conheço para o problema.

A outra solução consiste no uso de uma ferramenta como o iReport. Ele irá lhe proporcionar todo o feedback visual imediato de que você precisa. E a maneira como você trabalha nele é independente do formato gerado (tanto faz se você estiver gerando relatórios em html, excel, pdf, csv, etc). A única limitação consiste no fato de que o controle sobre o relatório gerado é menor. Além disto, a performance costuma ser um pouco pior também (assim como o consumo de memória).

Há um cusro online na DevMedia sobre o iReport que provávelmente lhe ajudará: https://www.devmedia.com.br/articles/viewcomp.asp?comp=9858

Qualquer coisa, estou a sua disposição
GOSTEI 0
Lucas Zago

Lucas Zago

28/07/2009

Oi Henrique,

Infelizmente este curso não está aberto para assinantes.
Em relação ao que já pesquisei na internet sobre iReport. Todo tutorial que vejo monta em cima de consultas SQL. Sei que existe uma maneira utilizando passagem de parâmetros, acredito ser  muito mais eficiente na minha aplicação.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

28/07/2009

Sim, é verdade.

Você pode passar como parâmetros para o seu relatório uma instancia de List contendo o conteúdo a ser exposto nas linhas do relatório além de uma série de outros parametros (definidos por você) para informações de cabeçalho por exemplo.

Há inclusive a possibilidade de se usar o iReport em conjunto com o Hibernate caso seja do seu agrado também.

Na minha opinião, inclusive as duas opções acima são mais interessantes do que acessando uma base de dados direatamente, uma vez que, ao menos em "condições ideais de temperatura e pressão" o acesso à base de dados deveria ser papel da sua camada de negócios, e não na de visualização, que é o caso dos relatórios gerados pelo iReport.
GOSTEI 0
Lucas Zago

Lucas Zago

28/07/2009

Você pode passar como parâmetros para o seu relatório uma instancia de List contendo o conteúdo a ser exposto nas linhas do relatório além de uma série de outros parametros (definidos por você) para informações de cabeçalho por exemplo.

Exatamente isso que tinha em mente!
Tem alguma idéia por onde começar isso, não encontro nada de iReport nesse sentido.

Att.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

28/07/2009

Lucas,

para meu choque, também não encontrei nenhum tutorial sobre como fazer isto (apesar de já tê-lo feito anteriormente).

Irei buscar em meus códigos fontes antigos algo similar ao que você esteja precisando e assim que estiver disponível (99% de chance de ser segunda feira) posto aqui para você.
GOSTEI 0
Lucas Zago

Lucas Zago

28/07/2009

Ok.

No aguardo.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

28/07/2009

Lucas,

antes de mais nada, mil desculpas pela demora.

Bem: vamos lá. Há duas opções para o seu caso:

Você pode utilizar uma fonte de dados do tipo "JavaBeans set datasource". Neste caso, você precisará de duas classes:

Um JRDataSourceProvider, que é o responsável por estabelecer o link entre o Jasper Reports e a sua fonte de dados. No caso, para criar o seu JRDataSourceProvider customizado, você deverá criar uma classe que implemente a interface JRDataSourceProvider

Neste caso, há quatro métodos a serem implementados:

create(JasperReport report), que irá criar uma nova instância do seu JRDataSource (ver descrição desta interface logo abaixo neste post). Basicamente é a implementação do padrão factory aqui.

dispose(JRDataSource datasource), que irá limpar os recursos utilizados pelo seu datasource. Se você utiliza por exemplo conexões com bancos de dados, este é o método aonde este tipo de recurso será liberado

getFields(JasperReport report), irá retornar um array do tipo JRField contendo todas as definições do seu datasource customizado (também descrito abaixo)

supportsGetFieldsOperation(), função booleana. Caso você não queira retornar campos específicos no seu datasource, faça com que esta função retorne false (pessoalmente, nunca vi um caso no qual eu não retornasse os campos)

O Javadoc desta interface pode ser encontrado em http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRDataSourceProvider.html

Um JRDataSource, que provê os campos que serão utilizados pelo seu editor visual iReports (ou que deverá ser referenciado pelo seu arquivo .jrxml). No caso, esta classe deverá implementar a interface JRDataSource.

No caso, o JRDataSource implementa o padrão de projeto interator, e você terá de implementar dois métodos:

next(), que move o cursor para o próximo registro (repare, a movimentação é unidirecional neste caso)

getFieldValue(JRField campo), que retorna um valor do tipo Object, contendo o valor representado pelo campo relacionado ao registro atualmente selecionado pelo iterator.

O Javadoc desta interface pode ser encontrado em http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRDataSource.html


Na Internet, encontrei alguns exemplos da utilização destes recursos para você nos links abaixo:

http://www.infoviae.it/jasperreportsexample1_e.html

http://www.jasperassistant.com/forum/topic/775/custom_jrdatasource%3Fp1
GOSTEI 0
Devmedia

Devmedia

28/07/2009

Lucas,
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
GOSTEI 0
Lucas Zago

Lucas Zago

28/07/2009

Sim.

Tudo certo.
Obrigado
GOSTEI 0
POSTAR