Página 1 de 2
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 02:21
por fladimir
Venho tendo problemas eventuais q acabam se tornando constantes devido a carteira, ou seja, suponhamos q em 20 clientes ocorra hj com 1 amanhã com outro etc., não frequentemente em um mesmo cliente, mas todo dia recebo um relatório de erro vindo de algum cliente.
Erros do tipo qdo mandamos um comando do tipo:
Código: Selecionar todos
Use Produto Alias Produto Shared New
DbSetIndex('Produto')
if Produto->( DBSeek( cCodigo ) ) // falar q a área não esta aberta sendo q a linha pra abrir esta acima...
//Vejam q não tem logica pq não ocorre constante, eventualmente em uma linha tipo essa vem um relatorio de erro
// Faz tal coisa
endif
E não é somente isso, vem erros do tipo:
Código: Selecionar todos
DBFCDX/1201.... Area não indexada (Sendo q esta) Cheguei a fazer um MyDBSeek pra contornar isso onde:
#translate DBSEEK( <xpar> ) => MyDbSeek( <xpar> )
********************************************************************************
func MyDbSeek(xPar)
if OrdNumber() == 0
DbSetIndex(Alias())
endif
SEEK xPar
return Found()
Código: Selecionar todos
BASE/1003 Variavel Indefinida Para comandos tipo Venda->Item
Ou seja, todos relacionados a Tabelas DBF
Já esta rodando a tempos com o
WIN_OSNETREGOK(.T.,.T.)
Ao longo do tempo fiz rotinas do tipo abaixo pra ver se melhora pq esses problemas são antigos
Código: Selecionar todos
procedure MY_DBDELETE() // ROTINA PARA NA HORA DO DELETE SETAR O INDICE ZERO E MELHORAR A ESTABILIDADE DOS DBFCDX
LOCAL nIdx := OrdNumber()
while ! dbRLock() // antes era somente dbRLock() ai devido a dica de um colega do forum seria interessante dar uma pausa
inkey(0.5)
end
dbSetOrder(0)
dbDelete()
dbCommit()
dbSetOrder(nIdx)
dbSkip( 0 ) // topic 16174
dbUnLock()
return
Meu pessoal fica argumentando q são os DBFs em Rede q não funcionam direito etc... mas poxa trabalhamos 100% TS, não é trafegado tabela pela rede.
Sei q vários colegas aki tb não tem esse tipo de problemas, mas realmente não sei mais onde procurar...
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 07:39
por marcosgambeta
fladimir escreveu:Código: Selecionar todos
Use Produto Alias Produto Shared New
DbSetIndex('Produto')
if Produto->( DBSeek( cCodigo ) ) // falar q a área não esta aberta sendo q a linha pra abrir esta acima...
//Vejam q não tem logica pq não ocorre constante, eventualmente em uma linha tipo essa vem um relatorio de erro
// Faz tal coisa
endif
Você testa se o comando USE ... abriu mesmo o arquivo, como no exemplo abaixo ?
Código: Selecionar todos
Use Produto Alias Produto Shared New
If !neterr()
DbSetIndex('Produto')
if Produto->( DBSeek( cCodigo ) )
...
endif
Else
// erro na abertura do arquivo
EndIf
Num ambiente multiusuário, este tipo de tratamento é vital. No exato momento em que se tenta abrir o arquivo, ele pode estar travado por outro processo e não ser aberto.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 08:12
por fladimir
Sim faço isso, ali foi apenas um exemplo mas mando abrir via função q faz isso.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 08:24
por marcosgambeta
fladimir escreveu:Sim faço isso, ali foi apenas um exemplo mas mando abrir via função q faz isso.
Ok.
Na sua assinatura, notei que usa duas versões do Harbour:
Harbour 2.1.0beta2 (Rev. 15281) | Console | MSVC | DBF | CDX
Harbour 3.2 | MinGW| Xailer 3.0.1 | MySQL Nativo | Outros via ADO
O problema ocorre com as duas versões ou com apenas uma delas ? Acredito que seja com a 2.1.0beta2, mas achei melhor perguntar para ter certeza (na 3.2 você não faz referência à arquivos DBF e índices CDX).
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 11:06
por JoséQuintas
Pelos trechos apresentados, diria que é erro de fonte.
Não que seja esse o problema, mas eu usaria assim:
Código: Selecionar todos
IF .NOT. Encontra( cCodigo, "produto", "produto" )
...
ENDIF
FUNCTION Encontra( cChave, cAlias, cIndex )
LOCAL nSelect, cOrdSetFocus, nSelect, nRecNo
nSelect := Select()
IF Select( cAlias ) == 0
SELECT 0
USE (sei lá qual arquivo)
SET INDEX TO ( sei lá quais índices )
WriteErrorLog( "Faltou abrir arquivo " + cAlias, 2 )
ENDIF
SELECT ( Select( cAlias ) )
cOrdSetFocus := OrdSetFocus()
OrdSetFocus( cIndex )
SEEK cChave
nRecNo := RecNo()
lEof := Eof()
OrdSetFocus( cOrdSetFocus )
GOTO ( nRecNo )
SELECT ( nSelect )
RETURN .NOT. lEof
Tem que ajustar para sua RDD.
Já corrige a falta do arquivo aberto, e mesmo assim te avisa do erro pra corrigir o fonte.
E sua rotina de abrir arquivos, o que acontece se o arquivo já estiver aberto? Dá erro, ou fica posicionado em área errada?
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 11:09
por JoséQuintas
Esqueci:
Em redes com domínio, é normal fechar a estação que fica parada.
Nem sempre dá tempo de reconectar antes da mensagem de erro.
Ou terminais que se desligam pra economizar energia.
Nesses casos os DBFs estão fechados, e o Harbour não vai esperar toda reconexão.
Vai dar erro mesmo.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 15:57
por Itamar M. Lins Jr.
Ola!
Se usa mapeamento, isso vai acontecer, mesmo fazendo tudo que foi postado aqui.
Use o NetIO do Harbour para resolver. Caso faça uso de mapeamentos.
Saudações,
Itamar M. Lins Jr.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 16:04
por fladimir
No caso NetIO resolveria... e o LetoDB? (Pergunto pq parece mais facil com ele)
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 16:11
por Itamar M. Lins Jr.
Ola!
Os dois resolverá. O NetIO para LAN(rede local) o LetodbF(fork) para redes maiores(WAN).
Mapeamento=problemas. Vem queimando o filme do DBF desde quando foi inventado isso.
Eu uso o LetoDBf.
Saudações,
Itamar M. Lins Jr.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 16:14
por Itamar M. Lins Jr.
Ola!
Outro detalhe que pode passar desapercebido é usar IP atribuído por DHCP. Use IP FIXO na rede!
Saudações,
Itamar M. Lins Jr.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 18:07
por fladimir
Quintas:
Esqueci:
Em redes com domínio, é normal fechar a estação que fica parada.
Nem sempre dá tempo de reconectar antes da mensagem de erro.
Ou terminais que se desligam pra economizar energia.
Nesses casos os DBFs estão fechados, e o Harbour não vai esperar toda reconexão.
Vai dar erro mesmo.
Matou a charada... é isso q eu falo, tinha algo q não entendia o q era, pq mesmo na tua rotina, se ocorrer o q mencionou acima vai dar problema correto?
Pq pra vcs entenderem melhor, vamos pegar a rotina do Quintas
Código: Selecionar todos
IF .NOT. Encontra( cCodigo, "produto", "produto" )
...
ENDIF
FUNCTION Encontra( cChave, cAlias, cIndex )
LOCAL nSelect, cOrdSetFocus, nSelect, nRecNo
nSelect := Select()
IF Select( cAlias ) == 0
SELECT 0
USE (sei lá qual arquivo)
SET INDEX TO ( sei lá quais índices )
WriteErrorLog( "Faltou abrir arquivo " + cAlias, 2 )
ENDIF
SELECT ( Select( cAlias ) )
cOrdSetFocus := OrdSetFocus()
OrdSetFocus( cIndex )
SEEK cChave //-------> Eventualmente ia dar erro aki, mesmo tudo pra cima estando certo, como se algo tivesse fechado a tabela/indice
nRecNo := RecNo()
lEof := Eof()
OrdSetFocus( cOrdSetFocus )
GOTO ( nRecNo )
SELECT ( nSelect )
RETURN .NOT. lEof
Vejam a parte q destaquei pra entenderem meu drama...
É algo q não tem lógica via programação, tipo é certeza q os comandos estão lá pra abrir corretamente etc, mas é como se algo fechasse... por isso q é eventual, mas ocorre geral no meu cenario.
Não vai ter jeito vou ter q migrar o q esta em DBF e não iria migrar pra Banco por enquanto (projetos antigos) pra LetoDB
Agora meu receio seria migrar tudo, será q tem como migrar as rotinas q abrem o arquivo tipo
AbreArquivo(....)
Fazer um esquema dentro da rotina tipo
Código: Selecionar todos
if file('testeleto')
... trabalha via LetoDB...
ELSE
... forma atual
endif.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 18:15
por fladimir
Em resposta ao Marcos...
Minha assinatura esta desatualizada, o correto é
Harbour 3.4.0dev (4541270) (2016-06-28 07:05) | Console | MINGW | DBF | CDX | FastReport | MySQL
Harbour 3.2 | MinGW | Xailer 4.0.2 | MariaDB Nativo | Outros via ADO
Na parte visual utilizo banco de dados e não tenho problemas, mas são projetos menores.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 21:26
por JoséQuintas
Mesmo que troque o banco de dados, ainda vai ter o problema de fechar terminal por limite de tempo.
Feche o aplicativo após 15 minutos fora de uso, ou altere no servidor para um tempo maior.
Ou.....
Não seria o melhor, mas poderia servir multithread.
Aproveitando GTWVG 1001 utilidades....
Código: Selecionar todos
hb_ThreadStart( { || OcupaServidor() } )
FUNCTION OcupaServidor()
LOCAL aFiles
hb_gtReload( "WVG" )
DO WHILE .T.
aFiles := Directory("*.*")
Inkey(60)
ENDDO
RETURN NIL
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 24 Fev 2017 22:49
por fladimir
Coloquei sua dica Quintas, só fiz algumas mudanças aki pro meu cenário. Seguem
Código: Selecionar todos
Static pThread_01
Func Main()
...
pThread_01 := hb_ThreadStart( { || OcupaServidor() } )
..
hb_threadQuitRequest( pThread_01 ) // coloquei assim pq ao sair ficava executando ainda a Thread e não fechava ai mandei forçar o fechamento dela aki
hb_threadWaitForAll()
return
***************************************
FUNCTION OcupaServidor()
LOCAL aFiles
// hb_gtReload( "WVG" ) // Tirei pq imagino ser algo relativo a lib gráfica, e no meu caso seria apenas console puro
DO WHILE .T.
aFiles := Directory("*.*")
tone(300, 4) ; tone(300, 7) // apenas em testes pra ouvir o comportamento da Thread
hb_idleSleep(60) // se comportou melhor q o Inkey (aparentemente)
ENDDO
RETURN NIL
Só a nível de testes, pra saber como esta executando em background , coloquei pra emitir um
aviso sonoro ai da pra ter uma ideia boa dela rodando, logicamente em produção não terá... kkkk
Vlw pessoal.
DBF x Windows x Problemas?! Pq? Onde? Como?
Enviado: 25 Fev 2017 09:17
por marcosgambeta
fladimir escreveu:Em resposta ao Marcos...
Minha assinatura esta desatualizada, o correto é
Harbour 3.4.0dev (4541270) (2016-06-28 07:05) | Console | MINGW | DBF | CDX | FastReport | MySQL
Harbour 3.2 | MinGW | Xailer 4.0.2 | MariaDB Nativo | Outros via ADO
Na parte visual utilizo banco de dados e não tenho problemas, mas são projetos menores.
Ok.
Quando vi esta versão antiga e beta do Harbour na assinatura, pensei na possibilidade de um bug no próprio Harbour. Mas como está usando versões mais recentes, então fica descartada esta hipótese.