Olá pessoal…
Hoje vou mostrar uma função para criar Gatilhos (SX7) via função desenvolvida em 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
Bom pessoal, por hoje é só.
Abraços e até a próxima.