Como deletar registros em DBF com DBT?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Como deletar registros em DBF com DBT?

Mensagem 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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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 ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem 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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem 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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem 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
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Blz Teco ?

Cara, o teu problema é quando vc deleta os registros do DBF o DBT continua sempre do mesmo tamanho ?
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

No caso do erro "DBFNTX/1012 Corruption detected" tente deletar o arquivo NTX e recria-lo. Talvez resolva o problema.
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem 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!!! :'(
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem 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.
Dr_Spock
Usuário Nível 1
Usuário Nível 1
Mensagens: 17
Registrado em: 05 Jan 2007 13:40
Localização: Brasilia - DF

Mensagem 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
-----------------------------------------------------------
Dbase II - Cobol MB - Edisa 251 - CP 300 / 500
Clipper Summer 85 - Proceda 4 Mhz - Hd 10 Mb
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem 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
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Teco tenta usar:

em vez disso: use chqpre alias Ch new

isso: use chqpre alias Ch excl new
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem 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!!!! -:]
Responder