O negócio é o seguinte, tenho um jframe com alguns jtextfields que eu puxo os valores do banco de dados, todos esses campos são referentes a apenas um ID da tabela.
Gostaria de montar um relatório contendo apenas esses campos, utilizando o ireport.
pra isso eu teria que passar o sql (select * from tabela where tabela_id=xxx), porem no ireport vc faz a instrução sql dentro do proprio relatório, aí nao da pra enviar o id do qual eu quero pegar os dados…
Tem algum jeito de fazer isso?
ou algum jeito de fazer um relatório pra imprimir sem usar o ireport?
Passar instrução sql pro ireport
9 Respostas
É possível, o iReport permite criação de queries dinâmicas (que recebem parâmetros).
Aqui mesmo no guj tem vários exemplos, dá uma pesquisada
Só pra nao criar outro tópico, como eu adiciono o driver do firebird no ireport?
Pois ele não mostra o driver do firebird, só dos outros databases.
Só pra nao criar outro tópico, como eu adiciono o driver do firebird no ireport?
Pois ele não mostra o driver do firebird, só dos outros databases.
Quer economizar árvores?
O assunto não tem nada a ver com esta pergunta, portanto, outro tópico deve ser aberto.
Ah, e não no fórum de java avançado, mas de ferramentas e utilitários
Siga os passos:
-
Monte o relatório no i-Report.
-
No painel do lado esquerdo (provavelmente) você verá o ReportInspector, com a subentrada Fields, clique com o botão direito sobre ela e clique em Adicional Field. Faça isso para quntos campos sua consulta SQL retornar e renomeie-os para os nomos dos campos que sua consulta irá retornar ex.
ID
NOME
TELEFONE -
Depois, na entrada na entrada parameters crie um novo parametro e renomei-o. Ex:
COD. -
Ainda no ReportInspector clique na primeira entrada (a com o nome do relatório) e no painel Properties edite o campo SQL colocando sua consulta colocando o parametro como condição, ex:
SELECT ID, NOME, TELEFONE FROM CLIENTES WHERE ID=$P{COD} -
Em cada TexField do seu relatório clique com o botaõ direito e clique em Edit expression, delete o $F{field} em vermelho, procure o field específico na lista em baixo dê duplo clique sobre ele e o mesmo aparecerá na parte superior. Clique em aplicar.
Repita o procedimento para todos os TextFields. -
Compile o relatório. (o ícone do martelo). Se dudo estiver correto ele criará o arquivo .jasper correspondente. Cole esse arquivo no patch do seu programa JAVA.
-
Na hora de chamar o relatório crie um objeto map e passe o código como parâmetro de busca para a SQL ex.: Map<String, String> param = new HashMap<String, String>(); param.put(“COD”, CodCliente); JasperFillManager.fillReportToFile(relatorio+".jasper", param, conn); JasperViewer jv = new JasperViewer(relatorio+".jrprint",false); jv.setVisible(true);
onde conn é sua conexão com o banco de dados, CodCliente é a varável com o código de busca para o Jasper relatorio é o nome do seu arquivo.
PS.: certifique-se de importar as biblitecas necessárias para esses procedimentos
Olá andresim, desde já obrigado pela ajuda.
Fiz exatamento como você postou, e na hora de mostrar o relatório apareceu essa mensagem de erro:
error preparing statement for executing the report query:
SELECT ORDID, EQUIPAMENTO FROM ORD_INFORMATICA WHERE ORDID=?
O meu método pra chamar o relatório ficou assim:
private void chamarRelatorio(String diretorio){
JasperPrint rel = null;
String arquivoJasper = diretorio;
try {
Map<String, String> parametros = new HashMap<String, String>();
parametros.put("COD", pegaIdCliente(ListaClientes.getSelectedItem().toString()));
rel = JasperFillManager.fillReport(arquivoJasper, parametros, Conexao.getConexao() ); //tem q criar a classe conexao!
JasperViewer jv = new JasperViewer(rel, false);
jv.setExtendedState(jv.MAXIMIZED_BOTH);
jv.setVisible(true);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
Opa, ja descobri porque dava esse erro, acontece que tem que por o “!” depois do $P, é assim que iReport reconhece aquilo como parametro.
Sinceramente, desconhecia isto.
Parâmetro no iReport sempre foi $P{param}
Sinceramente, desconhecia isto.
Parâmetro no iReport sempre foi $P{param}
Parâmetros simples, não precisam da “!”, agora se você quer mandar uma query inteira dinamicamente pro ireport, é necessário a “!”, por exemplo:
$P!{PARAM_SQL_QUERY}
jasper entende que deve executar o parâmetro como script, foi foda lembrar isso, não é bem documentado.
Primeiro crie o relatório jasper com a simples query select * from tabela...
Aplicação:
Esta seria a forma que eu estabeleceria a conexão com o SGBD.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConexaoBD implements IDatabase {
public static Connection con = null;
public void carregarDriver(){
try{
Class.forName( DRIVER );
}
catch ( ClassNotFoundException cnfe ) {
System.out.println( "Não tem drive JDBC para conexao : " +
cnfe.getMessage() );
}
}
public Connection getConexao(){
try{
/* Instanciando a classe do driver através do seu nome */
//if (con==null)
con = DriverManager.getConnection(URL, USER, PASSWORD);
return con;
}
catch ( SQLException sqle ) {
System.out.println( "Erro na conexão com BD : " +
sqle.getMessage() );
}
return null;
}
public void fecharConexao(){
try {
con.close();
}
catch ( SQLException sqle ) {
System.out.println( "Erro na conexão com BD : " +
sqle.getMessage() );
}
}
}
Esta classe irá alimentar o .jasper
import java.awt.Desktop;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JOptionPane;
import br.difere.ti.database.ConexaoBD;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
public class GeradorRelatorio {
private ConexaoBD database = null;
private PreparedStatement ps;
private Connection con;
private ResultSet rs;
public GeradorRelatorio() {
}
public void gerar( String jasperFile, String query, String exportPrint, String pdf ) throws JRException , SQLException, ClassNotFoundException {
database = new ConexaoBD();
con = database.getConexao();
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery( query );
//implementação da interface JRDataSource para DataSource ResultSet
JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );
//executa o relatório
Map parametros = new HashMap();
/* Preenche o relatório com os dados. Gera o arquivo .jrprint */
JasperFillManager.fillReportToFile( jasperFile, parametros, jrRS );
/* Exporta para o formato PDF */
JasperExportManager.exportReportToPdfFile( exportPrint );
abrirPdf(pdf);
}
private static void abrirPdf(String caminho) {
File pdf = new File(caminho);
try {
Desktop.getDesktop().open(pdf);
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(null, "Erro ao abrir arquivo: " + ex);
}
}
}
GeradorRelatorio gerador = new GeradorRelatorio();
String consulta = "";
String jasperFile = "";
String exportaPrint = "";
String pdf = "";
...
consulta = "SELECT * FROM tabela WHERE id = "+id+"";
jasperFile = "path\\tabela.jasper";
exportaPrint = "path\\tabela.jrprint";
pdf = "path\\tabela.pdf";
try {
gerador.gerar(jasperFile, consulta, exportaPrint, pdf);
} catch (JRException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
...