Página 1 de 1
Travar Arquivo
Enviado: 20 Dez 2006 10:37
por PITERGALDIANO
Bom dia
Pessoal, estou colocando meu sistema em rede... agora a dúvida
Como faço para verificar se outra estação está com um determinado DBF aberto?
Preciso saber isso pois tenho a rotina de recriar os índices do sistema, mas para isso o sistema tem que alertar se o DBF está aberto em outra estação.
Obrigado.
Enviado: 20 Dez 2006 11:07
por Clipper
Lá vai...
Código: Selecionar todos
DO WHIL .T.
USE MEUDBF EXCLUSIVE
IF NETERR()
@ 24,00 SAY "O arquivo esta em uso..."
ELSE
EXIT
ENDIF
INKEY(.5.)
ENDDO
INDEX ON CODIGO TO MEUDBF
...
...
Até logo.
Marcelo
Enviado: 20 Dez 2006 11:33
por PITERGALDIANO
Fiz da forma que vc me falou, porém quando uso
USE MEUDBF EXCLUSIVE
aparece o erro de compartilhamento nesta linha (Erro múmero 5 do DOS)
ou seja, não processa a linha IF neterr() que está logo abaixo do USE
porquê?
Enviado: 20 Dez 2006 12:32
por Clipper
Prezado Piter
Acontece que você precisa abrir os arquivos em modo SHARED e apenas abrir em modo EXCLUSIVE e ou executar um FLOCK() quando for necessário. Provavelmente os arquivos estão sendo abertos em modo EXCLUSIVE e por isso do erro.
Lembre-se que por padrão o Clipper abre os arquivos em modo EXCLUSIVE sendo necessário especificar a opção SHARED quando se deseja compartilhar.
Até logo.
Marcelo
Enviado: 20 Dez 2006 13:03
por PITERGALDIANO
Eu especifico Shared.. é assim:
// no PRG de cadastro
Use meudbf alias meudbf shared new
// no PRG de reindexação
Use meudbf exclusive // o erro ocorre aqui e não trata a linha abaixo (neterr())
If neterr()
? arquivo aberto
Else
reindexa
EndIf
Porquê?
Enviado: 24 Dez 2006 17:47
por gvc
Vc esta mandando abrir o arquivo em modo exclusivo.
Vc deve verificar se consegue bloquear o arquivo com FLOCK().
Ai testar o neterr() para saber se foi ou não possível bloquear o arquivo.
Se foi possível bloquear o arquivo, feche e abra em modo exclusivo para depois indexar o mesmo.
Enviado: 24 Dez 2006 22:42
por rochinha
Amiguinho
Faça um teste com este função:
Código: Selecionar todos
FUNCTION dblocked( dbf )
ldbf := FOPEN( dbf, 1 )
IF FERROR() <> 0
RETURN .t.
ENDIF
FCLOSE(ldbf)
RETURN .f.
Passe como parametro o nome do arquivo, não serve alias pois a tentativa de abertura se dará no arquivo fisico.
Código:
Código: Selecionar todos
...
if dbLocked( "CLIENTES.DBF" )
? "Arquivo travado em algum lugar"
else
USE clientes EXCLUSIVE