Página 1 de 2
Verificar Índice
Enviado: 17 Mar 2008 13:26
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.
Enviado: 17 Mar 2008 14:12
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.
Enviado: 17 Mar 2008 15:25
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.
Enviado: 17 Mar 2008 16:36
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?
Enviado: 17 Mar 2008 18:04
por Netavin
... Avast ou AVG
Netavin.
Re: Verificar Índice
Enviado: 17 Mar 2008 18:17
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.
Enviado: 17 Mar 2008 18:21
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.
Re: Verificar Índice
Enviado: 17 Mar 2008 18:42
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.
Enviado: 17 Mar 2008 20:51
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.
Enviado: 19 Mar 2008 09:04
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...
Re: Verificar Índice
Enviado: 19 Mar 2008 14:38
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.
Enviado: 19 Mar 2008 15:16
por PITERGALDIANO
Maligno, o que é esse CRC32 dos campos anteriores?
Enviado: 19 Mar 2008 17:47
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.
Enviado: 19 Mar 2008 18:02
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.
Enviado: 19 Mar 2008 19:38
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.