Validando se um gatilho existe e executando ExistTrigger e RunTrigger – Maratona AdvPL e TL++ 162

Nesse vídeo demonstraremos a utilização das funções ExistTrigger e RunTrigger, sendo que a primeira valida se existem gatilhos para um campo e a segunda dispara a execução desses gatilhos.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe162
Valida se gatilhos existem e executa eles
@type Function
@author Atilio
@since 19/12/2022
@see https://tdn.totvs.com/pages/releaseview.action?pageId=6815032
@obs 
    Função ExistTrigger
    Parâmetros
        + Nome do campo a ser verificado
    Retorno
        + .T. Se o campo possui gatilhos (X3_TRIGGER) ou .F. se não possui

    Função RunTrigger
    Parâmetros
        + nTipo        , Numérico    , Qual é o tiipo do gatilho (1=Enchoice; 2=Grid GetDados; 3=Consulta Padrão F3)
        + nLin         , Numérico    , Qual é a linha (quando o tipo for 2)
        + cMacro       , Caractere   , Compatibilidade
        + oObj         , Objeto      , Objeto da tela quando o tipo for 1
        + cField       , Caractere   , Nome do campo que os gatilhos serão disparados
    Retorno
        Função não tem Retorno

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe162()
    Local aArea     := FWGetArea()
    Local cCampo    := ""

    //Inicia o controle de transações
    Begin Transaction
        //Joga a tabela para a memória (M->)
        RegToMemory(;
            "SA1",;   // cAlias - Alias da Tabela
            .T.,;     // lInc   - Define se é uma operação de inclusão ou atualização
            .F.;      // lDic   - Define se irá inicilizar os campos conforme o dicionário
        )

        //Preenche o estado e o código da cidade
        M->A1_EST     := "SP"
        M->A1_COD_MUN := "06003"

        //Chama gatilho caso exista
        cCampo := "A1_COD_MUN"
        If ExistTrigger(cCampo)
            RunTrigger( ;
                1,;           //nTipo (1=Enchoice; 2=GetDados; 3=F3)
                Nil,;         //Linha atual da Grid quando for tipo 2
                Nil,;         //Não utilizado
                ,;            //Objeto quando for tipo 1
                cCampo;       //Campo que dispara o gatilho
            )
        EndIf

        //Mostra a cidade preenchida conforme gatilho disparado
        FWAlertInfo("Cidade: " + M->A1_MUN, "Teste de ExistTrigger e RunTrigger")

        //Cancela a transação para não incluir nenhum registro
        DisarmTransaction()
    End Transaction

    FWRestArea(aArea)
Return

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.

2 Responses

  1. Atílio, bom dia! Feliz 2024. Gostaria de acrescentar que muitas vezes alguma pessoa desaviada crie o gatilho via APSDU diretamente na tabela SX7. Sendo assim, pode ocorrer de um flag não ser gerado que é o X3_TRIGGER do campo que acionará o referido gatilho. Por conta desse flag, a função ExistTrigger retornará falso indicando que o gatilho não existe. Espero ter contribuído.

Deixe uma resposta

Terminal de Informação