MsUnlock
Libera o registro travado por RecLock. Esquecer essa chamada e a causa #1 de bugs de bloqueio em producao.
Assinatura: MsUnlock([cAlias]) -> NIL
Retorna: NIL
MsUnlock e o par obrigatorio do RecLock. Toda vez que voce trava um registro pra editar ou incluir, precisa destravar antes de sair da rotina ou do If — senao o lock persiste ate o usuario fechar o SmartClient, bloqueando todo mundo que tentar editar o mesmo registro.
Sintaxe
If RecLock("SA1", .F.) // .F. = alterar registro atual
SA1->A1_NOME := "NOVO"
SA1->(MsUnlock()) // libera o lock + grava
EndIf
Quando usar
- Sempre apos um
RecLockbem-sucedido — nao tem excecao - Antes de qualquer
Returndentro de um bloco com RecLock aberto - Dentro de tratamento de erro (
Begin Sequence) que possa abandonar o fluxo
Pegadinhas
- RecLock em
If+ Return cedo — bug classico. Se o Return for dentro do If sem MsUnlock antes, lock fica permanente. - Loop sem MsUnlock — While + RecLock sem MsUnlock no fim do loop trava todos os registros.
- Excecao nao tratada — sem Begin Sequence, erro depois do RecLock deixa lock orfao.
- Detecta automaticamente: a skill /advpl-find-issues tem regra
no-msunlockque pega isso.
Padrao recomendado
If SA1->(RecLock("SA1", .F.))
Begin Sequence
SA1->A1_NOME := "ALTERADO"
SA1->A1_EMAIL := "novo@email.com"
Recover
ConOut("Erro alterando SA1")
End Sequence
SA1->(MsUnlock()) // <-- SEMPRE aqui, antes do EndIf
EndIf
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cAlias | Character | não | Alias da tabela. Default: alias atual. |
Exemplos
Padrao inclusao
RecLock("SA1", .T.) // .T. = incluir
SA1->A1_FILIAL := xFilial("SA1")
SA1->A1_COD := cCodigo
SA1->A1_NOME := cNome
SA1->(MsUnlock())