Dica Exportacao De Relatorio Formatado Via Rotina Javascript

Boa tarde pessoALL!!

Hoje venho compartilhar com vocês uma dica para realizar a exportação de relatórios formatados através de um botão de ação utilizando rotina JavaScript.

Já existem alguns outros posts aqui tratando da impressão dos relatórios, porém aqui na empresa nós precisavamos necessáriamente exportar os relatórios através do botão de ação com JavaScript.

Seguem alguns dos links daqui da comunidade.

  1. Introdução

Recebemos uma demanda para encontrar uma solução que permitisse a exportação em PDF de vários pedidos de uma única vez através do portal de vendas e que fosse preferencialmente escrita em JavaScript.

  1. Preparando o Relatório

O relatório foi criado normalmente, com um parâmetro do tipo java.util.Collection. Em seguida, este parâmetro foi utilizado juntamente com a notação $X.

Segue abaixo o XML do relatório.

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="mainReport" language="groovy" pageWidth="595" pageHeight="842" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
	<property name="ireport.zoom" value="1.0"/>
	<property name="ireport.x" value="0"/>
	<property name="ireport.y" value="0"/>
	<property name="ireport.definition"/>
	<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
		<defaultValueExpression><![CDATA["./"]]></defaultValueExpression>
	</parameter>
	<parameter name="PK_NUNOTAS" class="java.util.Collection"/>
	<queryString>
		<![CDATA[Select NUNOTA From TGFCAB Where $X{IN, NUNOTA, PK_NUNOTAS}]]>
	</queryString>
	<field name="NUNOTA" class="java.math.BigDecimal"/>
	<detail>
		<band height="842" splitType="Stretch">
			<subreport>
				<reportElement key="PEDIDO" x="0" y="0" width="555" height="842"/>
				<subreportParameter name="PK_NUNOTA">
					<subreportParameterExpression><![CDATA[$F{NUNOTA}]]></subreportParameterExpression>
				</subreportParameter>
				<subreportParameter name="SUBREPORT_DIR"/>
				<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
				<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "PEDIDO12___v4.jasper"]]></subreportExpression>
			</subreport>
		</band>
	</detail>
</jasperReport>

Obs: Este é “O” relatório principal, através do qual os demais sub-relatórios são chamados.

  1. A ação do botão

Apesar de ter funcionado e atendido às nossas necessidades, não tenho completa certeza de que a forma com que a rotina foi implementada é a melhor do ponto de vista programático, entretanto, só consegui sanar algumas mensagens de Type Mismatch com o código que vou postar abaixo:

var nuNotas = newJava('java.util.ArrayList');

for(var i = 0; i < linhas.length; i++){        
    var linha = linhas[i];
    nuNotas.add(linha.getCampo("NUNOTA"));
}

var parametro = newJava('br.com.sankhya.modelcore.util.AgendamentoRelatorioHelper$ParametroRelatorio');
parametro.setNome('PK_NUNOTAS');
parametro.setValor(nuNotas);

var lstParametros = newJava('java.util.ArrayList');
lstParametros.add(parametro);

var nuRfe = new java.math.BigDecimal(91);
var codUsuLogado = new java.math.BigDecimal(getUsuarioLogado());

var dwfFacade = newJava('br.com.sankhya.modelcore.util.EntityFacadeFactory').getDWFFacade();

var pdfBytes = javaStaticMethod('br.com.sankhya.modelcore.util.AgendamentoRelatorioHelper', 'getPrintableReport', ['java.math.BigDecimal', 'java.util.List', 'java.math.BigDecimal', 'br.com.sankhya.jape.EntityFacade'], [nuRfe, lstParametros, codUsuLogado, dwfFacade]);

var sessionFile = javaStaticMethod('com.sankhya.util.SessionFile', 'createSessionFile', ['java.lang.String', 'java.lang.String', '[B'], ['Pedidos.pdf','Pedidos', pdfBytes]);

var serviceContext = javaStaticMethod('br.com.sankhya.ws.ServiceContext', 'getCurrent', [], []);

var chave = 'reportFileFor_' + codUsuLogado.toString() + '_' + nuRfe.toString();

serviceContext.putHttpSessionAttribute(chave, sessionFile);

mensagem = "<a id=\"alink\" href=\"/mge/visualizadorArquivos.mge?chaveArquivo=" + chave + "\" target=\"_blank\">Baixar Arquivo</a>"

O código acima é basicamente uma refatoração para o JavaScript do código JAVA disponibilizado pelo amigo @daniel em

Com isto o relatório pode ser baixado através do link gerado na mensagem.

Espero ter ajudado e ficaria muito grato se alguém puder compartilhar uma forma mais simples de realizar esta exportação.

Grande abraço a todos!!

Esta dica foi útil?
  • Sim
  • Não
0 votantes