No artigo de hoje, vamos falar um pouco sobre Gatilhos, dando alguns exemplos de como criar no Protheus.
Muitos alunos me perguntam como deve ser a criação de um gatilho, e como é a utilização dele no sistema.
Pois bem, um gatilho no Protheus, é usado quando você quer disparar uma informação para algum campo de destino, através da saída de um campo de origem.
Então vamos pensar na tela de pedido de venda, ao sair do campo Código do Produto (após a validação do sistema e validação do usuário), serão executados gatilhos, já trazendo informações como por exemplo, a Descrição do Produto.
Resumidamente, um gatilho então tem como objetivo, ao sair de um campo de origem, atualizar informações em um campo destino.
Para cadastrar um gatilho, é necessário abrir a Bases de Dados dentro do Configurador (SIGACFG). Na esquerda, selecionamos a opção Gatilhos.
Para criar, basta clicarmos no botão com folha e sinal de +. Os campos para preenchimento são:
- Campo: Campo de origem que será disparado o gatilho
- Sequência: Campo sequencial, onde o próprio Protheus preenche sozinho, conforme o campo origem
- Domínio: Campo de destino, que irá receber a informação “gatilhada”
- Tipo: Nas customizações e cenários que iremos ver, sempre iremos utilizar o Primário (que serve para atualizar dados na mesma tela aberta), caso queira saber mais sobre os outros tipos, acesse a documentação no TDN – https://tdn.totvs.com/pages/releaseview.action?pageId=312157626
- Regra: A regra de preenchimento do campo destino
- Posiciona: Se irá posicionar em alguma tabela estrangeira
- Alias: Alias da tabela estrangeira, se o posiciona for igual a Sim
- Ordem: Índice da tabela estrangeira, se o posiciona for igual a Sim
- Chave: Chave de pesquisa, conforme os dados da origem, na tabela estrangeira e o índice, se o posiciona for igual a Sim
- Condição: Condições extras, para execução do Gatilho
Exemplo 1 – Gatilho que executa algum cálculo entre dois campos
Nesse exemplo, queremos que quando o usuário digitar uma quantidade de um item do pedido, automaticamente o preço total seja calculado. Então para isso, iremos criar um gatilho do campo de origem sendo a quantidade vendida, e o campo destino o preço total.
E a regra, será o campo de quantidade vendida multiplicado pelo campo preço unitário.
Exemplo 2 – Gatilho que traz informação de outra tabela para algum campo
Para esse caso, quando o usuário digitar o código do produto, iremos posicionar no cadastro de produtos (SB1), e iremos trazer a descrição do produto.
Note no print abaixo, que usamos o Posiciona igual a Sim, e é informado as regras de posicionamento logo abaixo.
Exemplo 3 – Gatilho que usa alguma User Function para atualizar informações
Agora imagina o seguinte cenário, ao preencher o vendedor do pedido de venda, iremos executar uma user function, que busque a transportadora, através de algumas regras internas da empresa em questão, como podemos fazer isso?
Primeiro, iremos criar uma User Function, que irá fazer a query SQL e as validações, e o Return dela, deve ser do mesmo tipo do campo que irá receber a informação do gatilho (nesse caso o da transportadora).
User Function zTstGat() Local aArea := GetArea() Local cCodTransp := "" /* Aqui, podemos fazer a cláusula SQL, e outras validações Depois, basta, alterarmos a variável cCodTransp */ RestArea(aArea) Return cCodTransp
Abaixo um print de como fica nosso gatilho:
Exemplo 4 – Gatilho que só executa, se o usuário for o Administrador
Nós iremos pegar um gatilho que já existe, no caso o gatilho do campo de Produto para o campo Revisão do Produto na tela de Pedidos de Venda.
E adicionaremos uma condição, de que somente se o usuário for o Administrador, irá executar o gatilho (notem o campo Condição).
Para esse caso, nós podemos adicionar inúmeras condições, como por exemplo, só executar se for um grupo de clientes determinado, alguma TES específica, etc… Desde que a condição sempre retorne .T. ou .F. (true ou false respectivamente).
Obs.: Para algumas telas que são em MVC, não é possível utilizar a referência em memória (RegToMemory, famoso M->), então devemos utilizar por exemplo, a FWFldGet ou instanciar direto o modelo e buscar o valor com GetValue.
Bom pessoal, por hoje é só.
Abraços e até a próxima.