Função para criar Gatilhos (SX7) via AdvPL

Olá pessoal…

Hoje vou mostrar uma função para criar Gatilhos (SX7) via função desenvolvida em AdvPL.


AdvPL
AdvPL

A rotina recebe um array, e as posições do Array estão na ordem dos campos de criação do Gatilho (Campo Origem, Campo Destino, Regra, Tipo, Posiciona, Alias, Chave e Condição.

A funcionalidade da rotina, é que você pode criar vários gatilhos em um código fonte e aplicar em várias bases, sem ter que ficar recriando, bastando apenas compilar e executar.

Abaixo um exemplo de como criar:

//Gatilhos
aSX7 := {}
aAdd(aSX7,{'Z2_ORIGEM', 'Z2_DESTINO', 'u_FuncaoA()',  'P', 'N', '',    0, '',                              ''})
aAdd(aSX7,{'Z2_CODPRO', 'Z2_DESCPRO', 'SB1->B1_DESC', 'P', 'S', 'SB1', 1, 'FWxFilial("SB1")+M->Z2_CODPRO', ''})

//Criando os gatilhos
u_zCriaGat(aSX7)

Abaixo o código fonte completo:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zCriaGat
Função que cria os gatilhos na base
@type function
@author Atilio
@since 22/09/2015
@version 1.0
	@param aSX7, Array, Array com os dados da SX7
	@example
	u_zCriaGat(aSX7)
	@obs Abaixo a estrutura do array:
	SX7:
		[nLinha][01] - Campo
		[nLinha][02] - Conta Domínio
		[nLinha][03] - Regra
		[nLinha][04] - Tipo
		[nLinha][05] - Seek
		[nLinha][06] - Alias
		[nLinha][07] - Ordem
		[nLinha][08] - Chave
		[nLinha][09] - Condição
/*/

User Function zCriaGat(aSX7)
	Local aAreaX7 := SX7->(GetArea())
	Local nAtual := 0
	Local lCria := .T.
	Local cTabAux := ""
	Local cSeqAux := ""
	
	DbSelectArea("SX7")
	SX7->(DbSetOrder(1))
	DbSelectArea("SX3")
	SX3->(dbSetOrder(2)) // X3_CAMPO
	
	//Percorrendo os gatilhos
	For nAtual := 1 To Len(aSX7)
		lCria := .T.
		
		//Percorrendo a SX7, verificando se já não existe o campo com a conta domínio e a regra
		SX7->(DbGoTop())
		While ! SX7->(EoF())
			//Se encontrar o gatilho, não será criado
			If	Alltrim(SX7->X7_CAMPO) == Alltrim(aSX7[nAtual][01]) .And.;
				Alltrim(SX7->X7_CDOMIN) == Alltrim(aSX7[nAtual][02]) .And.;
				Alltrim(SX7->X7_REGRA) == Alltrim(aSX7[nAtual][03])
				lCria := .F.
			EndIf
			
			SX7->(DbSkip())
		EndDo
		
		//Se for para criar os dados
		If lCria
			cTabAux := AliasCpo(aSX7[nAtual][01])
			cSeqAux := fSeqSX7(aSX7[nAtual][01])
			
			//Grava a informação
			RecLock("SX7", .T.)
				X7_CAMPO	:= aSX7[nAtual][01]
				X7_SEQUENC	:= cSeqAux
				X7_REGRA	:= aSX7[nAtual][03]
				X7_CDOMIN	:= aSX7[nAtual][02]
				X7_TIPO	:= aSX7[nAtual][04]
				X7_SEEK	:= aSX7[nAtual][05]
				X7_ALIAS	:= aSX7[nAtual][06]
				X7_ORDEM	:= aSX7[nAtual][07]
				X7_CHAVE	:= aSX7[nAtual][08]
				X7_CONDIC	:= aSX7[nAtual][09]
				X7_PROPRI	:= "U"
				DbCommit()
			SX7->(MsUnlock())
			
			//Se posicionar no campo
			SX3->(DbGoTop())
			If SX3->(DbSeek(aSX7[nAtual][01]))
				//Se o controle de gatilho, estiver em branco
				If Empty(SX3->X3_TRIGGER)
					RecLock("SX3", .F.)
						X3_TRIGGER := "S"
					SX3->(MsUnlock())
				EndIf
			EndIf
			
			//Atualiza o Dicionário
			X31UpdTable(cTabAux)

			//Se houve Erro na Rotina
			If __GetX31Error()
				cMsgAux := "Houveram erros na atualização do gatilho "+aSX7[nAtual][01]+" -> "+aSX7[nAtual][02]+", com a regra '"+aSX7[nAtual][03]+"':"+Chr(13)+Chr(10)
				cMsgAux += __GetX31Trace()
				Aviso('Atenção', cMsgAux, {'OK'}, 03)
			EndIf
		EndIf
	Next
	
	RestArea(aAreaX7)
Return

/*---------------------------------------------------------------------*
 | Func:  fSeqSX7                                                      |
 | Autor: Daniel Atilio                                                |
 | Data:  22/09/2015                                                   |
 | Desc:  Função que pega a próxima sequencia da SX7 conforme campo    |
 *---------------------------------------------------------------------*/
 
Static Function fSeqSX7(cCampo)
	Local aAreaX7 := SX7->(GetArea())
	Local cSequen := "001"
	
	SX7->(DbSetOrder(1))
	SX7->(DbGoTop())
	
	//Se conseguir posicionar no campo
	If SX7->(DbSeek(cCampo))
		//Enquanto houver registros
		While ! SX7->(EoF()) .And. Alltrim(SX7->X7_CAMPO) == Alltrim(cCampo)
			cSequen := SX7->X7_SEQUENC
			SX7->(DbSkip())
		EndDo
		
		cSequen := Soma1(cSequen)
	EndIf
	
	RestArea(aAreaX7)
Return cSequen

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.

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

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta