Hoje vou mostrar uma forma de bloquear uma função para que apenas um usuário utilize por vez no Protheus.
Essa solução foi desenvolvida pelo grande Rodrigo R Fernandes ( LinkedIn ) e disponibilizada aqui para o Ti como exemplo.
Basicamente, se for uma rotina customizada, aí é mais fácil de se fazer o controle, mas e se for uma rotina padrão? Para esse caso, você pode fazer via ponto de entrada, caso a rotina tenha um antes de abrir a tela.
Ou você pode fazer conforme o exemplo abaixo, onde é feito o seguinte procedimento:
- Verifica se a rotina já não se encontra travada, se tiver mostra mensagem
- Do contrário é atualizado o arquivo com o nome do usuário que está usando, seta o nome da função padrão e chama ela
A partir disso, basta você colocar essa User Function no Menu, e com isso você consegue que apenas 1 usuário por vez utilize a rotina.
Abaixo o exemplo:
#Include "TOTVS.ch" /*/{Protheus.doc} zPCPP03 Função para substituir a chamada original da rotina MATA650. O objetivo é obter acesso exclusivo a rotina. Apenas 1 usuário por vez. @author Rodrigo R Fernandes @since 20/11/2020 @version 1.0 /*/ User Function zPCPP03() Local aArea := GetArea() Local cRotAux := "MATA650" // Nome da Rotina Local cUserAux := "Sem nome de Usuário" // Nome do Usuário Local cArqAux := "\" + Alltrim(cRotAux) + ".txt" // Arquivo que será responsável por armazenar o usuário que está com a rotina em USO // Se não conseguir acessar a rotina (ela já estiver em uso) If ! LockByName(cRotAux, .F., .F., .T.) //Se o arquivo existir no servidor, busca o nome gravado no txt If File(cArqAux) cUserAux := Alltrim(MemoRead(cArqAux)) EndIf //Exibe mensagem que já está em uso MsgAlert("Rotina Ordem de Produção em uso pelo usuário: " + cUserAux, "Atenção) Else //Grava o nome do usuário no arquivo de log MemoWrite(cArqAux, UsrRetName(RetCodUsr())) //Agora seta o nome da função no menu, como a rotina e faz a chamada dela SetFunName(cRotAux) &(cRotAux + "()") //Após sair da função padrão, o arquivo com o nome do usuário será excluído If File(cArqAux) fErase(cArqAux) EndIf //Libera o acesso para que a rotina seja aberta novamente UnLockByName(cRotAux, .F., .F., .T.) EndIf RestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.