Nesse vídeo demonstraremos a utilização das funções LockByName e UnlockByName que servem para travar ou destravar a execução de rotinas, para que assim, outros usuários não consigam executar ao mesmo tempo.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "Totvs.ch"
/*/{Protheus.doc} User Function zExe333
Trava a execução de uma rotina caso outro usuário já tenha começado
@type Function
@author Atilio
@since 12/03/2023
@see https://tdn.totvs.com/pages/releaseview.action?pageId=6814894 e https://tdn.totvs.com/pages/releaseview.action?pageId=6814897
@obs
Função LockByName
Parâmetros
+ cName , Caractere , Define o nome do semáforo que será validado ou criado
+ lEmpresa , Lógico , Define se o controle será por empresa
+ lFilial , Lógico , Define se o controle será por filial
Retorno
+ lCreated , Lógico , .T. se criou o semáforo com sucesso ou .F. se já existia o semáforo
Função UnlockByName
Parâmetros
+ cName , Caractere , Define o nome do semáforo que será validado ou criado
+ lEmpresa , Lógico , Define se o controle será por empresa
+ lFilial , Lógico , Define se o controle será por filial
Retorno
Função naõ tem retorno
**** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/
User Function zExe333()
Local aArea := FWGetArea()
//Se não conseguir travar, quer dizer que algum usuário já esta executando
If ! LockByName("zExe333_lock", .T., .F.)
FWAlertError("Atenção, outro usuário já está executando essa rotina!", "Falha no Lock")
//Senão, aciona o processamento das rotinas
Else
Processa({|| fSuaRotina() }, "Exportando...")
//Aciona o destravamento do lock
UnLockByName("zExe333_lock", .T., .F.)
EndIf
FWRestArea(aArea)
Return
Static Function fSuaRotina()
FWAlertInfo("Em construção", "Teste")
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.