Índice:


       

Objetivo:


Exemplo de utilização do Web Service do RM Reports no Fluig. Este documento tem o intuito de auxiliar na criação de uma integração simples entre o Fluig e o Web Service do RM Reports (TBC - Web Services Reports)

Cadastro do Web Service do RM Reports no Fluig:


O Web Service do RM Reports deve ser cadastrado no Fluig para que possa ser acessado na integração. Segue link da documentação para disponibilizar o serviço no Fluig: Visualização de Serviços

Criação do DataSet com o conteúdo do relatório gerado:


Para que os dados de um relatório sejam retornados, deve-se criar um DataSet no Fluig que consumirá o Web Service do RM Reports, solicitará a geração do relatório desejado e retornará o conteúdo do relatório gerado. O arquivo WsFuigDataSet.js é um exemplo da criação de um DataSet com informações para a geração de um relatório de boleto. Segue link da documentação do Fluig para o desenvolvimento de DataSets: Desenvolvimento de Datasets

Segue link da documentação da integração do Fluig com aplicativos externos que auxilia no entendimento de como recuperar as informações do Web Service: Integração com Aplicativos Externos


Exemplo - WsFuigDataSet.js
function createDataset(fields, constraints, sortFields) {

	try {		
		// 'WSRMReports' é o identificador utilizado no cadastro do Web Service do RM Reports no Fluig
		const SERVICE_STUB = ServiceManager.getService('WSRMReports'); // Cria o objeto de Integração
		log.info("wsProjetos-> SERVICE_STUB: " + SERVICE_STUB);
		const SERVICE_HELPER = SERVICE_STUB.getBean();

		// Cria o obejto da classe principal do Servico
		const wsReport = SERVICE_HELPER.instantiate('com.totvs.WsReport');
		log.info("wsProjetos-> wsReport: " + wsReport);

		// Obtem o objeto do WS
		var iWsReport = wsReport.getRMIwsReport();
		log.info("wsProjetos-> iWsReport: " + iWsReport);

		// Usuário e senha para autenticação no RM
		var rm_user = 'XXXXX';
		var rm_pass = '*****';

		var authIwsDataServer = SERVICE_STUB.getBasicAuthenticatedClient(iWsReport, 'com.totvs.IwsReport', rm_user, rm_pass);
		log.info("wsProjetos-> authIwsDataServer: " + authIwsDataServer);

		var NomeRelatorio = 'Relatorio.pdf';
		var IdBoleto = '1';

		// recupera o ID do boleto de acordo com parâmetro passado na constraint
		if (constraints.length > 0) {
			IdBoleto = String(new java.lang.String(constraints[0].getInitialValue()));
		}
		
		// XML de parâmetros recuperado pelo Web Service do RM Reports
		var parametros = "<ParametersSet>" +
			"<xs:schema id=\"ParametersSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">" +
			"<xs:element name=\"ParametersSet\" msdata:IsDataSet=\"true\" msdata:UseCurrentLocale=\"true\">" +
			"<xs:complexType>" +
			"<xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">" +
			"<xs:element name=\"ParametersTable\">" +
			"<xs:complexType>" +
			"<xs:sequence>" +
			"<xs:element name=\"Description\" type=\"xs:string\" minOccurs=\"0\" />" +
			"<xs:element name=\"Name\" msdata:Caption=\"Nome\" type=\"xs:string\" minOccurs=\"0\" />" +
			"<xs:element name=\"Value\" msdata:DataType=\"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" msdata:Caption=\"Valor\" type=\"xs:anyType\" minOccurs=\"0\" />" +
			"<xs:element name=\"Type\" msdata:DataType=\"System.Type, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" type=\"xs:string\" minOccurs=\"0\" />" +
			"</xs:sequence>" +
			"</xs:complexType>" +
			"</xs:element>" +
			"</xs:choice>" +
			"</xs:complexType>" +
			"</xs:element>" +
			"</xs:schema>" +
			"<ParametersTable>" +
			"<Description />" +
			"<Name>CODCOLIGADA</Name>" +
			"<Value xsi:type=\"xs:int\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">1</Value>" +
			"<Type>System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</Type>" +
			"</ParametersTable>" +
			"<ParametersTable>" +
			"<Description />" +
			"<Name>IDBOL</Name>" +
			"<Value xsi:type=\"xs:int\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + IdBoleto + "</Value>" +
			"<Type>System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</Type>" +
			"</ParametersTable>" +
			"</ParametersSet>"

		// dados de cadastro relatório
		var CodigoColigadaRel = 1;
        var IdRelatorio = 29; 
        var Contexto = "codcoligada=1;codsistema=G";

		// solicita a geração do realtório e armazena o identificador único
		var guid = authIwsDataServer.generateReport(CodigoColigadaRel, IdRelatorio, '', parametros, NomeRelatorio, Contexto);

		// recupera o tamanho do relatório gerado
		var size = authIwsDataServer.getGeneratedReportSize(guid);

		var offset = 0;
		var rptstr = "";
		var pack = 65000;

		// monta o arquivo com o relatório gerado
		while (offset < size) {
			var temp = pack;
			if ((offset + temp) > size)
				temp = size - offset;

			rptstr += authIwsDataServer.getFileChunk(guid, offset, temp);

			offset = offset + pack;
		}

		result = rptstr;

		log.info("Resultado do Servico: " + result);

		//O TBC retorna os valores da chave caso o registro tenha sido salvo,
		//caso contrário, a exceção ocorrida é enviada pelo mesmo retorno, porém
		//formatada entre linhas '==='

		if ((result != null) && (result.indexOf("===") != -1)) {
			log.info("Erro no serviço.");
			var msgErro = result.substring(0, result.indexOf("==="));
			log.info(msgErro);
			throw msgErro;
		}

		var dataset = DatasetBuilder.newDataset();

		dataset.addColumn("RELATORIO");
		dataset.addRow(new Array(result));

		log.info("RELATORIO: " + result);

		return dataset;

	} catch (e) {
		return getDatasetError(e);
	};
}

function getDatasetError(exception) {
	var dtsError = DatasetBuilder.newDataset();
	dtsError.addColumn("ERROR");
	dtsError.addRow(["Ocorreu um erro na execução do DataSet. Mensagem: " + exception]);
	return dtsError;

};


Exibição do relatório gerado nas páginas do Fluig:


Depois de disponibilizar o serviço e criar o DataSet do relatório, é necessário recuperar os dados DataSet e exibir o relatório. A página em que a integração for disparada deve possuir um link com a chamada para as funções JavaScript que solicitam a geração dos relatórios, no caso deste exemplo, inserimos um link simples na página.


Exemplo
<a id="boleto" href="#" onclick="GerarRelatorioRM()">Gerar Boleto</a>


O evento de click deste link executa as funções JavaScript abaixo que solicitarão a geração do relatório. O arquivo WsFluigReports.js deve ser referenciado na página do Fluig com o link para geração.


Exemplo - WsFluigReports.js
function GerarRelatorioRM() {

	// cria uma nova janela para exibição do conteúdo do relatório em PDF
	var newWindow = window.open("RMReports", "pagina");
    var data = getBytesRMReport();
    newWindow.document.write("<html><body><iframe title=\"MY title\" width=\"100%\" height=\"100%\" src=\"" + data + "\"></iframe></body></html>"); 
}


function getBytesRMReport() {

	// Constraint com o identificador do boleto que será utilizado para geração do realtório
	var IdBoleto = DatasetFactory.createConstraint("IDBOLETO", "110011", "110011", ConstraintType.MUST);
	var constraints = new Array(IdBoleto);

	var resultado = "";

	// dsRelatorioWs é identificador do DataSet exportado para o Fluig
	var dataset = DatasetFactory.getDataset("dsRelatorioWs", null, constraints, null);
	var wsReport = dataset.values[0];

	// seta o formato de abertura da string base 64 retornada pelo Web Service do RM Reports para PDF
	if (dataset.values.length == 1) {
		resultado = "data:application/pdf;base64, " + wsReport["RELATORIO"];
	}

	return resultado;
}
Exemplo prático utilizando o recurso Minhas Páginas do Fluig

Podemos realizar um teste símples utilizando o recurso Minhas Páginas do Fluig.

  • Acesse:  Painel de Controle > Personalização > Minhas Páginas;
  • Crie uma nova página;
  • Adicione um widget Editor de Conteúdo do agrupador WCM;
  • Clique na opção código-fonte e insira o código a seguir;


Código Exemplo
<html>
<head>
	<title></title>
</head>
<body>
  <script type="text/javascript" src="/webdesk/vcXMLRPC.js"></script>
  <script>
    function GerarRelatorioRM() { 
    // cria uma nova janela para exibição do conteúdo do relatório em PDF
    var newWindow = window.open("RMReports", "pagina");
    var data = getBytesRMReport();
    newWindow.document.write("<html><body><iframe title=\"MY title\" width=\"100%\" height=\"100%\" src=\"" + data + "\"></iframe></body></html>");
}
 
function getBytesRMReport() {
 
    // Constraint com o identificador do boleto que será utilizado para geração do realtório
    var IdBoleto = DatasetFactory.createConstraint("IDBOLETO", "110011", "110011", ConstraintType.MUST);
    var constraints = new Array(IdBoleto);
 
    var resultado = "";
 
    // dsRelatorioWs é identificador do DataSet exportado para o Fluig
    var dataset = DatasetFactory.getDataset("dsRelatorioWs", null, constraints, null);
    var wsReport = dataset.values[0];
 
    // seta o formato de abertura da string base 64 retornada pelo Web Service do RM Reports para PDF
    if (dataset.values.length == 1) {
        resultado = "data:application/pdf;base64, " + wsReport["RELATORIO"];
    }
 
    return resultado;
}
</script>
<p><button onclick="GerarRelatorioRM()">Gerar Relatório</button></p>

<div id="my-div"> </div>
</body>
</html>

Exemplo ilustrativo

Produto: Framework

Versão: 12.1.XX

Processo: Web Service do RM Reports no Fluig