DBF x Windows x Problemas?! Pq? Onde? Como?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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...
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Atenciosamente,
Marcos Antonio Gambeta
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem por fladimir »

Sim faço isso, ali foi apenas um exemplo mas mando abrir via função q faz isso.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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).
Atenciosamente,
Marcos Antonio Gambeta
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem por JoséQuintas »

Pelos trechos apresentados, diria que é erro de fonte.

Código: Selecionar todos

DbSetIndex('Produto')
if Produto->( DBSeek( cCodigo ) )
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?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem por fladimir »

No caso NetIO resolveria... e o LetoDB? (Pergunto pq parece mais facil com ele)
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

DBF x Windows x Problemas?! Pq? Onde? Como?

Mensagem 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.
Atenciosamente,
Marcos Antonio Gambeta
Responder