No artigo de hoje, vamos demonstrar uma função que criamos para trocar de empresa e filial de forma bem rápida.
No passado, nós mostramos como fazer essa alteração de empresa e filial com OpenFile. Então pensamos numa forma de ser mais fácil essa troca, e criamos uma função chamada zAltFil.
A lógica dessa função é:
- Ter variáveis estáticas, que ficarão na memória da execução desse prw, para usar como backup
- Receber 3 parâmetros, sendo a empresa nova, a filial nova e se é para voltar o backup
- Se vier da rotina de voltar o backup, busca o conteúdo em memória
- Se não, ele pega os parâmetros recebidos de empresa e filial
- E por fim aciona a OpenFile para fazer a mudança
Abaixo o código fonte da zAltFil:
//Bibliotecas
#Include "TOTVS.ch"
//Variáveis que existirão mesmo após sair do prw
Static cEmpBkp := ""
Static cFilBkp := ""
/*/{Protheus.doc} User Function zAltFil
Função que realiza a troca de filial para processos específicos
@type Function
@author Atilio
@since 08/09/2022
@param cEmpNov, Caractere, Código da empresa nova em cEmpAnt
@param cFilNov, Caractere, Código da filial nova em cFilAnt
@param lVolta, Lógico, Define se irá voltar o backup da empresa e filial original
@example
//Alterando a empresa e filial
u_zAltFil("01", "0101")
//Voltando o backup da empresa e filial
u_zAltFil( , , .T.)
@obs As variáveis cEmpAnt, cFilAnt e cNumEmp são públicas na thread do Protheus, cuidado ao manipular elas
/*/
User Function zAltFil(cEmpNov, cFilNov, lVolta)
Local aArea := FWGetArea()
Default cEmpNov := cEmpAnt
Default cFilNov := cFilAnt
Default lVolta := .F.
//Se for para voltar o backup
If lVolta
//Se tiver empresa e filial de backup
If ! Empty(cEmpBkp) .And. ! Empty(cFilBkp)
cEmpAnt := cEmpBkp
cFilAnt := cFilBkp
cNumEmp := cEmpAnt + cFilAnt
//Agora zera os backups
cEmpBkp := ""
cFilBkp := ""
EndIf
//Se não, será feito a troca para a filial
Else
//Se não tiver backup da empresa, realiza
If Empty(cEmpBkp)
cEmpBkp := cEmpAnt
EndIf
//Se não tiver backup da filial, realiza
If Empty(cFilBkp)
cFilBkp := cFilAnt
EndIf
//Se os parâmetros vieram vazios, coloca conteúdo default para não dar problema na troca
If Empty(cEmpNov)
cEmpNov := cEmpAnt
EndIf
If Empty(cFilNov)
cFilNov := cFilAnt
EndIf
//Realiza a troca de filial para as novas
cEmpAnt := cEmpNov
cFilAnt := cFilNov
cNumEmp := cEmpAnt + cFilAnt
EndIf
//Realiza a troca da empresa e filial
OpenFile(cNumEmp)
FWRestArea(aArea)
Return
E abaixo um trecho de como utilizar ela em uma função, alterando a filial e depois voltando ao backup.
User Function zTeste()
//Troca a filial para a nova
u_zAltFil( , "0102")
// ...
//Aqui você faz suas customizações
// ...
//Voltando o backup da empresa e filial
u_zAltFil( , , .T.)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Uma outra alternativa também é usar a função StartJob, e passar para a função a filial e empresa que deseja abrir, e dentro da função acionada pela startJob usar a função RpcSetEnv para abrir o ambiente na empresa desejada. Conforme exemplo abaixo.
Links
https://tdn.totvs.com/pages/releaseview.action?pageId=6814927
https://tdn.totvs.com/display/tec/StartJob
User Function zTeste()
//Aciona função com customização passando empresa e filial destino.
//Caso seja necessário também envia outros parametros
StartJob( “u_zFuncao”, GetEnvServer(), .T., ’99’, ’01’)
Return
User Function zFuncao(cEmpresa_, cFilial_)
//Se for acionada via StarJob vai entrar dentro do If
If IsBlind()
RpcSetEnv(cEmpresa_,cFilial_)
Endif
// …
//Aqui você faz suas customizações
// …
If IsBlind()
RpcClearEnv()
Endif
Return
Opa, um ótimo adendo Súlivan, obrigado pela contribuição.
Nós já publicamos um artigo sobre a StartJob, inclusive com comentário seu também rs ( https://terminaldeinformacao.com/2022/03/30/como-usar-o-startjob-para-atualizar-informacoes/ ).
No caso dessa de usar a OpenFile, seria mais para processos mais simples, por exemplo, em um relatório que percorre as filiais, então ao invés de acionar a StartJob, passar por outra thread, fazer o processamento, ai é mais rápido e simples já trocar em tempo de execução e imprimir as informações.
Um grande abraço jovem.