Integração com passagem de filtros e parametros - wsReport

Olá pessoal!

Estou tentando criar um dataset que faça integração com o wsReport e estou tendo problemas ao tentar executar o metodo GenerateReport, mais especificamente na inserção de filtros e parametros.

Eu fiz o procedimento para pegar os filtros e parametros pelo GetReportInfo e tentei criar o dataset da forma abaixo, porem tenho erro na conversao do xml
There was an error deserializing the object of type System.Collections.Generic.List`1[[RM.Rpt.Executor.Intf.RptParameterReportPar, RM.Rpt.Executor.Intf, Version=12.1.2402.232, Culture=neutral, PublicKeyToken=null]]. Data at the root level is invalid. Line 1, position 1.

A fução getFilters vai receber parametros futuramente q seria a expressao de filtro e a tabela de referencia, porem no momento estou tentando fazer funcionar com dados estaticos, mas sem sucesso. Alguem ja passou por algo semelhante ?

Grato pela atenção.

function createDataset(fields, constraints, sortFields)    
{    

    var NOME_SERVICO = "wsReport"; // Nome do serviço criado no Fluig Studio  
    var CAMINHO_SERVICO = "com.totvs.WsReport"; // Caminho do serviço  
    var dataset = DatasetBuilder.newDataset();      
    
    
    var idRelatorio = 2254
    var filters = getFilters()
    var params = getParams()
    var fileName = "teste.pdf"
    var context = "CodColigada=1;CodFilial=2"
    	
    	log.info("filters: " + filters)
    	log.info("params: " + params)

    try {  
        // Obtem a instancia do serviço   
        var servico = ServiceManager.getServiceInstance(NOME_SERVICO);          
        // Inicializa o serviço  
        var instancia = servico.instantiate(CAMINHO_SERVICO);          
        // Obtem o WebService para consumo  
        var ws = instancia.getRMIwsReport();            
        var serviceHelper = servico.getBean();  
        // Autenticação no serviço  
        var authService = serviceHelper.getBasicAuthenticatedClient(ws, "com.totvs.IwsReport", 'usuario', 'senha');  
        
        
        var result = authService.generateReport(1, idRelatorio, filters, params, fileName, context);  
            log.info("!!! INFO !!!");  
            log.info(result);  
         if ((result != null) && (result.indexOf("===") != -1)) {  
            var msgErro = result.substring(0, result.indexOf("==="));  
            log.error("Erro: " + msgErro);  
            throw "Erro: " + msgErro;  
         }
  
    } catch (e) {  
         if (e == null)  
             e = "Erro desconhecido; verifique o log do AppServer";  
         var mensagemErro = "Erro na comunicação com o app (linha: " + e.lineNumber + "): " + e;  
         log.error(mensagemErro);  
         log.info(mensagemErro);  
         dataset.addColumn("ERROR");  
         dataset.addColumn("MESSAGE_ERROR");  
         dataset.addRow(new Array(-1, mensagemErro));  
    }     

    return dataset;  
}


function getFilters(filterExpression, tableName) {
	return '<![CDATA[<?xml version="1.0" encoding="utf-16"?>' +
	' <ArrayOfRptFilterReportPar xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.totvs.com.br/RM/">' +
	  ' <RptFilterReportPar>' +
	    ' <BandName>RptReport</BandName>' +
	    ' <FiltersByTable>' +
	      ' <RptFilterByTablePar>' +
	        ' <Filter>RA = "2100234"</Filter>' +
	        ' <TableName>SALUNO</TableName>' +
	      ' </RptFilterByTablePar>' +
	    ' </FiltersByTable>' +
	    ' <MainFilter>true</MainFilter>' +
	    ' <Value>(RA = "2100234")</Value>' +
	  ' </RptFilterReportPar>' +
	' </ArrayOfRptFilterReportPar>]]>'
}

function getParams() {
	 var xml = '<![CDATA[<?xml version="1.0" encoding="utf-16"?>' +
	    ' <ArrayOfRptParameterReportPar xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.totvs.com.br/RM/">' +
	      ' <RptParameterReportPar>' +
	        ' <Description>Ano Letivo:</Description>' +
	        ' <ParamName>PARAMETRO1</ParamName>' +
	        ' <Type xmlns:d3p1="http://schemas.datacontract.org/2004/07/System" xmlns:d3p2="-mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089-System-System.RuntimeType" i:type="d3p2:RuntimeType" xmlns:d3p3="-mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089-System-System.UnitySerializationHolder" z:FactoryType="d3p3:UnitySerializationHolder" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">' +
	          ' <Data xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string" xmlns="">System.String</Data>' +
	          ' <UnityType xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:int" xmlns="">4</UnityType>' +
	          ' <AssemblyName xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string" xmlns="">mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</AssemblyName>' +
	        ' </Type>' +
	        ' <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">2025</Value>' +
	        ' <Visible>true</Visible>' +
	      ' </RptParameterReportPar>' +
	    ' </ArrayOfRptParameterReportPar>]]>'
	 
	 return xml
}
1 curtida

Acho que nesse caso não precisa do CDATA, por já estar passando parâmetro indicado como XML né.

Ainda não executei relatório chamando assim, só dentro de FV e nele vai o XML completo da chamada (igual ao usado no SoapUI) e aí sim precisa do CDATA porque fica um XML dentro do outro.

Então, eu fiz sem o CDATA e até obtive retorno, mas veio um relatorio vazio como se desconsiderasse o filtro. O filtro funciona corretamente no SOAP UI

Olá, a única coisa diferente que vi aí foi a falta da tabela no campo… pra ser sincero não sei se isso influencia… mais os meus são todos assim… testa aí, de repente é isso

<?xml version="1.0" encoding="utf-16"?>' +
' <ArrayOfRptFilterReportPar xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.totvs.com.br/RM/">' +
  ' <RptFilterReportPar>' +
    ' <BandName>RptReport</BandName>' +
    ' <FiltersByTable>' +
      ' <RptFilterByTablePar>' +
        ' <Filter>SALUNO.RA = "2100234"</Filter>' +
        ' <TableName>SALUNO</TableName>' +
      ' </RptFilterByTablePar>' +
    ' </FiltersByTable>' +
    ' <MainFilter>true</MainFilter>' +
    ' <Value>(SALUNO.RA = "2100234")</Value>' +
  ' </RptFilterReportPar>' +
' </ArrayOfRptFilterReportPar>

Tomara que de certo… abs

Olá Eduardo!

Nesse formato tambem me retornou um relatorio vazio, imaginei que esse nao seria o problema pois pelo SOAP UI o filtro funciona enviando sem especificar a tabela. De qualquer forma obrigado pela sugestão, ainda não tinha tentado essa opção.

1 curtida

Cria o filtro que você precisa lá no report e no SOAPUI roda o método GetReportInfo, passando a coligada e o id do report, ele vai retornar exatamente os XMLs de filtros e parâmetros… compara com o seu e vê se tem alguma coisa diferente.

Valeu… abs

Beleza vou tentar fazer dessa forma atualmente o retorno que tenho do GetInfo esta assim

Solicitei ao meu gestor (ele que cuida do RM) para cadastrar uma copia desse relatorio ja com o filtro para analisar. Assim que testar posto aqui os resultados. Obrigado pela dica!

Eduardo, fiz conforme sua dica esse é o getinfo do relatorio ja com o filtro

A única diferença que notei é que neste tem uma tag “Name” em branco, tentei apenas inserir essa tag porem o relatorio continua vindo vazio. Vou tentar agora no novo relatorio, ver se consigo passar um RA diferente.

Apenas atualizando, tentei passar o xml com RA diferente no novo report cadastrado e o relatorio tambem vem vazio. Se eu passo o filters como string em branco o relatorio vem devidamente preenchido com o filtro que foi cadastrado no RM, no caso apenas do aluno que foi filtrado no RM

Jhonata, deu certo a geração do report? Eu estava enfrendo um problema aqui que ao gerar o relatório ele mostrava em branco no navegador e gerava normalmente no RM. O problema era o tamanho do arquivo gerado, se você não resolveu ainda e quiser ver melhor me avisa aqui. Abraço!!

@eduardo.vantini , você chegou a perceber a partir de qual tamanho dava problema?

Hoje eu só uso esse WS pra gerar Recibos/Contratos de Funcionários e com o Base64 enviar pra um serviço de assinatura digital. Aí acabei esbarrando num limite de uns 2MB só pra não ter que chamar a operação “chunk” várias vezes pra pegar o base64, mas não estudei pra saber se há um limite específico.

Não consegui pegar o limite, no meu cenário ou ficava pequeno ou ficava muito grande e como eu verifiquei que o base64 estava gerando corretamente, justamente chamando o chunk várias vezes, imaginei que o problema fosse o navegador, pois passava o base64 para ele abrir o pdf em outra aba. Para conseguir passa para o navegador certinho, converti para um blob e deu certo.

Mais meu PDF está com mais de 6mb.

1 curtida

Fala pessoal, aqui eu abri um chamado junto a Totvs, o analista nao conseguiu resolver e mandou pro time de produto, estou no aguardo da resolução.

Então, no meu caso ele esta gerando em branco no RM!