Newsgroup: it.comp.lang.delphi
Titolo: Ricreazione indici DBF

Come faccio in Delphi a ricreare gli indici ??
Grazie .  
nico_l...@libero.it

 Grazie .  
nico_l...@libero.it
--
by(e) Doriano.
E-MAIL: doria~N~o@skyli~N~
k.it
PS: sostituisci  ~N~ con n per rispondere...
        To reply, replace ~N~ with n

 Attenzione che il BDE non funziona con i .DBF.
Ma quando mai... Ho usato per anni dBase con BDE senza problemi.
Il documento che citi parla del driver nativo FoxPro non del driver 
di dBase (che poi e' quello standard, lo stesso del Paradox).
In ogni caso se per ricreazione degli indici si intende l'equivalente
di quelli che in dBase sono i comandi PACK e REINDEX allora se non
ricordo
male (sono passati tanti anni da quando usavo BDE+DBF e la mia memoria
e' 
quella che e') non si puo' fare utilizzando i metodi della TTable. E' 
necessario fare delle chiamate di basso livello alle API del BDE.
Da qualche parte dovrei avere qualche esempio, se e' questo che serve
posso cercarlo.
In alternativa si trovano in giro dei componenti derivati da TTable con 
metodi che incapsulano queste chiamate al BDE.
 
-- 
Leonardo Lomartire
l.lom...@rasnatech.com

di dBase (che poi e' quello standard, lo stesso del Paradox).
Vero. 
Era giusto la mia opinione,
Ciao,
Eugenio Belli.
 

 compound associato e se l'indice e' alterato la tabella non si apre piu'.
Se non sbaglio e' una di quelle cose risolvibili con chiamate alle
API BDE. Effettivamente i metodi messi a disposizione dai componenti 
data access della Borland sono limitati (soprattutto per un 
programmatore che viene dal Clipper) pero' in linea di massima scendendo 
a livello di API BDE i problemi si risolvono. 
Personalmente ho incontrato problemi molto piu' seri per esempio con ADO 
che con BDE, e non farei a cambio se non costretto.
Leonardo Lomartire
l.lom...@rasnatech.com

API BDE.
No, non e' una questione di Api.
Sono andato a cercare la soluzione
e' del 03/03/1998 di Corrado Cavallini
//------------------------------------------------------------------------------------------------
1- Il problema è comune ad indici di tipo CDX o MDX
2- la definizione degli indici è memorizzata solo ed esclusivamente
nell'header degli stessi, quindi per poterli ricostruire dopo che si son
rovinati bisogna avere una fonte esterna che dica come son fatti.
3- Il byte 29 (offset 28) dell’header del file *.DBF segnala l’esistenza di
un indice “strutturale”. Tale byte può assumere i seguenti valori:
00h se nessun file *.CDX o MDX è associato
01h se esiste file *.CDX o MDX associato
Se l'indice è rovinato non si riesce più ad aprire nemmeno il DBF
Suggerisco la seguente line di azione:
1- Correggere manualmente il byte nell'header del DBF. A questo punto gli
indici son persi ma i dati son salvi.
2- Rifare a mano gli indici
Allego un esempio di listato per il punto 1, il punto 2 è elementare.
....
cBuffer : char
...
cBuffer := chr(0)
cFile := "MioDrive:\MiaDirectory\Miofile.DBF"
cIndex := "MioDrive:\MiaDirectory\Miofile.CDX" // o .MDX
/// Apertura di basso livello
FileHandle := FileOpen(cFile,fmOpenReadWrite or fmShareExclusive);
if FileHandle > 0 then
begin
  // Cancellazione del file indice (se esiste)
  if FileExists(cIndex) then deleteFile(cIndex);
  // sovrascrittura del 29-esimo byte (offset 28)
  FileSeek(FileHandle,28,0);
  FileWrite(FileHandle,cBuffer,1);
  FileClose(FileHandle);
....
a questo punto il file DBF si può aprire senza problemi con il database
desktop, e si può verificare se la corruzione riguarda solo l'indice o anche
i dati.
//------------------------------------------------------------------------------------------------------
Ciao,
Eugenio.
 


Ne sarei felice anche io, ho lo stesso terrore/problema.
Grazie.
Davide

Per quanto riguarda la PACK e la REINDEX dei file dBase riporto
di seguito un documento tratto dai TIP della Borland. La funzione
delle API BDE e':
DbiPackTable(Table1.DbHandle, Table1.Handle, Nil, szDBASE, TRUE);
dove l'ultimo parametro e' un flag booleano che determina o meno la 
rigenerazione degli indici.
Non so se questo sia utile anche rispetto ai problemi segnalati da 
Eugenio Belli ma  se avesse la possibilita' di provarlo mi
interesserebbe 
saperlo.
Leonardo Lomartire
l.lom...@rasnatech.com
----------------------------------------------------------------------------
Copyright © 1998 Inprise Corporation
   PRODUCT  :  Delphi                                       NUMBER  : 
2873
   VERSION  :  All
        OS  :  Windows/Win32
      DATE  :   5/20/96                                       PAGE  : 
1/1
     TITLE  :  packing a dBASE table
KEYWORDS: packing a dBASE table AREA: Database Programming
packing a dBASE table
Q:  How do I pack a dBASE table?
A:  To pack a dBASE table that has been opened with a TTable,
use the BDE function DbiPackTable.  There are two basic steps
to do this:
1. Add the following units to your uses clause:
{ For Delphi 1.0: } DBITYPES, DBIPROCS and DBIERRS;
{ For Delphi 2.0: } BDE;
2) Then call the DbiPackTable BDE function as follows:
Check(DbiPackTable(Table1.DbHandle, Table1.Handle, Nil, szDBASE, TRUE));
Notes:
* The table must be opened in exclusive mode.
* Use the Check procedure when calling BDE API functions.  Check
  will raise an exception if an error occurs on the BDE call.
------------------------------------------------------------------------------