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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 |
O legal é que dessa forma, funções como xFilial, e RetSqlName, funcionam normalmente.
Show de bola cara, sua função me ajudou a resolver um problema aqui.
Que maneiro! Abraço.
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) ?