Página 1 de 1

dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 16 Set 2010 10:08
por Mário Isa
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

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 16 Set 2010 19:10
por Cezar
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

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 17 Set 2010 13:39
por Mário Isa
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 /

:%

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 17 Set 2010 18:44
por Cezar
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

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 17 Set 2010 20:44
por Mário Isa
O meu modelo funciona mais ou menos assim:

é 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
e a função ace_erro_dbf()

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

Simples porque é automático
Complicado por causa do código / que é doido.
:)´

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 19 Set 2010 22:54
por Stanis Luksys
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.

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 20 Set 2010 07:56
por Mário Isa
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

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 20 Set 2010 13:46
por Cezar
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

Re: dbf travado qdo fecha com CTRL+ALT+DEL

Enviado: 20 Set 2010 14:05
por Stanis Luksys
Opa,
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...
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...

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.