Página 1 de 3
Letodbf - problema ao usar console e hmg simultâneos
Enviado: 05 Set 2019 23:25
por Nascimento
Itamar M. Lins Jr. escreveu : Mas quem já usa LetoDbf não se preocupa com isso
passo uma coisa intrigante com o letodbf
tenho um sistema semi-console usando a gtwvt
estou portando para harbour/minigui
me deparei com o seguinte problema usando o letodbf
se eu usar todos os modulos do semi console com o letodbf funcionam tranquilamente
mais se eu abrir o modulo portado grafico "hmg" não consigo abrir, se eu abrir varias instancias do portado hmg abre normalmente
deixa ver se eu explico melhor....
se eu abrir primeiro o modulo recepção semi-console e em outro pc abrir o modulo recepção que portei pra hmg , da erro de travamento requerido ou seja é como se um banco não estivesse liberado...
mas se eu abrir varias instancias do modulo recepção com hmg em varios computadores abre tranquilamente
se eu abrir todos os modulos do semi-console , tambem abrem normalmente, o interessante é que a criação dos dbf´s e cdx´s em ambos são do mesmo jeito
ou seja consigo abrir os modulos do mesmo tipo , ou tudo grafico, ou tudo console, se eu abrir um de um e outro de outro trava , nos debug´s percebi que é como se o banco tivesse aberto exclusivo e não compartilhado
Obs: meu sistema é modular, modulos : cozinha, portaria , recepção
Tabela DBF apaga os registros
Enviado: 06 Set 2019 00:58
por JoséQuintas
Se mistura gtwvt e migui... provavelmente pode estar usando multithread.
A conexão é visível em multithread?
O aplicativo é multithread?
Tabela DBF apaga os registros
Enviado: 06 Set 2019 10:53
por Nascimento
JoséQuintas escreveu :
Se mistura gtwvt e migui...
não amigo quintas, são aplicativos destintos, um compilado so com a gtwvt e outro com a minigui
segue abaixo a imagem

- este é o modo console , usando letodbf

- este é o portado para minigui tambem usando letodbf
se eu abrir o modo console, e esse modo grafico, um dos 2 travam e não abrem, mesmo usando a mesma maneira de criação de dbf/cdx com o letodbf
mais se eu abrir todos os modulos consoles, ou todos os modulos graficos abrem normalmente
Tabela DBF apaga os registros
Enviado: 06 Set 2019 11:45
por JoséQuintas
Problemas malucos, soluções malucas.... compile os dois juntos pra ver o que dá.
Módulo principal:
Código: Selecionar todos
PARAMETERS cConsole
IF PCount() != 0
MainConsole()
QUIT
ENDIF
MainMiniGUI()
Tabela DBF apaga os registros
Enviado: 06 Set 2019 15:18
por Nascimento
JoséQuintas escreveu:
Problemas malucos, soluções malucas.... compile os dois juntos pra ver o que dá.
acho que ou o amigo não entendeu ,ou eu não entendi o que o amigo sugeriu
eu crio abro as tabelas e crio os indices de maneira igual tanto na compilação 100% console "gtwvt", como na versão grafica "hmg"
so da pau se eu abrir um grafico e um console, se eu abrir varias instancias do console não a problema, como tambem se eu abrir varias instancias do grafico
tambem não da pau
ja li , re li a função que abro a dbf e os indices e não vejo erros
abaixo esta um pequeno exemplo de como abro os indices no modo grafico e no modo console
Código: Selecionar todos
// Modo grafico com a minigui
#include 'minigui.ch'
#include "rddleto.ch"
Function Net_use()
parameters cFiledbf,cAlias,cFilecdx,lexcl,lretry
private lforever
private aFilecdx
private bFilecdx
private bFiledbf
private nomearq
lretry := iif(type("lretry") != "N",500,lretry)
lexcl := iif(type("lexcl") != "L",.F.,lexcl)
lforever := lretry == 0
bFiledbf:= cFiledbf+'.DBF'
cFiledbf := PathLeto+cFiledbf+'.DBF'
aFilecdx:= cFilecdx+".CDX"
bFilecdx:= cFilecdx //"MCOCUP"
cFilecdx := PathLeto+cFilecdx+'.CDX' //"MCOCUP.CDX"
cDriver := "LETO"
if !vFile(bFiledbf)
msginfo("VERIFIQUE SE O SERVIDOR ESTA LIGADO OU A CONEXAO ESTA ATIVA "+bFiledbf)
quit
endif
protect (bFiledbf,"D")
do while (lretry > 0 .or. lforever)
if (lexcl)
DbUseArea( .T., cDriver, cFiledbf, cAlias, .F. )
else
DbUseArea( .T., cDriver, cFiledbf, cAlias, .T. )
* msgdebug(cfiledbf)
endif
if (Used())
exit
endif
lretry =- 1
enddo
if (Used())
*-------------------------------------------
if (bFilecdx = "MCOCUP")
if (!vFile(aFilecdx))
nomearq := bFilecdx
index on sui tag sui to (cFilecdx)
endif
DbSetIndex( cFileCdx )
endif
endif
Código: Selecionar todos
// modo console
#include "rddleto.ch"
Function Net_use
parameters cFiledbf,cAlias,cFilecdx,lexcl,lretry
private lforever
private aFilecdx
private bFilecdx
private bFiledbf
private nomearq
lretry:= iif(Type("lretry") != "N", 500, lretry)
lexcl:= iif(Type("lexcl") != "L", .F., lexcl)
lforever:= lretry == 0
bFiledbf:= cFiledbf+'.DBF'
cFiledbf := PathLeto+cFiledbf+'.DBF'
aFilecdx:= cFilecdx+".CDX"
bFilecdx:= cFilecdx //"MCOCUP"
cFilecdx := PathLeto+cFilecdx+'.CDX' //"MCOCUP.CDX"
cDriver := "LETO"
if !vFile(bFiledbf)
alert("VERIFIQUE SE O SERVIDOR ESTA LIGADO OU A CONEXAO ESTA ATIVA "+bFiledbf)
quit
endif
protect(bFiledbf, "D")
do while (lretry > 0 .or. lforever)
if (lexcl)
DbUseArea( .T., cDriver, cFiledbf, cAlias, .F. )
else
DbUseArea( .T., cDriver, cFiledbf, cAlias, .T. )
endif
if (used())
exit
endif
corantig:= SetColor()
cor("menu")
if (mens(24, 11, "Arquivo nao liberado... AGUARDE ", 1) == 27)
set color to "&corantig"
exit
endif
set color to "&corantig"
lretry:= lretry - 1
enddo
if (used())
o_cor:= SetColor()
set color to (contecor[4])
**
if (bFileCdx = "MCOCUP")
if (totarq != 0)
@ 13, 40 say Space(27)
@ 13, 40 say "Ocupacoes"
endif
if (!vFile(aFilecdx))
if (totarq != 0)
@ 13, 40 say Space(27)
@ 13, 40 say "Indexando Ocupacoes"
endif
nomearq:= bFileCdx
oldcor:= SetColor()
oldtela:= SaveScreen(19, 14, 20, 70)
set color to (contecor[4])
index on sui tag sui to (cFileCdx)
set color to (oldcor)
RestScreen(19, 14, 20, 70, oldtela)
if (totarq != 0)
recat:= recat + 100 / totarq
termoh2(recat)
endif
else
if (totarq != 0)
recat:= recat + 100 / totarq
termoh2(recat)
endif
endif
DbSetIndex( cFileCdx )
endif
endif
Tabela DBF apaga os registros
Enviado: 06 Set 2019 15:42
por JoséQuintas
Você é que não entendeu.
Se um EXE funciona e outro não, talvez tudo no mesmo EXE funcione, talvez aí console e GUI usem a mesma referência pro lettodb.
Quando se refere a console... é realmente console?
Faça um teste com GTWVG, talvez o modo Windows faça alguma diferença.
É só acrescentar gtwvg.hbc e nada mais, sem mexer em nada os fontes, é um teste relativamente rápido.
Tabela DBF apaga os registros
Enviado: 07 Set 2019 21:40
por Itamar M. Lins Jr.
Ola!
Assim fica difícil de ajudar.
Tem que ser um exemplo com o mesmo fonte.
Com certeza é um problema ai seu. Eu uso desde sempre com WVT e Hwgui. WVG + Hwgui... etc.. Não tem problema nenhum, roda o gerenciador para ver o estado dos dbf's. Gerenciador do LetoDbf.
Pode abrir o mesmo DBF com qualquer coisa. ADO, RDDCDX, LETO, NETIO...
Isso não e problema nem do LETO a bem da verdade. Alguma coisa ai trava o registro. Eu abro pelo Letodbf, com ele aberto acesso até pelo DBU, lógico que em modo compartilhado.
Com modo SHARED, tem que deixar abrir com qualquer RDD simultaneamente, FOXPRO, etc...
Saudações,
Itamar M. Lins Jr.
Tabela DBF apaga os registros
Enviado: 07 Set 2019 22:51
por Nascimento
Itamar M. Lins Jr. escreveu :
Ola!
Assim fica difícil de ajudar.
Tem que ser um exemplo com o mesmo fonte.
nobre se vc observar , o net_use() é o mesmo a maneira de abrir é da mesma forma
sei que deve ser algum pequeno erro meu, mais não consegui compreender ainda o erro
olha acima eu botei um exemplo do net_use() que uso no modo gráfico e no modo console, observe que são indenticas,
com pequenas diferenças no modo console porque tem uma barra de progresso, mais o miolo é o mesmo digamos assim
e se ficou alguma duvida no que postei, posso tentar explicar melhor, eu não entendi o caso de um exemplo do proprio fonte
como falei acima botei o exemplo de como abro os dbf´s e indices no modo console e no modo gráfico..
att: Nascimento
Tabela DBF apaga os registros
Enviado: 07 Set 2019 22:58
por JoséQuintas
Parei de olhar os fontes quando vi PRIVATE.... coisa de 40 anos atrás, e grande fonte de problemas.
Tabela DBF apaga os registros
Enviado: 07 Set 2019 23:09
por JoséQuintas
Pergunta meio idiota....
O que faz o Protect( dbf ) ? impede o uso por outro aplicativo?
Tabela DBF apaga os registros
Enviado: 08 Set 2019 01:51
por Nascimento
sim , bloqueia alguns dbf´s para uso de outro soft, mais ja observei o motivo do erro não é esse, ja retirei
em fim amanhã tenho uma viagem, volto na quarta e vou refazer passo a passo e ver no que vai dar
uso privates sem problemas até hj
Tabela DBF apaga os registros
Enviado: 08 Set 2019 01:53
por Nascimento
JoséQuintas escreveu:
Pergunta meio idiota....
O que faz o Protect( dbf )
sim bloqueia alguns dbf´s para o uso em outros programas
mais a causa do erro não é ele ja fiz esse teste, enfim tenho que viajar amanhã
volto possivelmente na quarta, ai vou iniciar pequenos testes e ver no que dá
Tabela DBF apaga os registros
Enviado: 08 Set 2019 04:32
por JoséQuintas
No editor de texto deu pra ver melhor.
Melhor refazer essa função, está muito ruim.
Não analisa direito se abriu DBF, e muito menos se abriu CDX.
E mistura teste de abrir arquivo com outras coisas.
Tabela DBF apaga os registros
Enviado: 08 Set 2019 07:31
por Nascimento
na função eu vejo se o arquivo existe
com o vfile()
bom o que eu estava tentando falar era isso aqui vejam as imagens

- observe que aqui ta aberto 2 modulos em modo console , o auxiliar e o modulo caixa

- agora observe que eu abri o modulo grafico com a hmg e abaixo estou tentando abrir o modulo auxiliar modo console
JoséQuintas escreveu :
No editor de texto deu pra ver melhor.
Melhor refazer essa função, está muito ruim.
Não analisa direito se abriu DBF, e muito menos se abriu CDX.
E mistura teste de abrir arquivo com outras coisas.
uso o file() para checar se existe tanto o dbf quanto o cdx ela é meia confusa mesmo,
mais lendo direitinho da pra entender
agora na função used() eu li tempos atrás que estava obsoleta, qual melhor opção para
por no lugar dela?
talvez seja esse o problema
Syntax
Used() → lDbfOpen
Arguments
(This function has no arguments)
Returns
lDbfOpen True is a database is Used;otherwise False
Description
This function returns a logical true (.T.) if a database file is in USE in the current or designated work area.
If no alias is specified along with this function , it will default to the currently selected work area.
Examples:
USE test NEW
USE names NEW
? Used() // --> .T.
? test->( Used() ) // --> .T.
dbCloseArea()
? Used() // --> .F.
SELECT test
? Used()
https://harbour.github.io/doc/harbour.html#used
Tabela DBF apaga os registros
Enviado: 08 Set 2019 09:52
por Ranier
Olá, posso fazer duas sugestões.
A primeira, use NetErr() ao invés de Used() para verificar se ocorreu erro na abertura,
além do que dbUseArea já retorna .T. se ok, e .F. se falhou, bastaria então:
lret = DbUsearea()
Mas, sempre usei NetErr com sucesso.
A segunda, sempre crie um tópico novo para questionar a respeito de outro assunto, mesmo que relacionado,
e sempre coloque [RESOLVIDO] para ajudar outros que estão passando pelo mesmo problema.