A partir do dia 28/08 após às 20hs, o acesso ao TDN nas páginas logadas será integrado ao Identity Fluig, seguindo o mesmo padrão já adotado em outras ferramentas, como o Jira Produção.
Essa mudança tem como objetivo aprimorar a segurança e a gestão de acessos a ferramenta. Atenciosamente, equipe TOTVS.
Bloqueia um registro do alias de uma tabela para receber atualizações de valores de campos.
Sintaxe
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.).
Observações
Esta função é utilizada quando se tem uma tabela aberta, compartilhada e se deseja bloquear um registro para que outros usuários não possam alterá-lo. 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 chamada da função é desnecessária, e retorna .T.
O usuário pode escolher o registro que será bloqueado, através do parâmetro nRec, mas se este não for especificado, 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 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.
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
DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
DBGoTo( 100 )
lRet := DBRLock() // Bloqueia o registro de número 100
conout( lRet ) // Exibe: .T.
lRet := DBRLock( 110 ) // Bloqueia o registro de número 110
conout( 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.
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