FLOCK()
 Trava um arquivo de banco de dados aberto e compartilhado
------------------------------------------------------------------------------

 Sintaxe

     FLOCK() --> lSucesso

 Retorno

     FLOCK() retorna verdadeiro (.T.) se uma tentativa de travar um arquivo
     de banco de dados em USo na área de trabalho corrente é bem sucedida;
     do contrário, ela retorna falso (.F.).  Para maiores informaçoes am
     respeito do travamento de arquivos, consulte o capítulo Programando em
     Rede no livro Programando e Utilitários.

 Descriçao

     FLOCK() é uma funçao de tratamento de banco de dados utilizada em
     ambientes de rede a fim de travar um arquivo aberto e compartilhado
     para evitar que outros usuários atualizem o arquivo até que o
     travamento seja liberado.  Ao mesmo tempo, os registros no arquivo
     travado sao acessíveis para operaçoes de leitura somente.

     FLOCK() é relacionado a USE...EXCLUSIVE e RLOCK().  USE...EXCLUSIVE
     abre um arquivo de banco de dados de forma que nenhum outro usuário
     possa abrir o mesmo arquivo ao mesmo tempo e é o mecanismo de
     travamento mais restritivo em Clipper.  RLOCK() é o menos restritivo e
     tenta colocar um travamento atualizado em um registro compartilhado,
     impossibilitando a outros usuários a atualizaçao do registro corrente.
     FLOCK() falls in the middle.

     Regra geral, FLOCK() é utilizado para operaçoes que acessam todo o
     arquivo de banco de dados.  Sao comandos que atualizam o arquivo com
     uma abrangência ou condiçao como, por exemplo, DELETE ou REPLACE ALL.
     A seguir está uma lista de tais comandos:

     Tabela 5-17: Comandos que requerem FLOCK()
     ------------------------------------------------------------------------
     Comando                          Modo
     ------------------------------------------------------------------------
     APPEND FROM                      FLOCK() ou USE...EXCLUSIVE
     DELETE (múltiplos registros)     FLOCK() ou USE...EXCLUSIVE
     RECALL (múltiplos registros)     FLOCK() ou USE...EXCLUSIVE
     REPLACE (múltiplos registros)    FLOCK() ou USE...EXCLUSIVE
     UPDATE ON                        FLOCK() ou USE...EXCLUSIVE
     ------------------------------------------------------------------------

     Para cada invocaçao de FLOCK(), há uma tentativa de travar o arquivo de
     banco de dados, e o resultado retorna na forma de um valor lógico.  Um
     travamento de arquivo falha caso outro usuário tenha correntemente um
     travamento de arquivo ou registro para o mesmo arquivo de banco de
     dados, ou uso exclusivo de um arquivo de banco de dados.  Caso FLOCK()
     seja bem sucedido, o travamento de arquivo permanece ativo até que você
     destrave, feche o banco de dados ou utilize RLOCK().

     O padrao é que FLOCK() opere na área de trabalho correntemente
     selecionada, mas pode operar em uma área de trabalho nao selecionada se
     esta for especificada em uma expressao alias como mostra o exemplo
     abaixo.

 Notas

       SET RELATION: O Clipper nao trava automaticamente todas
        as áreas de trabalho na cadeia de relacionamentos quando você trava
        a área de trabalho corrente.  Da mesma forma, um comando UNLOCK nao
        tem efeito algum sobre áreas de trabalho relacionadas.

 Exemplos

       Este exemplo demonstra a utilizaçao de FLOCK() para uma
        atualizaçao de batch de preços em Inventory.dbf:

        USE Inventory NEW
        IF FLOCK()
           REPLACE ALL Inventory->Price WITH Inventory->Price * 1.1
        ELSE
           ? "Arquivo nao disponível"
        ENDIF

       Este exemplo utiliza uma expressao alias para tentar um
        travamento de arquivo em uma área de trabalho nao selecionada:

        USE Sales NEW
        USE Customer NEW
        //
        IF Sales->(FLOCK())
           ? "Arquivo Sales em uso por outra estacao"
        ENDIF

 Arquivos:  Biblioteca CLIPPER.LIB.
 To download this example - click here.

See Also: RLOCK() SET EXCLUSIVE* UNLOCK USE