Como passar mais de uma SQL pro relatório IReport? [RESOLVIDO]

Olá galera

Como eu faço pra passar 2 SQL pro relatório

Exemplo:

eu tenho no relatório 2 campos NOME e DESCRICAO

essa SQL preenche o campos

[code]

“SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 2 AND codInspecao = 2 AND codComponente = 2 AND codPeriferico = 2 AND codSub = 2”[/code]

certo com essa SQL eu preenche umá página

ae pra outra página eu preciso adicionar mais uma sql

"SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 1 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1"

ou seja a mesma sql com valores diferentes, cada SQL que eu passar vai preencher uma página

A classe que chama o relatório é essa, tem umas linhas comentadas com uma solução que eu não entendi direito e deu erro

[code]
public void gerar( String jasperFile ) throws JRException , SQLException, ClassNotFoundException {

	Class.forName( driver );
	Connection con = DriverManager.getConnection( url , login , pwd );
	Statement stm = con.createStatement();
	String sql = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 1 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";

	String sql1 = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 2 AND codInspecao = 2 AND codComponente = 2 AND codPeriferico = 2 AND codSub = 2";
	
	ResultSet rs = stm.executeQuery( sql );
	
	/*ArrayList<String> numPaginas = new ArrayList<String>();
	numPaginas.add(sql);
	numPaginas.add(sql1);*/
	
	//implementação da interface JRDataSource para DataSource ResultSet
	
	//JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(numPaginas);

	JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );
	
	Map<String, String> parametro = new HashMap<String, String>();
	parametro.put("nomeEclusa", "BARRA BONITA");
	parametro.put("nomeCadastro", "INSPEÇÃO");
	parametro.put("data", "08/02/2002");
	parametro.put("data1", "09/02/2002");
	parametro.put("nomeEstrutura", "PORTA JUSANTE");
	parametro.put("nomeComponente", "PORTA JUSANTE PARTE 1");
	parametro.put("nomeItem", "PORTA JUSANTE PARTE 11");

	/* Preenche o relatório com os dados. Gera o arquivo BibliotecaPessoal.jrprint    */
	//JasperFillManager.fillReportToFile( jasperFile, parametros, jrRS );

	/* Exporta para o formato PDF */
	//JasperExportManager.exportReportToPdfFile( "teste.jrprint" );
	
	JasperPrint jp = JasperFillManager.fillReport(jasperFile, parametro, jrRS);        
	JasperViewer.viewReport(jp, false);    
}[/code]

Atenciosamente

Se eu entendi direito você quer imprimir esses relatórios referente a apenas esses 2 usuarios?

Não é seu cliente que escolhe qual usuário quer q apareça no relatório??

Mas voltando ao assunto… é 1 sql só … e utilize o ResultSet rs.next(); para ele percorrer toda tabela do BD…

Isso é função básica de SQL e lógica hehe

Não, não eh soh essas duas

Eu vou criar uma tela pra ele selecionar qual nome ele vai querer gerar no relatório mais eu vou pegar os dados e vai ficar mais ou menos com esses valores

Não é soh uma SQL, eu preciso de varias consultas

Pq pra cada consulta eu obtenho apenas 1 nome e 1 descrição

ali eh apenas um exeplo doke pode acontecer

mais pode ser assim tbm

[code] String sql = “SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 1 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1”;

	String sql1 = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 2 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";[/code]

Viu eu só mudei o valor do d.codTipoDescrição pra 2 e essa SQL me traz outro resultado

se eu mudar o valor do codComponente = 2 já eh outro resultado, cada valor que eu mudar, pode ser um por vez, vai me trazer um resultado diferente

Amigão acho que vc nao ta entendendo…

A unica informação que varia no teu SQL é os codigos do campo.

E isto vai ser mudado como um laço de FOR, vc nao vai fazer 1 SQL pra simplesmente colocar manualmente qual codigo de usuario quer imprimir.

Vc vai escolher la FULANO DE TAL e o relatório vai imprimir o codigo do FULANO DE TAL…

É 1 SQL com RS.NEXT() para percorrer as suas tabelas do SQL que são iguais independentes de quantos usuarios forem ou qual deles você quer

[quote=brunorota]ali eh apenas um exeplo doke pode acontecer

mais pode ser assim tbm

[code] String sql = “SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 1 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1”;

	String sql1 = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 2 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";[/code]

Viu eu só mudei o valor do d.codTipoDescrição pra 2 e essa SQL me traz outro resultado

se eu mudar o valor do codComponente = 2 já eh outro resultado, cada valor que eu mudar, pode ser um por vez, vai me trazer um resultado diferente

[/quote]

To pensando aki e não consigo enxergar uma lógica do tipo

Ta certo eu só vou mudar os valores, mais eu pedi mais de uma SQL pq pra cada valor que eu mudar vai virar uma sql “diferente”

eu sei que do desse jeito eu consigo gerar um relatório pra cada item que eu preciso, gerando um relatório por vez, mais eu quero gerar 1 relatório com varias páginas

Na vdd no mesmo relatório eu vou ter no máximo 5 páginas

SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 1 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1

variando o d.codTipoDescricao de 1 até 5

pra cada número tenho um dado diferente

O rset.next eu sei que ele é usado pra quando vc tem uma lista de valores e o .next() pega o dado da próxima linha e aponta o marcador pra próxima linha e assim por diante

Se eu fizer isso da certo?


String sql = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 1 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";

String sql1 = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 2 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";

String sql2 = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = 3 AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";

ResultSet rs = stm.executeQuery( sql );
rs = stm.executeQuery(sql1);
rs = stm.executeQuery(sql2);

Não conheço nada parecido do jeito que vc me falou =/

Amigo pense assim:

int condicaoDoUsuario = ??? (TELA VISUAL ONDE USUARIO DIGITA)

SQL = “SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = condicaoDoUsuario AND codInspecao = condicaoDoUsuario AND codComponente = condicaoDoUsuario AND codPeriferico = condicaoDoUsuario AND codSub = condicaoDoUsuario ORDER BY codTipoDescricao”;

Aqui fica o resultSet certo?

rs.next();
stm.executeQuery(SQL); //SE EXISTER USUARIO = CONDICAO DO SQL MOSTRA // E SE TIVER MAIS DE 1 VAI MOSTRAR TMB

É mais ou menos isso …

Isso eu sei

Mais a minha condição vai ser assim

vai ter 5 opções

1 - Descrição
2 - material
3 - mao de obra
4 - correção
5 - equipamento

o usuario vai selecionar qual item ele quer que entre no relatório certo, podendo escolher ateh os 5

então aqui eu vou ter um

ArrayList<Integer> codigos = new ArrayList<Integer>();

o meu sql só vai variar o código do tipo descrição

vai ficar assim

"SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = "+ codigos.get(i) +" AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";

os outros números eu deixei fixo que vai ser fixo pro mesmo relatório, o unico valor na sql que vai mudar por relatório vai ser o d.codTipoDescricao

E pra cada valor eu vou ter um resultado, que seria pra cada valor mudado vai ser uma página diferente

E o resultSet pelo que eu sei guarda o resultado de UMA consulta SQL por vez, não da pra eu armazenar por exemplo 3 consultas SQL dependendo de quantas opções o usuário desejar

Não consigo armazenar tudo que eu kero em apenas 1 ResultSet, pq vai ser necessário eu usar varias consultas SQL

Exato. e é por isso que vc usa o RS.NEXT amigo…

Esta perfeito agora, só falta vc utilizar do RS.NEXT para que ele percorra a sua UNICA SQL :wink:

fiz isso e não funcionou apareceu que o documento não possui páginas

[code]ArrayList codigos = new ArrayList();
codigos.add(1);
codigos.add(2);

	JRResultSetDataSource jrRS = null;
	for(int i=0; i<2; i++){
		
		String sql = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = "+ codigos.get(i) +" AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";
		ResultSet rs = stm.executeQuery( sql );
		/*while(rs.next())
			System.out.println(rs.getString("nomeDescricao"));*/
		jrRS = new JRResultSetDataSource( rs );
	}[/code]

Oq eu tenho que modificar ae pra dar certo?

Pq confesso que ainda não sei como vou adiconar o resultado de várias pesquisas diferentes em um único ResultSet

Amigo acho que está fazendo confusão…

A lógica do teu SQL deve ser a mesma que vc fosse usar para mostrar as informações na tela…

pode se usar até mesmo um INNER JOIN para pegar as informações da tabela…

Mas o ResultSet vai guardar as informações em ROWS INDEPENDENTE de qntas informações forem

Desde que você utilize o RS.NEXT para ele percorrer as tabelas.

Não tem como eu fazer uma lógica pra mostrar TODAS as informações que eu quero no mesmo SQL

Eu preciso fazer consultas diferentes

por isso que eu estou falando que eu precisava de mais de um SQL =/

 s

Eu faço através do ResultSet como falei pra você…

Nao precisei fazer nada de Procedures, faço quantas consultas quiser…

No maximo quando realmente nao dá eu utilizo o ArrayList pra rodar os SQL…

Estou sem tempo, poderia analisar seu código mas realmente nao dá

dessa maneira eu tenho duas pesquisas armazenadas no meu ResultSet?

EX:

[code]rs = stm.executeQuery( sql );

	rs.next();
	
	rs = stm.executeQuery(sql1);[/code]

Nao sei se funcione este código…

Mas pra que 2 sqls? o SQL é o mesmo só muda o código descricao…

Amigo faz com 1 sql, e usa o ResultSet pra guardar as informacoes … to tentando te explicar isso ja faz tempo

Deixa eu ver se eu entendi

É q pelo q sei do ResultSet ele guarda uma pesquisa que pode ter varias linhas

Não sabia que dava pra ele guardar varias pesquisas no mesmo resulSet

o código vai ficar assim?

[code]for(int i=0; i<=2; i++){
String sql = “SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = “+ cod.get(i) +” AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1”;

		System.out.println(sql);
		
		rs = stm.executeQuery(sql);
		System.out.println(rs.getString("nomeDescricao"));
		rs.next();		
	}[/code]

jah fiz vários testes e não sei como amarzenar consultas no ResultSet como vc recomendou

=/

String sql = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao = "+ cod.get(i) +" AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";

Testa o seguinte sql abaixo

String sql = "SELECT t.nomeDescricao, d.descricao FROM tiposDescricao t, descricoes d WHERE d.codTipoDescricao = t.codTipoDescricao AND d.codTipoDescricao AND codInspecao = 1 AND codComponente = 1 AND codPeriferico = 1 AND codSub = 1";

kra vc me deu uma luz hehehe

Obrigado novamente

Eu vou usar essa sql e depois vou fazer o seguinte eu deleto as linhas no ResultSet que o usuário não escolher

Pq com essa sql ele vai listar todos, não vai ser por seleção neh, soh que pela seleção eu deleto as linhas que eu não quero ^^

Obrigado novamente vou testar agora, mais assim vai dar certo ^^

Desculpe o incomodo cara

Valew ^^