Sql dinamico no ireport

8 respostas
M

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

8 Respostas

tRuNkSnEt

A solução é simples, basta não fazer a query diretamente no relatório :) . 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);
	}
	}
//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();
			}

	}

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

Flw.

M

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!

fredferrao

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!!!

M

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

fredferrao

o que vc nao esta entendendo???

M

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:

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();
	}
}
M

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

colosos_colossus

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?

Criado 28 de março de 2006
Ultima resposta 10 de jul. de 2009
Respostas 8
Participantes 4