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.
Retorna verdadeiro (.T.), se a tabela for bloqueada com sucesso; caso contrário, falso (.F.).
Observações
Esta função é utilizada quando se tem uma tabela aberta, compartilhada e se deseja bloquear toda ela para que outros usuários não possam alterar.
Para desbloquear a tabela deve-se utilizar a função DBUnlock.
Caso não haja área de trabalho 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 de bloqueios efetuados e NNN o número de registros bloqueados.
Se a tabela está aberta em modo exclusivo, a função não altera o bloqueio da tabela e retorna .T..
Antes de bloquear a tabela é feito a gravação das alterações pendentes. Caso haja erro nessa gravação, o programa será encerrado com ocorrência de erro recuperável "Commit error: (FLock)".
Se o arquivo não estiver em um bloco transacionado, será feito o desbloqueio de todos os registros tabela antes de bloqueá-la. Caso haja erro nesse desbloqueio, será apresentada no log de console do AppServer uma mensagem "Warning - FLock - Unlock error".
Após a execução de FLock, a chamada a função DBRLockList retorna o valor { 0 }, uma vez que todos os bloqueios de registro foram liberados.
O principal motivo de retorno .F. é quando a tabela já foi bloqueada por outro usuário.
Se a tabela já estiver bloqueada e a conexão que fez o bloqueio tentar bloquear novamente essa mesma tabela, a função retornará .T..
Caso um programa faça mais de uma conexão com o SGBD e a primeira conexão bloquear uma tabela, a segunda conexão consegue desbloquear a mesma tabela. Isso só é possível se as duas conexões partirem da mesma thread.
A função DBCloseArea remove todos os bloqueios realizados.
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( "MSSQL/DSN1", "127.0.0.1", 7890 )
Local cTable := "MYTABLE"
Local cRDD := "TOPCONN"
Local lRet := .F.
// Abre a tabela em modo exclusivo
DBUseArea( .T., cRDD, cTable, (cTable), .F., .F. )
DBGoTop()
lRet := FLock() // Tenta bloquear a tabela indica em cTable
conout( lRet ) // Exibe: .T.
varinfo( "list1", DBRLockList() ) // Exibe: { 0 }
DBCloseArea()
// Abre a tabela em modo compartilhado
DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
lRet := DBRLock( 100 ) // 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.
varinfo( "list2", DBRLockList() ) // Exibe: { 100, 110 }
lRet := FLock() // Bloqueia a tabela indica em cTable
conout( lRet ) // Exibe: .T.
varinfo( "list3", DBRLockList() ) // Exibe: { 0 }
// Fecha a tabela
DBCloseArea()
// Desconecta do SGBD
TCUnlink( nHandle )
return
O exemplo abaixo espera ser possível fazer o bloqueio de uma tabela, altera vários registros e depois desbloqueia.
user function test2()
Local nHandle := TCLink( "MSSQL/DSN1", "127.0.0.1", 7890 )
Local cTable := "MYTABLE"
Local cRDD := "TOPCONN"
Local lRet := .F.
// Abre a tabela em modo compartilhado
DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
// Espera o bloqueio da tabela ser possível
while !FLock()
sleep( 1000 )
enddo
// Altera o conteúdo do registro 100
DBGoTo( 100 )
(cTable)->MYFIELD := "ABCDE"
// Altera o conteúdo do registro 110
DBGoTo( 110 )
(cTable)->MYFIELD := "FGHIJ"
// Desbloqueia a tabela
DBUnlock()
// Fecha a área de trabalho
DBCloseArea()
// Desconecta do SGBD
TCUnlink( nHandle )
return