Troca de Empresa em Tempo de Execução

PessoALL,

Mais uma novidade da release 12.1.2510 do TOTVS Protheus: não será mais possível manipulação das variavéis públicas de ambiente “cEmpAnt” e “__cUserId“.

Artigo do TDN: https://centraldeatendimento.totvs.com/hc/pt-br/articles/33541555451799-Cross-Segmento-TOTVS-Backoffice-Linha-Protheus-ADVPL-Restri%C3%A7%C3%B5es-na-atribui%C3%A7%C3%A3o-das-vari%C3%A1veis-cEmpAnt-e-cUserId

Muitos desenvolvedores utilizam atribuição explicitas dessas variavéis para troca de empresa em ambientes com múltiplas empresas e múltiplos usuários. No entanto, esta prática tem que acabar com a nova release.

Neste contexto teremos que revisitar customizações de nossos clientes e seguir a boa prática que é utilizar a função RpcSetEnv() para setar um novo ambiente.

Uma dica importante é utilizar o StartJob(cFuncao, cAmbiente, lIraAguardar) para criar uma nova thread assíncrona onde já é necessário montar um novo ambiente.

Mas vamos ao código exemplo:

Eu faço backup das áreas e da empresa anteriormente utilizadas para restaurar após finalizar a execução do código no novo ambiente:

Local _aAreAtu := {SC5->(FwGetArea()), FwGetArea()} as array //Salva todas as areas num array
Local aEmpBkp := {FwCodEmp(), FwCodFil()} as Array

Atenção: Se for browser com filtros ou outros tipos de função que seja necessário restaurar para não quebrar rotinas padrões, precisa ser salvo em váriaveis backup.

Depois disso, eu limpo o ambiente anterior e monto novo ambiente:

RpcClearEnv()
RpcSetEnv(cEmpDestino, cFilDestino,,,,GetEnvServer(), {“SC5″,”SC6″,”SA1”})

Executo o bloco de código que desejo na empresa destino e depois restauro tudo.

RpcClearEnv()
RpcSetEnv(aEmpBkp[1], aEmpBkp[2],,,,GetEnvServer(), {“SC5″,”SC6″,”SC9″,”SA1”})

As funções exemplificadas acima são de uso exclusivo de funções com interface (SIGAMDI) e não é recomendado o uso em WebServices SOAP e/ou RESTFUL.

Conte com a ABF TECH para auxiliá-los na refatoração destes códigos.