Como disparar um gatilho através do aCols em AdvPL

Olá pessoal…

Hoje vou mostrar para vocês como percorrer todas as linhas de um aCols e disparar um gatilho através da função RunTrigger.

AdvPL

AdvPL

Para executar o gatilho na grid, primeiro nós percorremos o acols, depois verificamos se existe um gatilho criado para ele (tabela SX7), posicionamos no gatilho, e enquanto existir gatilhos para esse campo, a gente chama a função RunTrigger.

No exemplo abaixo é isso que fazemos com o campo C6_X_CAMPO, onde ele percorre todas as linhas, e dispara todos os gatihos do C6_X_CAMPO. Lembrando que a maioria das rotinas a variável n e aCols são variáveis públicas.

cCampoAux := "C6_X_CAMPO"
nLinBkp := n
For n := 1 To Len(aCols)
	//Se tiver gatilhos no campo
	If ExistTrigger(cCampoAux)
		//Posiciona no gatilho
		DbSelectArea("SX7")
		SX7->(DbSetOrder(1)) //Campo + Sequencia
		SX7->(DbGoTop())
		If SX7->(DbSeek(cCampoAux))
			//Percorrendo todos os gatilhos
			While ! SX7->(EoF()) .And. Alltrim(SX7->X7_CAMPO) == Alltrim(cCampoAux)
				//Dispara o Gatilho
				cCpoTrigger := SX7->X7_CAMPO
				RunTrigger(	2,;           //nTipo (1=Enchoice; 2=GetDados; 3=F3)
							n,;           //Linha atual da Grid quando for tipo 2
							Nil,;         //Não utilizado
							,;            //Objeto quando for tipo 1
							cCpoTrigger)  //Campo que dispara o gatilho
							
				SX7->(DbSkip())
			EndDo
		EndIf
	EndIf
Next
n := nLinBkp

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

4 Responses

  1. Roque Freitas disse:

    Grande Daniel!

    Que post sensacional cara!!! Há muito estava procurando uma solução dessas, mas como leitor assíduo do Terminal de Informação, estava convicto que a qualquer hora este post chegaria!

    Me ajudou muito mesmo parceiro, utilizei o conceito apresentado para personalizar a rotina MATA103 ficou top!

    Sucesso meu caro…

    Forte abraço!

    Att,

    Roque Freitas

  2. Igor disse:

    Preciso atualizar os campos da tela em tempo “real”. Eu criei um gatilho onde na regra eu executo uma função. Nessa função eu insiro o valor nas variáveis de memória e no Return eu retorno a informação que irá preencher a conta domínio. Eu queria que além de preencher o campo domínio, preencher outros campos também. Por exemplo: gatilho é no campo DA3_ATIVO, domínio para o campo DA3_LOG e preciso que no retorno também sejam preenchidos os campos DA3_COD, DA3_MUNPLA etc.

Deixe uma resposta