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

CampoConteudo
X7_CAMPOCampo que dispara (ex: "A1_CGC")
X7_TIPOP=Posicionamento, V=Valor
X7_REGRAExpressao avaliada (ex: "PadR(M->A1_CGC, 14)")
X7_CDOMINCampo destino (que recebe valor)
X7_SEEKS = posiciona alias antes; N = nao
X7_ALIASAlias a posicionar
X7_ORDEMIndice usado
X7_CHAVEChave do seek
X7_PROPRIS = usuario; U = TOTVS (nao mexer)
X7_CONDICCondicao (so dispara se .T.)
X7_SEQUENSequencia 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:

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

CasoSolucao
Preenchimento simples campo derivadoGatilho (V ou P)
Validacao simples (faixa, formato)Gatilho (V com User Function)
Logica complexa multi-campoPE (M030LOK, MTA010OK)
Integracao externaPE (mais flexivel)
Calculo financeiro multi-passoPE

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

Veja também