IReport-Imagem no Header e Relatório Complexo

Sou novato com o iReport(usei iText no passado, mas foi só), tó lendo o tutorial do furutani(um tanto antigo), e tenho duas perguntas(uma fácil e
uma complexa) sobre iReport 3.0:

1)Como insiro uma imagem como cabeçalho no iReport(terá cerca de 800x200 ficará no topo do
relatório)?
2)Essa é mais f… é sobre como montar uma pesquisa complexa:

O o usuário digita o número de uma fórmula numa página, meia dúzia de dados, e aperta “gerar Relatório”.No Relatório haverá esses dados digitados, mas os referentes a fórmula digitada buscada no Banco.Mas não são os dados do BD que irão para a tela(a não ser dois únicos campos que vem direto do BD),e sim o resultado do processamento desses dados.Vou dar um exemplo que é melhor:

Exemplo de tabelas:
Formula(id,nome,desc,indices,pesos) e Valor_Indice(id_indice,data,valor)

Exemplo de registros:
Formula(11,“Fórmula do Pão”,"(((0.4*(TrAt/TrAn))+(0.6*(FbAt/FbAn)))-1);",“Tr,Fb”,“0.4,0.6”);

Valor_Indice(“Tr”,01/2001,1.2901);
Valor_Indice(“Tr”,11/2008,9.9113);

Quando uma fórmula é digitada(EX.: 11 do meu post anterior),o sistema localiza o registro dessa fórmula, seleciono o campo índices e pesos da fórmula e localizo esses índices na tabela de valor_indice.
Eu pego as datas inicial e final de pesquisa e seus respectivos valores do campo valor da tabela valor_indice e passo a um método java que divide(o valor na data maior sobre a menor) e multiplica pelo respectivo peso para obter o valor final do índice e passo a outro método, que calcula o valor da fórmula no periodo.
Ou seja, no exemplo anterior, Ao localizar “Tr,Fb” taco num array de Strings busco no BD quando for igual ao índice e calculo.Por exemplo, em Tr eu pego [b]9.9113 divido por 1.2901 e multiplico pelo peso (0.4)[b] e devolvo o resultado para relatório(o mesmo eu faria com “Fb”).Cada fórmula tem no máximo, 8 índices, e lógico, 8 pesos. Ou seja, ao relatório, eu só devolvo resultados, tipo Tr-7.6825 e assim sucessivamente.Eu presumo que quando isso ocorre, não é para linkar a fonte de dados diretamente(apesar de 2 campos terem que ser buscados diretamente da base além de outros 6 da página anterior, a de submissão do relatório),
qual(e como é) a estrutura de montagem que eu devo seguir??? :?:

[quote] 1)Como insiro uma imagem como cabeçalho no iReport(terá cerca de 800x200 ficará no topo do
relatório)? [/quote]
insere um componente imagem, está na barra de ferramentas. Crie um parâmetro no menu Visualizar -> parametros do tipo String. Na sua aplicação você passa o “path/nomedaimagem” para esse parâmetro.

você pode trabalhar com scriptlets que são classes java que dá para manipular os atributos, parâmetros, campos e variáveis do relatório…

http://www.guj.com.br/posts/list/19107.java

1 ) A imagem você pode usar um componente já pronto e passar o caminho dela por parametro.

2) Cara eu evito ao máximo levar muita complexidade de cálculos, formatações para o relatório, mas isso é, uma opção minha.
Eu prefiro trazer essa parte para dentro do java e crio objetos específicos para a saída. Isso quer dizer que gero a minha lista e mando uma coleção como fonte de dados para relatório e uso o jasper somente para exibir e mandar para o pdf as informações. É claro que quando o resultado da consulta é muito grande isso inviabiliza esta solução, mas no seu caso acho que atende.

[]s

1)Pergunta 1 parece que funciona Ok.Valeu pessoal.

2)Augusto, eu sei o que são scriptlets, mas talvez possa colocar uma complexidade a mais no relatório.

Eduardo, vou ser um pouco mais específico:
No relatórios, os dados (Empresa,Nome, número_formula e valor são digitados na página anterior pelo usuário que aperta o botão “gerar relatório”).Ocorre aquele processamento que eu mencionei no tópico acima e entrega os dados processados dos Índices(até 8) e da fórmula.
Além disso, o relatório exibe um número do processo(gerado automaticamente pelo sistema para controle do Administrador) e o valor que foi digitado pelo usuário antes da geração do relatório, atualizado pela fórmula calculada.Ou seja, os dados tem fontes distintas,
sendo parte da página anterior digitada pelo usuário, parte do banco(como atualização da tabela Consulta com o número e a data), e parte de um pós-processamento do banco(os índices e a fórmula), ou seja, até 33 campos(Apenas 25 se a fórmula tiver um só índice).
Minha pergunta a ti: Como você criaria objetos específicos para a saída? Criaria 3 Collections para cada tipo proveniente de dados(página, direto do banco, e pós-processamento dos índices)???
Se puder, ponha um snipet de código/pequeno exemplo.

Colocar complexidade? Como se voce não quisesse fazer algo complexo demais.

Mas por que voce não passa por parametros?

Calcula em um JavaBean os resultados e vai adicionando no Map com parametros para o relatorio.

Na realidade eu criaria uma classe de resultado de relatorio e ela teria os atributos que o seu relatorio precisaria apresentar.

public class FormulasConstruidas{
  //o nome dos atributos tem que ser iguais aos fields do relatorio
  //atributos da pagina
  private String empresa;
  private String nome;
  private String numeroFormula;
  
  // tabela consulta
  private Date dataAtualizacaoFormula;

  //lista dos campos
  List<Field> fields;

  //getters e setters 
}

public class Field{
  //o nome dos atributos tem que ser iguais aos fields do relatorio
  private String indice;
  private String formula;

  //getters e setters 
}

No seu back bean ou no evento coloca um método que vai fazer toda essa parte do banco e que te devolve uma lista de fields.

Depois vc chama o relatorio passando uma lista formulas contruidas ± assim :

//carrega o relatório já compilado
ServletContext servletContext = (ServletContext) contexto.getExternalContext().getContext(); 
//relatorio pai
String caminhoRelatorio = servletContext.getRealPath("/WEB-INF/reports/seurelatorio.jasper");
String subRelatorio = servletContext.getRealPath("/WEB-INF/reports/seurelatorio.jasper");

JasperReport relatorio = (JasperReport) JRLoader.loadObject(  caminhoRelatorio );
JasperReport subRelatorio = (JasperReport) JRLoader.loadObject(  caminhoSubRelatorio );

			
//seta os parametros
Map<String, Serializable> param = new HashMap<String, Serializable>();
String logo = servletContext.getRealPath("/images/os.png");
param.put("logo", logo );
param.put("subReport", subRelatorio);
         
//lista		
FormulasConstruidas formula = new FormulasConstruidas();	                       
formula.setEmpresa("vem da tela");
//...
formula.setFields(consultarIndicesFormulas(codigoFormula));
List<FormulasConstruidas> listaRelatorio= new ArrayList<FormulasConstruidas>(); 
listaRelatorio.add(formula);

//cria um data source a partir de uma lista	
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(listaRelatorio);

//gera o relatorio
bytes = JasperRunManager.runReportToPdf(relatorio, param, ds);
           	          
}catch(JRException exception){
    exception.printStackTrace();
}
	
HttpServletResponse response = (HttpServletResponse) contexto.getExternalContext().getResponse();  
//envia relatorio para browser
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
response.setHeader("Content-disposition", "attachment;filename=SeuRelatorio.pdf");	
ServletOutputStream out = response.getOutputStream();
out.write(bytes);
out.flush();
out.close();
//sem o responseComplete o relatório não é exibido.
contexto.responseComplete();  

Nao sei como é o layout do relatorio, mas eu criaria um relatorio mais externo com a cara que o seu relatorio deve ter e um subRelatorio com os itens que pode ser variados de 25 a 33.

Se precisar ter mais uma lista e/ou mais um subrelatório a idéia é a mesma.

[]s

Mark_Ameba,
eu disse que é complexo para mim, que apesar de ter quase 6 anos de java, nunca parei para fazer um relatório no iReport(ia fazer uma vez, mas o projeto foi cancelado no meio, isso no tempo do 1.2xxx). Eu deduzi que seria “difícil” pela natureza distinta da fonte dos dados(e os tutoriais que eu sentei para estudar não falavam muito disso, além de serem antigos comparado com a versão 3.0).
Mas eu posso estar enganado e isso ser “mamão-com-açucar”, não? 8)

eduardocsanto, eu vou analisar com cuidado a sua solução, me parece bem centrada.
Mas quanto ao subrelatório de índices(que é variável pois uma fórmula pode ter de 1 a 8), eu posso perfeitamente deixar ele(esse subrelatório) marcado com 8 campos vagos e preencher SE houver campos certo?Tipo campo1 Tr-12.3456, campo2-XXXX campo3-XXXX sem problemas né?Valeu cara, segunda eu recebo todos os dados e vou meter a “mão-na-massa”! :smiley:

Não… minha intenção com aquela frase é que voce realmente quer fazer algo complexo demais… não acho legal fazer varias contas no relatorio.

Apesar que voce pode deixar os 8 campos sim e no relatorio deixa os campos com a opção “blank when null”

Pode sim tranquilo só usar a opção que o Mark_Ameba citou.

Boa sorte!

[]s

Nãaaooo!!!O relatório só terá os dados processados!!!
O problema é que NO ATO de gerar o relatório, várias contas terão que ser feitas(eu já deixei uma classe pronta para isso), e meus problemas estão mais no banco do que qualquer outra coisa(Não sei se faço uma SP para armazenar/disparar as consultas ou não).
Só para deixar registrado:
quando o cliente digita o número da fórmula, e as datas inicial e final e digita “gerarRelatório”, ocorre os seguintes passos:
1-A fórmula é localizada na base, e os campos indices e pesos são selecionados;
2-Há uma comparação para saber QUANTOS são os indices e QUAIS são eles;
3-É achada o valor_do_indice nas datas correspondentes na tabela valor_indice;
4-cada indice tem seus dois valores_indice passados a um método calculaIndice(valor_inicial,valor_final);
5-O resultado desse(s) cálculo(s) são passados a um método do tipo(exemplo para 2 indices e 2 pesos) com seus pesos:
double calcularFormula2Indices(result_indice1,result_indice2,peso1,peso2);
6-O relatório será gerado exibindo o resultado de cada índice e da fórmula no período dado, alguns dados digitados pelo usuário e o número dessa consultano sistema.

Agora eu fui claro pq eu disse “complexo”? :smiley:

Mark e eduardocsanto, valeu, vou testar aqui. :thumbup: