O erro parece ser simples, mas já está me custando alguns cabelos brancos…
Por questões de desempenho, decidi alterar nossa DANFE. Como gerei o relatório de NFS-e usando o jrxml sem problemas, considerei uma boa opção (até agora…).
Tive dois problemas, mas vou focar no mais critico: O relatório roda perfeitamente no IReport, mas é exibido em branco quando chamado pela aplicação.
Em modo debug, verifiquei que o xml é enviado corretamente. Estou usando a versão 3.5.2 (tentei atualizar para 3.7.3, mas tive ainda mais problemas com ‘cast’ de campos/nodes xml que até então eram apenas strings- java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl cannot be cast to java.lang.String - e optei por manter a versão antiga mesmo).
Esta é a versão resumida do código da chamada de relatório:
JRXmlDataSource jRXmlDataSourceComXmlDaNotaEletronica;
String caminhoFisicoDoRelatorioDanfeEmDisco;
jRXmlDataSourceComXmlDaNotaEletronica = new JRXmlDataSource(getXmlDaNotaEletronica(nfeVO.getNfelSequencial()), "/NFe/infNFe");
Map<String, Object> parametros = preencherParametros(nfeVO);
JasperPrint relatorio = JasperFillManager.fillReport(caminhoFisicoDoRelatorioDanfeEmDisco, parametros, jRXmlDataSourceComXmlDaNotaEletronica);
JasperViewer.viewReport(relatorio, false);
A variável caminhoFisicoDoRelatorioDanfeEmDisco é preenchida no construtor da classe, apenas declarei ai embaixo para melhor compreensão do código.
É um código demasiadamente simples para me causar tantos problemas… alguma idéia, para que eu não tenha de esperar ‘uma boa noite de sono’ para conseguir enxergar o problema? :lol:
Primeiro problema resolvido!
O XPath se atrapalha todo com namespace, havia me esquecido deste detalhe (sabia que era algo idiota, mas funcionar no IReport e dar problema na aplicação é sacanagem…).
Se alguém passar por problema semelhante, remova o namespace de seu xml e seja feliz!
Agora o segundo problema:
Os subdatasourcers para Duplicatas e Itens…
Aparentemente tudo certo nas configurações (http://jasperforge.org/website/ireportwebsite/IR%20Website/ir_xml_datasources.html?header=project&target=ireport), mas as subconsultas não me trazem nada…
São dois componentes lista, configurados com os datasources ((net.sf.jasperreports.engine.data.JRXmlDataSource) $P{REPORT_DATA_SOURCE}).subDataSource("/NFe/infNFe/det") e ((net.sf.jasperreports.engine.data.JRXmlDataSource) $P{REPORT_DATA_SOURCE}).subDataSource("/NFe/infNFe/cobr/dup").
O xml utilizado no teste foi este:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
- <NFe>
- <infNFe Id="NFexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" versao="1.10">
- <ide>
<cUF>51</cUF>
<cNF>000004060</cNF>
<natOp>VENDA DE MERCADORIA</natOp>
<indPag>1</indPag>
<mod>55</mod>
<serie>103</serie>
<nNF>2898</nNF>
<dEmi>2010-02-03</dEmi>
<dSaiEnt>2010-02-03</dSaiEnt>
<tpNF>1</tpNF>
<cMunFG>5108402</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>1.1002.01.0</verProc>
</ide>
<emit>
<CNPJ>01234567890123</CNPJ>
<xNome>EMPRESA</xNome>
<xFant>EMPRESA</xFant>
<enderEmit>
<xLgr>RUA</xLgr>
<nro>112252</nro>
<xBairro>DISTRITO INDUSTRIAL</xBairro>
<cMun>5108402</cMun>
<xMun>VARZEA GRANDE</xMun>
<UF>MT</UF>
<CEP>78455000</CEP>
<cPais>1058</cPais>
<xPais>BRASIL</xPais>
<fone>6566666666</fone>
</enderEmit>
<IE>012345678</IE>
</emit>
<dest>
<CPF>01234567891</CPF>
<xNome>AMANDA LIMA</xNome>
<enderDest>
<xLgr>RUA A</xLgr>
<nro>1213</nro>
<xBairro>BAIRRO B</xBairro>
<cMun>5103403</cMun>
<xMun>CUIABA</xMun>
<UF>MT</UF>
<CEP>78074800</CEP>
<cPais>1058</cPais>
<xPais>BRASIL</xPais>
<fone>6536211814</fone>
</enderDest>
<IE>ISENTO</IE>
</dest>
<det nItem="1">
<prod>
<cProd>42</cProd>
<cEAN />
<xProd>RODA DO GOL 1000</xProd>
<NCM>10025454</NCM>
<CFOP>5102</CFOP>
<uCom>PC</uCom>
<qCom>1.0200</qCom>
<vUnCom>150.0000</vUnCom>
<vProd>153.00</vProd>
<cEANTrib />
<uTrib>PC</uTrib>
<qTrib>1.0200</qTrib>
<vUnTrib>150.0000</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS60>
<orig>1</orig>
<CST>60</CST>
<vBCST>0.00</vBCST>
<vICMSST>18.24</vICMSST>
</ICMS60>
</ICMS>
<IPI>
<cEnq>999</cEnq>
<IPITrib>
<CST>99</CST>
<vBC>150.00</vBC>
<pIPI>5.00</pIPI>
<vIPI>7.65</vIPI>
</IPITrib>
</IPI>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>150.00</vBC>
<pPIS>1.65</pPIS>
<vPIS>2.52</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>150.00</vBC>
<pCOFINS>7.60</pCOFINS>
<vCOFINS>11.63</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
<infAdProd>PRODUTO SUJEITO A SUBSTITUICAO TRIBUTARIA * MARCA: CHEVROLET</infAdProd>
</det>
<total>
<ICMSTot>
<vBC>155.00</vBC>
<vICMS>18.60</vICMS>
<vBCST>0.00</vBCST>
<vST>0.00</vST>
<vProd>153.00</vProd>
<vFrete>0.00</vFrete>
<vSeg>0.00</vSeg>
<vDesc>0.00</vDesc>
<vII>0.00</vII>
<vIPI>7.65</vIPI>
<vPIS>2.52</vPIS>
<vCOFINS>11.63</vCOFINS>
<vOutro>2.00</vOutro>
<vNF>162.65</vNF>
</ICMSTot>
</total>
<transp>
<modFrete>1</modFrete>
<vol>
<qVol>123</qVol>
<esp>asaaas</esp>
<marca>A</marca>
<nVol>afag</nVol>
<pesoL>161.000</pesoL>
<pesoB>13.000</pesoB>
</vol>
</transp>
<cobr>
<dup>
<nDup>5160000482 - 1</nDup>
<dVenc>2010-02-15</dVenc>
<vDup>162.65</vDup>
</dup>
</cobr>
<infAdic>
<infCpl>Dados Procon: SECRET. ESTADO JUSTICA DEFESA DA CIDADANIA - AV. HISTORIADOR RUBENS DE MENDONCA, S/NR, Bairro: BAU Fone: 151 * Forma Pagamento: 10 * Vendedor: PROTO *</infCpl>
</infAdic>
</infNFe>
</NFe>
Creio que este seja até mais simples que o anterior, mas ao menos fica aqui como ‘log’ para quem mais tiver este tipo de problema… assim que encontrar algo, posto aqui… se alguém já souber a resposta… não seja tímido :lol:
Alguém? =/
[EDITED]
Acabei me esquecendo de postar a solução…
A diferença entre os xmls de NFS-e e NF-e (que realmente importam no momento), são que o NF-e tem um nível a mais para chegar aos itens (um pai a mais na hierarquia).
Eu havia entendido que todo o path deveria ser colocado na chamada do subDataSource, quando na verdade, apenas o nó agregador (det/dup) e seus respectiovos pais deveriam ser informados…
Assim, meus datasources ficaram como:
((net.sf.jasperreports.engine.data.JRXmlDataSource) $P{REPORT_DATA_SOURCE}).subDataSource(“infNFe/det”) e ((net.sf.jasperreports.engine.data.JRXmlDataSource) $P{REPORT_DATA_SOURCE}).subDataSource(“cobr/dup”).
Somente isso…
Olá a todos.
Estou com um problema para preencher o DANFE com os itens da NFe.
Não estou conseguindo pq a tag , no meu objeto NFe é um ArrayList.
Algém sabe como preencher os itens do DANFE ?
Parabens pela solucao, rodou certinho!!!
Muito obrigado!