JasperReports com base de dados XML

24 respostas
PatricMaffi

Olá pessoal

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:

String reportFileName = "D:/Projetos/Patric/GerarRelatorio/web/recursos/Nf-e_Retrato.jasper";
doc = db.parse("D:/Projetos/TJSistemas/TJNfe/Implementacao/ServletNFe/web/xmls/testeNFe.xml");  
String recordPath = "/NFe/infNFe/ide";
xmldatasource = new JRXmlDataSource(doc, recordPath);

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);

espero que tenham entendido o problema

24 Respostas

guilhermetonetto

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 :slight_smile:

[]'s

PatricMaffi

Voce não teria alguns detalhes em codigo
ou algum print para eu ter uma ideia de como vc esta fazendo??

guilhermetonetto

vamos fazer o contrario faz um print ae do teu relatorio no ireport e da query dele q eu posso tentar entender e ver onde esta o erro …

fico aguardando :slight_smile:

[]'s

PatricMaffi

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);




guilhermetonetto

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 :wink:

[]'s

PatricMaffi

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

=D
se vc puder me mostrar como vc esta fazendo :smiley:

guilhermetonetto

é façil !

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!

se ficou com duvida posta q eu respondo :slight_smile:

[]'s

PatricMaffi

estou tentando fazer direto a query pelo IReport

fiz um field com nome cNF

e criei um hyperlink com o data source com esse codigo

((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("NFe/infNFe/ide/cNF")

seguintes erros

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)

guilhermetonetto

os type dos fields estao corretos??

confesso que me perdi um pouco naquilo que vc ta querendo … :frowning:

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 …

[]'s

PatricMaffi

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

=///

guilhermetonetto

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 :wink:

qualquer duvida posta ae q se eu souber tento ajudar

[]'s

PatricMaffi

brotherr to saindo de ferias semana agora
qdo voltar vou fazer mais uns testes aqui
tem email para entrar em contato?

guilhermetonetto

bleza …

pode postar aqui neste topico ou mandar e-mail para [email removido]

e boas férias :wink:

[]'s

F

Alguém pode disponibilizar o arquivo jasper do DANFE ??? Ajudaria bastante ? Qq coisa entre em contato por mp !!!

Valeu

Fred

guilhermetonetto

Cara

eu nao trabalho mais com danfe…mas qual a sua duvida em relação a ela?

[]'s

gcoletaalves

tenho um jrxml p/ impressão do DANFE!!

se precisarem manda um email ai!

[email removido]

PadrE

Pessoal…

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 ?

vlw

PadrE

Opa…

Alguem mais teria esse XML ?? Porque o nosso amigo “gcoletaalves” parece estar offline ^^

Se alguém puder ajudar, por favor posta ai para dowload ou me manda MP…

Vlw!

PadrE

Galera…

Quem já montouo DANFE ??

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 ?

Vlw!

javer

Tem um arquivo .jrxml do DANFE aqui (com autorização do autor) - meu Jasper é o 2.0.4.

Também estou me matando para gerar o DANFE a partir do XML da NFe, se alguém tiver tido algum sucesso nisso e puder compartilhar ficaria agradecido.

evandromib

estou usando o Ireport 3.7.0 para gerar um danfe a partir de um XML alguem teria uma dica de como começar ou um tutorial de como como criar um relatorio que utiliza XML como fonte de dados ?

R

Estou usando o iReport 3.7.1, eu vou na parte de definir a query e defino como query language o xpath
então aparece uma arvore do lado direito com os campos do XML
é só arrastar pra parte de baixo (dos fields do relatório) q ele gera o field com o caminho certinho pra ler
até ai tudo bem

fiz metade da DANFE lendo direto o XML, mas só vem a cabeça

eu na verdade precisaria trazer vários registros por causa dos vários itens, para que a quebra funcionasse corretamente

é ai que estou me ferrando

criei um relatório em branco de testes que le o XML
ai no campo maior onde vc define a query
coloquei a raiz de leitura como
/nfeProc/NFe/infNFe/det

e nos campos adicionei somente um
nItem e o description está como /nfeProc/NFe/infNFe/det/@nItem

pelo que entendi em teoria ele deveria gerar um datasource com 3 linhas lendo os valores das tres
porém ele gera 3 linhas só que mostra no relatório o valor da primeira linha
to achando que é bug!

só estou mostrando o que consegui até agora pq as vezes pode ajudar alguém
se alguém tiver conseguido avançar e mandar um relatório de exemplo simples mesmo já ajuda

evandromib

cara tava com esse problema tambem

é facil de resolver no seu XML vc tem que tirar as tags e deixar apenas as tags de até
nao sei o q rola mais qdo essas tag ele nao reconhece os nós do xml

qdo vc for na query setar as tag que vc precisar usar no relatorio clico com o botao direito em cima da tag e escolhe a 1 opção
set (alguma coisa em ingles ) rs
vc vai notar q na parte de baixo vai aparecer escrito Select 2 nodes

e qdo vc for adicionando os campos q vc vai precisar nao vai mais aparecer /enviNfe/…/…/… e sim @nIten e assim por diante pq as tag principais foi setada acima

bom aqui deu certo , boa sorte

R

Eu tava voltando aqui pra escrever que fiz um teste na versão 3 e funcionou tudo certinho
a versão 3.7.1 ta com pau!
ele faz tudo errado!

Criado 19 de dezembro de 2007
Ultima resposta 3 de mar. de 2010
Respostas 24
Participantes 8