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