Open exclusive em DBF

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Open exclusive em DBF

Mensagem 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
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Open exclusive em DBF

Mensagem 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.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Re: Open exclusive em DBF

Mensagem 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
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: Open exclusive em DBF

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Open exclusive em DBF

Mensagem 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!
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Re: Open exclusive em DBF

Mensagem 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
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Open exclusive em DBF

Mensagem 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.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Open exclusive em DBF

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Bettu
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 14 Nov 2013 16:25
Localização: Curitiba

Open exclusive em DBF

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Open exclusive em DBF

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder