Protheus – Trocar de empresa em tempo de execução

Hoje desenvolvendo uma rotina em AdvPL, me deparei com a seguinte dúvida: Como trocar a empresa que o usuário está logado em tempo de execução?

Abaixo vou mostrar como consegui realizar a troca de empresa no sistema.


#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'TOPCONN.CH'
#INCLUDE 'RWMAKE.CH'
#INCLUDE "TBICONN.CH"
#INCLUDE "TBICODE.CH"
User Function TESTE()
Local _aAux := {}
Local i := 0
Local _aAreaSM0 := {}
Local _oAppBk := oApp //Guardo a variavel resposavel por componentes visuais
dbSelectArea("SM0")
_aAreaSM0 := SM0->(GetArea())
_cEmpBkp := SM0->M0_CODIGO //Guardo a empresa atual
_cFilBkp := SM0->M0_CODFIL //Guardo a filial atual
//Lista Empresas que usuario tem Acesso
//Retorno – array
//1 – Codigo da empresa
//2 – Nome da empresa
//3 – Codigo da filial
//4 – Nome da filials
_aAux := FWEmpLoad(.F.)
//Percorro a lista de empresas/filiais que o usuário tem acesso
For i := 1 to Len(_aAux)
//troco de empresa
dbCloseAll() //Fecho todos os arquivos abertos
OpenSM0() //Abrir Tabela SM0 (Empresa/Filial)
dbSelectArea("SM0") //Abro a SM0
SM0->(dbSetOrder(1))
SM0->(dbSeek(_aAux[i][1] + _aAux[i][3],.T.)) //Posiciona Empresa
cEmpAnt := SM0->M0_CODIGO //Seto as variaveis de ambiente
cFilAnt := SM0->M0_CODFIL
OpenFile(cEmpAnt + cFilAnt) //Abro a empresa que eu desejo trabalhar
//Realizo o meu processo aqui
//funções como RetSqlName e xfilial, funcionam!
Next i
//Para finalizar volto as variaveis de sistema para seus valores antes da execução
dbCloseAll() //Fecho todos os arquivos abertos
OpenSM0() //Abrir Tabela SM0 (Empresa/Filial)
dbSelectArea("SM0")
SM0->(dbSetOrder(1))
SM0->(RestArea(_aAreaSM0)) //Restaura Tabela
cFilAnt := SM0->M0_CODFIL //Restaura variaveis de ambiente
cEmpAnt := SM0->M0_CODIGO
OpenFile(cEmpAnt + cFilAnt) //Abertura das tabelas
oApp := _oAppBk //Backup do componente visual
Return

view raw

teste.prw

hosted with ❤ by GitHub

O legal é que dessa forma, funções como xFilial, e RetSqlName, funcionam normalmente.

3 thoughts on “Protheus – Trocar de empresa em tempo de execução

  1. Igor silva diz:

    Boa tarde! Alguém já precisou gerar um relatório de comissões, unificando dados de uma empresa A e B e filiais? Eu tenho o seguinte cenário: Duas empresas faturam, o vendedor 000011 vai ter comissões em ambas para receber. Me questionaram o seguinte: “Existe uma forma de gerar o relatório na empresa logada mas que relacione os dados da outra empresa onde também o vendedor tem comissões a receber?” Isso é possível de fazer com advpl ajustando o relatório MATR540 (Relação de comissões) ?

Deixe um comentário