Como verificar se um registro está travado via AdvPL

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.

AdvPL

AdvPL

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

6 Responses

  1. George Allan disse:

    Muito bom Daniel, vlw aê por compartilhar!

  2. Stephan disse:

    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?

Deixe uma resposta

Terminal de Informação