Gatilhos SX7 avancados — automacao de campos
Como criar gatilhos sofisticados na SX7 pra cascata de campos, validacoes complexas, lookup automatico. Tipos de gatilho, ordem de disparo.
Gatilho (SX7) e o jeito declarativo de fazer "se o usuario digitar X, calcule/valide Y". Diferente de PE (que e codigo), gatilho fica no dicionario — propagado entre filiais, sobrevive a update.
Estrutura da SX7
| Campo | Conteudo |
|---|---|
| X7_CAMPO | Campo que dispara (ex: "A1_CGC") |
| X7_TIPO | P=Posicionamento, V=Valor |
| X7_REGRA | Expressao avaliada (ex: "PadR(M->A1_CGC, 14)") |
| X7_CDOMIN | Campo destino (que recebe valor) |
| X7_SEEK | S = posiciona alias antes; N = nao |
| X7_ALIAS | Alias a posicionar |
| X7_ORDEM | Indice usado |
| X7_CHAVE | Chave do seek |
| X7_PROPRI | S = usuario; U = TOTVS (nao mexer) |
| X7_CONDIC | Condicao (so dispara se .T.) |
| X7_SEQUEN | Sequencia de execucao se houver multiplos |
Tipo P (Posicionamento)
Posiciona um alias e atualiza campo destino com valor da tabela posicionada.
Cenario: usuario digita C5_CLIENTE em pedido de venda → automaticamente preenche
nome do cliente (C5_NOMECLI) buscando em SA1.
X7_CAMPO = "C5_CLIENTE"
X7_TIPO = "P"
X7_SEEK = "S"
X7_ALIAS = "SA1"
X7_ORDEM = "1"
X7_CHAVE = "xFilial('SA1') + M->C5_CLIENTE + M->C5_LOJACLI"
X7_CDOMIN = "C5_NOMECLI"
X7_REGRA = "SA1->A1_NOME"
Tipo V (Valor)
Calcula valor por expressao e atribui ao destino. Nao posiciona tabela.
Cenario: usuario digita quantidade (C6_QTDVEN) e preco (C6_PRCVEN) →
calcula valor total (C6_VALOR).
Gatilho 1:
X7_CAMPO = "C6_QTDVEN"
X7_TIPO = "V"
X7_REGRA = "M->C6_QTDVEN * M->C6_PRCVEN"
X7_CDOMIN = "C6_VALOR"
Gatilho 2 (espelho):
X7_CAMPO = "C6_PRCVEN"
X7_TIPO = "V"
X7_REGRA = "M->C6_QTDVEN * M->C6_PRCVEN"
X7_CDOMIN = "C6_VALOR"
Cascata — gatilhos em cadeia
Quando um gatilho atualiza campo Y, e Y tem outro gatilho que dispara, vira cadeia. AdvPL gerencia mas:
- Profundidade limite ~10 niveis
- Recursao circular leva a loop — TOTVS detecta e aborta
- Performance degrada — minimize cadeias
Validacao via gatilho
Cenario: validar CPF antes de aceitar.
X7_CAMPO = "A1_CGC"
X7_TIPO = "V"
X7_REGRA = "If(CGC(M->A1_CGC), M->A1_CGC, U_AvisaInvalido())"
X7_CDOMIN = "A1_CGC"
Validacao mais complexa: chamar User Function via X7_REGRA.
Condicional (X7_CONDIC)
Dispara gatilho so se condicao for verdadeira.
X7_CONDIC = "M->A1_PESSOA == 'J'" // so dispara pra PJ
X7_REGRA = "..." // valida CNPJ se PJ
Ordem de execucao (X7_SEQUEN)
Se varios gatilhos disparam pelo mesmo X7_CAMPO, X7_SEQUEN define ordem (1, 2, 3...). Util quando voce precisa fazer A antes de B.
Quando usar Gatilho vs PE
| Caso | Solucao |
|---|---|
| Preenchimento simples campo derivado | Gatilho (V ou P) |
| Validacao simples (faixa, formato) | Gatilho (V com User Function) |
| Logica complexa multi-campo | PE (M030LOK, MTA010OK) |
| Integracao externa | PE (mais flexivel) |
| Calculo financeiro multi-passo | PE |
Criar gatilhos via codigo
// PutSx7 - util pra distribuir customizacao
Static Function CriaGatilhos()
PutSx7("C5_CLIENTE", "P", ".T.", ;
"SA1", 1, ;
"xFilial('SA1') + M->C5_CLIENTE + M->C5_LOJACLI", ;
"C5_NOMECLI", "SA1->A1_NOME", "U", "01")
Return
Pegadinhas
- Em ExecAuto: gatilhos podem disparar diferentemente — alguns nao executam.
- X7_PROPRI: "U" = TOTVS (nao alterar). "S" = sua customizacao. Misturar pode causar conflito no update.
- Performance: gatilho com Posicione em base grande degrada digitacao.
- Documentar: gatilhos ficam invisiveis pra dev novo. Liste em README.