Página 1 de 2

Como deletar registros em DBF com DBT?

Enviado: 13 Ago 2007 18:33
por teco
Olá pessoal.
Presto assistência a um cliente que possui um sistema desenvolvido em Delphi; ajusto ou elimino alguns registros da Base de Dados (somente).
Porém me deparei com a necessidade de eliminar alguns registros, que na verdade são muitos, de um arquivo DBF com campo Memo. Confesso que não utilizo campo Memo e nem prefiro. O problema em questão é que quando gero um simples programa para abrir o DBF e eliminar os registros determinados, o programinha me retorna um erro de execução:
Error DBFNTX/1012 Corruption detected.
Como devo proceder?
Grato por qualquer ajuda. :)Pos

Enviado: 13 Ago 2007 19:39
por sygecom
Tche, esse sistema é em Delphi e usa DBF ?
Já tentou abrir ele com algum sistema de terceiro...tenho aqui o xdbu.exe se qusier posso te mandar !! outra coisa...pergunta basica...quando vc vai mexer nesse DBF ninguem esta usando ele em rede ?

Enviado: 13 Ago 2007 19:57
por teco
Blz, Leonardo?
Sim, a base é em DBF com índice MDX. O sistema é de supermercado e faço a manutenção no servidor no sistema de retaguarda. Entendo sua preocupação quanto a rede, mas garanto que o arquivo em questão só é utilizado na retaguarda. Possuo o xDbu, mas como poderia eliminar os devidos registros?
Grato.

Enviado: 13 Ago 2007 20:06
por sygecom
Tche, o Xdbu que me refiro pra ser mais prescisso é o ourXdbu e ele não abre MDX, aqui na lista dele consta, DBFCDX,DBFNTX,SIXCDX, ADS Etc...menos MDX...lamento vou ficar lhe devendo essa, talvez aparece alguem que conheça mais sobre MDX...

Enviado: 13 Ago 2007 20:21
por teco
Ok, Leonardo.
Mas acredito que o índice pra mim não é o problema, pq já fiz muitas mudanças nos outros arquivos (SEM DBT), e após recrio o indice pela própria ferramenta do delphi (Database Desktop), pois possuo as chaves dos índices.
O meu problema é simplesmente como abrir (no programinha que faço na hora no cliente) o arquivo que possui o DBT associado.
Por exemplo, o que fiz:

Código: Selecionar todos

set date to british
use chqpre alias Ch new
go top
do while !eof()
   if DT_VENC < CTOD("01/01/07")
      Delete
   endif
   skip
enddo
close all
return
O que pode estar causando o erro na abertura do arquivo?
Valeu!!!! :)Pos

Enviado: 13 Ago 2007 20:29
por sygecom
Captei vossa mensagem, hj toh dormindo em Pé !!!

Já tentou colocar no incio do seu sisteminha:

Código: Selecionar todos

request DBFMDX
Abraços

Enviado: 14 Ago 2007 09:36
por teco
Leonardo, agradeço a sua disposição em ajudar. Coloquei o request, mas não consegui gerar o EXE.
BLINKER: 1115 "DBFMDX" unresolved external
Verificando o uso do comando USE, li que simplesmente na abertura do DBF caso haja um DBT associado, ele é aberto automaticamente. Nunca utilizei arquivos DBT, por isso imagino que o simples exemplo acima funcionaria, veja, não preciso abrir o DBF com o índice.
Talvez não seria uma proteção quanto a abertura do mesmo fora do sistema (?????), pois seria o único, visto que já consegui com vários outros, mas sem DBT.
Obrigado. :)Pos

Enviado: 14 Ago 2007 10:15
por Ademir
Blz Teco ?

Cara, o teu problema é quando vc deleta os registros do DBF o DBT continua sempre do mesmo tamanho ?

Enviado: 14 Ago 2007 10:16
por Ademir
No caso do erro "DBFNTX/1012 Corruption detected" tente deletar o arquivo NTX e recria-lo. Talvez resolva o problema.

Enviado: 14 Ago 2007 11:18
por teco
Belezinha Ademir.
A coisa tá esquisito!!!! (rsrsrs)
Copiei para a minha máquina, os dois arquivos, para fazer os testes. Os arquivos são CHQPRE.DBF e também o CHQPRE.DBT.
Ademir, não existe o NTX e sim um índice com a extensão MDX, mas tudo bem, o índice pra mim agora não tem necessidade, pois tento executar exatamente o exemplo que postei anteriormente, volto a dizer nunca trabalhei com campo MEMO, e acredito pelo que li a respeito do comando USE, que seria válido a abertura do arquivo no exemplo, tento abrir o DBF sem a cláusula INDEX.
Por curiosidade abrir o .DBF pelo aplicativo DBFExplorer.EXE e eliminei o campo MEMO, blz. Executei novamente o exemplo sem a deleção e bingo!!!! O arquivo foi percorrido inteiro. Meu problema é o campo MEMO, mas preciso fazer a deleção com o .DBT aberto também, não é verdade.
Aguardo alguma dica do que pode estar acontecendo, ou que eu esteja errando em algo.
Valeu moçada!!! :'(

Enviado: 14 Ago 2007 11:37
por Ademir
Para excluir os registros vc nao precisa abrir o NTX / MDX.
Quando vc abre um DBF automaticamente o DBT associado a ele é aberto. Então vc não precisa abri-lo.

A experiencia que tive com arquivos DBT é que a tendencia desses arquivos é sempre aumentar de tamanho. Mesmo que se faça um pack no DBF, o DBT não diminui. A unica forma de diminuir o seu tamanho é recriar a estrutura do DBF e atualiza-lo novamente.

Enviado: 14 Ago 2007 11:51
por Dr_Spock
- Caro Teco

- Quanto a deletar os registros acho que esta tranquilo agora, pelas respostas acima.
- So gostaria de alertar voce de um detalhe "muito importante", e que podera causar uma tremenda dor de cabeca num futuro proximo.
- Uma das causas do erro ""DBFNTX/1012 Corruption detected" pode ser o que voce esta fazendo na rotina de exclusao, ou seja, voce esta abrindo o arquivo, apagando os registros, mas nao esta incluindo na abertura os arquivos de indices a ele vinculados. A menos que apos fazer isso voce execute uma rotina de reindexacao ou criacao dos indices novamente, as posicoes dos arquivos de indices estarao apontando para outros registros completamente diferentes do que eram antes. So como exemplo, voce podera fazer a consulta dos titulos de um cliente e aparecer um registro que nao pertenca ao mesmo ou algum outro deixar de ser exibido.
- Portanto cada vez que voce fizer uma alteracao numa base de dados sem utilizar os indices vinculados, os mesmos devem ser recriados.

- Como sugestao, voce pode criar uma rotina que recria todos os indices das tabelas, executando um PACK antes, assim o tamanho dos arquivos tambem serao reduzidos.
- Claro que esta rotina deve ser executada com todos os usuarios desconectados do sistema.

- Um clip_abraco

Enviado: 14 Ago 2007 13:11
por teco
Pessoal, agradeço as respostas.
Compreendo perfeitamente o que todos disseram, mas o que eu estou tentando fazer é simplesmente abrir o arquivo .DBF puro (sem indice), percorrer por ele inteiro e eliminando os registros que atendam minha necessidade (verifiquem no inicio do tópico), e logo em seguida, obviamente, crio o indice. Pessoal, o sistema em que utiliza os referidos arquivos, não é meu. O que sempre fiz, foi: pego o aquivo em questão faço o que for necessario (através de um programinha simples que faço no próprio cliente, como o exemplo que postei), então de posse das chaves dos indices, crio-os através do Database Desktop do Delphi, o sistema é em delphi, ficando os registros pronto para serem utilizados pelo Sistema.
Todos os outros arquivos do Sistema (DBF´s), já fiz várias manutenções. Somente esse único CHQPRE.DBF possui um campo memo (CHQPRE.DBT) é que não consigo executar o programinha (acima, bem acima).
Valeu pessoal, vou tentando por aqui, qualquer dica ainda é bem vinda.
Obrigado :xau

Enviado: 14 Ago 2007 15:16
por Ademir
Teco tenta usar:

em vez disso: use chqpre alias Ch new

isso: use chqpre alias Ch excl new

Enviado: 14 Ago 2007 15:42
por teco
Nada feito Ademir (rsrsrsrs).
Estou imaginando que o problema esteja no CHQPRE.DBT, com algum tipo de inconsistência, sei lá. Existe a possibilidade de se eliminar o .DBT e cria-lo novamente (????) a partir do DBF. Se sim como?
Desculpe pessoal, posso até estar falando uma tremenda bobagem.
Com o DBF está ok, pq deletei o campo memo e funcionou blz.
Caso não consiga resolver, vou verificar junto ao cliente se ele utiliza dentro do sistema o campo de comentário.
Caso não use, poderei deletar atraves do DBU o campo memo, e em seguida criá-lo novamente?
Será gerado o arquivo .DBT correspondente?
Respondam aí, feras!!!! -:]