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 (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

6 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.

  3. Alessandro Jesus disse:

    Dan Boa Noite, como vai?
    Uma dúvida? Onde executo esta função? função do usuário ou ponto de entrada? O que quero é inserir dados de um campo craido da SB1 (Preço frete unit por produto) e quando eu efetuar o faturamento do produto,ele levar o valor deste campo SB1 para um campo criado tambem na tabela de itens da NF (SD2).

    • Bom dia Alessandro, tudo bem graças a Deus e você?
      Certo, essa função você adicionar o trecho dela dentro de algum valid de campo ou pode ser também em um ponto de entrada na validação da linha (LinOk).
      Mas no seu caso, talvez seria interessante, criar um gatilho do campo C6_PRODUTO para o campo C6_X_????? (Campo de preço frete unit por produto), e assim gravar essa informação na sc6.
      Ai você faz um ponto de entrada na geração do documento de saída, ai basta olhar esse campo C6_X_????? que já vai estar posicionado.

Deixe uma resposta