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.
Obs.: No print abaixo é apenas uma ilustração do cenário de um campo multiplicado por outro, se for uma rotina com grid antiga, deve ser alterado para aCols[n][GDFieldPos(‘C6_QTDVEN’)] * aCols[n][GDFieldPos(‘C6_PRCVEN’)]
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.
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.
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.
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.
Bom dia,
Foi criado o gatilho e funcionou, porem ele traz os 2 caracteres do campo C6_ITEM, e precisa dos 6!
Bom dia Cleberson, tudo joia?
Então, não sei dizer se você seguiu o cenário A ou o cenário B. Em todo o caso, o que você pode tentar fazer é usar a função PadL, colocando zeros a esquerda da sua expressão.
PadL(, 6, “0”)
Ai no comando acima, ele vai pegar a expressão, e mesmo que seja dois caracteres, por exemplo, “01”, “02” até “ZZ” ele vai adicionar zeros a esquerda até chegar no tamanho 6, por exemplo “000001”, “000002” até “0000ZZ”.
Obs.: Se você utilizar StrZero com Val, pode surtir um efeito parecido com a PadL acima, só não funcionará 100% quando usar letras junto dos números.
Tenha uma ótima e abençoada sexta feira.
Um grande abraço.
Boa noite!
É possível criar um gatilho onde ao digitar o COD.MUNICIPIO X ele fixar um código em outro campo customizado?
Bom dia Diego, tudo joia?
Até dá, mas você precisaria criar uma User Function que é acionada pelo gatilho e depois “percorrer” todos os objetos da tela, até encontrar o do campo e depois dar um SetFocus nele.
Nesse link tem um exemplo de como percorrer os objetos na tela: https://terminaldeinformacao.com/2023/07/10/deixar-um-campo-obrigatorio-via-customizacao-ti-responde-064/
Ai na linha onde tem o SetCSS, você mudaria o método para ser o SetFocus() pra posicionar no campo desejado.
Tenha um ótimo e abençoado fim de semana.
Um grande abraço.
Bom dia,
Gostaria de criar um gatilho para preenchimento de campo quando o conteúdo for igual 0, preencher o campo customizado com a opção igual 1, como posso fazer isso?
Bom dia Denis, tudo joia?
Vamos supor que o campo que você vai testar se é igual a 0, seja o B1_X_AAA e o campo que você vai preencher com 1 seja o campo B1_X_BBB.
Então seu gatilho ficaria:
Do campo Origem: B1_X_AAA
Para o Campo: B1_X_BBB
Regra: “1” //aqui coloquei entre aspas se o campo B1_X_BBB for caractere, se ele for numérico, ai você coloca sem aspas
Condição: M->B1_X_AAA == “0” //mesmo caso do de cima, se o campo B1_X_AAA for caractere, por isso coloquei aspas, agora se for numérico ai é sem aspas o 0
Feito isso, quando o usuário alterar o campo B1_X_AAA, se o campo estiver como 0, ele vai disparar um gatilho e preencher 1 no campo B1_X_BBB.
Tenha uma ótima e abençoada quinta feira.
Um grande abraço.