Travar Arquivo

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Travar Arquivo

Mensagem 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.
Piter Galdiano
Programador Clipper
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Mensagem 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ê?
Piter Galdiano
Programador Clipper
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Mensagem 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ê?
Piter Galdiano
Programador Clipper
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem 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.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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 
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder