Grazie . nico_l...@libero.it
Attenzione che il BDE non funziona con i .DBF.
From the Borland Community web site at
http://community.borland.com/article/0,1410,21774,00.html, Borland/Inprise
support staff discourages the use of their own native BDE FoxPro Driver for
anything other than read-only access to FoxPro tables.
The following is the exact quote:
"Based on extended testing of the Native BDE FoxPro driver, Inprise/Borland
advises against any use of this driver other than for read only access.
Usage other than read only may result in crashes, Access Violations or
corruption of indexes." -- Inprise Developer Support Staff.
In ogni caso... non lo so. Sorry! :-)
Io utilizzo Apollo.
> 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
Doriano Biondelli wrote:
> 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
>
>
>Doriano Biondelli wrote:
>
>
>> Attenzione che il BDE non funziona con i .DBF.
>
>Ma quando mai... Ho usato per anni dBase con BDE senza problemi.
Io invece ho dei brutti ricordi, infatti ho poi deciso di utilizzare Apollo.
L'ultimo errore (di una lunga serie) segnalatomi dal BDE quando
lavoravo con il driver dbase ricordo e' stato :
Access to table disabled because the last error.
Il BDE non mi permetteva piu' l'accesso ad una tabella che
invece Clipper apriva senza problemi.
Se fosse stata una grossa tabella di movimenti contabili di
un cliente cosa avrei potuto fare ?
Il BDE con il driver Dbase apre automaticamente l'indice
compound associato e se l'indice e' alterato la tabella non si apre piu'.
Non potendo aprire la tabella non e' nemmeno possibile rigenerare
i/gli indici.
E' un problema che e' stato risolto...su it.comp.delphi, tempo fa...
Ricordo anche che Borland non garantiva il funzionamento della
Findkey (con indici tipo stringa come in Clipper) ma solo la Gotokey
e con indici stringa anche il fields link che si usa per creare relazioni
master detail non puo' funzionare.
Ricordo che G. Madaffari sconsiglio' piu' volte di usare Dbase con il BDE
Cmq se tu non hai avuto problemi _ci credo_ (sul serio)
Sono cosi' diverse le strade che percorriamo che ognuno puo' solo
parlare per se stesso e niente di piu'.
>Il documento che citi parla del driver nativo FoxPro non del driver
>di dBase (che poi e' quello standard, lo stesso del Paradox).
Vero.
Era giusto la mia opinione,
Ciao,
Eugenio Belli.
> Il BDE non mi permetteva piu' l'accesso ad una tabella che
> invece Clipper apriva senza problemi.
Certo, gli accessi a DBF con Clipper erano sicuramente migliori,
e' ovvio. D'altra parte quello fornito con il BDE era un driver
generico. E ricordo anche i problemi di indice e di link
relazionali da te citati; ma da questo a dire che "il BDE con .DBF
non funziona" ce ne passa. E' che ultimamente se ne sentono tante:
- Paradox che non supporto la multiutenza.
- BDE che "non funziona" con file DBF
- Il BDE non funziona in assoluto ed e' da gettare nel cesso.
> Il BDE con il driver Dbase apre automaticamente l'indice
> 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
>> Il BDE con il driver Dbase apre automaticamente l'indice
>> 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.
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
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.
------------------------------------------------------------------------------