BrunoGasparetto Posted January 22 Topic Count: 5 Topics Per Day: 0.00 Content Count: 21 Content Per Day: 0.01 Reputation: 11 Achievement Points: 164 Solved Content: 0 Days Won: 4 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: 924 Topics Per Day: 0.13 Content Count: 9,081 Content Per Day: 1.32 Reputation: 364 Achievement Points: 108,993 Solved Content: 0 Days Won: 225 Status: Offline Age: 52 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.09 Reputation: 15 Achievement Points: 3,172 Solved Content: 0 Days Won: 6 Status: Offline Age: 44 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: 21 Content Per Day: 0.01 Reputation: 11 Achievement Points: 164 Solved Content: 0 Days Won: 4 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: 21 Content Per Day: 0.01 Reputation: 11 Achievement Points: 164 Solved Content: 0 Days Won: 4 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: 21 Content Per Day: 0.01 Reputation: 11 Achievement Points: 164 Solved Content: 0 Days Won: 4 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: 924 Topics Per Day: 0.13 Content Count: 9,081 Content Per Day: 1.32 Reputation: 364 Achievement Points: 108,993 Solved Content: 0 Days Won: 225 Status: Offline Age: 52 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: 924 Topics Per Day: 0.13 Content Count: 9,081 Content Per Day: 1.32 Reputation: 364 Achievement Points: 108,993 Solved Content: 0 Days Won: 225 Status: Offline Age: 52 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: 21 Content Per Day: 0.01 Reputation: 11 Achievement Points: 164 Solved Content: 0 Days Won: 4 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: 21 Content Per Day: 0.01 Reputation: 11 Achievement Points: 164 Solved Content: 0 Days Won: 4 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
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.