D3POD Posted July 14, 2013 at 01:43 PM Report #518699 Posted July 14, 2013 at 01:43 PM Olá a todos, estou a criar um programa para um centro de reparações. O programa para já é muito simples e consiste no registo dos equipamentos quando dão entrada na loja e estou a preparar o programa de maneira a que os técnicos possam registar por exemplo quando o equipamento está pronto ou se não tem reparação e ainda se está a aguardar algum componente. A ideia é nesta primeira fase criar apenas o essencial e com o tempo introduzir novas funcionalidades. Bem mas isto para explicar que irei precisar de fazer pelo menos 2 tipos de impressões. Uma quando o cliente entrega o equipamento para servir de comprovativo de entrega e outra quando o processo termina para dar um relatório do que aconteceu na reparação. Já tenho tudo criado, estou a tratar neste momento da DB, mas entretanto comecei já a ver a situação de imprimir esses relatórios. Encontrei alguma informação sobre o ireports e tenho algumas duvidas pois os exemplos que encontro explicam muito bem a parte de conectar o ireports com o java, mas não muito bem a parte de enviar a ordem de impressão. Alguém me pode ajudar explicando como posso fazer para imprimir a informação? O ireports vai buscar a informação directamente à DB? ou vai aos jtextfield que eu expecificar? Como posso indicar um "processo de reparação" pelo ID desse processo, ou seja, se o processo for o numero 230 como é que eu dou a ordem de impressão para esse processo? Estou um pouco baralhado pois não estou a perceber esta parte, os exemplos que vejo, são muito vagos no que toca ao código introduzido no java. Cumprimentos
Rui Carlos Posted July 14, 2013 at 06:17 PM Report #518726 Posted July 14, 2013 at 06:17 PM O iReports não é mais ou menos o mesmo que o JasperReports? Se bem me lembro, tens a opção de abrir o relatório gerado numa nova janela, onde tens um botão para imprimir (assim como mais ). Não é exactamente imprimir directamente, mas quase. O processo seria indicar o ID, abrir o relatório, e clicar no botão de imprimir. É provável que também dê para imprimir directamente, mas nunca fiz isso. Estive agora a ver a documentação, e tens esta classe: http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperPrintManager.html Eu costumava usar as classes equivalentes para gerar PDFs (JasperExportManager) e abrir o visualizador (JasperViewer). Por isso, também deves conseguir imprimir directamente. Rui Carlos Gonçalves
saca-rolhas Posted July 18, 2013 at 02:01 PM Report #519199 Posted July 18, 2013 at 02:01 PM (edited) Boas C3PO, se queres gerar PDFs com a tua aplicação Java e que faça não depender de softwares externos a apenas de um .jar eu recomendo o iTextPdf porem desde já informo que é uma biblioteca complexa e configuração de documentos muito detalhados pode ser demorada, porem é sólida e versátil, pois permite fazeres tudo o que tu quiseres em PDF. Vai a http://itextpdf.com/ para sacares o jar e a http://itextpdf.com/examples/ para veres exemplos práticos e se calhar construíres algo a partir deles para a tua solução. Sobre o iReports já tinha ouvido falar, e constatei que é uma ferramenta espectacular que tem o layout do NetBeans que é um IDE a que estou familiarizado, recomendo. Agora dos 10 minutos que estive a configurar uma ligação JDBC a uma base de dados MSSQL onde tive de colocar bibliotecas externas ao programa e a gerar um report através dum template pré-feito pergunto-me. Como posso integrar isto numa aplicação de maneira a que fornecendo um Result Set dum query e um template XML feito através deste programa posso fazer o mesmo que se vê no preview, onde posso encontrar as bibliotecas necessárias para fazer isto acontecer? Edited July 18, 2013 at 02:30 PM by saca-rolhas The worst part of censorship is ****
Rui Carlos Posted July 18, 2013 at 04:58 PM Report #519237 Posted July 18, 2013 at 04:58 PM Sobre o iReports já tinha ouvido falar, e constatei que é uma ferramenta espectacular que tem o layout do NetBeans que é um IDE a que estou familiarizado, recomendo. Agora dos 10 minutos que estive a configurar uma ligação JDBC a uma base de dados MSSQL onde tive de colocar bibliotecas externas ao programa e a gerar um report através dum template pré-feito pergunto-me. Como posso integrar isto numa aplicação de maneira a que fornecendo um Result Set dum query e um template XML feito através deste programa posso fazer o mesmo que se vê no preview, onde posso encontrar as bibliotecas necessárias para fazer isto acontecer? Penso que aquilo que precisas é a biblioteca JasperReports, que te permite pegar no ficheiro de configuração XML do relatório, e gerar relatórios, permitindo também que os relatórios seja populados com um ResultSet. Tenho aqui um projecto onde usei um código semelhante a este: public void viewReport(ResultSet rs, Map<String,Object> parameters, String path) throws JRException { // Compilar o ficheiro JRXML que contém a definição do relatório, e que pode ser gerado pelo iReport JasperReport report = JasperCompileManager.compileReport(path); // Preencher o relatório com dados JasperPrint print = JasperFillManager.fillReport( report, parameters, // Parâmetros a serem usados no preenchimento do relatório new JRResultSetDataSource(rs) // ResultSet a ser usado no preenchimento do relatório ); // Visualizar o relatório // Pode ser facilmente adaptado para em vez de abrir um visualizador, gerar um PDF, e imprimir o relatório JasperViewer.viewReport(print, false); } Rui Carlos Gonçalves
saca-rolhas Posted July 25, 2013 at 10:49 AM Report #519906 Posted July 25, 2013 at 10:49 AM Penso que aquilo que precisas é a biblioteca JasperReports, que te permite pegar no ficheiro de configuração XML do relatório, e gerar relatórios, permitindo também que os relatórios seja populados com um ResultSet. Tenho aqui um projecto onde usei um código semelhante a este: public void viewReport(ResultSet rs, Map<String,String> parameters, String path) throws JRException { // Compilar o ficheiro JRXML que contém a definição do relatório, e que pode ser gerado pelo iReport JasperReport report = JasperCompileManager.compileReport(path); // Preencher o relatório com dados JasperPrint print = JasperFillManager.fillReport( report, parameters, // Parâmetros a serem usados no preenchimento do relatório new JRResultSetDataSource(rs) // ResultSet a ser usado no preenchimento do relatório ); // Visualizar o relatório // Pode ser facilmente adaptado para em vez de abrir um visualizador, gerar um PDF, e imprimir o relatório JasperViewer.viewReport(print, false); } Boas, Sobre o IReports e esse metodo tenho 2 questões. 1ª- Que informação se deve passar através dessa variável parameters e em que parte aplico o jrxml para aplicar os templates e formatos que criei no iReport Designer? 2ª- Li o THE JASPERREPORTS ULTIMATE GUIDE e com base no que li cheguei à conclusão que as bibliotecas a ser carregadas para a aplicação para que possa gerar reports em PDF e carregar dados de uma base de dados MSSQL são: jcommon, jtds, itextpdf e jasperreports contudo no metodo que forneceste o JasperFillManager acusa erro nos parâmetros declarados, alguma sugestão? The worst part of censorship is ****
Rui Carlos Posted July 25, 2013 at 11:04 AM Report #519907 Posted July 25, 2013 at 11:04 AM 1ª- Que informação se deve passar através dessa variável parameters e em que parte aplico o jrxml para aplicar os templates e formatos que criei no iReport Designer? O parameters contém os valores para os parâmetros existentes no JRXML. A localização do JRXML é especificada na variável path (a primeira coisa que é feita é compilar esse ficheiro). 2ª- Li o THE JASPERREPORTS ULTIMATE GUIDE e com base no que li cheguei à conclusão que as bibliotecas a ser carregadas para a aplicação para que possa gerar reports em PDF e carregar dados de uma base de dados MSSQL são: jcommon, jtds, itextpdf e jasperreports contudo no metodo que forneceste o JasperFillManager acusa erro nos parâmetros declarados, alguma sugestão? Qual é o erro que dá? O código que apresentei já tem alguns anos, e é possível que a API tenha mudado entretanto. Rui Carlos Gonçalves
saca-rolhas Posted July 25, 2013 at 11:11 AM Report #519908 Posted July 25, 2013 at 11:11 AM Basicamente diz que o método invocado não possui aqueles parâmetros ou seja o típico "no suitable method found" The worst part of censorship is ****
Rui Carlos Posted July 25, 2013 at 11:42 AM Report #519913 Posted July 25, 2013 at 11:42 AM No meu caso, tenho essa classe/método no jar jasperreport-2.0.2.jar, no package net.sf.jasperreports.engine. Provavelmente o que te falta é o jar jasperreports-5.1.2.jar. Rui Carlos Gonçalves
saca-rolhas Posted July 25, 2013 at 12:58 PM Report #519924 Posted July 25, 2013 at 12:58 PM Eu tenho o jasperreports-5.2.0.jar The worst part of censorship is ****
Rui Carlos Posted July 25, 2013 at 01:31 PM Report #519927 Posted July 25, 2013 at 01:31 PM Experimenta trocar public void viewReport(ResultSet rs, Map<String,String> parameters, String path) por public void viewReport(ResultSet rs, Map<String,Object> parameters, String path) Rui Carlos Gonçalves
saca-rolhas Posted July 25, 2013 at 01:57 PM Report #519931 Posted July 25, 2013 at 01:57 PM Realmente assim ele come, já tinha visto na documentação da biblioteca que ele levava com Map<String,Object> mas não vejo o mal de levar com Map<String,String> uma vez que String herda de Object. Obrigado The worst part of censorship is ****
saca-rolhas Posted July 25, 2013 at 03:29 PM Report #519952 Posted July 25, 2013 at 03:29 PM (edited) Aqui vai o resultado da minha pesquisa. package reports; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporter; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JRResultSetDataSource; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.view.JasperViewer; public class Reports { public static final String MSSQL = "net.sourceforge.jtds.jdbc.Driver"; public static final String PATH = "jdbc:jtds:sqlserver://aserver:1433;databaseName=Adatabase"; public static final String SQL_USER = "auser"; public static final String SQL_PWD = "apw"; public static void main(String[] args) throws ClassNotFoundException { Class.forName(MSSQL); String fileName = "compiledReport.jasper"; String outFileName = "apdf.pdf"; HashMap hm = new HashMap(); String query = "SELECT * from table"; ResultSet rs = null; try { rs = getQueryResultSet(query, new LinkedList<String>()); } catch (SQLException ex) { Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex); } createPDFReport(fileName, outFileName, hm, rs); } public void viewReport(ResultSet rs, Map<String, Object> parameters, String path) throws JRException { // Compilar o ficheiro JRXML que contém a definição do relatório, e que pode ser gerado pelo iReport JasperReport report = JasperCompileManager.compileReport(path); // Preencher o relatório com dados JasperPrint print = JasperFillManager.fillReport(report, parameters, new JRResultSetDataSource(rs)); // Visualizar o relatório // Pode ser facilmente adaptado para em vez de abrir um visualizador, gerar um PDF, e imprimir o relatório JasperViewer.viewReport(print, false); } public static void createPDFReport(String fileName, String outFileName, HashMap hm, ResultSet rs) { try { JasperPrint print = JasperFillManager.fillReport(fileName, hm, new JRResultSetDataSource(rs)); JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter(); exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileName); exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); exporter.exportReport(); System.out.println("Created file: " + outFileName); } catch (JRException e) { e.printStackTrace(); System.exit(1); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } public static ResultSet getQueryResultSet(String query, LinkedList<String> values) throws SQLException { Connection conn = DriverManager.getConnection(PATH, SQL_USER, SQL_PWD); PreparedStatement ps = conn.prepareStatement(query); if (values.size() != 0) { for (int i = 0; i < values.size(); i++) { ps.setString(i + 1, values.get(i)); } } return ps.executeQuery(); } } com este bocado de código consigo converter o .jasper em pdf e creio que uma vez que importei todas as bibliotecas contidas na biblioteca de jasperreports-5.2.0 mais a de JTDS (MSSQL) consigo exportar para mais formatos. Espero que seja útil para alguém que queira ver a vida facilitada em criar relatórios. Edited October 16, 2013 at 12:25 PM by saca-rolhas 1 Report The worst part of censorship is ****
Rui Carlos Posted July 25, 2013 at 03:47 PM Report #519956 Posted July 25, 2013 at 03:47 PM Eu para exportar para PDF costumava usar a seguinte linha no final do método que apresentei anteriormente: JasperExportManager.exportReportToPdfFile(print, "ficheiro_de_output.pdf"); (Não sei se ainda funciona nas versões mais recentes.) Rui Carlos Gonçalves
saca-rolhas Posted July 25, 2013 at 06:03 PM Report #519990 Posted July 25, 2013 at 06:03 PM Eu para exportar para PDF costumava usar a seguinte linha no final do método que apresentei anteriormente: JasperExportManager.exportReportToPdfFile(print, "ficheiro_de_output.pdf"); (Não sei se ainda funciona nas versões mais recentes.) Os métodos que encontrei para gerar os ficheiros são todo do genero JR+ tipo do ficheiro+Exporter(); Como por exemplo: JRPdfExporter(); JRXlsExporter();... The worst part of censorship is ****
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now