Sql dinamico no ireport

Galera,
estou tentando fazer um sql dinamico no ireport e nao estou conseguindo. Fiz o seguinte:

  • fiz o layout no ireport
  • coloquei a query desejada
  • adicionei nessa query um parametro
  • fiz minha classe java para gerar o relatorio
  • coloquei a mesma query q estava la no ireport na minha classe
  • copiando ate mesmo o parametro
    mas tem o seguinte, qndo vou gerar o relatorio ele pega o oarametro q coloquei la no ireport, nao deixando eu colocar outro.
    Gostaria de saber se alguem poderia me dizer como faco para gerar essa query dinamica.

Valew!
abs

A solução é simples, basta não fazer a query diretamente no relatório :slight_smile: . Execute sua query na aplicação da maneira que quiser, pegue o ResultSet e tranforme ele em uma lista. Então utilize o objeto JRBeanCollectionDataSourcee passe o objeto prontinho prontinho para o relatório:

//Método onde adquiro a lista public void rliLista() { /* Obtem a coleção de objetos * para compor o detail do relatório * a partir do Hibernate */ List resultado = f.selecionaTudo("ListaInfratores"); JRBeanCollectionDataSource jrc = new JRBeanCollectionDataSource(resultado); /* chamando o metodo para construir * o relatório apartir de um collection */ nova="rliLista"; constroiRelatorio(jrc); } }

[code]//metodo que constroi o relatorio passando o objeto anterior
public void constroiRelatorio(JRBeanCollectionDataSource jrc) {
try {
//compila relátorio

		JasperReport relatorio = JasperCompileManager.compileReport(layout);
		
			
		// prepara o relatorio para impressao
		 JasperPrint impressao = JasperFillManager.fillReport(relatorio,
				parametros, jrc);
		
		 //Exibi o resultado da impressão em padrão swing
		if(!nova.equals(atual)  && viewer!=null){
			viewer.dispose();
			viewer=null;
		}
		if(viewer==null){
		atual=nova;
		 viewer = new JasperViewer(impressao, false);
		 viewer.setExtendedState(JFrame.MAXIMIZED_BOTH);
		 viewer.setVisible(true);
		 }	else {
			viewer.setVisible(true);
		}
		
		viewer.addWindowListener(new WindowAdapter(){
			public void windowClosed(WindowEvent arg0) {
				viewer=null;
				instance=null;
			}
	});

	} catch (JRException e) {
			e.printStackTrace();
		}

}[/code]

Esse último metodo você pode dar uma boa enxugada nele afinal fiz algumas coisas a mais neles (reaproveitei de um projeto antigo).

Flw.

Tudo bem tRuNkSnEt, vc me deu uma luz muito boa.

mas ainda fiquei com duvida, no caso de eu nao estar utilizando hibernate, pq ainda estou fazendo testes usarei o hibernate, mas apriore nao.

faco minha query normal e passo ela para o metodo da lista??? Ou coloco tudo no mesmo metodo, digo, a query e a lista?

valew brigadaoooo!

Vai la o IReport e cria sua Query normalmente, sem usar parametros nem nada(coloca no where uns parametros fixos so pra ele trazer os campos pra vc trabalhar)

depois na hora de chamar o jasper vc faz o select que quiser e joga em um resultSet e depois passa esse result pro jasper assim:

   ResultSet seuResult = suaConsulta;
   JasperFillManager.fill(relatorio, map, new JRResultSetDataSource(seuResult));

verifica se os nome dos componentes sao estes mesmos, to fazendo de cabeça!!!

[edited]
observando que os campos da query que vc fez la no IReport devem estar presentes nessa sua query dinamica!!!

Galera,
mil perdoes … mas nao estou conseguindo fazer o relatorio.
sera que alguem pode me mandar um codigo exemplo completo para que eu possa dar uma olhada, pq eu nao estou entendendo algumas coisas, e talvez isso resolva se alguem mandar um exemplo completo.

fico grato!

abs

o que vc nao esta entendendo???

Cara, é o seguinte:

Vamos por parte, 1º:
Tenho duvidas como vou fazer para criar essa lista para popular o meu relatorio. nao consigo visualizar isso, esta confuso pacas.

vcs tem me ajudado, mas esta dificil.

para ver se facilita vou mandar o codigo do relatorio.

esse é o codigo:

[code]public class TesteRelatorio2 {

public TesteRelatorio2(){
	
	Statement stmt = null;
	ResultSet rs = null;
	ArrayList valor = new ArrayList();
	
	String sql = "select * from cliente";
			
	try {
		stmt = Conexao.getConnection().createStatement();
		rs = stmt.executeQuery(sql);

		while(rs.next()){
			ArrayList valores = new ArrayList();
			valores.add(rs.getString(1) + ""); 
			valores.add(rs.getString(2) + "");
			valor.add(valores);
			
			System.out.println(rs.getString(1) + " - " + rs.getString(2));
		}

	} catch (SQLException e) {
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}

	String dir = "C:\desen\tools\iReport-1.2.0\testes_de_relatorios\teste_raeal1.jrxml";
	
	try{
		JasperDesign design = JasperManager.loadXmlDesign(dir);
		JasperReport jr = JasperManager.compileReport(design);
		JRField[] campos = jr.getFields();
		for(int i=0;i<campos.length; i++){
			System.out.println("Campo " + i + " " + campos[i].getName().toString());
		}
		ArrayList dados = valor;
		HashMap parameter = new HashMap();

// for(int i=0; i<dados.size(); i++){
parameter.put("Cliente: ", dados);
// parameter.put("Data: ", array[2]);
// parameter.put("Nome do produto: ", array[3]);
// }
JasperPrint jp = JasperManager.fillReport(jr, parameter, Conexao.getConnection());
JasperViewer jsViewer = new JasperViewer(jp, false);

		jsViewer.show();
	} catch(Exception e) {
		e.printStackTrace();
	}
	
}

public static void main(String[] args) throws SQLException, ClassNotFoundException {
	new TesteRelatorio2();
}

}[/code]

Galera,
meu maior problema é nao conseguir popular meu HashMap para que ele possa jogar no relatorio, nao eh assim q funciona?
primeiro popula o HashMap e depois joga para o relatorio?
pq se for assim o negocio … eh isso q falta.

Valew

AWE galera nao esta alterando minha sql
tá ficando a do iReport
olha meu código

@SuppressWarnings("static-access") private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) { try { String jasperFile = "C:\Arquivos de programas\projetosNetBeans\Controledevales\src\report2.jasper"; String sql = ""; if ((jFormattedTextField3.getText().equals("")) & (jFormattedTextField3.getText().equals(""))) { sql = "SELECT * FROM MOVVALE INNER JOIN TABPROF ON TABPROF.CODPROF = MOVVALE.CODPROF WHERE TABPROF.CODPROF = " + jTCodigo.getText(); } else { data = dataformatador.parse(jFormattedTextField3.getText()); data2 = dataformatador.parse(jFormattedTextField6.getText()); sql = "SELECT * FROM MOVVALE INNER JOIN TABPROF ON TABPROF.CODPROF = MOVVALE.CODPROF WHERE TABPROF.CODPROF = " + jTCodigo.getText() + " and DTMOV BETWEEN '" + dataformatador2.format(data) + "' and '" + dataformatador2.format(data2) + "'"; } JOptionPane.showMessageDialog(null, "cod!\n" + jTCodigo.getText()); Class.forName(driver); Connection con = DriverManager.getConnection(url, login, pwd); Statement stm = con.createStatement(); ResultSet rs = stm.executeQuery(sql); JRResultSetDataSource jrRS = new JRResultSetDataSource(rs); Map parametros = new HashMap(); parametros.put("SALPROF", new Double(10)); this.impr = JasperFillManager.fillReport("C:\Arquivos de programas\projetosNetBeans\Controledevales\src\report2.jasper", parametros, con); JasperFillManager.fillReportToFile(jasperFile, parametros, jrRS); JasperViewer ver = new JasperViewer(impr, false); ver.viewReport(impr, false); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "ERRO! " + e.getLocalizedMessage()); } }

o que posso ta errando?