Se na minha aplicação existirem 20 relatórios, eu vou ter 20 arquivos .jasper? Existe alguma forma via codigo eu mudar os campos estáticos do meu relatório. Por exemplo:
Caso eu tenha 2 relatorios distintos. Só muda o nome de um texto estático no meu relatório. Há alguma maneira via código eu mudar este texto estático fazendo somente um relatório ou tenho que fazer dois relatórios?
Se a diferença entre os seus relatórios for apenas um texto estático vc pode transformar este texto em parâmetro (View >> Report Parameters >> New) e passar na chamada do seu relatório.
E
efukuda
Como eu faria isso no java? Eu criei um parametro como vc disse. E agora?
Eu fiz e sempre uso a classe abaixo,
É só instancia-la com o caminho do relatório e dois arrays um com o nome das variaveis do relatório e outro com o conteudo das variaveis,
e depois executar o método mostraRelatorio para exibi-lo
importjava.io.*;importjava.util.HashMap;importjava.util.Map;importnet.sf.jasperreports.engine.*;importnet.sf.jasperreports.view.*;importnet.sf.jasperreports.engine.JasperCompileManager;/** * @author Elinton Dozol Machado * @version 1.0 */publicclassRelatorio{privateStringarquivoXML="Relatorio.xml";privateStringarquivoXML_OLD="";privateStringparametros[];privateStringconteudo[];privatestaticJasperReportjrImpressao;/**Construtor Padrão. */publicRelatorio(){}/**Construtor * * @param arquivoXML caminho do arquivo XML. */publicRelatorio(StringarquivoXML){this.arquivoXML=arquivoXML;}/**Construtor que recebe o caminho do XML seus parametros e os valores que os preencherão * * @param arquivoXML caminho do arquivo XML. * @param listaParametros lista de parametros do XML * @param listaValores lista com os valores que preencherão os parametros */publicRelatorio(StringarquivoXML,StringlistaParametros[],StringlistaValores[]){this.arquivoXML=arquivoXML;parametros=listaParametros;conteudo=listaValores;try{gerarConteudo();}catch(Exceptionexe){System.out.println("Erro: "+exe.getMessage());}}publicvoidmostraRelatorio()throwsIOException{try{JasperViewer.viewReport(gerarConteudo(),false);}catch(JRExceptionjrex){thrownewIOException(jrex.getMessage());}}privateJasperReportgetJasperReportImpressao()throwsJRException,IOException{try{if((jrImpressao==null)||(!(arquivoXML_OLD.equalsIgnoreCase(arquivoXML)))){jrImpressao=JasperCompileManager.compileReport(newBufferedInputStream(getClass().getResourceAsStream(arquivoXML)));// Localizacao do arquivo XML exibido acima.arquivoXML_OLD=arquivoXML;}}catch(JRExceptionjrex){System.out.println("Erro causa:"+jrex.getMessage()+jrex.getMessage());thrownewJRException(jrex.getCause());}catch(Exceptionjrex){System.out.println("Erro de IO"+jrex.getCause()+jrex.getMessage());}returnjrImpressao;}privateJasperPrintgerarConteudo()throwsJRException,IOException{intintQuantidade=parametros.length;Mapparameters=newHashMap(intQuantidade);for(inti=0;i<intQuantidade;i++)parameters.put(parametros[i],conteudo[i]);returnJasperFillManager.fillReport(this.getJasperReportImpressao(),parameters,newJREmptyDataSource());}privateStringlerHTML(OutputStreamosHTML,FilefileHTML,StringfileName)throwsIOException,JRException{fileHTML=newFile(fileName);JasperExportManager.exportReportToHtmlFile(this.gerarConteudo(),fileName);BufferedReaderrd=newBufferedReader(newInputStreamReader(newFileInputStream(fileHTML)));Strings;StringBuffersbHTML=newStringBuffer();while((s=rd.readLine())!=null){sbHTML.append(s+" ");}rd.close();returnsbHTML.toString();}privatevoidfecharStreams(OutputStreamosHTML,FilefileHTML,StringfileName)throwsIOException{if(osHTML!=null){osHTML.flush();osHTML.close();}if((fileHTML!=null)&&fileHTML.exists()){fileHTML.delete();}fileHTML=newFile(fileName+"_files");if((fileHTML!=null)&&fileHTML.exists()&&fileHTML.isDirectory()){fileHTML.delete();}}/**Determina os parametros do Relatório. Método sem Efeito * * @param strParametros parametros do Relatório. */publicvoidsetParametros(String[]strParametros){this.parametros=strParametros;}/**Determina o conteudo das páginas do Relatório. * * @param strConteudo Cabeçalho das páginas do Relatório. */publicvoidsetConteudo(String[]strConteudo){this.conteudo=strConteudo;}/**Gera um relatorio para a Impressão * * @param verDialogoDeImpressao Se quer ver o diálogo de impressão. * @exception IOException SE ocorrer algum problema de I/O, ou na geração * de conteúdo ou quando enviar o relatório a impressora. */publicvoidgerarImpressao(booleanverDialogoDeImpressao)throwsIOException{try{// JasperViewer.viewReport(gerarConteudo(),false);JasperPrintManager.printReport(this.gerarConteudo(),verDialogoDeImpressao);}catch(JRExceptionjrex){thrownewIOException(jrex.getMessage());}}/**Gera versao HTML do Relatório. * * @return String com o conteudo HTML do Relatório. */publicStringgerarHTML(){StringstrHTML=null;OutputStreamosHTML=null;FilefileHTML=null;StringfileName=System.currentTimeMillis()+".html";try{strHTML=this.lerHTML(osHTML,fileHTML,fileName);}catch(IOExceptionioex){thrownewRuntimeException(ioex);}catch(JRExceptionjrex){thrownewRuntimeException(jrex);}finally{try{this.fecharStreams(osHTML,fileHTML,fileName);}catch(IOExceptionioex){thrownewRuntimeException(ioex);}}returnstrHTML;}/** * * @return Stream com o versao PDF do Relatório. * @throws IOException Se ocorrer um problema de I/O ou na criacao do * Conteudo. */publicOutputStreamgerarStreamPDF()throwsIOException{byte[]bytePDF=this.gerarPDF();OutputStreamosPDF=newBufferedOutputStream(newByteArrayOutputStream(bytePDF.length));osPDF.write(bytePDF);osPDF.flush();returnosPDF;}/** * * @return Vetor de bytes com a versao PDF do Relatório. * @throws IOException Se ocorrer um problema de I/O. */publicbyte[]gerarPDF()throwsIOException{byte[]bytePDF=null;try{bytePDF=JasperExportManager.exportReportToPdf(this.gerarConteudo());}catch(JRExceptionjrex){thrownewIOException(jrex.getMessage());}returnbytePDF;}}
E
efukuda
Não está aceitando o parametro.put!!!
Você tem outro tutorial de jasperreports sem ser este do guj?
Na chamada parametro.put vc deve passar dois parametros, o primeiro com o nome do parametro que vc criou no Jasper e o segundo com o valor que deseja atribuir a este parametro. Certo?
Vc criou o campo no relatorio associando a este o novo parametro?
Adiciona um componente do tipo Textfield Tool, abre as propriedades do mesmo e depois na aba Text Field digita em Text Expression $P{nome_do_parametro}, onde nome_do_parametro eh o parametro que vc criou.
E
efukuda
Quando eu coloco o texto estático não tem esta opção. Somente quando eu coloco um campo ai sim tem a aba Text Field.
Como que eu faço para passar por parâmetro um texto estático?
Marcel Horner:
Na chamada parametro.put vc deve passar dois parametros, o primeiro com o nome do parametro que vc criou no Jasper e o segundo com o valor que deseja atribuir a este parametro. Certo?
Vc criou o campo no relatorio associando a este o novo parametro?
Adiciona um componente do tipo Textfield Tool, abre as propriedades do mesmo e depois na aba Text Field digita em Text Expression $P{nome_do_parametro}, onde nome_do_parametro eh o parametro que vc criou.