BrunoGasparetto Posted January 22 Topic Count: 5 Topics Per Day: 0.00 Content Count: 26 Content Per Day: 0.02 Reputation: 12 Achievement Points: 196 Solved Content: 0 Days Won: 5 Status: Offline Device: Windows Report Posted January 22 Atualmente tenho uma FV que envia o Recibo de Férias por e-mail para os usuários. Nele eu utilizo a atividade Executar Relatório. Essa atividade funciona corretamente, enviando o relatório como anexo. Agora surgiu a necessidade de fazer o relatório ser enviado como Base64 para uma integração REST com um serviço de Assinatura Digital. Seguindo a documentação da TOTVS - Como gerar relatório via Webservices - eu consegui gerar o relatório capturando o Base64 usando o WS. Porém são necessárias 3 chamadas ao WS para conseguir criar um relatório. Considerando que normalmente o relatório será executado para vários funcionários de uma vez fiquei preocupado de tornar a FV muito custosa. Há alguma maneira de converter o System.Byte[] retornado pela atividade Executar Relatório em um Base64 ou a única maneira realmente é fazer o RM executar o WS? Considerando minha vivência com o TOTVS Fluig, acredito que a solução é usar o WS mesmo, mas a esperança de não precisar ainda vive. 1 Quote
Jair - Fórmula Posted January 22 Topic Count: 932 Topics Per Day: 0.13 Content Count: 9,110 Content Per Day: 1.30 Reputation: 395 Achievement Points: 109,221 Solved Content: 0 Days Won: 241 Status: Offline Age: 53 Device: Windows Report Posted January 22 Bruno, tudo bão?? Espero que sim. Tem um cara que é o fera das FVs aqui, que é o @Fábio Maia. Mas o cara é concorrido pacas, dá curso, monta StartUp. Vamos ver se ele tira um tempinho e dá as caras por aqui para dar uma força. Se ele diz que tem como, vai na fé que da bom!! 3 Quote
Solution Popular Post Fábio Maia Posted January 22 Topic Count: 32 Topics Per Day: 0.00 Content Count: 581 Content Per Day: 0.08 Reputation: 15 Achievement Points: 3,172 Solved Content: 0 Days Won: 6 Status: Offline Age: 45 Device: Windows Solution Popular Post Report Posted January 22 Fala Bruno, blz? Testei aqui uma situação e acho que é o que você precisa. Dá uma olhada e depois retorna pra gente pra saber se deu certo. A atividade getReport é a atividade de “Executar Relatório”. Ela tem uma propriedade que é a RelatorioGerado, ou seja, o resultado da geração do relatório. Ela é um array de bytes (byte []) Eu usei a atividade de código pra pegar esse retorno e transformar esse array de bytes em base64. Pra facilitar, compartilho o código abaixo comentado: private void transform_ExecuteCode(object sender, System.EventArgs args) { // 1. Obtém o relatório em formato de array de bytes byte[] relatorioOriginal = this.getReport.RelatorioGerado; // 2. Converte o array de bytes em uma string no formato Base64 string relatorioConvertido = ByteArrayParaBase64(relatorioOriginal); // 3. Dispara uma exceção (apenas como exemplo) contendo a string em Base64 throw new Exception(relatorioConvertido); } // Método auxiliar que converte um array de bytes em Base64 public static string ByteArrayParaBase64(byte[] matrizByte) { // Usa a classe Convert para criar uma string Base64 a partir do array de bytes return Convert.ToBase64String(matrizByte); } Você vai ver um resultado como o apresentado abaixo, que já é o resultado apresentado em base64: Pra testar eu copiei e colei o resultado em um site que converte base64 para PDF e deu certo: Então basta você usar a mesma estrutura e adaptar pra sua necessidade ai. Abs 1 4 Quote
BrunoGasparetto Posted January 23 Topic Count: 5 Topics Per Day: 0.00 Content Count: 26 Content Per Day: 0.02 Reputation: 12 Achievement Points: 196 Solved Content: 0 Days Won: 5 Status: Offline Device: Windows Author Report Posted January 23 Que solução incrível, @Fábio Maia. Muito obrigado. Eu realmente preciso investir um tempo estudando as atividades “Executar Código” e “Executar Código Fonte”. Demorei pra conseguir responder porque estava testando jogar a exceção com o base64, porém quando executava isso dentro do “Para Cada Iteração” ele não informava o texto da exceção. Então fiz um teste simples, sem o “Para Cada Iteração” e funcionou perfeitamente. Pra facilitar um pouco eu fiz o seguinte. Na atividade “Executar Requisição REST” eu criei uma propriedade para o parâmetro que é o base64. Assim eu pude atribuir o resultado da atividade “Executar Código” direto pra requisição. Agora confirmado que num fluxo contínuo funciona só preciso adaptar pra fazer dentro do “Para Cada Iteração”. Muito obrigado mesmo pela ajuda. 1 Quote
BrunoGasparetto Posted January 23 Topic Count: 5 Topics Per Day: 0.00 Content Count: 26 Content Per Day: 0.02 Reputation: 12 Achievement Points: 196 Solved Content: 0 Days Won: 5 Status: Offline Device: Windows Author Report Posted January 23 Mas pelo jeito a atividade "Executar Código" não aceita ficar dentro da atividade "Para Cada Iteração". Sempre que a insiro na atividade Sequência, dentro da iteração, ocorre uma exceção que não consigo capturar o a mensagem de erro. 1 Quote
BrunoGasparetto Posted January 28 Topic Count: 5 Topics Per Day: 0.00 Content Count: 26 Content Per Day: 0.02 Reputation: 12 Achievement Points: 196 Solved Content: 0 Days Won: 5 Status: Offline Device: Windows Author Report Posted January 28 Só pra explicar o que eu fiz no final: No RM que estou usando sempre dá um erro ao usar atividade "Executar Código" ou "Se / Senão" com condicional usando código ao invés de declaração, em um loop "Para Cada Iteração" (indiferente do código e de estar numa sequência ou não). Como não sei se é o comportamento padrão do RM dar esse tipo de problema (já que a atividade "Executar Código Fonte" funciona normalmente) abri chamado pra TOTVS validar isso. Enquanto isso estou fazendo a geração do relatório usando a atividade SOAP (agradeço demais o Fabio por ter um vídeo no YouTube explicando como configurar tudo certinho e felizmente a documentação da TOTVS também ajudou). Percebi que pra baixar o base64 do WS eu posso informar um tamanho maior do que o do documento em si, então estou pulando a etapa de consultar o WS só pra pegar o tamanho do arquivo, assim eu chamo a operação de baixar o Base64 passando sempre 0 e 2M como parâmetros (já que nenhum relatório, nesse caso, passará de 1MB). 1 Quote
Jair - Fórmula Posted January 30 Topic Count: 932 Topics Per Day: 0.13 Content Count: 9,110 Content Per Day: 1.30 Reputation: 395 Achievement Points: 109,221 Solved Content: 0 Days Won: 241 Status: Offline Age: 53 Device: Windows Report Posted January 30 Em 23/01/2025 at 18:09, BrunoGasparetto disse: Mas pelo jeito a atividade "Executar Código" não aceita ficar dentro da atividade "Para Cada Iteração". Sempre que a insiro na atividade Sequência, dentro da iteração, ocorre uma exceção que não consigo capturar o a mensagem de erro. Realmente Bruno, essa atividade não funciona no ForEach, então uma solução para tal é você colocar o seu For Each chamando outra FV, e nesta FV você roda o que precisa em "Executar Código". Acaba dando uma volta, mas funciona!! 1 Quote
Jair - Fórmula Posted January 30 Topic Count: 932 Topics Per Day: 0.13 Content Count: 9,110 Content Per Day: 1.30 Reputation: 395 Achievement Points: 109,221 Solved Content: 0 Days Won: 241 Status: Offline Age: 53 Device: Windows Report Posted January 30 E se quiser ficar fera mesmo nas Fórmulas Visuais, recomendo o curso da Bemper, que você vai aprender muito, além do suporte de forma geral que é excelente. O pessoal tem um grupo no whatsapp, exclusivo para membros, que rola muitas mensagens, dicas, ajudas... é bom demais. Recomendo! Veja aqui alguns vídeos de aulas que disponibilizaram grátis para todos. Imagina o que você recebe no curso pago, kkkk https://www.forumrm.com.br/tags/bemper/ https://academy.bemper.com.br/formulavisual Acessa lá. Qualquer coisa, se precisar de algo, me dá um toque. 2 Quote
BrunoGasparetto Posted January 30 Topic Count: 5 Topics Per Day: 0.00 Content Count: 26 Content Per Day: 0.02 Reputation: 12 Achievement Points: 196 Solved Content: 0 Days Won: 5 Status: Offline Device: Windows Author Report Posted January 30 Eu achei eles no YouTube e realmente é incrível. Até Atividade Personalizada eles criam. Quando vi essa opção até pensei em estudar pra criar uma atividade personalizada que fizesse a conversão. Pena que aqui o RM tá na nuvem e teríamos que convencer a colocar atividade personalizada, hehehe. Mas vou fazer o curso deles sim, achei muito bom. E minha meta nesse início de ano é fazer muitas automatizações com FVs. Vai ajudar demais. 1 Quote
BrunoGasparetto Posted January 30 Topic Count: 5 Topics Per Day: 0.00 Content Count: 26 Content Per Day: 0.02 Reputation: 12 Achievement Points: 196 Solved Content: 0 Days Won: 5 Status: Offline Device: Windows Author Report Posted January 30 12 minutos atrás, Jair - Fórmula disse: Realmente Bruno, essa atividade não funciona no ForEach O que achei estranho é que nem a "Se / Senão" funcionou ao usar código ao invés de declaração. Mas o "Executar Código Fonte" funcinou, mas ele achei complicado pra pegar os valores do loop. Vi que tem como passar parâmetro, mas os parâmetros tem que permitir leitura e escrita, aí quando tentei mandar o binário dava erro de permissão. Os eventos disparados pela "Para Cada Iteração", mesmo usando código, funciona, hehehe. Mas aí seria estranho demais se a própria atividade desse erro ao manipular código do evento dela né. Mas é compreensível uma ferramenta que tenta dar tanto poder aos usuários tenha algumas limitações estranhas de vez em quando. 1 Quote
BrunoGasparetto Posted May 15 Topic Count: 5 Topics Per Day: 0.00 Content Count: 26 Content Per Day: 0.02 Reputation: 12 Achievement Points: 196 Solved Content: 0 Days Won: 5 Status: Offline Device: Windows Author Report Posted May 15 Retornando a esse tópico só pra uma atualização. A atividade "Executar Código" não funciona em iterações, porém em conversa em outro fórum percebemos que a atividade "Executar Código Fonte" funciona. Então é possível fazer essa conversão usando a atividade "Executar Código Fonte" e para isso basta colocar 2 parâmetros na atividade, um para receber o ReportResult da "Executar Relatório" e outro parâmetro para ser a string Base64 que depois será atribuída a alguma outra atividade, uma Expressão por exemplo. Então na "Executar Código Fonte" teríamos um código mais ou menos assim: Assim basta nessa atividade fazer o parâmetro RelatorioByte apontar para o "Executar Relatório" ReportResult e o parâmetro RelatorioString apontar para o value de uma Expressão. Só pra ter uma ideia da diferença de trabalho entre usar essa atividade e usar a geração em SOAP. Soap: Atividade Executar Código Fonte: Claro que em grande parte no caso da chamada SOAP precisamos recuperar o XML, validar os dados da chamada pra saber se tem erro, e ainda é necessário executar 3 chamadas ao TBC (gerar relatório, pegar o guid e pegar o base64). Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.