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

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

%d blogueiros gostam disto: