Verificar Índice

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Verificar Índice

Mensagem por PITERGALDIANO »

Boa tarde pessoal!

Tenho um PDV que fica atualizando o limite de clientes no servidor a cada finalização de venda, o problema é que as vezes o arquivo de clientes corrompe o índice! Aí é um Deus nos acuda porque são vários PDV´s tendando acessar o arquivo de clientes com o índice danificado, causando transtornos no atendimento.

Gostaria de uma função que verificasse se o índice do DBF está integro! para somente abrir o arquivo de clientes se estiver correto.

Alguém conhece uma função dessa?

Obrigado.
Piter Galdiano
Programador Clipper
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho:

Duas dicas:

Abra o arquivo e va trabalhando com ele durante o uso do PDV

ou

Abra, atualize e feche este arquivo, ja que ele não é de produção.

Outra,

Verifique a possibilidade de um anti-virus como o deAVAST estar sendo usado e corrompendo estes arquivos durante suas verificações.

Tenho este problema em clientes que usam ele, e a prova do crime é encontrar no meio do joio frases referentes a verificação do tal anti-virus.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Não sabia que o AVG fazia isso. Mas corromper índices é uma coisa que não era para ser usual. Algum módulo deve estar abrindo o arquivo DBF para gravação sem abrir os arquivos de índices todos relacionados a esse DBF. Se for muito frequente isso, talvez seria questão de criar e abrir os índices no local, não é um método "normal", mas como se trata de arquivos de clientes, não de produção como disse o Rochinha, acho que até seria válido. Mas também teria que fazer uma rotina de atualização de índices também. Na verdade, essa idéia seria muito radical. Bom seria encontrar a raiz do problema. Quem sabe abrir esse arquivo de clientes em modo READONLY para consultas.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Verifique suas rotinas de abertura e atualização de arquivos.
A corrupção ocorre depois de atualizar um cliente?
Vc esta usando dbcommit() e dbunlock() no final da atualização?
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Mensagem por Netavin »

... Avast ou AVG ???

Netavin.
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Verificar Índice

Mensagem por sygecom »

PITERGALDIANO escreveu:Boa tarde pessoal!
Gostaria de uma função que verificasse se o índice do DBF está integro! para somente abrir o arquivo de clientes se estiver correto.
Pitergaldiano,
Você pode usar um "begin sequence" para abrir os DBF e INDICE, de uma procurada no forum que tem um monte de post que mostra como usar.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Netavin escreveu:... Avast ou AVG ???
Perdão, agora que eu me toquei... tinha pensado que era a mesma coisa. O que o Rochinha estava falando é sobre o AVAST não AVG.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Verificar Índice

Mensagem por Pablo César »

Agora que o colega falou de "begin sequence", lembrei que eu trato os erros, através do ERRORSYS.PRG e quando dá alguma mensagem de "corruption detected" faço que o próximo passo entre na rotina de indexação.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos

Chamei de deAVAST pois o mesmo realmente corrompeu vários DBFs e a informação do mesmo e de tudo que ele verificou ficou gravada dentro do arquivo.

Em relação a corrupções é dificil correr deles pois em muito se deve ao fato do servidor ser usado para outras coisas alem do provimento de dados e seu cache fica sendo usado em outras aplicações e quando o descarregamento dele é feito muito lixo temporário pode ir graudado aos dados ou indices.

A melhor solução é a busca de uso de um gerenciador de dados potente ou usar uma maquina que apenas provenha dados, acho até que um pequeno P3 ligado a rede possa suprir este problema sem deixar lento o desempenho do restante da rede.

O que geralmente fazemos é instalar nossos aplicativos em qualquer maquina de uma rede, que geralmente é usada por usuário com outros programas, inclusive alguns pesados que puxam tudo da CPU deixando pouco para o aplicativo xBase.

Outro fator é a inocencia, alguns programas que achamos ocupar pouco da maquina na realidade se mostram pequenos comedores de espaço, como é o caso do Google Desktop, que apresenta uma barra de utilidade identica a do Kurumin e Vista. Esta mesmo barracom somente o relogio e um leitor de noticias conseguiu usar 5Gb de meu HD, 5Gb em um programinha de nada e meu sistema com dados de vários anos de um cliente chega a ocupar 100Mb.

Portanto programas que achamos uteis podem ser também armadilhas aos nossos dados.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Wind
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 12 Mar 2008 18:35
Localização: Brasil

Mensagem por Wind »

Piter, fica dificil dar qualquer opinião com o pouco de informação que você passou...

Qual erro que ocorre afinal? Qual clipper, linkador e RDD (NTX ou CDX?) você usa? Você tem certeza que não são os DBFs que estão corrompidos (um campo data, com letras no meio, pode bagunçar o indice...)? Como você abre e fecha os DBFs/Indices e como/quando os índices são criados? Como são as chaves de indexação? Se você cria um índice usando por exemplo ALLTRIM(CAMPO), a chance de dar erro é grande (as chaves devem ter o mesmo tamanho).

Dê mais informações...
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Verificar Índice

Mensagem por Maligno »

PITERGALDIANO escreveu:Gostaria de uma função que verificasse se o índice do DBF está integro! para somente abrir o arquivo de clientes se estiver correto.
Eu sempre sei se meu DBF está íntegro. O truque é simples. Crio o último campo do registro do DBF com CHAR(8) para armazenar o CRC32 da soma das strings que representam todos os campos anteriores. Se na utilização do programa o CRC32 recalculado não bater com o que está armazenado, de duas uma: ou ferrou ou alguém fraudou. Mais fácil impossível.
No meu menu de ferramentas também incorporei uma função de checagem de integridade total, que nada mais é do que a checagem do CRC32 de todos os registros dos DBFs que o usuário selecionar.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
PITERGALDIANO
Usuário Nível 2
Usuário Nível 2
Mensagens: 91
Registrado em: 28 Nov 2003 08:48

Mensagem por PITERGALDIANO »

Maligno, o que é esse CRC32 dos campos anteriores?
Piter Galdiano
Programador Clipper
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Você transforma para strings os campos que não sejam caractere, soma todos os campos e obtém uma única string. Calcula o CRC32 dessa string e armazena no último campo do registro. Uso o último campo porque facilita o cálculo automático na minha função de checagem. Ah, sim. Esqueci de dizer que a cada alteração do registro, claro, o CRC desse registro é atualizado.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Se interessar, eis as funções que uso:

Código: Selecionar todos

//******************************************************
function dbSaveCRC()
if dbFieldCRC()
   FieldPut(FCount(),dbCalcCRC())
end
return nil


//******************************************************
function dbFieldCRC()
return Right(RTrim(FieldName(FCount())),3) == "CRC"


//******************************************************
function dbCalcCRC()
local cSum := ""
local f
local i
*
for i := 1 to FCount()-1
    f := FieldGet(i)
    cSum += if(ValType(f) = "C",      f         ,;
            if(ValType(f) = "N",  Str(f,18,6)   ,;
            if(ValType(f) = "D", DtoS(f)        ,;
            if(ValType(f) = "L",   if(f,"1","0"), ""))))
next
return CRC32Calc(cSum)
Apenas note que a função dbFieldCRC() verifica se o último campo do DBF tem um nome iniciado pela string "CRC". Se positivo, calcula o CRC de todos os campos e armazena o resultado neste último campo.

A função CRC32Calc() foi feita em Assembly e é bem rápida. Está no meu site (fonte e objeto), caso queira. Clique aqui para pegar.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Maligno, voce tem esta mesma função em Clipper puro, ou ASM compilado em 32bits, gostaria de agregar as verificações em meu sistema. Como uso Harbour vejo que isto seria super util.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder