Página 1 de 1

Open exclusive em DBF

Enviado: 10 Jan 2011 08:53
por Laudelino Scarmagnani
Pessoal, bom dia!
Tenho o comando USE CRACE INDEX CRACE ALIAS CRACE EXCLUSIVE
Queria saber se tem como eu verificar, antes de dar este comando, se há alguém usando este arquivo de forma exclusiva,
para evitar queda do programa, alertando o usuário para que aguarde.
Abraços.
Laudelino

Re: Open exclusive em DBF

Enviado: 10 Jan 2011 09:09
por ANDRIL
Ola amigo, tente assim:

Código: Selecionar todos

USE CRACE EXCLUSIVE 

if neterr()
wait"Arquivo em uso no momento, tente mais tarde"
return
endif
*--aqui segue o seu fluxo normalmente.
SET INDEX TO CRACE
OBSERVACAO: Eu nao costumo abrir os INDICES junto com os DBFS, a nao ser que verifique antes a existencia do arquivo, caso contrario ocorrerar erro de arquivo inexistente.

Abraços.

Re: Open exclusive em DBF

Enviado: 10 Jan 2011 09:40
por Laudelino Scarmagnani
Andril, obrigado pela ajuda, mas não sei como dar o comando corretamente. Continua o problema. Incluí desta forma:
SELECT 8
USE CRACE INDEX CRACE ALIAS CRACE EXCLUSIVE
if neterr()
wait"Arquivo em uso no momento, tente mais tarde"
return
endif
ZAP
Laudelino

Re: Open exclusive em DBF

Enviado: 10 Jan 2011 09:49
por Itamar M. Lins Jr.
Ola!
Usando o Harbour.

Código: Selecionar todos

if select(apel) > 0
   FechaDb(apel)
endif

BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
        DbUseArea(.t.,'DBFCDX',dDados+db,apel,.T.,.F.,'PTISO')
Recover
     msginfo('Erro, abrindo Arquivo: '+dDados+Db+' Compartilhado')
End Sequence
Saudações,
Itamar M. Lins Jr.

Re: Open exclusive em DBF

Enviado: 10 Jan 2011 10:13
por ANDRIL
Laudelino, em suma, o que voce fez deveria ter funcionado, visto que esta pedindo abertura exclusiva de arquivo, se alguem em tiver utilizando, NETERR() passa a ser .T., nesse caso, indicando para o usuário tentar mais tarde.

Veja que coloquei um return para sair e não executar o restante do codigo, agora voce precisa ver se no seu codigo cabe esse return ou um outro que direcione o fluxo corretamente, por exemplo return 1 ou return "FALHOU".

Se não conseguir da forma que o nosso colega Itamar informou, poste o trecho onde esta tendo o problema.
Abraços!

Re: Open exclusive em DBF

Enviado: 10 Jan 2011 10:54
por Laudelino Scarmagnani
Mudei para

//USE CRACE INDEX CRACE ALIAS CRACE EXCLUSIVE
USE CRACE EXCLUSIVE
if neterr()
wait"Arquivo em uso no momento, tente mais tarde"
return
endif
close
USE CRACE INDEX CRACE ALIAS CRACE EXCLUSIVE
ZAP
Desta forma, funcionou. Não sei se é a melhor forma.
Laudelino

Re: Open exclusive em DBF

Enviado: 10 Jan 2011 11:10
por ANDRIL
Amigo, funcionou, mais não é a forma correta. Veja que voce testou se o arquivo poderia ser aberto, e pôde (foi aberto), logo em seguida fechou com CLOSE. Se outro usuario executar o mesmo codigo em outra maquina nesse pequeno instante do CLOSE ao USE ocasionara erro.

Tente nao abrir o INDICE junto com o DBF, pode ser por isso que esteja falhando o seu NETERR(), me parece que este so testa a abertura do dbf.

Código: Selecionar todos

USE CRACE EXCLUSIVE
if !neterr()
   *--aqui dentro dessa estrutura se algum outro usuario tentar acessar esta
   *--mesma tarefa simultaneamente, nao conseguira.
   IF file("CRACE.IDX")  //aqui conforme seu INDICE
      SET INDEX TO CRACE
   ENDIF
   ZAP
  *--fecha a area aberta e seus indices
  close
else
   wait"Falha ao tentar abrir o arquivo solicitado. Esta em uso. Tente depois."
endif
Tenta ai, blz.

Re: Open exclusive em DBF

Enviado: 10 Jan 2011 11:35
por alxsts
Olá!

Não precisa abrir o arquivo duas vezes. Veja se o código abaixo funciona para você:

Código: Selecionar todos

Procedure Main

Local nOpt := 1

   WHILE nOpt == 1

      Try
         USE CRACE EXCLUSIVE NEW

         // Abriu EXCLUSIVE, segue processamento

         CRACE->( DbSetIndex( "CRACE" ) )

         Zap

         // outras instruções
 
         CRACE->( DbCloseArea() )

      Catch
         // Falha na abertura... try again?
         If ( nOpt := Alert( "Arquivo em uso no momento.;Deseja tentar novamente?", { " Sim ", " Não " } ) ) != 1
            EXIT
         Endif 
      End Try

   Enddo

   RETURN

Open exclusive em DBF

Enviado: 25 Mar 2014 17:05
por Bettu
Olá, estou programando em harbour usando dbf, e logo de abrir uma dbf exclusive, se eu quiser abrir a mesma em uma segunda aplicação, aparece a mensagem Acesso arquivo denegado e nao me deixa abrí-la, isso tem que ser assim, mas quando saio da primeira aplicação e fecha o dbf, com close fornecedores por exemplo, e volto a abrí-la desde a aplicação 2, na parte do grid aparece uma tela preta, mas aparecem os dados do lado da edição. Porque será que não carrega de novo a dbf para o grid, logo que foi aberto desde a outra aplicação?

Ao inicio da função esta definido o set exclusive off

e logo no programa abro a dbf:

Código: Selecionar todos

PROCEDURE AbrirTabfor

   SELECT 1
   arq_for=p_pastrab+'fornec'
   arq_in1 := p_pastrab+"fornecnpj.ntx"
   arq_in2 := p_pastrab+"fornec.ntx"
   arq_in3 := p_pastrab+"forneccn.ntx"
   if !NET_USE("&arq_for",.t.,3,"&arq_in2","&arq_in1","&arq_in3")
         retu .f.
   endif
  gO TOP

RETURN
e a função que uso para bloquear a dbf é:

Código: Selecionar todos

func net_use
para file,ex_use,esp,idx1,idx2,idx3,idx4,idx5,idx6
priv etern
etern=(esp=0)
file=file+".dbf"
if !file(file)
   MsgInfo ('Arquivo '+FILE+' Inexistente')
   retu .f.
endi
do whil (etern .OR. esp > 0)
   if ex_use
      use &file excl
   else
      use &file shar
   endi
   if !neterr()
      do case
         case pcount()=4
            set inde to &idx1
         case pcount()=5
            set inde to &idx1,&idx2
         case pcount()=6
            set inde to &idx1,&idx2,&idx3
         case pcount()=7
            set inde to &idx1,&idx2,&idx3,&idx4
         case pcount()=8
            set inde to &idx1,&idx2,&idx3,&idx4,&idx5
         case pcount()=9
            set inde to &idx1,&idx2,&idx3,&idx4,&idx5,&idx6
      endc
      retu(.t.)
   endi
   inke(1)
   esp=esp - 1
   if esp=0
      w_key=0
      if !lolock(w_key)
           exit
      endi
      esp=3
   endi
enddo
****
function lolock(w_key)

w_altera := MsgOkCancel ("Acesso ao Arquivo Denegado - Continua Intentando?")
      
do whil w_altera == .t.
   w_key=inke(3)
   if w_altera == .f. .or. w_key=27
      rest scree from w_card
      retu
   else
      w_altera := MsgOkCancel ("Acesso ao Arquivo Denegado - Continua Intentando?")
   endi
enddo
RETURN w_altera
retu(.f.)
Muito obrigada pela dedicação de vocês, aprendo bastante com o forum.
Bettu

Open exclusive em DBF

Enviado: 25 Mar 2014 23:49
por JoséQuintas
Uma coisa não comum no seu comando:
O ALIAS é pra quando vai se dar outro nome ao arquivo (dentro do programa).

USE GRACE

ou

USE GRACE ALIAS OUTRONOME