Como forçar o fechamento de DBFs na rede?
Moderador: Moderadores
Como forçar o fechamento de DBFs na rede?
Existe jeito de forçar o fechamento de um arquivo DBF que está sendo usado por outro usuário da rede?
Clipper 5.2e + DBFCDX + Exospace 1.0g
Não. Mas o que você pode fazer é criar um sistema de identificação e notificação para pedir que esses usuários encerrem suas atividades.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Estou com um problema semelhante.
Em algumas ocasiões uma estação não consegue gravar em um determinado dbf pq outro usuário está com o mesmo dbf (registro) aberto e travado com RLOCK(). E o usuário, impaciente como sempre, lasca um CTRL+ALT+DEL enquanto o sistema está aguardando o desbloqueio na outra estação.
Como resolver isso? ainda não sei...
Jânio
Em algumas ocasiões uma estação não consegue gravar em um determinado dbf pq outro usuário está com o mesmo dbf (registro) aberto e travado com RLOCK(). E o usuário, impaciente como sempre, lasca um CTRL+ALT+DEL enquanto o sistema está aguardando o desbloqueio na outra estação.
Como resolver isso? ainda não sei...
Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Se vc usa o Windows XP ou 2003 como servidor e não esta abrindo esses DBF como Exclusivo, tem como fazer pelo Gerenciador de Computador que lista todos os DBF e EXE aberto....eu suo isso para aqueles usuario teimoso da REDE....claro que ah um risco nisso !!!....se o DBF estiver aberto como EXCL vai dar erro e não vai fechar !!! mas estou usando esse recurso do Windows ...e não deu problema ainda !!!....
Obs:Aconselho dar uma procurada na net por algo mais profissional...isso que faço não passa de uma Gambiara !!!
Abraços
Leonardo Machado
Obs:Aconselho dar uma procurada na net por algo mais profissional...isso que faço não passa de uma Gambiara !!!
Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
No caso que você citou a única solução é orientar o usuário a não fazer isso, ao mesmo tempo em que o informa, pelo programa, que determinado arquivo ou registro está bloqueado por algum usuário em uma outra estação. Claro que você deverá usar um tempo de espera pequeno para que a máquina não fique travada enquanto o usuário aguarda o destravamento. Passado esse tempo, dê a opção para o apressadinho aguardar mais um tempo ou desistir.Como resolver isso? ainda não sei...
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Vejo um problema aí.Maligno escreveu:Claro que você deverá usar um tempo de espera pequeno para que a máquina não fique travada enquanto o usuário aguarda o destravamento. Passado esse tempo, dê a opção para o apressadinho aguardar mais um tempo ou desistir.
Quando preciso realizar gravações em vários DBF's, se tento travar para gravação um DBF lá no meio de uma rotina e não conseguir por ele estar sendo usado em outra estação, se eu abandonar essa rotina, pergunto: E o restante dos dados que devem ser gravados em VÁRIOS dbf's?
Exemplo: Na rotina abaixo preciso realizar gravação em 03 arquivos. O PRIMEIRO e no SEGUNDO dbf's consigo com hesito o travamento e gravação. Já no TERCEIRO não consigo o travamento e após esperar... esperar... esperar... dou ao usuário a opção de desistir e sair da rotina. E os dados já gravados no PRIMEIRO e no SEGUNDO???
Código: Selecionar todos
SELECT CAIXA
DBSETORDER(1)
GOTO TOP
DBSEEK(vNUMCXA)
TRAVA()
rSLDCXA = SLDCXA + vVLRDIN + vVLRCHQ
rSLDDIN = SLDDIN + vVLRDIN
rSLDCHQ = SLDCHQ + vVLRCHQ
replace SLDCXA with rSLDCXA ,;
SLDDIN with rSLDDIN ,;
SLDCHQ with rSLDCHQ
DESTRAVA()
SELECT CLIENTE
DBSETORDER(1)
GOTO TOP
DBSEEK(vCODCLI)
TRAVA()
vSALCLI = SALCLI + xVLRBAI
replace SALCLI with vSALCLI
DESTRAVA()
SELECT MOVCXA
TRAVA()
replace NUMMOV with vNUMMOV ,;
NUMCXA with vNUMCXA ,;
CODUSU with CODNOM ,;
DATMOV with vDATMOV ,;
TIPMOV with "C" ,; // C - credito / D - Debito
CODHIS with vCODHIS ,;
HISTOR with vHISTOR ,;
TIPDOC with vTIPDOC ,;
CODEMT with vCODEMT ,;
NUMDOC with vNUMDOC ,;
SEQDOC with vSEQDOC ,;
SEQBAI with vSEQBAI ,;
VLRMOV with vVLRMOV ,;
VLRDIN with vVLRDIN ,;
VLRCHQ with vVLRCHQ ,;
FLGMOV with "1"
DBCOMMITALL()
UNLOCK ALL
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
O Ademir deu a solução. E aí se nota como o código pode ficar macarrônico de tantos testes de abertura. E se fossem 10 arquivos?
Há algum tempo eu comentei sobre a necessidade de se criar um sub-sistema de controle de arquivos, semelhante ao que existe para GETs. Eu fiz o meu há alguns anos e nunca tive qualquer problema. Um exemplo:
Nesse sistema simplificado, a função de abertura só retornará TRUE se todos os arquivos puderem ser abertos, a exceção daqueles que não têm a cláusula "VITAL". Serão bloqueados os que tiverem a cláusula "EXCLUSIVE". O arquivo temporário, no fechamento, será apagado.
Dá pra imaginar que, sem um sistema desses, a quantidade de IFs seria tremendamente grande.
Janio, sempre que for trabalhar com algo assim, mesmo não sendo algo relacionado a arquivos, você sempre deve pensar que alguma coisa do que foi feito vai dar errado. A partir daí, tente imaginar as piores situações possíveis. Só assim você vai conseguir minimizar a ocorrência desse e de outros tipos de erros.
Há algum tempo eu comentei sobre a necessidade de se criar um sub-sistema de controle de arquivos, semelhante ao que existe para GETs. Eu fiz o meu há alguns anos e nunca tive qualquer problema. Um exemplo:
Código: Selecionar todos
dbDefGroup Tempor kill create vital
dbDefGroup Client create vital exclusive
dbDefGroup BasPAC create vital
dbDefGroup ComPAC vital
dbDefGroup MatPri
dbDefGroup EstqEx create vital
dbDefGroup ProAca2 create vital tag "iPAC_PED"
dbDefGroup ProAca1 vital
dbDefGroup PedVnd2 create vital exclusive
dbDefGroup PedVnd1 create vital exclusive tag "iPVD_CLI"
dbDefGroup ProPed3 create vital
dbDefGroup ProPed2 create vital
dbDefGroup ProPed1 create vital exclusive tag "iPP1_SEQ"
*
if !dbOpenGrp()
errDialog text "Arquivos não abertos"
// ....
end
dbCloseGrp()Dá pra imaginar que, sem um sistema desses, a quantidade de IFs seria tremendamente grande.
Janio, sempre que for trabalhar com algo assim, mesmo não sendo algo relacionado a arquivos, você sempre deve pensar que alguma coisa do que foi feito vai dar errado. A partir daí, tente imaginar as piores situações possíveis. Só assim você vai conseguir minimizar a ocorrência desse e de outros tipos de erros.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Uma coisa que dá pra fazer é derrubar o TBrowse() após algum tempo sem nenhuma ação do usuário. Por ex., o Fulano sai pra almoçar e larga o Vendas.DBF aberto na tela... No n-ésimo loop, o Tbrowse() é encerrado e o DBF pode ser UNLOCKado.
Código: Selecionar todos
ciclos=10 // limite pra ficar aberto sem nenhuma ação
do whil .t.
(&nome):refreshall()
(&nome):forceStable()
lk:=inkey(5) // pausa de 5 segundos
if lk=0
ciclos--
if ciclos=0
* TBrowse() é derrubado
exit
endi
elseif lk=27
exit
else
* outras teclas...
* teclou qq coisa, reinicia a contagem
ciclos=10
endi
endd-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
E você com isso? No meu sistema num faço nenhum tratamento estrambólico, não abriu da a mesagem e pergunta se quer continuar aguardando...janio escreveu:E o usuário, impaciente como sempre, lasca um CTRL+ALT+DEL
Se o usuário é espírito de porco, ele que tenha os dados corrompidos, Nem esquento a cabeça. Caiu no auditor que o sistema foi fechado incorretamente, o usuário fica sem argumento algum para cobrar algo.
Nenhum sistema é a prova de balas, é no máximo a prova de falhas. Se ele da um ctrl+alt+del para desligar o programa, também deve desligar o computador enquanto faz uma desfragmentação de disco que ta demorando. Enfim: falta orientação, ou inteligência.
Stanis Luksys
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Outra coisa que me ocorre agora é o seguinte:
Eu por muito tempo fui avesso a criação de arquivos temporários, no entanto hoje quase todo o meu sistema, em especial as rotinas de movimentação, roda em cima deles, tudo local. Só vai pro servidor ao finalizar a tarefa, aí da um replace rápido em várias tabelas ao mesmo tempo. Existe um .prg a parte só para este super replace.
Há inclusive a possibilidade de se processar os arquivos ao entrar o sistema, pois ele avisa que o programa foi abortado no meio de um processo. Mesmo tendo uma parte sido gravada e outra não, consigo reprocessar (se o usário autorizar), ou então deletar o que já foi (se ele não autorizar).
Estive um tempo atrás desenvolvendo um novo módulo em que vou gravando a pilha de funções executadas, para que ao acontecer coisa deste tipo, ele já abrisse o sistema na tela que havia parado já com os dados do dbf temporário expostos na tela. Ainda não consegui implementar, mas desejo ainda dar continuidade nisso.
Eu por muito tempo fui avesso a criação de arquivos temporários, no entanto hoje quase todo o meu sistema, em especial as rotinas de movimentação, roda em cima deles, tudo local. Só vai pro servidor ao finalizar a tarefa, aí da um replace rápido em várias tabelas ao mesmo tempo. Existe um .prg a parte só para este super replace.
Há inclusive a possibilidade de se processar os arquivos ao entrar o sistema, pois ele avisa que o programa foi abortado no meio de um processo. Mesmo tendo uma parte sido gravada e outra não, consigo reprocessar (se o usário autorizar), ou então deletar o que já foi (se ele não autorizar).
Estive um tempo atrás desenvolvendo um novo módulo em que vou gravando a pilha de funções executadas, para que ao acontecer coisa deste tipo, ele já abrisse o sistema na tela que havia parado já com os dados do dbf temporário expostos na tela. Ainda não consegui implementar, mas desejo ainda dar continuidade nisso.
Stanis Luksys
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.

