Página 2 de 2
Re: Perda de Dados no xHarbour
Enviado: 25 Mai 2009 18:28
por wagner aragao
Olá,
Acho que o que está acontecendo, é o seguinte, hoje uso o programa BroPlus 2.51 do Peter Volz para manutenção das bases de dados, so que é DOS, e manipula os arquivos CDX do fox. Na versào clipper uso o SIXCDX e a versão que tenho do Bro, tem esse drive na tela mais não esta disponível, e continuo usando o mesmo programa para Clipper, e xHarbour que volto a usar as mesmas bases com DBFCDX e que não são as mesmas do fox. Gostaria de saber que ferramenta posso usar fácil como o Bro para manter a base de dados nessas plataformas, pois acho que estou tendo problema no cabecalho dos arquivos, ou mesmo nos arquivos de MEMO.
t+
Re: Perda de Dados no xHarbour
Enviado: 25 Mai 2009 18:36
por Itamar M. Lins Jr.
ourXdbu.
http://www.xharbour.com/xhc/index.asp?p ... show_sub=1
Saudações,
Itamar M. Lins Jr.
Re: Perda de Dados no xHarbour
Enviado: 25 Mai 2009 21:56
por wagner aragao
Valeu Itamar,
Já baixei e vou testar....
t+
Re: Perda de Dados no xHarbour
Enviado: 27 Mai 2009 14:36
por wagner aragao
Olá,
Para a leitura e a gravação de dados em arquivos criei funções para automatizar esse processo para não ter que informar os campos que darei o replace ou mesmo criar as variáveis de memória. Será que o problema que estou tendo pode ser pela maneira que faço isso. Uso as mesmas funções em clipper e nunca deram problema, mais o problema n"ao está so na gravação dos dados, mais também na hora de mostrar os dados na tela (say, get) após ler a tabela. As funções que uso são :
Código: Selecionar todos
************************************************
* Funcoes de Usuario p/Operacoes com Variaveis *
************************************************
function CRIA_VAR()
***************************************
* Cria Variaveis baseado no arquivo da área atual, verifico
* quantos campos tem, e faço laço jogando cada campo para a
* memoria com contéudo correspondente vazio com prefixo "V"
* Ex: CLIENTE -> vCLIENTE = space(40)
* DT_NASC -> vDT_NASC = ctod(""")
***************************************
A=fcount()
for X=1 to A
if type(field(X))<>"M"
NOMECAMPO=field(X)
NOMEVAR="v"+NOMECAMPO
publi &NOMEVAR
do case
case type(field(X))="C"
&NOMEVAR=spac(len(&NOMECAMPO))
case type(field(X))="N"
&NOMEVAR=0
case type(field(X))="D"
&NOMEVAR=ctod("")
case type(field(X))="L"
&NOMEVAR=.F.
endcase
endif
next
return(.t.)
function IGUAL_VAR()
***************************
* Iguala Variaveis baseado no arquivo da área atual,
* verifico quantos campos tem, e faço laço jogando cada
* campo para a memoria com contéudo correspondente do campo
* com prefixo "V"
* Ex: CLIENTE -> vCLIENTE = CLIENTE
* DT_NASC -> vDT_NASC = DT_NASC
***************************
A=fcount()
for X=1 to A
if type(field(X))<>"M"
NOMECAMPO=fieldname(X)
NOMEVAR="v"+NOMECAMPO
public &NOMEVAR
&NOMEVAR=&NOMECAMPO
endif
next
return(.t.)
function REPL_VAR()
****************************
* Grava no arquivo as variaveis que estão na memória com o * mesmo nome do campo com o prefixo "V"
****************************
A=fcount()
for X=1 to A
if type(field(X))<>"M"
NOMECAMPO=field(X)
NOMEVAR ="v"+NOMECAMPO
if type("&NOMEVAR")<>"U".and.&NOMEVAR<>&NOMECAMPO
repl &NOMECAMPO with &NOMEVAR
endif
endif
next
return(.t.)
Será que existe alguma incompatibilidade com xHarbour

Valeu T+
Re: Perda de Dados no xHarbour
Enviado: 27 Mai 2009 18:18
por Hasse
Boa noite Wagner.
Vendo este tipo de leitura, que eu também uso, lembrei-me, que tive alguns casos de gravação, por excesso de velocidade do terminal.
Explicado melhor: Estes problemas aconteceram sempre que o cliente substituia um terminal por um último tipo, super-rápido.
Todos os casos eu resolvi inserindo um pequeno "freio" no loop, que é muito rápido, e não sei "quem" perde o fio da meada: se é o buffer, se é o HD, sei lá.... Na verdade uma gambiarra que resolveu o assunto. Se no futuro, com a maior velocidade dos processadores o problema voltará a acontecer só Deus sabe.
A primeira vez que me deparei com este tipo de problema foi num loop FOR/NEXT que inseria 'n' registros em branco em um arquivo DBF. Pedia-se 20 registros e o sistema inseria 12, 15, 18, raramente os 20, sem qualquer mensagem. E agora me lembro também, que isto já acontecia com o Clipper, nos últimos tempos de uso.
No xHarbour usei a função Millisec( n ), onde 'n' insere um wait de 'n' milisegundos. Em alguns casos basta 1 milisegundo, em outros mais. Depende do caso. O atraso é imperceptível para o operador.
No Clipper usei um loop FOR / NEXT, pois o INKEY(0.1) era muito demorado, e ele não aceita valores menores.
Re: Perda de Dados no xHarbour
Enviado: 27 Mai 2009 19:02
por wagner aragao
Olá Hasse,
Então pode realmente acontecer, ainda bem que você me deu essa dica, já tava pensando em mudar de profissão (rsrsrsrs). Acho que tem sentido o que você falou mesmo o tempo de leitura dos dados dependendo do tamanho da base pode não ser feita corretamente. Vou tentar.... Agora descobri mais uma coisa, com esse problema criei no meu utilitário do sistema a opção RECUPERA BASE DE DADOS, o que ela faz, abre o arquivo de dados, copia a estrutura para uma pasta temporária, fecha o arquivo de dados, abre a estrutura vazia e puxa os dados com append from para corrigir possiveis erros de header e MEMO. Como compilei com xHarbour e to usando o DBFCDX nativo, meu amigo, a mesma rotina em clipper varre todos as 198 tabelas do meu sistema, mais no xHarbour na primeira tabela com MEMO (FPT) da erro de leitura e pára. Ou seja AS TABELAS DO CLIPPER NÃO SÃO COMPATÍVEIS COM xHARBOUR, SE TIVER USANDO MEMO. E agora como recupero essas tabelas pois dentro dos memos tenho Help, Novidades da Versão, etc.... Tentei abrir pelo OurXDbu e tabela não abre.... Olha a rotina abaixo....
Código: Selecionar todos
Function RecupDados()
*******************************************************
* Recupera as Bases de dados do sistema automaticamente
*******************************************************
quadro('10','10','14','70',' Local do Programa MLINE ','W+/B+')
vPathMLINE=space(20)
@ 12,12 get vPathMLINE
read
if lastkey()=27
close all
retu
endif
if !netuse('INDICES',.t.)
retu(.f.)
endif
index on ARQDBF tag A to C:\TEMP\RECUPERA uniq
do while !eof()
if !netuse(indices->ARQDBF,.t.)
loop
endif
quadro('08','10','12','70',' Recupera Base de Dados' ,'W+/B+')
@ 10,14 say 'Aguarde... Compactando Base de Dados...'+trim(indices->ARQDBF)
pack
vStruDBF = 'C:\TEMP\'+alltrim(indices->ARQDBF)+'.DBF'
vArqDBF = alltrim(dbf())+'.DBF'
quadro('08','10','12','70',' Recupera Base de Dados' ,'W+/B+')
@ 10,14 say 'Aguarde... Criando Estrutura da Base de Dados...'+trim(indices->ARQDBF)
copy stru to &vStruDBF
TemReg=.f.
if recco()>0
TemReg=.t.
endif
use
*** So roda se tiver registro ***
if TemReg
quadro('08','10','12','70',' Recupera Base de Dados' ,'W+/B+')
@ 10,14 say 'Aguarde... RECUPERANDO Dados...'+trim(indices->ARQDBF)
use (vStruDBF) exclu new
pack
appe from (vArqDBF)
@ 10,14 say 'Aguarde... Indexando Base de Dados...'+trim(indices->ARQDBF)
use
endif
*** Copia arquivos para o diretorio do MLINE ***
vPathDestino=alltrim(vPathMLINE)+'\'+vArqDBF
__copyfile( vStruDBF , vPathDestino)
quadro('08','10','12','70',' Recupera Base de Dados' ,'W+/B+')
@ 10,14 say 'Aguarde... INDEXANDO Tabela....'+vArqDBF
use (vArqDBF) new exclu
reindex
use
sele INDICES
skip
enddo
close data
ApagaCDX()
retu(.t.)
Re: Perda de Dados no xHarbour
Enviado: 28 Mai 2009 15:32
por Hasse
Boa tarde colega Wagner.
Infelizmente não posso te ajudar com os campos MEMO, pois eu sempre fugi deles como o diabo foge da cruz, pois mesmo no tempo do Clipper, havia muita gente (colegas Clippeiros) que colocavam em dúvida a estabilidade deles e outros tantos afirmando que já passaram por poucas e boas com estes MEMO.
Eu procurei sempre usar DBF's para esta finalidade. Todos os meus Help's, mesmo aqueles ditos "de contexto", estão baseados em em arquivo DBF.
Se você pesquisar neste Fórum, certamente você vai achar centenas de mensagens tratando do assunto MEMO.
Parace-me que o Leonardo (não tenho certeza) colocou algumas dicas muito boas neste sentido.
Quanto aos Headers do DBF's, vou te contar a respeito da experiência das muitas cabeçadas.
Eu uso o dBase IV e DBU, este último modifiquei para funcionar com CDX.
Quando necessito efetuar alguma alteração de uma base de dados, uso o DBU, pois sendo ele compilado com o xHarbour, ele é 100% compatível por princípio, meio e fim. Nunca apanhei o DBU corrompendo Header de DBF. O que já me aconteceu foi que, ao inserir um novo campo entre 2 já existentes, e ao confirmar as opções que o DBU apresenta, escolher a incorreta (nome dos campos) e o resultado é uma bagunça total. Para segurança sempre faço uma cópia do arquivo DBF antes de modificá-lo.
Quando tenho alguma corrupção de dados em algum DBF (raro mas acontece), eu uso o dBase, em vista dos recursos de linha de comando que ele possui. Porém, o dBase IV é incompatível com o DBFCDX e muitas vzes ele diz que o arquivo não é um DBF. Então antes, abro o arquivo com o DBU, forço o fechamento do índice CDX acoplado ao fazer uma pequena alteração em qualquer campo para desatrelar o DBF do CDX. Em seguida fecho o DBU e abro o arquivo via dBase IV, e conserto as corrupções no braço. O dBase IV tem um grande inconveniente: É muito lento. Em compensação, é muito seguro.
Re: Perda de Dados no xHarbour
Enviado: 29 Mai 2009 08:19
por tonyx
desculpe a intromissao entre os sabios do clipper / xharbour ...perguntas de testes ??
1-- se autor da pergunta ja fez peguena rotininha teste em (clipper e xharbour) so incluir e alterar excluir o arquivo DBF ..

2-- sabendo-se ter que excluir os todos os CDX antes de entrar na rotina.. ??
e na propria rotina criar estes CDX..
3-- se falhar no xharbou providenciar versao em 1,1,0 funcione
( os meus miqrei do ntx para cdx tranquilo)
ainda nem usei partes do miniqui ainda
grato preferencia
:^|
Re: Perda de Dados no xHarbour
Enviado: 29 Mai 2009 11:33
por wagner aragao
Olá TonyX,
Desculpe mais não entendi o que você quiz dizer, mais vou tentar
1-- se autor da pergunta ja fez peguena rotininha teste em (clipper e xharbour) so incluir e alterar excluir o arquivo DBF ..
O problema aqui não esta na fato de recriar os arquivos e sim descobrir se existem incompatibilidades entre CLipper X xHarbour, até que eu chegue a conclusão que não tem jeito, pois pelo menos eu procuro sempre trabalhar o menos possível, senão jogaria tudo que já desenvolvi fora e tentariamos ir para Delphi/Java,etc.... Outro preciso pensar nos dados que tem armazenado em clientes também, preciso importar eles e saber se não vão dar pau.
2-- sabendo-se ter que excluir os todos os CDX antes de entrar na rotina.. ??
e na propria rotina criar estes CDX..
Sim, nessa rotina já faço apago os CDX e crio novamente
3-- se falhar no xharbou providenciar versao em 1,1,0 funcione
( os meus miqrei do ntx para cdx tranquilo)
ainda nem usei partes do miniqui ainda
To usando a 1.0.0, e já uso o CDX a muito tempo na realidade uso o SIXCDX, pois no DBFCDX do clipper dava problema quanto gravava datas com descend().
Acho que descobri o motivo desse problema todo, vou fazer últimos testes e informo a todos.
De qualquer forma, nossa interação é muito importante pois conseguimos manter vivo nossa ferramenta maravilhosa que é o clipper (xHarbour é so um nome né ?).
Valeu T+
Re: Perda de Dados no xHarbour
Enviado: 01 Jun 2009 12:03
por wagner aragao
Olá,
Bom pessoal depois de alguns dias sem dormir direito, acho que finalmente consegui resolver o problema da perda de dados.
Vamos, lá tinha problema na leitura e gravaçào dos dados, quando jogava na tela os dados (gets) vinham em branco e quando gravava, os dados que já estavam no arquivo em alguns campos sumiam. Revisei toda a rotina de a rotina, inclusive coloquei um tempo de espera como o amigo Hasse deu a dica, pois poderia ser que a rotina que lia e/ou gravava os dados poderia estar fazendo rápido demais. Mais após monitorar o processo descobri na realidade que as variáveis que estava usando simplesmente não armazenavam os valores, o motivo não sei so que aumentei o nome delas e o problema foi resolvido, vou anexar o codigo atual para quem quiser comparar com o anterior já anexado anteriormente :
Código: Selecionar todos
************************************************
* Funcoes de Usuario p/Operacoes com Variaveis *
************************************************
function CRIA_VAR(ComCalma)
***************************************
* Cria Variaveis com tamanho dos campos
***************************************
if pcount()=0
ComCalma=.t.
endif
ABCDEFG=fcount()
for XYZ=1 to ABCDEFG // aqui a variavel era somente X e o contador A
if type(field(XYZ))<>"M"
NOMECAMPO=field(XYZ)
NOMEVAR="v"+NOMECAMPO
publi &NOMEVAR
do case
case type(field(XYZ))="C"
&NOMEVAR=spac(len(&NOMECAMPO))
case type(field(XYZ))="N"
&NOMEVAR=0
case type(field(XYZ))="D"
&NOMEVAR=ctod("")
case type(field(XYZ))="L"
&NOMEVAR=.F.
endcase
endif
* if ComCalma
* millisec(1)
* endif
next
if XYZ<ABCDEFG
MsgAlert('Atencao !!!, Nao foi possivel criar as variaveis para inclusao '+;
'dos dados. Vou tentar novamente a operacao...')
Cria_Var()
endif
return(.t.)
function IGUAL_VAR(ComCalma)
***************************
* Iguala VARIAVEIS a CAMPOS
***************************
if pcount()=0
ComCalma=.t.
endif
ABCDEFG=fcount()
for XYZ=1 to ABCDEFG // aqui a variavel era somente X e o contador A
if type(field(XYZ))<>"M"
NOMECAMPO=fieldname(XYZ)
NOMEVAR="v"+NOMECAMPO
public &NOMEVAR
&NOMEVAR=&NOMECAMPO
endif
*if ComCalma
* millisec(1)
*endif
next
if XYZ<ABCDEFG
MsgAlert('Atencao !!!, Nao foi recuperar os dados armazenados no registro '+strzero(recno(),7)+;
' do arquivo '+dbf()+'.Vou refazer novamente a operacao de leitura dos dados...')
Igual_Var()
endif
return(.t.)
function REPL_VAR(ComCalma)
****************************
* Repassa Variaveis p/Campos
****************************
if pcount()=0
ComCalma=.t.
endif
ABCDEFG=fcount()
for XYZ=1 to ABCDEFG
if type(field(XYZ))<>"M"
NOMECAMPO=field(XYZ)
NOMEVAR ="v"+NOMECAMPO
if type("&NOMEVAR")<>"U".and.&NOMEVAR<>&NOMECAMPO
repl &NOMECAMPO with &NOMEVAR
endif
endif
*if ComCalma
* millisec(1)
*endif
next
if XYZ<ABCDEFG
MsgAlert('Atencao !!!, Nao foi possivel gravar os dados da memoria no registro '+strzero(recno(),7)+;
' do arquivo '+dbf()+'.Vou tentar novamente a operacao...')
Repl_Var()
endif
return(.t.)
Obrigado a todos que mandaram dicas ....
Valeu...
Re: Perda de Dados no xHarbour
Enviado: 01 Jun 2009 13:19
por Hasse
Boa tarde Wagner.
Fico satisfeito que você encontrou o erro. Exatamente como eu havia previsto. A danada Lei de Murphy sempre se faz presente nas horas mais impróprias.
Me esqueci de mencionar que você poderia substituir o comando Replace pela função de gravação FieldPut(), que retorna o valor gravado em caso de sucesso, como:
Código: Selecionar todos
FieldPut( <nFieldPos>, <xValue> ) --> xAssigneValue
ou
FieldPut(FieldPos( <cFieldName> ), <xValue> ) --> xAssigneValue
Desta forma pode-se checar se o valor foi ou não gravado com sucesso.
Tipo:
Código: Selecionar todos
WHILE xValue <> xGravado ; xGravado := FieldPut(FieldPos( <cFieldName> ), <xValue> ) ; ENDDO