dbf travado qdo fecha com CTRL+ALT+DEL
Moderador: Moderadores
-
Mário Isa
- Usuário Nível 4

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
dbf travado qdo fecha com CTRL+ALT+DEL
Então !
De vez em quando um usuário resolve "fechar" o sistema com CTRL+ALT+DEL.
Justamente durante a rotina de organização geral (coisa minha) que só acontece uma vez por mês.
Depois, ao voltar ao sistema, o mesmo não consegue mais abrir o dbf.
Ou, na hora de abrir, o windows informa que o banco já está aberto.
Daí é necessário reiniciar pois sem isso / os dbfs / não estão corretamente fechados /
Tem alguma maneira de se resolver isso ?
Tipo um comando que force o fechamento do banco ?
Mário
De vez em quando um usuário resolve "fechar" o sistema com CTRL+ALT+DEL.
Justamente durante a rotina de organização geral (coisa minha) que só acontece uma vez por mês.
Depois, ao voltar ao sistema, o mesmo não consegue mais abrir o dbf.
Ou, na hora de abrir, o windows informa que o banco já está aberto.
Daí é necessário reiniciar pois sem isso / os dbfs / não estão corretamente fechados /
Tem alguma maneira de se resolver isso ?
Tipo um comando que force o fechamento do banco ?
Mário
Re: dbf travado qdo fecha com CTRL+ALT+DEL
ola,
Para evitar esse tipo de desatre eu fazia a reindexação geral na maquina que contem a base de dados em modo exclusivo e não sai de perto até acabar..
v_cez@yahoo.com.br
Para evitar esse tipo de desatre eu fazia a reindexação geral na maquina que contem a base de dados em modo exclusivo e não sai de perto até acabar..
v_cez@yahoo.com.br
-
Mário Isa
- Usuário Nível 4

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Re: dbf travado qdo fecha com CTRL+ALT+DEL
Olá César!
Isso eu já faço / eu alterei o errorsys.prg para que ele / ao detectar algum problema com NTX / ele "fecha" todos os bancos / em todos os computadores da rede / e reconstrói só aquele NTX / e depois dá ordem para reabrir o banco em todos (enquanto isso eles ficaram aguardando a ordem para reabertura)
O problema é quando o banco travou e não abre. você dá o comando use / mas não acontece nada / ele não abre...
Eu também já até modifiquei o errorsys.prg / para que ele / ao perceber este problema / ele reinicia a máquina servidora automaticamente / mas eu gostaria de evitar isso / e ainda não sei como /
:%
Isso eu já faço / eu alterei o errorsys.prg para que ele / ao detectar algum problema com NTX / ele "fecha" todos os bancos / em todos os computadores da rede / e reconstrói só aquele NTX / e depois dá ordem para reabrir o banco em todos (enquanto isso eles ficaram aguardando a ordem para reabertura)
O problema é quando o banco travou e não abre. você dá o comando use / mas não acontece nada / ele não abre...
Eu também já até modifiquei o errorsys.prg / para que ele / ao perceber este problema / ele reinicia a máquina servidora automaticamente / mas eu gostaria de evitar isso / e ainda não sei como /
:%
Re: dbf travado qdo fecha com CTRL+ALT+DEL
Ola,
Eu adoto esses critérios, talvez sirva como sugestão:
1. Todos os usuários tinham que estar fora do programa(s), sei que numa rede
com muitos usuários fica dificil/impossível.
Mantinha uma tabela dos usuarios que estaõ usando o programa.
Qdo entra seta a tabela, qdo sai re-seta, assim vc sabe quem esta usando.
2. Ligava um semaforo, assim que todo mundo estivessem for dos programas,
se alguem tentar-se entrar no programa e a indexação geral esta em curso,
o programa pede para "voltar depois".
3. Na indexação:
Um de cada vez: fechar o Dbf, deletar o indice(s), abrir exclusivo, indexar e fechar.
v_cez@yahoo.com.br
Eu adoto esses critérios, talvez sirva como sugestão:
1. Todos os usuários tinham que estar fora do programa(s), sei que numa rede
com muitos usuários fica dificil/impossível.
Mantinha uma tabela dos usuarios que estaõ usando o programa.
Qdo entra seta a tabela, qdo sai re-seta, assim vc sabe quem esta usando.
2. Ligava um semaforo, assim que todo mundo estivessem for dos programas,
se alguem tentar-se entrar no programa e a indexação geral esta em curso,
o programa pede para "voltar depois".
3. Na indexação:
Um de cada vez: fechar o Dbf, deletar o indice(s), abrir exclusivo, indexar e fechar.
v_cez@yahoo.com.br
-
Mário Isa
- Usuário Nível 4

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Re: dbf travado qdo fecha com CTRL+ALT+DEL
O meu modelo funciona mais ou menos assim:
é um modo automático /
Aqui é na hora que vai tentar abrir o arquivo
e a função ace_erro_dbf()
Simples porque é automático
Complicado por causa do código / que é doido.
´
é um modo automático /
Aqui é na hora que vai tentar abrir o arquivo
Código: Selecionar todos
contaneterr := 1
DO WHILE (sempre .OR. m->tempox > 0)
// tentando abrir o arquivo
IF exuse && exclusivo
USE (arq) alias (ape) EXCLUSIVE New
ELSE && compartilhado
USE (arq) alias (ape) Shared New
ENDIF
// se o arquivo não foi aberto e tentou-se mais de 5 vezes / toma-se providencias
if select(ape) = 0 .and. contaneterr <= 5 .and. !exuse
inkey(1)
contaneterr++
loop
end
if select(ape) # 0
return .t.
end
if contaneterr > 5
// start_rep_autom ??
// se tentou mais de 5 vezes dá umas mensagens
Tecle('Um ou mais arquivos nÆo puderam ser aberto(s). Verifique o computador-servidor.')
ferase('erroabre.txt')
// nesta função vai tentar corrigir o erro
ace_erro_dbf(arq)
return .t.
end
INKEY(1) && espera 1 segundo
Código: Selecionar todos
//--------------->
function ace_erro_dbf(o_nome_dbf)
// grava o log de todos os q estão abertos agora
comanda := 'qprocess * /SYSTEM > qproc__e.txt'
execdos(comanda)
// pega o nome do indexado
__indexa := vaiab(o_nome_dbf)
// manda "parar" (fechar) aquele dbf na rede toda
para_file_ter(o_nome_dbf) // a função para_file_ter recebe o nome do arquivo q é prá "parar" (fechar) / e o fecha em todas as estações e elas aguardam ordens para reabrí-lo.
aguarda(5)
// fecha o dbf aqui (nesta estação) também
&o_nome_dbf->(dbclosearea())
// abre ele no modo exclusivo
use &o_nome_dbf exclusive new
// caso não tenha aberto é porque tá com pau mesmo / então reinicia mas só se for o servidor
porque isso ainda é um projeto / tenho q trabalhar mais nele.
if empty(alias())
// Talvez, no futuro, tem q reiniciar computadores
if (type('estacao')=N .and. estacao=val(subs(unitserver,5)) ) .or. (type('estacao')="C" .and. estacao == UNITSERVER)
chutdown()
end
return .f.
end
// caso tenha conseguido abrir então dá o pack e o recall all
pack
recall all
// daí reconstrói todos os indexados.
ct__index := 1
while ct__index <= len(indexado(__indexa))
ferase(indexado(__indexa)[ct__index])
__aachave := achave(__indexa)[ct__index]
indexon(__aachave,'1',indexado(__indexa)[ct__index],'.t.')
// indexon é a minha função que reconstrói aquele .ntx
// indexado() é uma função q retorna o nome do .NTX daquele .dbf / daquela posição
ct_index++
end
dbclearindex()
// fecha o arquivo
&o_nome_dbf->(dbclosearea())
// a função usei já abre o .DBF com todos os .ntx
usei(o_nome_dbf)
//renavarios renomeia vários arquivos para vários
renomeando para .ope é uma ordem para reabrir o arquivo / e todos reabrem.
renavarios('fh*.fil','fh*.ope')
return nil
//-------------------->
Function chutdown()
dbcloseall()
execdos('ren ok*.* de*.*') // derruba todos os outros terminais
clear
cor(8)
@ 08,5 say 'UM PROBLEMA FOI DETECTADO E O REINÖCIO DO COMPUTADOR NECESSµRIO.'
@ 10,5 say 'AGUARDANDO 3 SEGUNDOS PARA REINICIAR O COMPUTADOR....'
ctsecs := 3
whil ctsecs > 0
@ 12,20 say ctsecs pict '99'
aguarda(1)
ctsecs--
end
cor(1)
//memoriza um e-mail para enviar a mim me avisando de q a máq teve q ser reiniciada.
Transemail('Reiniciou maq-'+minha_fanta+'-'+dtoc(date()),{},{},NIL,NIL,"S")
comanda := 'start shutdown -r -f'
run (comanda)
saiimed()
return nil
Complicado por causa do código / que é doido.
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Re: dbf travado qdo fecha com CTRL+ALT+DEL
Olá,
Me parece que eu vi algum lugar que existe uma rotina, ou um flag de compilação, não me lembro, que seta o xHarbour para fazer um despejo de memória quando o programa termina inesperadamente (mesmo que não passe pelo errorsys), mas não sei se funciona quando o processo é terminado na marra via ctrl+alt+del.
Ou seja, falei um monte de coisa e não disse nada né... Mas vou pesquisar e volto aqui pra falar sobre esta funcionalidade, que apesar dea princípio não poder resolver a questão do DBF travado em sí, pode dar boas pistas para no momento do próximo início do sistema, fazer umas verificações, talvez até recuperando dados perdidos antes do commit.
Na questão do DBF propriamente, acho que não tem solução, a única forma que conheço é o loop infinito tentanto abrir em modo exclusivo.
Minha sugestão prática seria a seguinte: você faz um backup geralzão sempre antes dessa rotina, faz tudo que ela tem que fazer direcionando para o backup, e não para os DBFs principais, e então quando reiniciar o sistema, se detectar que esta rotina rodou com sucesso nos arquivos novos, substitue os velhos pelos novos.. Se não rodou até o fim fica com os DBFs originais e tenta de novo. É gambi mas deve funcionar!
Olha, seria bem fácil isso, bastaria copiar os DBFs envolvidos para outro diretório, mudar pelo SET DEFAULT o path de trabalho, e rodar a rotina.
Abraços.
Me parece que eu vi algum lugar que existe uma rotina, ou um flag de compilação, não me lembro, que seta o xHarbour para fazer um despejo de memória quando o programa termina inesperadamente (mesmo que não passe pelo errorsys), mas não sei se funciona quando o processo é terminado na marra via ctrl+alt+del.
Ou seja, falei um monte de coisa e não disse nada né... Mas vou pesquisar e volto aqui pra falar sobre esta funcionalidade, que apesar dea princípio não poder resolver a questão do DBF travado em sí, pode dar boas pistas para no momento do próximo início do sistema, fazer umas verificações, talvez até recuperando dados perdidos antes do commit.
Na questão do DBF propriamente, acho que não tem solução, a única forma que conheço é o loop infinito tentanto abrir em modo exclusivo.
Minha sugestão prática seria a seguinte: você faz um backup geralzão sempre antes dessa rotina, faz tudo que ela tem que fazer direcionando para o backup, e não para os DBFs principais, e então quando reiniciar o sistema, se detectar que esta rotina rodou com sucesso nos arquivos novos, substitue os velhos pelos novos.. Se não rodou até o fim fica com os DBFs originais e tenta de novo. É gambi mas deve funcionar!
Olha, seria bem fácil isso, bastaria copiar os DBFs envolvidos para outro diretório, mudar pelo SET DEFAULT o path de trabalho, e rodar a rotina.
Abraços.
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.
-
Mário Isa
- Usuário Nível 4

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Re: dbf travado qdo fecha com CTRL+ALT+DEL
Está muito legal o papo.
Mas acho q a solução definitiva é abandonar o .DBF e migrar para um banco de dados como firebird, mysql, oracle e outros...
Mas vou pesquisar também sobre o LETODBF.
Depois posto aqui.
Mário
Mas acho q a solução definitiva é abandonar o .DBF e migrar para um banco de dados como firebird, mysql, oracle e outros...
Mas vou pesquisar também sobre o LETODBF.
Depois posto aqui.
Mário
Re: dbf travado qdo fecha com CTRL+ALT+DEL
Ola Mário,
Me ocorreu agora, será que que não tem um jeito de quando iniciar o programa bloquear/Inibir o CTRL+ALT+DEL ??
Uma outra coisa que ajudaria, antes de mudar para Sql que seria o ideal, seria trocar os indices de .Ntx para .Cdx, mais pratico e seguro.
v_cez@yahoo.com.br
Me ocorreu agora, será que que não tem um jeito de quando iniciar o programa bloquear/Inibir o CTRL+ALT+DEL ??
Uma outra coisa que ajudaria, antes de mudar para Sql que seria o ideal, seria trocar os indices de .Ntx para .Cdx, mais pratico e seguro.
v_cez@yahoo.com.br
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Re: dbf travado qdo fecha com CTRL+ALT+DEL
Opa,
Agora se o código está confuso, com o Mediator dá pra fazer isso sem muita alteração. Dá uma pesquisadinha pelo fórum...
Quanto a bloquear o ctrl+alt+del, não adianta fazer isso, porque se o cara sair do modo tela cheia, e o programa perder o foco, tanto o ctrl alt del como o fechar pelo X da janela mesmo, são de responsabilidade do Windows, teria então que ter um outro programa residente na memória, tipo no reloginho, aí daria muito trabalho.
Se você centralizou a abertura, indexação e gravaçao de arquivos em funções suas e não fica usando USE e INDEX ON pelo meio do código, converter para qualquer banco de dados se torna muitíssimo facil, bastando alterar as devidas funções. O ideal pra quem está no DBF seria criar um classe só pra manipular DBFs... Dá uma olhadinha neste tópico que pode servir de exemplo...Mário Isa escreveu:Mas acho q a solução definitiva é abandonar o .DBF e migrar para um banco de dados como firebird, mysql, oracle e outros...
Agora se o código está confuso, com o Mediator dá pra fazer isso sem muita alteração. Dá uma pesquisadinha pelo fórum...
Quanto a bloquear o ctrl+alt+del, não adianta fazer isso, porque se o cara sair do modo tela cheia, e o programa perder o foco, tanto o ctrl alt del como o fechar pelo X da janela mesmo, são de responsabilidade do Windows, teria então que ter um outro programa residente na memória, tipo no reloginho, aí daria muito trabalho.
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.
