Fórmulas Visuais / Workflows
A TOTVS tem constantemente aprimorando seus sistemas e a uma das novidades presentes desde a versão 11.0 são os Workflows ou Fórmulas Visuais.
Para que serve?
A ferramenta serve para criarmos uma série de situações no sistema como validações de campos, validação de situações cadastrais, envio de e-mail, geração de exceções, etc. Para entender, vamos a exemplos que já são aplicados em diversos clientes:
1. Envio de e-mail ao se cadastrar um novo produto: Em diversas situações as entradas do sistema não são corretas pois os campos cadastrais não foram preenchidos (campos contábeis / fiscais), então com a execução de uma fórmula visual, podemos alertar, via e-mail que um novo produto / serviço foi cadastrado.
2. Validação de campo complementar em lançamento: Em algumas situações o cliente possui, no lançamento da NF, um campo complementar que precisa estar preenchido com um valor válido, nestes casos o sistema não permite transformar um campo complementar em campo obrigatório, logo a fórmula visual resolve este problema.
3. Informar responsável sobre demanda: Neste caso específico, vou utilizar um exemplo do TOTVS Obras e Projetos (RM Solum), nesta situação, o usuário ao gerar os pedidos de compras e atingir 80% do total permitido, alertará o responsável de compras que um determinado insumo atingiu seu limite.
Como fazer?
Os sites da TOTVS estão cheios de referências de como fazer diversos tipos de fórmulas visuais, sendo esse link considerado o mais relevante por nós:
- No TOTVS Obras e Projetos (RM Solum), ao gerar os pedidos de compra, o sistema deverá verificar se o total consumido do insumo atingiu 80% do total planejado, caso tenha atingido, o responsável pelo setor de compras deverá receber um e-mail informando que este insumo atingiu este nível.
- Como a ideia é criar um passo-a-passo não iremos criar uma trava básica desta fórmula que seria o pré-requisito que o responsável receba apenas 1 e-mail daquele insumo, para evitar receber N e-mails enquanto o usuário gera os pedidos de compra.
SELECT DISTINCT MPRJ.CODPRJ, MPRJ.DESCRICAO, MNECESSIDADEMAT.IDPEDIDO, MNECESSIDADEMAT.CODCOLIGADA, MNECESSIDADEMAT.IDPRJ,
MISM.IDISM, MISM.CODISM, MISM.DESCISM, MISM.CODUND, TPRD.IDPRD, TPRD.DESCRICAO, CASE WHEN ((SELECT ISNULL(SUM(ISNULL(MI.QTDEPEDIDA, 0)), 0) FROM MPEDIDOMAT (NOLOCK), MNECESSIDADEMAT MN(NOLOCK), MITEMPEDIDOMATERIAL MI(NOLOCK) WHERE MN.CODCOLIGADA = :CODCOLIGADA_N AND MN.IDPRJ = :IDPRJ_N AND MN.IDISM = MNECESSIDADEMAT.IDISM AND MN.CODCOLIGADA = MPEDIDOMAT.CODCOLIGADA AND MN.IDPRJ = MPEDIDOMAT.IDPRJ AND MN.IDPEDIDO = MPEDIDOMAT.IDPEDIDO AND MPEDIDOMAT.TIPOREQUISICAO = 0 AND MI.CODCOLIGADA = MN.CODCOLIGADA AND MI.IDPRJ = MN.IDPRJ AND MI.IDNECESSIDADE = MN.IDNECESSIDADE) / (SELECT SUM(MCURVASISM.QUANTPLANEJADO) FROM MCURVASISM (NOLOCK) WHERE CODCOLIGADA = :CODCOLIGADA_N AND IDPRJ = :IDPRJ_N AND IDISM = MNECESSIDADEMAT.IDISM AND VALIDO = 1)) >= 0.8 THEN '1' ELSE '0' END AS PERC, QTD_NECESS = (SELECT SUM(MCURVASISM.QUANTPLANEJADO) FROM MCURVASISM (NOLOCK) WHERE CODCOLIGADA = :CODCOLIGADA_N AND IDPRJ = :IDPRJ_N AND IDISM = MNECESSIDADEMAT.IDISM AND VALIDO = 1), QTD_PEDIDA = (SELECT ISNULL(SUM(ISNULL(MI.QTDEPEDIDA, 0)), 0) FROM MPEDIDOMAT (NOLOCK), MNECESSIDADEMAT MN(NOLOCK), MITEMPEDIDOMATERIAL MI(NOLOCK) WHERE MN.CODCOLIGADA = :CODCOLIGADA_N AND MN.IDPRJ = :IDPRJ_N AND MN.IDISM = MNECESSIDADEMAT.IDISM AND MN.CODCOLIGADA = MPEDIDOMAT.CODCOLIGADA AND MN.IDPRJ = MPEDIDOMAT.IDPRJ AND MN.IDPEDIDO = MPEDIDOMAT.IDPEDIDO AND MPEDIDOMAT.TIPOREQUISICAO = 0 AND MI.CODCOLIGADA = MN.CODCOLIGADA AND MI.IDPRJ = MN.IDPRJ AND MI.IDNECESSIDADE = MN.IDNECESSIDADE), QTD_EXTRA = (SELECT ISNULL(SUM(ISNULL(MITEMPEDIDOMATEXTRA.QTDEPEDIDO,0)),0) FROM MITEMPEDIDOMATEXTRA WHERE MITEMPEDIDOMATEXTRA.CODCOLIGADA = :CODCOLIGADA_N AND MITEMPEDIDOMATEXTRA.IDPRJ = :IDPRJ_N AND MITEMPEDIDOMATEXTRA.IDPRD = TPRD.IDPRD), QTD_PENDENTE = (SELECT ISNULL(SUM(ISNULL(MCURVASISM.QUANTPLANEJADO, 0)), 0) FROM MCURVASISM (NOLOCK) WHERE CODCOLIGADA = :CODCOLIGADA_N AND IDPRJ = :IDPRJ_N AND IDISM = MNECESSIDADEMAT.IDISM) - (SELECT ISNULL(SUM(ISNULL(MI.QTDEPEDIDA, 0)), 0) FROM MPEDIDOMAT (NOLOCK), MNECESSIDADEMAT MN(NOLOCK), MITEMPEDIDOMATERIAL MI(NOLOCK) WHERE MN.CODCOLIGADA = :CODCOLIGADA_N AND MN.IDPRJ = :IDPRJ_N AND MN.IDISM = MNECESSIDADEMAT.IDISM AND MN.CODCOLIGADA = MPEDIDOMAT.CODCOLIGADA AND MN.IDPRJ = MPEDIDOMAT.IDPRJ AND MN.IDPEDIDO = MPEDIDOMAT.IDPEDIDO AND MPEDIDOMAT.TIPOREQUISICAO = 0 AND MI.CODCOLIGADA = MN.CODCOLIGADA AND MI.IDPRJ = MN.IDPRJ AND MI.IDNECESSIDADE = MN.IDNECESSIDADE)
FROM MNECESSIDADEMAT (NOLOCK), MISM (NOLOCK), MITEMPEDIDOMATERIAL (NOLOCK), TPRD (NOLOCK), MPRJ(NOLOCK) WHERE MNECESSIDADEMAT.CODCOLIGADA = :CODCOLIGADA_N AND MNECESSIDADEMAT.IDPRJ = :IDPRJ_N AND MNECESSIDADEMAT.IDPEDIDO = :IDPEDIDO_N AND MNECESSIDADEMAT.CODCOLIGADA = MISM.CODCOLIGADA AND (MNECESSIDADEMAT.IDPRJ = MISM.IDPRJ OR MISM.IDPRJ = 0) AND MNECESSIDADEMAT.IDISM = MISM.IDISM AND MITEMPEDIDOMATERIAL.CODCOLIGADA = MNECESSIDADEMAT.CODCOLIGADA AND MITEMPEDIDOMATERIAL.IDPRJ = MNECESSIDADEMAT.IDPRJ AND MITEMPEDIDOMATERIAL.IDNECESSIDADE = MNECESSIDADEMAT.IDNECESSIDADE AND MITEMPEDIDOMATERIAL.CODCOLIGADA = TPRD.CODCOLIGADA AND MITEMPEDIDOMATERIAL.IDPRD = TPRD.IDPRD AND MPRJ.CODCOLIGADA = MNECESSIDADEMAT.CODCOLIGADA AND MPRJ.IDPRJ = MNECESSIDADEMAT.IDPRJ GROUP BY MNECESSIDADEMAT.IDPEDIDO, MNECESSIDADEMAT.CODCOLIGADA, MNECESSIDADEMAT.IDPRJ, MISM.IDISM, MNECESSIDADEMAT.IDISM, MISM.CODISM, MISM.DESCISM, MISM.CODUND, TPRD.IDPRD, TPRD.DESCRICAO, MPRJ.CODPRJ, MPRJ.DESCRICAO
- Clique no botão “…” na frente do parâmetro CODCOLIGADA_N
- Será aberta uma tela de seleção do WorkFlow, selecione Fields, Item[0] e pressione F2, a opção ficará passível de edição, então vamos até o colchetes e iremos escrever o nome do campo que queremos puxar da visão do usuário, neste caso CODCOLIGADA e dê um ENTER.
- Após isto, clique em AsInteger (pois o CODCOLIGADA é do tipo inteiro).
- A tela deverá ficar assim:
- Activity=RMSWorkflow, Path=Fields.Item["CODCOLIGADA"].AsInteger
- Activity=RMSWorkflow, Path=Fields.Item["IDPEDIDO"].AsInteger
- Activity=RMSWorkflow, Path=Fields.Item["IDPRJ"].AsInteger
11. Essa SQL pode gerar mais de uma linha de retorno, pois ela buscará, item a item da requisição, quem ultrapassou ou não 80% do consumo antes de enviar um e-mail, então temos que inserir um componente que seja responsável por percorrer todas as linhas da SQL.
Para tanto, selecione a aba Atividades e adicione abaixo do componente SQL o componente “Para cada Iteração”.
12. Temos que definir para este componente, quem fornecerá os registros para que ele atue, neste caso será a nossa consulta SQL. Clique no componente “Para cada Iteração”, vá em Propriedades e clique duas vezes no ícone amarelo da ”Lista de itens”.
Na tela que se abre, busque por rmsConsSQLActivity1, Tables[0] e selecione o componente Rows.
Feito isto, tudo o que for inserido dentro deste componente agora, será feito tantas vezes quanto forem os resultados da SQL.
13. Agora vamos adicionar as nossas condições ao sistema, ou seja, determinar quando será enviado o e-mail.
Vá na aba Atividades e selecione o componente “Se/Senão” dentro do componente “Para cada Iteração”, sua tela deve estar dessa maneira neste momento:
Dentro do ifElseBranchActivity1, vamos inserir as condições que desejamos.
Para tanto, selecione o lado esquerdo do ifElse, clique em “Propriedades”, clique em Condition e depois em “Declarative Rule Condition”.
A propriedade permitirá a você abri-lá, você então poderá ver outra propriedade, chamada de “Condition Expression”, clique no botão logo a frente dela e depois em “New” e será aberta a seguinte tela:
A condição é escrita em linguagem similar ao C#, abaixo está o texto que deve ser adicionado a nossa condição:
this.rmsForEachActivity1.Fields["PERC"].AsString == "1"
Se você estudou a SQL viu que nela mesmo nós estamos retornando o valor 1 ou 0, sendo que 1 significa que o item chegou a 80% de consumo e 0 não.
Diversas vezes será mais fácil criar as verificações dentro da própria SQL do que no Condition Rule da fórmula Visual.
14. Agora vamos adicionar um componente de expressão que irá conter o texto do E-Mail. Adicione o componente Expressão dentro do ifElseBranchActivity1, clique em “Propriedades”, “Expressões” e digite um texto similar ao demonstrado abaixo:
'Prezado,' +NewLine + NewLine + 'O sistema TOTVS Gestão de Obras e Projetos constatou que um insumo ultrapassou o limite de 80% de consumo: ' +NewLine+ '--- Projeto: '+rmsForEachActivity1.CODPRJ+' - '+rmsForEachActivity1.DESCRICAO+NewLine+NewLine+ rmsForEachActivity1.CODISM+' - '+rmsForEachActivity1.DESCISM +NewLine+ '--- Necessidade: '+rmsForEachActivity1.QTD_NECESS+NewLine+ '--- Pedido: '+rmsForEachActivity1.QTD_PEDIDA+NewLine+ '--- Extra: '+rmsForEachActivity1.QTD_EXTRA+NewLine
15. O próximo passo é enviar o e-mail.
Adicione um componente de “Envio de E-Mail” logo abaixo da expressão. Clique no mesmo e em propriedades e configure conforme desejar as propriedades:
- Assunto – Ex: [E-Mail Automático] Alerta de Curva ABC
- Destinatários. O destinatário pode ser retornado via consulta SQL em um determinado usuário ou inserido manualmente, para fins de exemplo vamos inserir manualmente. Ex: joao@silva.com.br
- Destinatários em cópia / Destinatários em Cópia Oculta
- Remetente (pode ser o usuário que está fazendo o pedido, a empresa (filial), a coligada e e-mail padrão do sistema).
- Texto do E-mail: Clique no botão “…” e selecione rmsForEachActivity1, ifElseActivity1, ifElseBranchActivity1, rmsExpressionActivity1, Expression e clique em OK.
Para não termos problemas de formatação no texto de envio, vamos voltar ao componente rmsExpressionActivity1, clicar em “Valor Calculado” e apontar para o componente de envio de e-mail no campo “Body”.
16. Quase prontos! Sua fórmula Visual deve estar parecida com essa:
17. Falta agora somente adicionar o Gatilho, ou seja, o que faz a nossa fórmula funcionar!
Para tanto, salve a sua fórmula visual, clique sobre ela e depois sobre o ícone “Editar”, acesse a aba “Gatilhos” e clique em novo.
Na tela que se abre, vamos procurar o item “Antes da atualização do registro (Fim)” e a Action “Requisição de Material”.
Conclusão
Pronto! A fórmula visual está pronta, vamos testá-la. Lembre-se de que seu computador deve estar preparado para rodar fórmulas visuais, para confirmar isso, acesse o site http://totvsconnect.blogspot.com/2011/07/dicas-repositorio-de-formulas-visuais.html e verifique a configuração no final das fórmulas visuais, item 18.
Para testar a mesma, vamos fazer uma requisição de material de um determinado insumo e solicitar todo o seu quantitativo, um e-mail deverá ser enviado para o destinatário(s) cadastrado(s) na fórmula visual.
Abaixo o e-mail gerado com essa fórmula visual:
A Ethos Consultores conta com know-how para implementar diversas situações com fórmulas visuais, entre em contato conosco sempre que precisar!
Segurança da Informação para Pequenas e Médias Empresas
A segurança da informação não é um tema novo nas grandes corporações e as ameaças atuais exigem uma maior atenção das pequenas e médias empresas.
Leia mais
TI Verde
É notória a necessidade de contribuir com o meio ambiente e a responsabilidade de todas as empresas para este fim. Imagine aliar a esta necessidade a uma redução de custos, isto é possível na área de tecnologia, é a chamada TI Verde, cada vez mais adotada em empresas de médio porte.












