Olá pessoal…
Hoje vou mostrar como verificar se um registro está travado (via RecLock) utilizando o AdvPL.
Para descobrir se um registro está travado, basta utilizar a função DBRLockList, e verificar o RecNo que você deseja, se está nessa lista, caso esteja, o registro está travado.
Porém, para facilitar essa checagem, construi uma rotina chamada zIsLock, que pode ser utilizada de 3 formas:
//Primeira Forma DbSelectArea('SB1') lLock := u_zIsLock() //Segunda Forma lLock := SB1->(u_zIsLock()) //Terceira Forma lLock := u_zIsLock('SB1', SB1->(RecNo()))
Abaixo o código fonte completo.
//Bibliotecas #Include "Protheus.ch" //Constantes #Define POS_ALIAS 001 #Define POS_INDIC 002 #Define POS_RECNO 003 /*/{Protheus.doc} zIsLock Função que verifica se um registro esta travado na memória (com RecLock por exemplo) @type function @author Atilio @since 03/08/2016 @version 1.0 @param cAliasLock, character, Alias da Tabela (se não for passado nada, será utilizado a última em memória) @param nRegLock, numérico, RecNo pesquisado (se não for passado nada, será utilizado o último em memória) @return lTravado, Retorna se o registro esta travado (.T.) ou não (.F.) na memória @example DbSelectArea('SB1') lLock := u_zIsLock() //ou lLock := SB1->(u_zIsLock()) //ou lLock := u_zIsLock('SB1', SB1->(RecNo())) /*/ User Function zIsLock(cAliasLock, nRegLock) Local aArea := GetArea() Local lTravado := .F. Local aTravas := {} Default cAliasLock := aArea[POS_ALIAS] Default nRegLock := 0 //Se tiver zerado o RecNo If nRegLock == 0 //Se for o Mesmo Alias do GetArea() If cAliasLock == aArea[POS_ALIAS] nRegLock := aArea[POS_RECNO] //Senão, abre a tabela e pega o RecNo atual Else DbSelectArea(cAliasLock) nRegLock := (cAliasLock)->(RecNo()) EndIf EndIf //Pegando os registros travados em memória aTravas := (cAliasLock)->(DBRLockList()) //Se encontrar o recno nos travados na memória, o registro está travado If aScan(aTravas,{|x| x == nRegLock }) > 0 lTravado := .T. EndIf RestArea(aArea) Return lTravado
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Muito bom Daniel, vlw aê por compartilhar!
Eu que agradeço George.
Abração.
Massa!
Opa, abraços jovem.
Excelente post! Fui testar com pedido de venda e não funcionou, o comando DBRLockList não retornou um array. Será que não funciona dependendo do banco de dados?
Boa noite Stephan.
Não sei te dizer, eu testei com SQL Server.
Um grande abraço.