Relatório Dinâmico com JasperDesign
08/junho/2010 - Java
Olá
Que tal fazer um relatório sem iReport? e sem ter de fazer o JRXML? e ser montada de dinamicamente?
Pois isso é possível usando algumas classes do JasperReports como a JasperDesign, JRDesignBand, JRDesignStaticText, JRDesignField e JRDesignExpression. Não é muito complicado fazer isso não como você podem ver no exemplo que fiz, o mais díficil mesmo é posicionar os elementos na página. Precisa usar muito a imaginação.
Basicamente é feito tudo pela classe abaixo.
package br.com.furutani.reldin;
import java.awt.Color;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.type.HorizontalAlignEnum;
public class ReportDesigner {
public JasperDesign getDesign() throws JRException {
// Cria um novo relatório
JasperDesign jasperDesign = new JasperDesign();
// PAGE
configPage(jasperDesign);
// FIELD
JRDesignField field = null;
addField("referencia", String.class, jasperDesign);
addField("consumo", Integer.class, jasperDesign);
// TITLE
JRDesignBand jrDesignband = null;
JRDesignStaticText staticText = null;
configTitle(jasperDesign);
// PAGE HEADER
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(15);
jasperDesign.setPageHeader(jrDesignband);
// COLUMN HEADER
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(25);
jasperDesign.setColumnHeader(jrDesignband);
//Dados da referencia
staticText = new JRDesignStaticText();
staticText.setX(0);
staticText.setY(5);
staticText.setWidth(150);
staticText.setHeight(15);
staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
staticText.setText("Referência - Mês/Ano");
staticText.setBold(true);
jrDesignband.addElement(staticText);
//Dados do consumo
staticText = new JRDesignStaticText();
staticText.setX(150);
staticText.setY(5);
staticText.setWidth(100);
staticText.setHeight(15);
staticText.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
staticText.setText("Consumo - kWh");
staticText.setBold(true);
jrDesignband.addElement(staticText);
// DETAIL
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(20);
//Dados da referencia
JRDesignTextField textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(0);
textField.setY(5);
textField.setWidth(150);
textField.setHeight(15);
// Adiciona a expressao no campo
JRDesignExpression expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{referencia}");
textField.setExpression(expression);
jrDesignband.addElement(textField);
//Dados do consumo
textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(200);
textField.setY(5);
textField.setWidth(50);
textField.setHeight(15);
textField.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
//Adiciona a expressao no campo
expression = new JRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$F{consumo}");
textField.setExpression(expression);
jrDesignband.addElement(textField);
jasperDesign.setDetail(jrDesignband);
// COLUMN FOOTER (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setColumnFooter(jrDesignband);
// PAGE FOOTER (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setPageFooter(jrDesignband);
// NO DATA (No JasperViewer não mostra, na web mostraria)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(20);
staticText = new JRDesignStaticText();
staticText.setX(10);
staticText.setY(5);
staticText.setWidth(64);
staticText.setHeight(15);
staticText.setText("Sem registros para compor o relatório!");
staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
jrDesignband.addElement(staticText);
jasperDesign.setNoData(jrDesignband);
// SUMMARY (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setSummary(jrDesignband);
return jasperDesign;
}
/**
* Ajusta os parametros do titulo
* @param jasperDesign
*/
private void configTitle(JasperDesign jasperDesign) {
JRDesignBand band = new JRDesignBand();
band.setHeight(50);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(10);
staticText.setY(10);
staticText.setWidth(450);
staticText.setHeight(40);
staticText.setFontName("Tahoma");
staticText.setForecolor(Color.BLUE);
staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
staticText.setFontSize(24);
staticText.setPdfFontName("Helvetica-Bold");
staticText.setBold(true);
staticText.setText("Histórico de Consumo");
band.addElement(staticText);
jasperDesign.setTitle(band);
}
/**
* Adiciona campos ao relatorio
* @param name
* @param clazz
* @param jasperDesign
* @throws JRException
*/
private void addField(String name, Class clazz, JasperDesign jasperDesign)
throws JRException
{
JRDesignField field = new JRDesignField();
field.setName(name);
field.setValueClass(clazz);
jasperDesign.addField(field);
}
/**
* Configura a pagina
* @param jasperDesign
*/
private void configPage(JasperDesign jasperDesign) {
jasperDesign.setPageWidth(500);
jasperDesign.setPageHeight(1000);
jasperDesign.setColumnCount(1);
jasperDesign.setColumnWidth(450);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(10);
jasperDesign.setRightMargin(10);
jasperDesign.setBottomMargin(5);
jasperDesign.setTopMargin(5);
jasperDesign.setName("RelatorioDeConsumo");
}
}
O exemplo foi feito no Eclipse Galileo. Não foi usado nada de web apesar de ser facilmente adaptado para rodar em ambiente web.
Adicione as bibliotecas no classpath do projeto que estão dentro de <DIR_INSTALL>\iReport-3.7.2\ireport\modules\ext para compilar os fontes:
ant-1.7.1.jar
antlr-2.7.6.jar
asm-attrs.jar
asm.jar
barbecue-1.5-beta1.jar
barcode4j-2.0.jar
batik-anim.jar
batik-awt-util.jar
batik-bridge.jar
batik-css.jar
batik-dom.jar
batik-ext.jar
batik-gvt.jar
batik-parser.jar
batik-script.jar
batik-svg-dom.jar
batik-svggen.jar
batik-util.jar
batik-xml.jar
bcel-5.2.jar
bsh-2.0b4.jar
castor-1.2.jar
cglib-2.1.jar
cincom-jr-xmla.jar
commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
commons-logging-1.1.jar
commons-math-1.0.jar
commons-pool-1.3.jar
commons-vfs-1.0.jar
dom4j-1.6.jar
ehcache-1.1.jar
eigenbase-properties-1.1.0.10924.jar
eigenbase-resgen-1.3.0.11873.jar
eigenbase-xom-1.3.0.11999.jar
ejb3-persistence.jar
groovy-all-1.5.5.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate3.jar
hsqldb-1.8.0-10.jar
iText-2.1.7.jar
iTextAsian.jar
jakarta-bcel-20050813.jar
jasperreports-3.7.2.jar
jasperreports-chart-themes-3.6.2.jar
jasperreports-extensions-3.5.3.jar
jasperreports-fonts-3.7.2.jar
javacup.jar
javassist-3.4.GA.jar
jaxen-1.1.1.jar
jcommon-1.0.15.jar
jdt-compiler-3.1.1.jar
jfreechart-1.0.12.jar
jpa.jar
js_activation-1.1.jar
js_axis-1.4patched.jar
js_commons-codec-1.3.jar
js_commons-discovery-0.2.jar
js_commons-httpclient-3.1.jar
js_jasperserver-common-ws-3.5.0.jar
js_jaxrpc.jar
js_mail-1.4.jar
js_saaj-api-1.3.jar
js_wsdl4j-1.5.1.jar
jta.jar
jxl-2.6.jar
log4j-1.2.15.jar
mondrian-3.1.1.12687-Jaspersoft.jar
olap4j-0.9.7.145.jar
png-encoder-1.5.jar
poi-3.5-FINAL-20090928.jar
rex-20080421.jar
rhino-1.7R1.jar
saaj-api-1.3.jar
slf4j-api.jar
slf4j-log4j12.jar
spring.jar
sqleonardo-2007.03.jar
swingx-2007_10_07.jar
xml-apis-ext.jar
xml-apis.jar
O projeto do Eclipse com os fontes está disponível no link abaixo:
JasperDinamico
O resultado será esse:
Até mais,
Roberto
Simplificando cálculos com datas com Joda Time – Java
21/fevereiro/2010 - Java
Olá!
Quem precisou fazer contas com java.util.Date ou java.util.Calendar saber o trabalho que dá e como a API nativa do Java (até o Java 6 pelo menos) não ajuda muito a fazer coisas simples como adicionar horas na data atual. A API Joda Time veio para simplificar o trabalho com datas no Java, tanto é que muitas idéias dessa API tem grande chance de estarem no Java 7 através da JSR-310.
O que eu mais gostei do Joda Time são os método toString() que aceitam como parâmetro o padrão de formatação (não preciso criar mais SimpleDateFormat para formatar os benditos java.util.Date!!! parecido com o do C#), inicialização do objeto com String e o uso de interfaces fluentes.
Abaixo exemplos de uso.
- Inicialização do objeto com String
DateTime date = new DateTime("2010-2-21T20:19:45.000-03:00");
System.out.println(date.toString("dd/MM/yyyy HH:mm:ss"));
- Soma de dias escolhendo o ano
LocalDate localDate = new LocalDate();
LocalDate moreDays = localDate.withYear(2008).plusDays(8);
System.out.println(moreDays.toString("dd/MM/yyyy"));
// 29/02/2008
- Dia da semana por extenso
DateTime dateTime = new DateTime(); String dayOfMonth = dateTime.dayOfWeek().getAsText(); System.out.println(dayOfMonth); // Domingo
- Quantidade de dias entre um dia e outro
DateTime inicio = new DateTime(2010, 2, 21, 0, 0, 0, 0); DateTime fim = new DateTime(2010, 2, 22, 13, 30, 0, 0); System.out.println(Days.daysBetween(inicio, fim).getDays()); // 1 System.out.println(Hours.hoursBetween(inicio, fim).getHours()); // 37 System.out.println(Minutes.minutesBetween(inicio, fim).getMinutes()); // 2250
- Diferença de horas entre fusos horários.
DateTime agora = new DateTime();
DateTime saoPaulo =
agora.withZoneRetainFields(DateTimeZone.forID("America/Sao_Paulo"));
DateTime rioBranco =
agora.withZoneRetainFields(DateTimeZone.forID("America/Rio_Branco"));
DateTime japao =
agora.withZoneRetainFields(DateTimeZone.forID("Asia/Tokyo"));
DateTime londres =
agora.withZoneRetainFields(DateTimeZone.forID("Europe/London"));
System.out.println(Hours.hoursBetween(japao, saoPaulo).getHours());
System.out.println(Hours.hoursBetween(londres, saoPaulo).getHours());
System.out.println(Hours.hoursBetween(rioBranco, saoPaulo).getHours());
// Diferença de horas entre Japão e São Paulo: 12
// Diferença de horas entre Londre e São Paulo: 3
// Diferença de horas entre Rio Branco/AC e São Paulo: -1
Até mais,
Roberto
NullPointerException ou FileNotFoundException ao executar relatórios com Jasper Reports
21/fevereiro/2010 - Java, Tutoriais
Olá!
Muitas pessoas tem dificuldade em utilizar os relatórios feitos no iReport em suas aplicações, especialmente as webs, por não saberem onde colocar os arquivos .jasper em sua aplicação para que o Servlet ou o ManagedBean consiga lê-los. Então é bem comum ver erros como esses:
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException
java.lang.NullPointerException at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185)
Recomendo colocar os arquivos jasper e/ou jrxml juntos as classes Java e não nos diretórios abaixo de Páginas Web no Netbeans ou Web Content no Eclipse, pois eles podem fica expostos. Não é desejado que os usuários possam baixa os arquivos jasper e/ou jrxml e ficarem fuçando neles.
A figura abaixo mostra o local correto para copiar o arquivo jasper e/ou jrxml no Netbeans. No Eclipse a lógica é a mesma, no lugar de Pacotes de código fontes coloque em Java Resorces: src.
Note que o arquivo jasper e/ou jrxml está no mesmo pacote do GerarRelatorioServlet.java e para obter o InputStream no Servlet eufaço assim getResourceAsStream(“Rel_Precipitacoes.jasper”).
Para ser mais organizado é possível colocar em outro pacote, nesse caso é preciso ajustar o caminho ao jasper com relação ao local do GerarRelatorioServlet.java. No exemplo abaixo o jasper ficou no pacote br.com.furutani.relatorios logo obtemos o InputStream passando esse caminho “../relatorios/Rel_Precipitacoes.jasper” no GerarRelatorioServlet.
O projeto do netbeans com os fontes e bibliotecas do JasperReports podem ser baixados no link: Projeto Jasper Projeto Jasper Netbeans 6.8
Espero ter ajudado.
Até mais,
Roberto
JasperReports em Flash
01/fevereiro/2010 - Java, Tutoriais
Olá!
Faz muito tempo que não publico nada no blog, mas ele não está abandonado.
Neste post vou deixar mais uma dica sobre JasperReports e Flas, na verdade é só um exemplo de que é possivel usar o mesmo .jasper para criar relatórios em PDF e em Flash também.
Neste exemplo eu usei um outro exemplo que acompanha o JasperReports Flash Viewer 3.0.0.
» Clique aqui para ver o exemplo funcionando.
» Download dos fontes: Relatório em JasperReports e Flash Exemplo de relatório em JasperReports e Flash
Outra opção para exibir relatórios em flash é utilizar o xViewer mostrado neste post Exibindo relatórios gerados pelo Jasper Report em Flex. O exemplo precisa do Adobe Flex e do ant para compilar, mas voce pode importar os fontes para sua IDE favorita sem problemas é só adicionar os jars no classpath.
Até mais,
Roberto
Convenções de código Java
05/janeiro/2010 - Java
Olá
Nada melhor para quem vai efetuar uma manutenção em código-fonte do que poder ler de forma padronizada. Pensando nisso a SUN disponibiliza uma convenção para formatação de código Java, isso incluí nome das classes, dos métodos, declaração de váriaveis, identação, formatação dos comandos e etc. Apesar da última revisão ter sido em abril de 1999 ainda está valendo.
Para algumas pessoas a convenção da SUN pode não agradar, pois tem gente que gosta do fonte assim:
if (condition)
{
statements;
}
else if (condition)
{
statements;
}
else
{
statements;
}
Mas a convenção diz para ser assim:
if (condition) {
statements;
} else if (condition) {
statements;
} else {
statements;
}
Enfim, gostando ou não gostando é importante seguir um padrão, já pensou se as placas de pare fosse octogono em algumas cidades e em outras não? ou se cada banco criasse um código de barras próprio para seus boletos? iria ser muito mais dificil ler.
A convenção que mais ajuda é o de nomenclatura, por exemplo os métodos que devem iniciar com verbo e tem a primeira letra minúscula e depois cada palavra capitalizada.
Code Conventions for the Java Programming Language
Até mais,
Roberto

