Páginas filhas
  • Execução de RUP na atualização de Release - UPDDISTR

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

RUP no UPDDISTR

Produto:

Microsiga Protheus

Versões:

12

Passo a passo:

A equipe de Framework implementou no UPDDISTR a capacidade de executar funções de compatibilização e/ou conversão de dados para as tabelas do sistema. Esse processo já existe na atualização de versão (MP710TO120), assim, com essa implementação este processo também será possível nas atualizações de Release.

A partir de agora o UPDDISTR

,

irá procurar no RPO por uma FUNCTION iniciadas por “RUP_” + <sigla do módulo>, por exemplo:  RUP_GPE, RUP_FAT, RUP_PFS, etc. Se a função existir no RPO, ela será chamada.

 


Serão passados para essa função RUP_”, 5 parâmetros: 

cVersion          : Versão do Protheus, Ex. ‘12’
cMode             : Modo de execução. ‘1’=Por grupo de empresas / ‘2’=Por grupo de empresas + filial (filial completa)
cRelStart         : Release de partida.  Ex: ‘002’  ( Este seria o Release no qual o cliente está)
cRelFinish       : Release de chegada. Ex: ‘005 ‘( Este seria o Release ao final da atualização)
cLocaliz           : Localização (país). Ex: ‘BRA’

 


Os parâmetros referentes a Release serão passados com “0” para facilitar a programação/comparação.

A função irá ser chamada de 2 formas: Uma vez para cadaGrupo de Empresase Uma vez para cada Empresa/Filial. 


Imaginemos um SIGAMAT com os seguintes registros:

Empresa

Filial

T1

01

T1

02

T1

03

T2

01

T2

02

T2

03

 


A chamada das funções “RUP_” se comportará da seguinte forma:

Empresa

Filial

Posicionado no Registro: 

T1

01

Chama uma vez com o cMode == ‘1’
Chama uma vez com o cMode == ‘2’

T1

02

Chama uma vez com o cMode == ‘2’

T1

03

Chama uma vez com o cMode == ‘2’

T2

01

Chama uma vez com o cMode == ‘1’
Chama uma vez com o cMode == ‘2’

T2

02

Chama uma vez com o cMode == ‘2’

T2

03

Chama uma vez com o cMode == ‘2’

 


No exemplo as funções ‘RUP_” serão chamadas 8 vezes, variando o conteúdo do parâmetro cMode. Estas chamadas serão iniciadas depois de terminada a atualização dos dicionários e consequentemente a atualização da estrutura das tabelas.

Um ponto importante para entender o uso da função, é que não importa quantos Releases estão sendo atualizados, o processo de chamar as “RUP_” é feito apenas uma vez. Por exemplo, o cliente está atualmente no Release 12.1.6 e está rodando o UPDDISTR para o Release 12.1.17. Mesmo sendo atualizados vários Releases, o processo será executado uma vez só.  Com isso, se houver a necessidade, pode-se otimizar a lógica para compatibilização. O desenvolvedor pode tratar de uma vez só ou Release a Release.

 


Bloco de código
#Include 'Protheus.ch'

//-------------------------------------------------------------------
/*{Protheus.doc} RUP_FAT 
Função exemplo de compatibilização do release incremental. Esta função é relativa ao módulo faturamento. 
Serão chamadas todas as funções compiladas referentes aos módulos cadastrados do Protheus 
Será sempre considerado prefixo "RUP_" acrescido do nome padrão do módulo sem o prefixo SIGA. 
Ex: para o módulo SIGACTB criar a função RUP_CTB   

@param  cVersion   - Versão do Protheus
@param  cMode      - Modo de execução. 1=Por grupo de empresas / 2=Por grupo de empresas + filial (filial completa)
@param  cRelStart  - Release de partida  Ex: 002  
@param  cRelFinish - Release de chegada Ex: 005 
@param  cLocaliz   - Localização (país). Ex: BRA 

@Author Framework 
@since 28/01/2015
@version P12
*/
//-------------------------------------------------------------------


Function RUP_FAT( cVersion, cMode, cRelStart, cRelFinish, cLocaliz )
Local cRelLoop

Local nRelease := 0


// Regra geral : só executar atualização quando release de partida diferente do release de chegada 
// A decisão, no entanto, cabe ao desenvolvedor 
// A decisão de executar ou não pode estar condicionada a outros fatores 

//If !( cRelStart == cRelFinish ) 

      ConOut( "Executei o update do faturamento")
      ConOut( "Modo - " + If( cMode == "1", "Grupo de empresas", "Grupo de empresas + filial" ) )
      ConOut( "Grupo de empresas " + cEmpAnt )   // cEmpAnt está disponível 
      ConOut( "Localização (país) " + cLocaliz ) // Pode-se tomar decisões baseado no país 
      
      If cMode == "
2" // Através do controle de cModo, é possível escolher entre processos que devem rodar para
1"

            // 
todo
Execução 
o
por grupo de empresa 
( cModo = 1 ) ou processos que serão disparados por grupo + filial

	
            // 
Ambas as opções serão executadas cabendo ao desenvolvedor escolher ConOut( "Filial " + cFilAnt ) // cFilAnt está disponível
Situação padrão 
           
EndIf
 
      
      // A versão é passada ( Ex "12" ) e pode ser necessária no futuro 
            ConOut( "Versão - " + cVersion )
            
            // Os releases de partida (início) e chegada (fim) são no formato caractere com 3 dígitos. 
            // Exemplo : 
001, 003
033, 2510
            
      
      ConOut( "Release de partida - " + cRelStart )
            ConOut( "Release de chegada - " + cRelFinish )  

      
//
 
Neste
 
FOR
 
é
 
feita
 
a
 
varredura
 
do
 
release
 
de
 
partida
 
ao
 
release
 
de
 
chegada

      
//
 
Isso
 
é
 
necessário
 
pois
 
podemos
 
atualizar
If 
do
cRelFinish 
release 002 direto para o 005, por exemplo
>= "2310" 
           
//
 
Às
 
vezes,
 
o
 
desenvolvedor
 
pode
 
optar
 
por
 
usar
 
Val(

 
cRelStart
 
)
 
+
 
1
 
como
 
início
 
do
 
FOR
  
      // 
Isso
Aqui 
impede
escolhi 
que
processar 
dado
algo 
processo seja executado duas vezes, visto que
só se o release de 
"
chegada
"
 
de
for 
uma
maior 
ou igual 
// atualização fatalmente será o release de "partida" da próxima
a 2310 
      
      
//
 
For
 
nRelease
 
:=
 
Val(
 
cRelStart
 
)
 
+
 
1
 
to
 
Val(
 
cRelFinish
 
)

 
//
 
Contrução
 
alternativa.
 
Ver
 
comentário
 
acima
 
      
For
 
nRelease
 
:=
 
Val
ConOut( "Disparando 
cRelStart
processo 
)
do 
to
release 
Val( cRelFinish
2310 !!!" )
  

       
//
 
Aqui
 
é
 
criado
 
o
 
código
 
de
 
release
 
que
 
está
 
processando
 
"no
 
momento"
 
            
cRelLoop
EndIf 
:= StrZero( nRelease, 3 )
  
        
    
        If cRelStart 
>= 
ConOut( "Processando update -
"2210" 
+ cRelLoop
 
)

      
            
If cRelLoop
 
==
 
"003"

            
    // Aqui escolhi processar algo se o release de partida for igual ou maior 
//
que 
Aqui
2210 
escolhi

 
processar
 
algo
 
 
do
 
release 003
 
                  
                ConOut( "Disparando processo a partir do release 
003
2210 !!!" )
  
  
ConOut(
 
SA1->(
 
LastRec()
 
)
 
)
  
            
            EndIf
  


      
If cRelLoop
ElseIf cMode == "
004
2"

            
// 
Aqui
Execução 
escolhi
por 
processar
FILIAL 
algo só no release 004
!!! 

            // Usar apenas caso necessário 
!!!

            
ConOut( "Disparando processo do release quatro !!!" )
// Através do controle de cModo, é possível escolher entre processos que devem rodar para 
            // todo o grupo de empresa 
ConOut
( 
SA2->( LastRec() )
cModo = 1 ) ou 
processos que serão disparados por grupo + 
filial 

            
EndIf
// Ambas as opções serão executadas cabendo ao desenvolvedor 
escolher 

            
ConOut( "Filial " + cFilAnt ) // cFilAnt 
está disponível
 
     
  
Next
EndIf 
nRelease


//EndIf   
   
Return NIL

 

#Include 'Protheus.ch'

 

//-------------------------------------------------------------------

/*{Protheus.doc} RUP_FAT

Função exemplo de compatibilização do release incremental. Esta função é relativa ao módulo faturamento.

Serão chamadas todas as funções compiladas referentes aos módulos cadastrados do Protheus

Será sempre considerado prefixo "RUP_" acrescido do nome padrão do módulo sem o prefixo SIGA.

Ex: para o módulo SIGACTB criar a função RUP_CTB  

 

@param  cVersion   - Versão do Protheus

@param  cMode      - Modo de execução. 1=Por grupo de empresas / 2=Por grupo de empresas + filial (filial completa)

@param  cRelStart  - Release de partida  Ex: 002 

@param  cRelFinish - Release de chegada Ex: 005

@param  cLocaliz   - Localização (país). Ex: BRA

 

@Author Framework

@since 28/01/2015

@version P12

*/

//-------------------------------------------------------------------

 

 

Function RUP_FAT( cVersion, cMode, cRelStart, cRelFinish, cLocaliz )

 

Local cRelLoop   

 

Local nRelease    := 0

 

// Regra geral : só executar atualização quando release de partida diferente do release de chegada

// A decisão, no entanto, cabe ao desenvolvedor

// A decisão de executar ou não pode estar condicionada a outros fatores

 

//If !( cRelStart == cRelFinish )

 

      ConOut( "Executei o update do faturamento")

      ConOut( "Modo - " + If( cMode == "1", "Grupo de empresas", "Grupo de empresas + filial" ) )

      ConOut( "Grupo de empresas " + cEmpAnt )   // cEmpAnt está disponível

      ConOut( "Localização (país) " + cLocaliz ) // Pode-se tomar decisões baseado no país

     

      If cMode == "2"

            // Através do controle de cModo, é possível escolher entre processos que devem rodar para

            // todo o grupo de empresa ( cModo = 1 ) ou processos que serão disparados por grupo + filial

            // Ambas as opções serão executadas cabendo ao desenvolvedor escolher

            ConOut( "Filial " + cFilAnt ) // cFilAnt está disponível

      EndIf

     

      // A versão é passada ( Ex "12" ) e pode ser necessária no futuro

      ConOut( "Versão - " + cVersion )

     

      // Os releases de partida (início) e chegada (fim) são no formato caractere com 3 dígitos.

      // Exemplo : 001, 003

     

      ConOut( "Release de partida - " + cRelStart )

      ConOut( "Release de chegada - " + cRelFinish ) 

 

      // Neste FOR é feita a varredura do release de partida ao release de chegada

      // Isso é necessário pois podemos atualizar do release 002 direto para o 005, por exemplo

      // Às vezes, o desenvolvedor pode optar por usar Val( cRelStart ) + 1 como início do FOR 

      // Isso impede que dado processo seja executado duas vezes, visto que o release de "chegada" de uma

      // atualização fatalmente será o release de "partida" da próxima  

     

      // For nRelease := Val( cRelStart ) + 1 to Val( cRelFinish ) // Contrução alternativa. Ver comentário acima

      For nRelease := Val( cRelStart ) to Val( cRelFinish )

     

            // Aqui é criado o código de release que está processando "no momento"

            cRelLoop := StrZero( nRelease, 3 )

           

            ConOut( "Processando update - " + cRelLoop )

           

            If cRelLoop == "003"

           

                  // Aqui escolhi processar algo só do release 003

                 

                  ConOut( "Disparando processo do release 003 !!!" ) 

                 

                  ConOut( SA1->( LastRec() ) ) 

           

            EndIf            

     

            If cRelLoop == "004"

           

                  // Aqui escolhi processar algo só no release 004

                 

                  ConOut( "Disparando processo do release quatro !!!" ) 

                 

                  ConOut( SA2->( LastRec() ) ) 

           

            EndIf            

           

                   

     

      Next nRelease

     

//EndIf      

 

...


Centralizando nesta função, teremos um controle melhor do que está sendo forçado e maior facilidade para eventuais manutenções.