De fato eu vou precisar revisar todo o programa, tem muita coisa errada. Esse programa começou a ser feito em 1995, quando eu ainda estava começando a aprender a programar. De lá pra cá, fui alterando algumas coisas, melhorando aqui e ali, mas ainda tem muita coisa velha, que precisa ser mudada. Vou aproveitar que estou começando a usar MySQL para refazer todo o programa, fazer tudo novo, corrigindo todos os velhos defeitos.
Já abandonei o meu errorsys.
Minha usebase() já faz essa verificação, esperando liberar a base:
Código: Selecionar todos
if upper(exclusivo)#"S" .and. ("ATIV"$upper(nomebase) .or. "NUMEROS"$upper(nomebase) .or. "RODRIGO"$upper(nomebase) .or. "BEATRIZ"$upper(nomebase) .or. "ATCAM"$upper(nomebase) .or. "ATROD"$upper(nomebase) .or. "ATBIA"$upper(nomebase) .or. "PROC"$upper(nomebase) .or. at("COM",upper(nomebase))=1 .or. at("CONSULTA",upper(nomebase))=1 .or. "ARQBX"$upper(nomebase) .or. "RELATOR"$upper(nomebase) .or. "REUS"$upper(nomebase) .or. "TIPOSP"$upper(nomebase) .or. "USUAR"$upper(nomebase) .or. "1"$upper(nomebase) .or. "2"$upper(nomebase) .or. "3"$upper(nomebase)) // .or. upper(curdir())="TAREFAS")
vezusb=0
if select(bssembarra) = 0
use &nomebase. shared //new
else
DbSelectArea(bssembarra)
exit
endif
else
if select(bssembarra) = 0
use &nomebase. //new
else
DbSelectArea(bssembarra)
if exclusivo="S"
use
use &nomebase. //new
else
exit
endif
endif
endif
if neterr()
vezusb++
if ("TAR2P"$upper(hb_progname()) .and. vezusb>120) .or. (at("TAR2P",upper(hb_progname()))=0 .and. vezusb>60)
return .f.
endif
if vezusb=120 .or. vezusb=220 //.or. vezusb=280 .or. vezusb=200 .or. vezusb=240
nHand=999
if at("TAR2P",upper(hb_progname()))=0
nHand := FOpen( "\tarefas\TAR2P.EXE " , 2 )
fclose(nHand)
endif
mandmail1("","Base em uso por "+alltrim(str(vezusb))+" vezes:"+nomebase+"; exclusivo: "+exclusivo+"; área atual: "+alltrim(str(select()))+"; área da base "+nomebase+": "+alltrim(str(select(nomebase)))+"; aliás1: "+alias(1)+"; aliás2: "+alias(2)+"; aliás3: "+alias(3)+"; aliás4: "+alias(4)+"; nhand: "+alltrim(str(nHand))+"; select(nomebase): "+alltrim(str(select(nomebase)))+"; tamanho da base: "+alltrim(str(filesize(nomebase))))
endif
@ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
@ maxrow()-1,1 say "Base "+upper(nomebase)+" ocupada; aguarde liberação ("+alltrim(str(vezusb))+")"
if us="I"
@ maxrow(),1 say "Área: "+alltrim(str(select()))+"; aliás1: "+alias(1)+"; aliás2: "+alias(2)+"; aliás3: "+alias(3)+"; aliás4: "+alias(4)+"; select(nomebase): "+alltrim(str(select(nomebase)))
endif
inkey(8)
@ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
desiste:=inkey(8)
if desiste= 27 //K_ESC
conf="N"
@ maxrow()-2,1 clear to maxrow(),79
@ maxrow()-1,5 say "Confirma abandono da tentativa da utilização?"get conf pict "@!"
read
@ maxrow()-2,1 clear to maxrow(),79
if conf="S"
return .f.
endif
endif
else
exit
endif
O problema é que o usuário A vai copiar a base pro computador do usuário B. Daí eu mando primeiro ele usar a base, para verificar se ela está disponível. Uma vez aberta a base em modo exclusivo, o que significa que ela não está em uso, eu fecho a base para poder copiar. Nesse exato instante, depois de fechada a base e antes de terminar a cópia, o usuário B abre a base (o que acontece eventualmente). Resultado: a cópia dá erro.
O que eu queria era uma forma de evitar esse erro. No meu errorsys eu havia feito essa opção de, havendo erro de cópia, o programa esperar um pouco e tentar copiar de novo.