BlackTDN Search

quinta-feira, 5 de fevereiro de 2009

Protheus :: Repositório Auxiliar


Neste artigo vou discursar um pouco sobre o "Repositório de Objetos Auxiliar" do Protheus. A idéia do "Repositório Auxiliar" surgiu para otimizar o processo de execução do "Roteiro de Cálculo" do SIGAGPE. As fórmulas e os roteiros do GPE são todos "interpretados" durante a sua execução, tornando o processo lento. Sendo assim a Totvs/Microsiga teve a brilhante idéia de criar um "Repositório Auxiliar" para que as Fórmulas e Roteiros de Cálculo fossem compilados. Esse novo esquema para o Roteiro de Cálculo do GPE só está disponível para os países que não o Brasil (Chile, México, Portugal, etc.), acredito que futuramente a Totvs/Microsiga disponibilize também para o Brasil.

A boa notícia é que o "Repositório Auxiliar" não serve apenas para o módulo GPE, ele pode ser utilizado em qualquer lugar onde você possa estar colocando uma "macro execução" ou uma "User Function". O "Repositório Auxiliar" está disponível, no Protheus, desde a versão 8, mas o exemplo que estarei demonstrando aqui foi desenvolvido e compilado na versão 10.

A criação de um "Repositório Auxiliar" é bem simples. Utilizaremos o método :New() da Classe Rpo [Rpo():New()] para criar um objeto de repositório em memória e os métodos: :StartBuild(.T.), :PreComp(), :Compile(), :RemProg() e :EndBuild(), para Iniciar o processo de Compilação, Pré-Compilar, Compilar, Remover programas e finalizar o processo de adicionar códigos fontes em Advpl ao "Repositório Auxiliar".

Dentre esses métodos, o único que não utilizarei no exemplo é o :PreComp() (pois não está funcional). Tentei de todas as formas efetuar uma Pré-Compilação mas sem sucesso (Não encontra os arquivos #include, se alguém descobrir como utilizá-lo, ficarei feliz em saber). Em função disso e da Totvs/Microsiga ter bloqueado a execução do advpl16.exe e do appre.exe limitando sua chamada e execução apenas pela IDE do Protheus, abrirei mão de um outro compilador. O Harbour.exe. Utilizarei esse compilador para efetuar a verificação de sintaxe dos programas e para gerar os arquivos Pré-Processados para que o método :Compile() da classe Rpo possa compilar os programas.

Os seguintes recursos serão necessários para a execução do exemplo que disponibilizarei neste artigo, sendo eles:
  1. O Windows® PowerShell® que será utilizado para execução do "script" de Pré-Compilação. Obs: Para que o "script" possa ser executado faz-se necessário autoriza-lo através do Windows® PowerShell® , sendo assim, execute o Windows® PowerShell® e digite o seguinte comando: get-help about_signing. Esse comando irá listar as opções de "Diretivas de Assinatura e de Execução" de "Script", leia-as atentamente. Mas se quiser pular esse passo (eu não recomendo)digite o seguinte comando no Windows® PowerShell® : Set-ExecutionPolicy Unrestricted. Esse comando fará que qualquer "Script" seja executado em sua máquina (mas atente para os ítens de segurança listados à partir do comando get-help about_signing).
  2. O Harbour.exe (que também poderá ser baixado clicando aqui) que utilizaremos para efetuar a checagem de sintaxe, a Pré-Compilação e a geração dos arquivos a serem compilados e adicionados ao "Repositório Auxiliar" pelo método :Compile() da classe Rpo. A utilização do Harbour.exe se fez necessária primeiro, porque não nos é possível utilizar a saída do Pré-Processador do Protheus e, segundo, porque o método :Compile() da classe Rpo não compila programas que possuam comentários, "#define" e muito menos "#include". Quem sabe, futuramente, quando a Totvs/Microsiga corrigir o método :PreComp() ou permitir a chamada direta ao programa advpl16.exe ou appre.exe seu uso não seja mais necessário;
  3. De um "Repositório de Objetos" do Protheus "virgem" baixado do Portal do Cliente da Totvs/Microsiga;
  4. Do programa u_preComp.prg, programa de exemplo de uso do "Repositório Auxiliar";
  5. Do "script" em Windows® PowerShell® que será chamado à partir da IDE do protheus para executar o processo de Pré-Compilação.
Para executar esse exemplo, o "Repositório de Objetos do protheus" deverá ser o "padrão". Sem nenhuma User Function compilada. A única User Function que deverá ser compilada no "Repositório de Objetos Padrão" deverá ser a do programa de exemplo disponibilizado para "Download".

Após ter baixado os arquivos, altere o modelo de "script" em Windows® PowerShell® para ajusta-lo à sua realidade. Nesse modelo temos as seguinte linhas:

Linha 1

if ( get-item -path 'c:\totvs\*' -include 'compile_error.log' ) { Remove-Item -path 'c:\totvs\compile_error.log' -force }

Linha 2

Get-ChildItem -include *.prx,*.prw,*.lib,*.prg,*.ap_ -exclude u_preComp.prg,asoec009.lib -recurse c:\svn\repos\asoec\microsiga\source | foreach { invoke-expression -command "C:\hmg\HARBOUR\bin\harbour.exe $_ /n /ic:\totvs\include\ /pc:\totvs\p10\pdata\RpoUserSourcePath\" >> c:\totvs\compile_error.log }

Onde:
  • if ( get-item -path 'c:\totvs\*' -include 'compile_error.log' ) { Remove-Item -path 'c:\totvs\compile_error.log' -force } verifica se existe o arquivo de erros de compilação e apaga-o
  • Get-ChildItem irá obter todos os aquivos com o seguinte filtro
  • (-include) *.prx,*.prw,*.lib,*.prg,*.ap_
  • deixando de lado os arquivos após a chave -exclude (sendo eles: u_preComp.prg,arquivo1_exclude,arquivoN_exclude)
  • de forma recursiva (-recurse ), ou seja, em todo diretório c:\svn\repos\microsiga\source e seus sub-diretórios, processando para cada arquivo o comando C:\hmg\HARBOUR\bin\harbour.exe
  • gerando a saida (/p) em c:\totvs\p10\pdata\RpoUserSourcePath\ (altere o caminho de saida conforme necessidade) e
  • buscando os arquivos #include (/i) em :\totvs\include\ (necessário que todos os arquivos #include do protheus estejam nessa pasta. Obs.: se der erro de compilação em MsDialog, inclua a chamada ao #include "sigawin.ch" no "protheus.ch")
  • e vai gerar os erros (>>), encontrados durante o processo de pré compilação, em c:\totvs\compile_error.log (consulte esse arquivo para verificar os programas com erros de sintaxe e corrija-os. Repita o processo até que nenhum erro seja encontrado. Obs.: O Pré-Compilador do Protheus, para os Clientes, tem um nível de verificação de erros muito baixo permitindo variáveis duplicadas, pequenos erros de sintaxe etc.)

Compile o Programa
u_preComp.prg (único programa customizado que deverá constar no "Repositório de Objetos Padrão"). Esse programa contém a chamada aos "Pontos de Entrada Genérico dos Módulos" onde será carregado o "Repositório Auxiliar" e as funções para Carga do "Repositório Auxiliar" e do processo de Compilação.

Os programas em HTML (As HTML Functions) deverão ser, primeiro compiladas pelo IDE do Protheus para que os arquivos de saida *.ap_ possam ser utilizados pelo Harbour.exe.

Configure as Ferramentas da IDE do Protheus (totvsDevStudio.exe) para que o "script" de Pré-Compilação possa ser executado conforme figura abaixo:




Titulo: preComp
Programa: C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe
Iniciar em: C:\WINDOWS\system32\WindowsPowerShell\v1.0\
Parâmetros: c:\svn\repos\scripts\windows\PowerShell\preComp.ps1
Dica: Pré-Compilar os programas para o Repositório Auxiliar

Atente para a opção "Parâmetros" informe o local onde salvou o "script" em Windows® PowerShell® que será executado.

Execute a "Nova Ferramenta" configurada na IDE do Protheus. Os arquivos fontes definidos no "script" serão agoras Pré-Compilados e armazenados em uma pasta para que o "Objeto Rpo" os encontre, compile-os e adicione ao "Repositório Auxiliar".

Entre em qualquer módulo do Protheus (que esteja declarado dentro do programa u_preComp.prg) e aguarde a finalização do processo de compilação.

A partir desse momento o "Repositório Auxiliar" estará disponível e carregado na memória juntamente com o "Repositório Padrão do Protheus" e todas as funções ali compiladas poderão ser executadas normalmente.

Por "DEFAULT" o diretório onde os arquivos Pré-Processados (*.ppo) serão buscados para a compilação do "Repositório Auxiliar" é \RpoUserSourcePath\ e o diretório de onde os arquivos que deverão ser excluidos do "Repositório Auxiliar" é \RpoUserSourcePath\RpoUserRemovePath\ abaixo do Protheus RootPath. Esses diretórios poderão ser reconfigurados, bastando para isso, incluir as seguintes linhas no .ini do Protheus Server:

RpoUserRemovePath=\RpoUserRemovePath\
RpoUserSourcePath=\RpoUserSourcePath\

O Diretório onde será gravado o Repositório Auxiliar também poderá ser alterado, bastando, para isso, incluir a seguinte linha no .ini do Protheus Server:

RpoUser=\RpoUser\

Para remover um programa do "Repositório Auxiliar" basta copiar o arquivo Pré-Processado (que terá a extensão .ppo) para o diretório de Remoção de Programas.

Sobre o programa u_preComp.prg temos as seguintes considerações:

  1. A InitSystem() é a função que será executada na chamada no "Ponto de Entrada Genérico dos Módulos" Sendo o ponto de entrada para todas as demais chamadas.
  2. RpoInit() é a que fará a inicialização do "Objeto Rpo".
  3. GetRpo() retorna um nome valido para o "Objeto Rpo".
  4. GetRpoPath() retorna o "path" onde o "Repositório Auxiliar" deverá ser gravado. (Por padrão estará gravando no diretório temporário do "Client" retornado pela função GetTempPath(). Se desejar altere para que seja gravado no Server do protheus ou juntamente com o Repositório Padrão);
  5. GetRpoObj() retorna o "Objeto RPO" instanciado pela RpoInit();
  6. UserRpoCompile() carrega os programas a serem compilados ou excluidos do "Repositório Auxiliar" e faz a chamada aos métodos :Compile() e/ou :RemProg(). UserRpoCompile() será chamada à partir de InitSystem() e pode ser chamada em dois pontos desse programa. Verifique o programa e defina qual o melhor lugar para a chamada. Poderá ser executando apenas após a abertura do Módulo ou, além da abertura do módulo sempre que o usuário retornar ao menu principal;
  7. GetPrgsCompile() irá obter os programas que serão compilados;
  8. GetPrgsRemove() irá obter os programas a serem removidos;
  9. GetPrgsInfoPath() obtem informações dos diretórios com os programas a serem Compilados\Removidos de forma a poder verificar se ocorreu alguma mudança para forçar a recompilação;
  10. GetSourcePath() retorna o diretório onde estão os programas a serem compilados;
  11. GetRemovePath() retorna o diretório dos programas a serem removidos;
  12. FileToStr() retorna "string" com o código fonte do programa a ser compilado;e
  13. As demais são User Function com a chamada aos "Pontos de Entrada Genérico dos Módulos Protheus".
Vale lembrar, que se for implementar a opção do "Repositório Auxiliar" e utilizar ferramentas de "WorkFlow" e/ou "Portais" a primeira função que deverá ser executada é a que carrega o Repositório Auxiliar, caso contrário nenhuma customização para o "WorkFlow" e/ou "Portais" será executada.

Para finalizar, as vantagens e desvantagens de utilizar o "Repositório Auxiliar".

Vantagens:
  1. A compilação efetiva dos programas customizados será sempre feita pelo próprio sistema;
  2. Não precisará mais haver o sincronismo entre repositório de desenvolvimento e de produção;
  3. Qualquer alteração do repositório poderá ser feita sem a necessidade do usuário sair do sistema (bastando ir para o menu principal);
  4. O repositório padrão e de produção só será sincronizado em função da aplicação de "patch" ou "update" ou da substituição do repositório;
  5. O repositório será menor pois não terá tanto histórico de compilação.
Desvantagens:
  1. Para que o uso do "Repositório Auxiliar" seja plenamente funcional, será necessário descobrir todos os "pontos" onde ele poderia ser carregado (Na chamada dos módulos é facil, mas temos "portais", 'workflow", etc.... que precisam ser identificados para que o "Repositório Auxiliar" possa ser carregado);
  2. Dependendo do número de fontes, o processo para inicialização do sistema pode tornar-se um pouco lento (mas nada que uma revisão no exemplo do código que passei, tornando-o um pouco mais inteligente e só compilando o que de fato foi alterado não resolva).
Enfim, seria uma sacada melhor da Totvs/Microsiga se implementasse o uso do "Repositório Auxiliar" como uma Ferramenta "padrão" do próprio sistema. Aí sim, só haveria vantagens em seu uso.


11 comentários:

  1. Saudações,

    Naldo vc conhece alguma forma de remover programar do RPO de forma automatica?

    Por exemplo, identifiquei no ambiente de testes que preciso remover um PE, certo?

    Entao queria uma forma de remove-lo do RPO Producao de forma automatica, pois vou passar essa orientacao a um analista, que 'eu nao confiaria este serviço manual'.

    Abs,

    ResponderExcluir
  2. Sérgio,

    Infelizmente não tem uma forma automática de se fazer isso. Até teria se a Totvs/Microsiga tivesse disponibilizado o parâmetro senha no "modo silencioso do TotvsDevStudio". Mas, infelizmente, para executar a compilação em "Modo Silencioso, ou seja em linha de comando, só é possivel pra quem tem a "Autorização Interna" para esse fim. Para resolver o seu problema duas dicas:

    1) A primeira não seria a remoção de fato do PE do Repositório, apenas a definição de uma User Function que não faz nada e recompilar. ex.:

    User Function
    Return( )

    Recompile o Programa. Apesar de o "Ponto de Entrada" ser localizado pelo "Protheus" ele não fará nada; e/ou

    2 ) Excluir, definitivamente, o PE do Projeto selecionando a exclusão também do Repositório pra o ambiente que desejar.

    []s

    ResponderExcluir
  3. naldo

    vc tem ideia em qual plataforma sao gerados os patchs e se são criptografados?

    ResponderExcluir
  4. Rocha,

    Os "patches" do Protheus são gerados pelo Próprio Protheus. Usa-se o totvsDevStudio para recuperar informações do RPO base e gerar o(s) "patche(s)".

    Sim, eles são "criptografados".

    Se não me engano, o RPO é um arquivo de Dados desenvolvido pela própria totvs.


    []s
    иαldσ dj

    ResponderExcluir
  5. Naldo, eu tentei fazer mas du problema nos includes, principalmente no protheus.ch, ele não aceitou o que eu tenho (criptografado)... ou será que fiz algo errado ?

    ResponderExcluir
  6. Daniel,

    Para que o teste funcione, os includes não podem ser "Criptografados".

    []s
    иαldσ dj

    ResponderExcluir
  7. Naldo, existe a possibilidade em recuperar fontes customizados via engenharia reversa da RPO.

    ResponderExcluir
    Respostas
    1. Naldo e Rodofo, tudo bem ?
      Vocês conseguiram recuperar fontes customizados via engenharia reversa do RPO ?
      Obrigado

      Excluir
    2. Naldo e Rodofo, tudo bem ?
      Vocês conseguiram recuperar fontes customizados via engenharia reversa do RPO ?
      Obrigado

      Excluir
  8. Naldo, qualquer rotina que eu executo aparece o seguinte erro:

    Exceção ocorrida: Invalid ReadMSChar in file c:\bamboo-agent-5.7.2\xml-data\build-dir\totvstec-build131227atfs-windows64\lib_base\memstream.hpp at line 836

    Pode me dar uma luz ???

    ResponderExcluir