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.