Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Complementar documentação e informações adicionais
portuguese
Composition Setup
import.css=/download/attachments/3279126062824/newLayouttecnologia.css

Pagetitle
DBRLock
DBRLock

Função: DBRLock

Bloqueia o registro atual ou o especificado.

DBRLock ( [ nRegistro] ) --> lRet

Bloqueia um registro do alias de uma tabela para receber atualizações de valores de campos.

Sintaxe

Bloco de código
collapsefalse
DBRLock( [ nRec ] )

Parâmetros

...

Nome

Tipo

Descrição

Obrigatório

Referência

...

nRec

...

numérico

Indica o número do registro que será bloqueado.



Retorno

Nome

...

Tipo

Descrição

lRet

lógico

Retorna verdadeiro (.T.), se o registro for bloqueado com sucesso; caso contrário, falso (.F.).

, se não bloquear o registro. Principal motivo: O registro já foi bloqueado por outro usuário.
Informações
icontrue
title
Observações
  • Esta função é utilizada quando se tem uma tabela aberta,
 compartilhada
  • compartilhada e se deseja bloquear um registro para que outros usuários não possam alterá-lo
.Se a tabela já
  • . Qualquer tentativa de atualizar um registro de uma tabela aberta sem primeiro obter um bloqueio do registro interrompe a aplicação AdvPL com a ocorrência de erro "Update error - lock required".
  • Caso não haja tabela aberta, o programa será encerrado com ocorrência de erro recuperável "Work area not in use".
  • Caso o número de bloqueios exceda o limite indicado pela chave MaxLocks (valor padrão: 10000), o programa será encerrado com ocorrência de erro fatal "Number of locks exceeded - Total: TTT File: NNN", onde TTT é o número total de bloqueios efetuados em todas as tabeas abertas e NNN o número de registros bloqueados na tabela informada.
  • Se a tabela está aberta em modo exclusivo ou foi feito um bloqueio total do arquivo através da função FLock, a
função não altera seu estado
  • chamada da função é desnecessária, e retorna .T.
  • O usuário pode escolher o registro que será bloqueado, através do parâmetro
<nRegistro>
  • nRec, mas se este não for especificado,
o registro
  • o registro corrente será bloqueado, como na função RLock
()
  • . Porém, quando não informamos o parâmetro nRec, é realizado um desbloqueio de todos os registros bloqueados da tabela pelo processo atual, antes de tentar bloquear o registro atual.
  • Esta função funciona de forma oposta a DBRUnlock
()
  • , que libera os registros bloqueados.
  • O principal motivo de retorno .F. é quando o registro especificado já foi bloqueado por outro usuário em outra conexão. Esta função também retorna .F. caso a tabela atual tenha sido aberta apenas para leitura – vide parametrização de abertura de tabelas na função DBUseArea.
  • Se um registro já estiver bloqueado e a conexão que fez o bloqueio tentar bloquear novamente esse mesmo registro, a função retornará .T..
  • O desbloqueio dos registros pode ser realizado pelas funções DBRUnlock e DBUnlock. O fechamento da tabela através das funções DBCloseArea ou DBCloseAll também
, que
  • libera os registros bloqueados pelo processo atual.

Exemplos

O exemplo abaixo utiliza a RDD "TOPCONN", mas a função pode ser utilizada com qualquer uma das RDDs válidas.

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
user function test1()
  Local nHandle := TCLink()
  Local cTable := "MYTABLE"
  Local cRDD := "TOPCONN"
  Local lRet := .F.
  
  // Abre a tabela em modo exclusivo
  DBUseArea( .T., cRDD, cTable, (cTable), .F., .F. )
  
  DBGoTop()
  lRet := DBRLock()       // Tenta bloquear o registro de número 1
  conout( lRet )          // Exibe: .T.
  
  DBCloseArea()
  
  // Abre a tabela em modo compartilhado
  
//Este exemplo, apresenta duas maneiras de utilizar a função DBRLock().
DBUseArea( .T.,
"dbfcdxads"
 cRDD, 
"\dadosadv609\sa1990.dbf","SSS",
cTable, (cTable), .T., .F. )
  
  DBGoTo( 100 )
  lRet := DBRLock()       // Bloqueia o registro
atual (100)DBRLock(110)
 de número 100
  conout( lRet )          // Exibe: .T.
  
  lRet := DBRLock( 110 )  // Bloqueia o registro de número 110
  conout( 
Advanced Protheus 6.09 , Advanced Protheus 7.10 , Microsiga Protheus 8.11 , Protheus 10 , TOTVS Application Server 10 , ByYou Application Server
DBRUnlock
lRet )          // Exibe: .T.
  
  // Fecha a tabela
  DBCloseArea()
  
  // Desconecta do SGBD
  TCUnlink( nHandle )
return

O exemplo abaixo espera ser possível fazer o bloqueio de um registro, altera e depois desbloqueia.

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
user function test2()
  Local nHandle := TCLink()
  Local cTable := "MYTABLE"
  Local cRDD := "TOPCONN"
  Local lRet := .F.
  
  // Abre a tabela em modo compartilhado
  DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
  
  DBGoTo( 100 )
  
  // Espera o bloqueio ser possível
  while !DBRLock()
    sleep( 1000 )
  enddo
  
  // Altera o conteúdo do registro
  (cTable)->MYFIELD := "ABCDE"
  
  // Desbloqueia o registro
  DBRUnlock( 100 )
  
  // Fecha a tabela
  DBCloseArea()
  
  // Desconecta do SGBD
  TCUnlink( nHandle )
return

Veja também