Como criar gatilhos no Protheus

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.

Acessando cadastro de 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 1 – Gatilho que executa algum cálculo entre dois campos

 

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 2 – Gatilho que traz informação de outra tabela para algum campo

 

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 3 – Gatilho que usa alguma User Function para atualizar informações

 

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).

Exemplo 4 – Gatilho que só executa, se o usuário for o Administrador

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

6 Responses

  1. CLEBERSON DA SILVA disse:

    Boa tarde,

    é possível fazer um gatilho para trazer a informação do campo C6_ITEM para o campo C6_ITEMPC ?

    • Bom dia Cleberson, tudo joia?

      Não, do campo C6_ITEM não, pois ele não é “digitável”. Como um gatilho precisa de um campo que dispare a ação, você precisa colocar em outro campo, por exemplo, de um campo que seja “preenchível”.

      E aí desse campo que você preenche, você dispara para o C6_ITEMPC, e você pega a informação do C6_ITEM.

      Um forte abraço.

  2. william disse:

    Bom dia gostaria de fazer um gatilho dessa forma IIF(M->C7_COND = “C12”,AVISO(“ATENCAO”,”Nao esquecer a condicao de pagamento”,{“ENTER”}),M->C7_COND), no caso seria uma mensagem nesse caso teria como realizar num gatilho simples como esse?

    • Bom dia William, tudo joia?

      O conceito de gatilho é você disparar uma informação conforme preenchimento de um campo.

      Quando é necessário mostrar uma mensagem em tela (como em validações), o ideal é você fazer na Validação de Usuário do campo no Configurador (X3_VLDUSER) ou até mesmo um ponto de entrada no TudoOk da rotina.

      Um grande abraço.

  3. cleberfiscal23 disse:

    Dan, neste caso que preciso seguir a sequencia do C6_ITEM, teria alguma forma de gatilho ? exemplo,

    Linha 1 da SC6 será o campo alimenta o campo C6_ITEMPC = ‘0000001’ …. Linha 2 C6_ITEMPC = ‘0000002’

    • Bom dia Cleber, tudo joia?

      Não sei se entendi muito bem, você precisa de:
      a. Ao preencher o campo C6_ITEMPC para popular o C6_ITEM?
      b. Ou, ao preencher o campo C6_ITEM para popular o C6_ITEMPC?

      Se for a letra A:
      Por padrão, o campo C6_ITEMPC tem tamanho 6, e o C6_ITEM tem tamanho 2, então os dados ficariam truncados (há não ser que ai tenha o mesmo tamanho de campo). Então o que você poderia fazer, seria criar um gatilho, pegando um Right de 2 ou tratar de alguma outra forma como em uma user function.

      Se for a letra B:
      O campo C6_ITEM é automático, então não vai ter como criar um gatilho a partir dele. O que você poderia fazer seria criar um gatilho de outro campo que é obrigatório, por exemplo, do campo C6_PRODUTO, e ai na regra do gatilho você usa o campo C6_ITEM, por exemplo:
      Campo Origem: C6_PRODUTO
      Campo Destino: C6_ITEMPC
      Regra: aCols[n][GDFieldPos(“C6_ITEM”)]

      Onde aCols é a variável com os dados da grid, n é a variável pública com o número da linha, e no GDFieldPos você está buscando a coluna do campo de Item.

      Um grande abraço.

Deixe uma resposta

Terminal de Informação