estou tentando montar um relatorio com dados a partir de um XML
crio um xmldatasource com o documento xml e o recoPath para pegar os valores no xml
exemplo:
Aqui eu crio um HashMap para setar os valores que eu pego do xml
e uso o put do hasmap para inserir o valor
no iReport onde eu criei paremeters ele recebe os valores
mais onde eu preciso q a variavel seja dinamica para agregar
varios tipos de produtos, eu não consigo fazer ele receber esses valores dinamicos
ou seja mostrar varios produtos na aba Details;
parameters = new HashMap();
field = new JRDesignField();
xmldatasource.next();
field.setDescription("xProd");
field.setValueClass(String.class);
strProd = (String) xmldatasource.getFieldValue(field);
System.out.println(field.getDescription() + "=" + strProd);
parameters.put("teste", strProd);
impressao = JasperFillManager.fillReport(reportFileName, parameters, xmldatasource);
Eu estou trabalhando num projeto que cria um xml a partir do iReport …
e para resolver o problema dos produtos eu resolvi através da query
Exemplo:
No meu projeto eu tenho um relatorio mãe e chama um subrelatorio itens , neste subrelatorio eu tenho uma tabela na banda detail , e na query o select dos itens , na banda detail ja faz o FOR por default , entao com isso retorna a lista de produtos de uma determinado codigo que eu passo por parametro para este subrelatorio.
Acho q não consegui ajudar muito , mas é um começo , responde oq vc conseguiu entender e eu vo tentando te ajudar
Bom aqui esta a imagem do desenho no IReport
sobre a query eu não estou utilizando, eu apenas monto o a estrutura
gero o arquivo JRXML e o .jasper e utilizo o HashMap para inserir os dados
Aqui o exemplo do codigo para inserir os valores no relatorio
db = dbf.newDocumentBuilder();
doc = db.parse("D:/Projetos/TJSistemas/TJNfe/Implementacao/ServletNFe/web/xmls/testeNFe.xml");
String reportFileName = "D:/Projetos/Patric/GerarRelatorio/web/recursos/Nf-e_Retrato.jasper";
String xmlFileName = "D:/Projetos/TJSistemas/TJNfe/Implementacao/ServletNFe/web/xmls/testeNFe.xml";
parameters = new HashMap();
field = new JRDesignField();
recordPath = "/NFe/infNFe/det/prod";
xmldatasource = new JRXmlDataSource(doc, recordPath);
xmldatasource.next();
field.setDescription("xProd");//Campo da xml que eu quero pegar valores
field.setValueClass(String.class);
strProd = (String) xmldatasource.getFieldValue(field);//passo resultado para uma string
System.out.println(field.getDescription() + "=" + strProd);
parameters.put("teste", strProd);// colocar valor da String no campo do IReport a ser mostrado
impressao = JasperFillManager.fillReport(reportFileName, parameters, xmldatasource);
Eu tbem estou trabalhando num projeto de DANFE hehe ,
assim vc ta colocando o field $F{produto} na banda detail??
Pq a detail te faz um FOR por default … e como nunca trabalhei com HashMap nao vou poder te ajudar mto , como disse eu pego minha informações através de um select que me retorna várias linhas…
Se vc tiver interesse em tentar fazer por select eu posso te ajudar
entao eu naum tenho preferencia por usar select ou hashmap
eu estou usando pq foi os exemplos que eu havia encontrado
mais se por select resolver meu problema ta valendo
vc tem o teu relatorio mãe ali neh , vc cria um subrelatorio “itens” e coloca la em baixo , dae vc cria a tua tabelinha de itens neste subrelatorio , vc vai na query deste subrelatorio e faz o teu select retornando varias linhas …
Ahh , nao esquece que o cabeçalho da tabela dos itens onde vai “codigo” “descriçao” “valor” … tem q ir numa banda em cima da banda “detail” e onde vai set setado os valores vai na banda detail para fazer o FOR
Desculpa a demora pra responde mas ta corrida a coisa aqui hj!
Erros de compilação .\teste.jasper.
net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. Cannot cast from JRXmlDataSource to String value = (java.lang.String)(((net.sf.jasperreports.engine.data.JRXmlDataSource)((net.sf.jasperreports.engine.JRDataSource)parameter_REPORT_DATA_SOURCE.getValue())).dataSource(“NFe/infNFe/ide/cNF”));//$JR_EXPR_ID=9$ <------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 2. Cannot cast from JRXmlDataSource to String value = (java.lang.String)(((net.sf.jasperreports.engine.data.JRXmlDataSource)((net.sf.jasperreports.engine.JRDataSource)parameter_REPORT_DATA_SOURCE.getValue())).dataSource(“NFe/infNFe/ide/cNF”));//$JR_EXPR_ID=9$ <------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 3. Cannot cast from JRXmlDataSource to String value = (java.lang.String)(((net.sf.jasperreports.engine.data.JRXmlDataSource)((net.sf.jasperreports.engine.JRDataSource)parameter_REPORT_DATA_SOURCE.getValue())).dataSource(“NFe/infNFe/ide/cNF”));//$JR_EXPR_ID=9$ <------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 3 errors at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:193) at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:587) at java.lang.Thread.run(Unknown Source)
confesso que me perdi um pouco naquilo que vc ta querendo …
pq teu problema nao era no itens? nao precisa de hyperlink para fazer os itens , só fazer um subrelatorio e na query do proprio ireport fazer o select , e criar os FIELDS no ireport para cada dado que vem da query , cuidando os types dos fields …
Bomm sim, eh q eu estava jogando os valores manualmente com HashMap
da forma com que vc estava falando com query tinha q criar uma conexao com o xml direto no IReport
entao to começando la pelos primeiros valores do DANFE
ou seja voltei la no começo
criei um dataSource no IReport e estou tentando fazer a consulta
isso , cria um relatorio “mãe” e la nesse relatorio mãe cria um subrelatorio itens , q dentro deste subrelatorio itens vai ter a query que busca do BD os itens da determinada danfe … a nao esqueca de colocar os itens na banda detail
qualquer duvida posta ae q se eu souber tento ajudar
Montei um XML como exemplo no iReport… configurei o XML e tals…
Mas como executo pela minha aplicação usando diferentes arquivos XML como parâmetro ??
Sendo que os XML tem o memso layout… so as informações que mudam… so queria que ao executar o JASPER ele usasse um XML diferente… como posso chamar isso de dentro da minha aplicação ?
Bom… eh o seguinte… pretendo montar o DANFE a partir do XML criado… e usar esse XML coo fonte de dados para meu iReport…
Aí seria mapear os campos e pronto…
Mas me surgiu uma dúvida em relação aos campos do DANFE…
Percio que talvez terei que montar 2 relatórios… um para Produtos e outro para Serviços…
Mas mesmo considerando somente produtos… alguns campos do DANFE são opcionais… o que pode mudar minha fonte de dados (Arquivo XML).
Alguém passou por isso, ou coseguiu montar esse jasper em cima do XML ?
Essa idéia daria certo ou terei mesmo que passar os parâmetros para o jasper via aplicação ?