Página 1 de 1

Erro com a funcao Flock()

Enviado: 22 Fev 2015 09:12
por rubens
Olá...

Estou tento um problema com a função flock() ou estou usando errado.

Código: Selecionar todos

// LIMPA ARQUIVO DE NFC TEMPORARIO
DBSelectArea('NFC2')
WHILE(.T.)
	IF FLOCK()
		ZAP
		DBUnlock()
		EXIT
	ENDIF
ENDDO


Pelo debug eu consigo ver que selecionou a area certinha, o Flock() retorna verdadeiro, mas na hora do zap dá erro DBFCDX/1023 uso exclusivo requerido. O arquivo está na pasta atual, está sendo usado somente por um usuário... o Arquivo foi aberto em modo compartilhado.
Tá errado essa forma de usar?
Só posso dar uma zap se o arquivo foi aberto de forma exclusiva?
O Flock() não deveria travar o arquivo para eu poder usar o zap?

Obrigado
Rubens

Erro com a funcao Flock()

Enviado: 22 Fev 2015 09:42
por Jairo Maia
Olá Rubens,
rubens escreveu:Só posso dar uma zap se o arquivo foi aberto de forma exclusiva?
Sim. Para usar o ZAP o arquivo precisa ser aberto em modo exclusivo. Feche o arquivo, e abra em modo exclusivo. Se você não abre todos os índices ao abrir o arquivo, certifique-se que todos os índices sejam abertos, porque eles também serão zerados, bem como todos arquivos de campos memos relacionados a ele. Após usar o ZAP feche-o novamente e abra em modo compartilhado.
rubens escreveu:O Flock() não deveria travar o arquivo para eu poder usar o zap?
Não. o FLock() trava o arquivo para que nenhum outro usuário altere nada nele, mas não se aplica ao ZAP.

Erro com a funcao Flock()

Enviado: 23 Fev 2015 17:04
por Kapiaba

Código: Selecionar todos

   USE BANCO ALIAS BANCO EXCLUSIVE NEW
   DBZAP()

    CLOSE DATABASE
Indexar o aquivo, se necessário.

Não necessita de WHILE... ENDDO.

Abs.

Erro com a funcao Flock()

Enviado: 23 Fev 2015 21:38
por Eolo
Tem que usar sempre a NETERR(), que retorna .T. ou .F. se o USE deu certo ou não (aliás, tanto EXCLUSIVE como SHARED).

Porque se o arquivo já estiver em USE por outro usuário na rede, vai dar erro na execução...

Eu uso dentro de um WHILE, porque tento abrir mais de uma vez, abortando só se todas as tentativas derem .F.

Algo como:

Código: Selecionar todos

function abre_excl
abriu=.f.
tenta=1
do whil .t.
  use banco new excl // ALIAS assume o mesmo nome do arquivo
  if neterr()
    * USE EXCL falhou
    * Mensagem pro usuário
    inkey(0.5)
    if tenta=5
      exit
    endi
    tenta++
  else
    * USE EXCL funcionou
    abriu=.t.
    exit
  endi
endd
retu abriu

Erro com a funcao Flock()

Enviado: 23 Fev 2015 22:44
por Pablo César
Bem lembrado Eolo !

Erro com a funcao Flock()

Enviado: 24 Fev 2015 08:50
por rubens
Bom dia...

Certo, abrir exclusivo eu já tinha conseguindo... só achei que o flock() travava o arquivo.

Quando se tenta abrir em modo exclusivo e o arquivo já está sendo usado, ele não mostra automaticamente uma mensagem de erro ????

Porque eu uso assim para não deixar o programa ser aberto duas vezes na mesma máquina... tenho um arquivo no d: da máquina e quando entra no programa abre ele em modo exclusivo, daí se tenta entrar no programa de novo ele tenta abrir o mesmo arquivo de novo e dá erro.. na época foi a forma que encontrei.

Bom de qualquer forma....

Obrigado

Rubens

Erro com a funcao Flock()

Enviado: 24 Fev 2015 10:25
por Jairo Maia
Olá Rubens,
rubens escreveu:só achei que o flock() travava o arquivo.
Rubens, apenas esclarecendo para você saber a diferença entre um e outro:

A função FLock() realmente bloquei (trava) o arquivo, mas outros usuários podem abri-lo no modo compartilhado para consulta, apenas não vai poder fazer alterações até que o arquivo seja liberado, mas ele consulta o arquivo.

Use <cFile> Exclusive, não permite nem mesmo outro usuário abri-lo para consulta. Ele fica visível apenas para o usuário que abri-lo de forma exclusiva, e para usar o ZAP, isso é necessário, ou seja, que nenhum outro usuário esteja acessando o arquivo.
rubens escreveu:Quando se tenta abrir em modo exclusivo e o arquivo já está sendo usado, ele não mostra automaticamente uma mensagem de erro ????
Não. Ao tentar abrir um arquivo aberto no modo Exclusivo, não provoca um RTE (Run Time Error ou Erro Em Tempo de Execução). Esse erro é retornado pela função NetErr() que retorna .T. quando há erro ao tentar abrir um arquivo, bloquear um arquivo ou bloquear um registro.
rubens escreveu:Porque eu uso assim para não deixar o programa ser aberto duas vezes na mesma máquina...
Enviei há um tempo esse exemplo para poder verificar se determinado processo já está ativo no SO: Funções WAPI no Harbour, mas se quiser pode também usar assim que funciona da mesma forma para seu caso:

Código: Selecionar todos

Function Main()

 EstouRodando()

Return Nil

Function EstouRodando()  // verifica se o sistema está em execução
 
 Local cFileChek := GetEnv( "TEMP" ) + "\ATIVIDADE.SYS"

 If !File( cFileChek )
  Hb_MemoWrit( cFileChek, "Sistema em Execução" )
 EndIf

 FOpen( cFileChek, 16 )  // tenta abrir em modo exclusivo
 If FError() != 0
  Hb_Alert( "Sistema já Aberto nesse Computador;Por Favor, Use a Cópia que está aberta" )
  Quit  // fecha essa cópia do programa
 EndIf

Return Nil

Erro com a funcao Flock()

Enviado: 24 Fev 2015 13:56
por Eolo
Rubens,

Posso parecer piégas mas, enfim, que seja.

Muitos programadores (inclusive eu, anos atrás) elegem o software, dão uma olhada rápida no manual e saem aplicando os comandos e funções, consultando o Google, copiando e colando, sem se preocupar muito com o significado delas ou com o que elas representam. Via de regra por necessidade.

Mas é preciso ir ao gênese, ao começo, entender o espírito da coisa. E nunca perder o link com isso.

Bão, um dia, alguém - sei lá quem foi - criou o Clipper. E ele criou o ZAP, o PACK, o REINDEX, todos representando uma necessidade da "vida real". Sobre o ZAP, imagino ele pensando: "Um prato sobre a mesa, 5 pessoas comendo nesse mesmo prato, aí uma delas resolve limpar o prato, jogar a comida fora, e aí como ficam os outros, com seus garfos espetados no bife? Pra fazer isso, preciso ter controle exclusivo do prato... Feito! Mas e se um outro comensal resolveu fazer a mesma coisa 5 segundos antes?"

Acho que aí nasceu o SET EXCLUSIVE e a NETERR()...

Se eu mando rodar o ZAP e outro(s) usuário(s) está(ão) usando o DBF/CDX, com um browse aberto, o que o browse dos outros iria mostrar como meu ZAP? Pra evitar isso, o EXCLUSIVE assegura que não vai ter mais ninguém com aquele DBF aberto, aí eu posso ZAPear ele. Mas, antes, o NETERR me avisa se alguém já não assumiu, antes, o "controle exclusivo do prato".

Enfim, como diz a música, "tem que se encantar menos com a rede, e mais com o mar".

Programação é lógica, 0's e 1's. Nada a ver com mágica, muito menos com copiar e colar.

Desculpe de novo se pareço piégas.

Erro com a funcao Flock()

Enviado: 11 Fev 2016 18:18
por microvolution
Olá srs. professores... boa tarde!
Hoje e, pela primeira vez, ao tentar usar o PACK via programação, aconteceu comigo essas coisas. Todos foram bem claros quanto às informações e acho que aprendi mais uma coisa, que nos últimos 20 anos nunca havia precisado, utilizado ou aprendido.
As explicações do professor Eolo foram fantásticas, sem esquecer das do Jairo, enfim, de todos.
Vou criar agora uma função/rotina que fecha e abre o arquivo imediatamente caso seja para usar o PACK ou ZAP. Aliás, no meu caso, estou tentando usar o PACk e caí na mesma ideia de trocar o RLOCK por FLOCK, pois, pensava que trocando de uma para outra função, o arquivo seria travado por completo para realização da tarefa.
Meus sinceros parabéns a todos!
:)Pos

Erro com a funcao Flock()

Enviado: 13 Fev 2016 00:08
por JoséQuintas
Acho que assim fica mais simples e direto:

Vai zerar o arquivo, vai deixar compartilhado para os outros terminais pesquisarem o que?

Mas com certeza, isso já foi dúvida pra todo mundo, inclusive pra mim.