Fórmula Visual

Padrão

A Fórmula Visual da linha RM possibilita pequenas customizações nos produtos, permitindo criar regras específicas em determinados cadastros/processos. Segue o link no TDN da Totvs.

http://tdn.totvs.com/pages/releaseview.action?pageId=161351564

60 comentários sobre “Fórmula Visual

  1. Avatar de Elias Elias

    Boa tarde, tudo bom?

    Estou com uma dúvida, surgiu uma nova ideia de formula visual para bloquear o percentual de desconto em um documento a pagar ou receber (só permitir desconto até 10%), porém gostaria que se fosse um usuário específico a formula deixasse incluir qualquer percentual de desconto, existe alguma forma, dentro da formula visual, que eu possa acessar o código do usuário logado?

    Curtir

  2. Avatar de Elias Elias

    Estamos com um problema na formula visual que escreve no histórico longo do movimento, quando seleciona mais de uma nota e fatura (cada movimento irá gerar um novo movimento) apenas uma dessas notas recebe as informações no campo. Enviei a formula via email.

    OBS: temos uma build da versão 11.82 instalada, importei nessa base e mesmo assim o erro continua.

    Curtir

    • Boa tarde Elias,

      O que esta errado na fórmula visual é que na primeira consulta sql (rmsConsSQLActivity1) os valores passados para os parâmetros da consulta esta pegando do RMSWorkFlow (Ex: Activity=RMSWorkflow, Path=Fields[“IDMOV”].AsInteger) assim sempre executará a consulta SQL passando os valores de apenas um movimento selecionado na visão.

      O correto é pegar os valores da primeira atividade para cada iteração (rmsForEachActivity1) pois ela esta associada aos registros do RMSWorkFlow e percorre cada registro selecionado na visão. Assim passando para os parâmetros da consulta sql o valor corrente da atividade rmsForEachActivity1 (Ex: Activity=rmsForEachActivity1, Path=Fields[“IDMOV”].AsInteger) para cada registro selecionado na visão a consulta irá trazer como resultado o movimento destino gerado.

      Curtir

  3. Avatar de Edimilson Edimilson

    Boa noite.

    Tenho acompanhado o blog e visto coisas interessantes por lá, mas como sou neófito em FV estou precisando de uma ajuda.

    Busco solução para a seguinte situação, informar um valor em um campo complementar usar esse valor como parâmetro para uma consulta SQL e o retorno do sql carregar nos outros campos complementares do mesmo movimento. É possível fazer isso ? que gatilho eu devo usar ?

    Curtir

  4. Avatar de Elias Elias

    Bom dia,

    Estou com um problema em uma formula visual do Fluxus. Preciso verificar a porcentagem de desconto no momento da baixa, mas a formula não consegue “olhar” nenhum campo a não ser a referencia do documento. Estou usando o gatilho Processos>Antes da Execução>FinLanBaixaData.

    O que estou fazendo de errado?

    Curtir

  5. Boa tarde Elias, Neste caso aconselho entrar em contato com o suporte da Totvs para verificar a existência de um bug na atividade pois se utilizada de maneira correta precisa estar acessando os valores informados antes de executar o processo no wizard de execução.

    Curtir

  6. Avatar de Cesar Cesar

    Bom dia Elias,

    Tenho uma situação em que não posso permitir que o usuário não conclua mais de um movimento por vez. Pensei que talvez fosse possível fazer isso via Fórmula Visual, percorrendo todos os movimentos selecionados. Você sabe me dizer se isso é possível ?

    Curtir

  7. Boa noite Cesar, é possível! Você precisa percorrer os movimentos através da atividades “Para cada Iteração” selecionando as rows da table do RMSWorkFlow.
    Assim se tiver com rows. count maior do que 1 quer dizer que selecionou mais de um movimento para concluir assim usa atividade de exceção para disparar a mensagem.

    O gatilho que você pode usar é o antes de executar o processo.

    Espero ter ajudado!

    Curtir

  8. Avatar de raphael raphael

    Olá Professor Renato,
    Fiz uma formula visual que após um movimento de ordem ser salvo, dispara um e-mail avisando que existe movimento para serem faturados(está funcionando). Porem gostaríamos de colocar na informação do corpo do e-mail algumas informações do movimento (dados da tabela TMOV, não está funcionando).
    Dentro do comando (rmsConsSQLActivity 1) acredito que o problema seja o parâmetro da consulta, testei com (Activity=RMSWorkflow, Path=Fields[“idmov”].AsInteger) porem da erro, tentei com outras opções, mas não sai do lugar.
    Alguma dica!

    Curtir

    • Avatar de Elias Elias

      Raphel, não sou um expert em formula visual igual ao Renato, mas posso tentar te ajudar.

      No caso, essa consulta SQL retorna as informaçoes que voce quer jogar no e-mail, certo? (Numero do movimento, cliente, etc)

      Chega a mostrar algum erro no sistema ou salva o movimento sem fazer mais nada?

      Tenta usar o componente “Gerar Exceção” logo após a consulta SQL e vincular algum campo da consulta SQL na mensagem de exceção, dai voce vai pelo menos descobrir se a consulta SQL está funcionando certinho.

      Espero ter ajudado rsrsrsrs

      Curtir

    • Boa tarde Raphael,

      As instruções do Elias são validas, pois precisa debugar para saber o exato aonde esta o problema. Com as informações que passou me parece que esta correto, deve haver algum passo que esta passando desapercebido.

      Curtir

  9. Avatar de raphael raphael

    Isso, da erro e não deixa salvar o movimento.
    De acordo com o tipo de parâmetro muda o erro:
    Activity=rmsConsSQLActivity1, Path=Fields[“idmov”].AsInteger
    ERRO: Fórmula Visual: ‘ENVIA EMAIL | Ao salvar movimento 2.1.30’.
    Erro na execução da Atividade: ‘rmsConsSQLActivity1’ Erro: GetRuntimeValue failed since Path ‘Fields[“idmov”]’ evaluated to ‘null’ value.

    Activity=RMSWorkflow, Path=Fields[“idmov”].AsInteger
    ERRO: Fórmula Visual: ‘ENVIA EMAIL | Ao salvar movimento 2.1.30’.
    Erro na execução da Atividade: ‘rmsConsSQLActivity1’
    Erro: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

    a SQL que montei foi algo simples:
    SELECT
    TMOV.NUMEROMOV, TTMV.nome
    FROM TMOV, TTMV
    WHERE
    TMOV.idmov =:idmov
    and tmov.codcoligada=1
    and tmov.dataemissao = CONVERT(datetime, CONVERT(varchar, getdate(), 103), 103)
    and tmov.idmov=(select MAX(idmov) from TMOV ) and
    TMOV.codtmv = TTMV.codtmv and TMOV.codcoligada = TTMV.codcoligada

    Valeu pelas dicas e ajudas ate o momento, mas continuo na luta, a totvs como sempre quer cobrar por este serviço!

    Curtir

  10. Boa tarde Rafael, O primeiro erro informado esta falando que esta retornando nulo no campo idmov. Tenta colocar o idmov em maiúsculo…

    No blog tem um post sobre Consulta SQL pesquisa e veja se esta acessando os dados da forma que fala no PPT do Post.

    Curtir

    • Boa tarde Raphael,

      Com as informações passadas o que poderia informar foi passado, o passo seguinte seria debugar a formula conforme sugerido pelo o Elias, porém, caso deseje que façamos a formula visual envie a mesma no e-mail de contato assim combinamos este trabalho.

      Curtir

    • Avatar de Elias Elias

      Bom dia,

      To tentando fazer uma formula visual aqui a mais de 3 dias, hoje recebi o mesmo erro que você mencionou, no meu caso foi o seguinte. Meu SQL tem dois filtros CODCOLIGADA e IDMOV, o CODCOLIGADA estava vinculado em “paraCadaTITMMOV” e o IDMOV vinculado em “paraCadaTMOV”, quando vinculei os dois filtros no “paraCadaTMOV” o erro parou, tenta fazer o seguinte:

      – Inclui um componente “Para Cada Iteração” vincula ele em RMSWorkflow>Tables[0]>Rows
      – Joga a consulta sql dentro desse componente e linka o seu filtro no “Para Cada Iteração”>Fields[“IDMOV”]

      Curtir

  11. Avatar de Ivan Ivan

    Olá,
    Estou com uma certa dificuldade para uma FV de email.
    Configurei a formula para enviar email ao criar um movimento de ajuste de estoque, até ai tudo bem.
    porém preciso por no corpo do email um campo da tmovcompl, Fiz uma consulta para tal informação, mas da erro no momento de salvar o movimento .
    O que eu percebo é que o RM acusa que esta null o complementar, com razão, pois o complementar é criado após o registro do movimento.

    Tem alguma solução para isso?

    Curtir

    • Boa noite Ivan, qual o gatilho colocou a formula? Caso seja no proprio movimento no momento que esta criando nao precisa usar a atividade de consulta sql basta acessar a table do campo complementar do proprio registro q esta incluindo. Creio que no seu caso esta ocorrendo erro porque o movimento ainda nao existe na base de dados, pois esta enserindo o movimento, assim a consulta sql retorna vazio.

      Curtir

      • Avatar de Ivan Ivan

        Obrigado pelo o retorno Renato,
        Mas o problema estava em um campo que estava chamando na expressão para fazer o corpo do email. o campo era “rmsworkflow.codusuario” incrível que pareça no contexto MovMovimentoData este campo vai nulo, só retirei ele agora ta certo. Mas não consegui nenhum jeito de trazer o usuário que criou o movimento.
        E a sentença foi necessária para trazer a informação do motivo que fica no complementar, pelo o motivo que este contexto do movimento também não traz informações do complementar.

        Muito Obrigado pela ajuda, Ficarei sempre de olho nesse site para ajudar no que eu poder.

        Abraços.

        Curtir

  12. Boa tarde Ivan, Você consegue acessar o usuário logado através do contexto (Context.CodUsuario). Esta classe context tem todo o contexto do sistema (coligada, usuário etc) e você acessa no mesmo local que acessa os dados do registro do gatilho.

    Seja bem vindo ao blog!

    Curtir

  13. Avatar de Lucas Abreu Lucas Abreu

    Boa tarde Renato,

    Gostaria de criar uma fórmula visual que agrupasse os movimentos por valor, é possível?

    Por exemplo:

    Tenho 5 movimentos (1.1.xx) e todos com o mesmo item, porém, com valores diferentes. Por exemplo, 3 movimentos com o item saindo a R$160,00 e 2 movimentos a R$400,00. (Suponhamos que todos tenham quantidade = 1). Na hora de faturar esse movimento para o (1.2.xx) gostaria que no movimento criado ficasse o item repetido, mas agrupando por valor:

    Quantidade: 3 Valor: 160,00
    Quantidade 2 Valor: 400,00

    Sei que o hoje o sistema agrupa somente por quantidade. É possível fazer isso por meio da FV?

    Aguardo retorno.

    Atenciosamente,

    Curtir

  14. Avatar de raphael raphael

    Galera, no meu funcionou!!!
    A alteração que foi necessária foi na SQL, colocar (NOLOCK)
    A estrutura da formula fiz simples, com as atividades consulta sql, Expression e o envio de email.

    Curtir

  15. Avatar de Lucas Abreu Lucas Abreu

    Renato, boa tarde!

    Na visão de Movimentos em Processos eu tenho um processo que é o de “Enviar E-mail para Cliente/Fornecedor”. Nele eu gostaria de deixar como default um e-mail no campo “Outros Destinatários” ou consistir a flag “Cópia de e-mail para o representante”.

    Por exemplo:

    Quando o meu usuário executar o processo quero consistir que ele marcou a flag supracitada, caso contrário, a FV dispara uma exceção.

    Na 12 nós temos uma atividade que é a de “Preparar Execução do Processo” nela eu consigo selecionar o XML do log de execução de processos. Com isso obtenho a informação dos valores dos campos desse processo de envio de e-mail, por exemplo.

    Agora vem a minha dúvida…É possível eu obter o valor desses campos através do XML e comparar na atividade de SE/SENÃO para que eu dispare a exceção? Se não, qual alternativa vc indicaria?

    Att.

    Curtir

    • Avatar de Lucas Abreu Lucas Abreu

      Renato,

      Consegui fazer a FV entrar na condição colocando desta maneira !this.rmsPrepareParamsProcActivity1.Tables[“Parametros”][“EnviarRepresentante”].AsBoolean.

      Só que eu tenho um problema. A FV sempre entra nessa condição, independente se eu marcar a flag no processo.

      Att.

      Curtir

  16. Boa noite Lucas, como vai? Estava de férias e voltando as atividades… Conseguiu resolver o problema que citou da fórmula visual? Me parece que não esta pegando os valores que esta citando, caso não tenha resolvido me retorne com mais detalhes para poder te ajudar.

    Curtir

  17. Avatar de Tânia Tânia

    Boa tarde Renato !!

    Quando emito NF ou Pedido de Vendas, preciso ir no cadastro dos produtos digitados e chegar se o campo NCM (NUMEROCCF) está preenchido.

    Fiz uma fórmula visual :

    1) Inseri “Para cada Iteração”, “Sequencia”;
    2) dentro inseri um SQL para acessar o cadastro do produto e trazer o conteúdo do campo;
    3) Inseri Se/Senão e gerar exceção

    A fórmula funciona só para o primeiro produto da NF.

    O que tenho que fazer para que ela valide todos os produtos da NF ?
    Pelo que li bastava colocar a atividade Para cada Iteração que daria certo.
    Estou quebrando a cabeça e não consigo achar a saída.

    Será que vc pode me ajudar ??

    Obrigada !!

    Curtir

  18. Boa noite Tânia, Acesse o Post ATIVIDADE PARA CADA ITERAÇÃO que explica como usar esta atividade. A diferença do exemplo do Post para sua formula é que ao invés de acessar a Tables [0] irá acessar a Tables[“TITMMOV”] diretamente.

    Curtir

    • Avatar de CARLOS NAZARENO FARIAS MACEDO CARLOS NAZARENO FARIAS MACEDO

      Oi Renato, boa tarde!
      Tudo bem?!

      Estou desenvolvendo uma fórmula visual para incluir movimento e estou tendo dificuldade em utilizar as atividades “Inclusão Movimento”, “Inclusão item Movimento” , “Inclusão Rateio Ccu Item Movimento”, “Salvar Movimento”.
      Não encontrei material na internet sobre essas atividades.

      Seria possível nos enviar de exemplo uma Fórmula visual com essas atividades?

      Atenciosamente;
      Carlos Macêdo.

      Curtir

  19. Avatar de wagner wagner

    Boa tarde, utilizamos o educacional com o processo Copiar Turmas por período letivo, estamos utilizando a atividade Ler Parâmetros do Processo e conseguimos gerar a exceção com XML dos parâmetros do processo e alterar alguns campos desse XML por meio da expressão, porém o registro final criado após a cópia da turma não obedece o que alteramos no XML.
    Como podemos realizar uma alteração no XML do processo e persistir após finalizar o processo?

    Curtir

  20. Avatar de wagnertsilva wagnertsilva

    Boa tarde, utilizamos o educacional com o processo Copiar Turmas por período letivo, estamos utilizando a atividade Ler Parâmetros do Processo e conseguimos gerar a exceção com XML dos parâmetros do processo e alterar alguns campos desse XML por meio da expressão, porém o registro final criado após a cópia da turma não obedece o que alteramos no XML.
    Como podemos realizar uma alteração no XML do processo e persistir após finalizar o processo?

    Curtir

    • Boa tarde Wagner, Precisamos analisar a funcionalidade em questão mais a fundo. De acordo com o que informou parece que os parâmetros são carregados novamente desconsiderando os alterados pela formula visual. Neste caso acho que poderia pegar a turma que criou e usar as atividades de leitura de um dataserver (readrecord e saverecord) para realizar uma leitura da turma que criou após a execução do processo, carregar seus dados, alterar e salvar novamente.

      Tente por este caminho e caso tenha dificuldades podemos conversar a respeito de uma consultoria para analisar o seu processo, a funcionalidade e as possíveis soluções mais a fundo.

      Havendo interesse entre em contato! Obrigado!

      Curtir

  21. Avatar de Charles Charles

    Caros, estou precisando configurar alguns valores default na action “MovEnviaEmailMovAction” (Enviar E-mail para Cliente/Fornecedor), preciso que as opções de envio para representante e Cli/For já apareçam marcadas no Wizard antes da execução do processo, alguém poderia me informar como faço?.

    Curtir

    • Avatar de Charles Charles

      Boa tarde, Renato… Justamento, existe, junto com ele há mais 3 atividades…

      Sendo a:
      – “Consultar Parâmetros do Processo” – rmsProcessParamsActivity
      – “Ler Parâmetros do Processo” – rmsReadParamsProcActivity
      – “Preparar Execução do Processo” – rmsPrepareParamsProcActivity
      – “Executa Processo” – rmsProcessActivity

      Bem, acredito que os dois últimos trabalhem em conjunto e sirvam apenas para execução de forma isolada, sem ir no processo na visão do movimento.

      Então, os outros dois, consultar e ler, não consigo fazer a relação ou fazer com que ele se realmente modifique lá no wizard, lembrando que tento colocar o gatilho no próprio processo, onde há 4 opções, antes e depois de submeter e antes e depois da execução.

      A atividade “rmsProcessParamsActivity” é a que me mostra todos os parâmetros assim que preencho qual processo a que ele se refere… acredito que seja essa atividade que irá “setar” os parâmetros, mas não consigo fazê-lo funcionar.

      Onde será que estou errando, no gatilho?

      Curtir

  22. Boa tarde Charles,

    Para exibir os dados no Wizard dos parâmetro vai depender muito de como foi implementado o preenchimento no Wizard. Caso não tenha nenhum valor default para este processo creio que não é tratado para exibir os dados através do preenchimento dos parâmetro, assim a classe de parâmetros é preenchida somente ao executar o processo.

    Desta forma você conseguiria intervir nos valores que foram informados na tela (wizard) mas não conseguiria exibir no Wizard antes de executar pois a tela não esta lendo os valores do parâmetros antes da execução e sim somente ao executar o processo porque leva em conta que sempre será informado os valores do wizard.

    Curtir

  23. Avatar de Marcilio Marcilio

    Estou tentando criar um fórmula visual que ao gerar um movimento de nfs do Educacional para o Nucleus, a fórmula executa uma consulta SQL que retorna o valor da bolsa do aluno e preenche um determinado campo no movimento, sendo um processo do Educacional para o Nucleus, estou usando o gatilho “Consulta valor no contexto do movimento”, pego o campo IDMOV pois uso ele como parâmetro na minha consulta SQL, porém, quando realizo o processo só obtenho essa mensagem de erro: Erro na execução da Atividade: ‘rmsConsSQLActivity1’ Erro: GetRuntimeValue failed since Path ‘Fields[“IDMOV”]’ evaluated to ‘null’ value.

    Curtir

    • Bom dia Marcilio, tentar usar outro gatilho pois neste o valor do idmov ainda esta nulo. Um teste que você pode fazer é colocar um valor fixo para ver se sua consulta sql esta correta, caso retorne valor a suspeita que te passei fica forte.

      Curtir

      • Avatar de Marcilio Marcilio

        Na opção do processo de geração de movimento no Educacional, só tenho 4 gatilhos (Antes de submeter o processo, Após submeter o processo, Antes da execução e Após a execução), estou usando o gatilho Após a execução e minha primeira atividade da FV é Consulta o valor do contexto, está trazendo o valor corretamente, porém se eu colocar uma SQL logo em seguida com parâmetro lendo o retorno da minha primeira atividade não funciona. Teria alguma outra sugestão?

        Curtir

  24. Avatar de Marcilio Marcilio

    Renato, meu problema não é acessar o valor da consulta, é como pegar o IDMOV durante o processo de geração de movimento do Educacional para o Nucleus para passar no parâmetro da minha consulta, sendo que a atividade “Consulta Valor do Contexto” pega o idmov, consigo ver quando coloco uma expressão e uma exceção, mas se coloco uma consulta sql não funciona, vou ir tentando outras possibilidades, obrigado pela ajuda.

    Curtir

  25. Avatar de André André

    Fala Lucas, primeiramente parabéns pelo Blog! Muita informações útil !

    Se puder me dar uma dica de como eu consigo receber/faturar um movimento 1.1.xx para 1.2.xx usando a atividade FATURAMENTO MOVIMENTO. Neste caso, não possui um campo obrigatório que é NATUREZA (nem para o item nem para o movimento) como também campos da tabela CODFB1FLX etc.. Consegue me dar uma dica ?

    Obrigado!

    Curtir

Deixe um comentário