Entwickler-Ecke

Datenbanken - Brauche Hilfe bei : DBIPackTable() unit: bde;


catweasel - Mi 17.07.02 21:07
Titel: Brauche Hilfe bei : DBIPackTable() unit: bde;
Hi,

Ich hab gelesen dass man mit der DBIPackTable() Dbase Datenbanken packen kann, also alle Datensätze mit Dbase Löschflag endgültig entfernen.
Dabei müsste die Dateigrösse (je nach Anzahl der Löschvorgänge), kleiner werden.
Bei folgendem Funktionsaufruf:


Quelltext
1:
2:
tabelle : TTable;
dbipacktable(tabelle.dbhandle,tabelle.handle,'fahrten.DBF','DBASE',true);


kommt es zwar zu keiner Fehlermeldung, aber Erfolg hat es auch nicht.
Die Grösse der DBF Datei ändert sich kein bischen, da tut sich nix...
Alle Beispiele die ich gefunden habe gehen aber auch gan z genauso....
Was mach ich falsch..
Nebenbei... Wie ist das mir dem "exklusiven" öffnen zu verstehen, das soll man da nämlich machen...

Thanks 4 help

Catweasel

Code-Tag hinzugefügt. Marc


Steffer - Do 18.07.02 08:10

Sind denn nachher markierte Datensätze noch vorhanden?

Exclusiv bedeutet, dass zu diesem Zeitpunkt niemand anders die Tabelle im Gebrauch haben darf.


MrSpock - Do 18.07.02 08:24

Hallo catweasel,

ich meine, dass du vor einem Aufruf irgendeiner DBI-Funktion erste einmal DBIInit (oder so ähnlich) aufrufen musst. Heute Abend schaue ich noch einmal nach und gebe die weitere Infos.


catweasel - Do 18.07.02 13:56
Titel: Danke schonmal
Hi,

Hmm, ich öffne die Tabelle ganz exklusiv......
Wie kann ich die "DBase-mässig" gelöschten Datensätz anzeigen lassen ????
Mit "gelöschten" Sätzen habe ich bisher nur im Zusammenhang mit CachedUpdates zu tun gehabt.

Schonmal Danke für das Stichwort mit dem DBInit...
Weitere Infos wären echt cool,

CU
Catweasel


Steffer - Do 18.07.02 15:15

Also mit Init hat das imho nix zu tun.

Probier mal folgendes:
Lege eine DBase-Tabelle mit 10 Datensätzen an.
Jetzt greifst du mit einem Testprogramm drauf zu und sagst bei 5 Datensätzen Delete.

Öffnest du die Datenbank jetzt mit der Datenbankoberfläche => umstrukturieren + komprimieren.
Wenn du dir jetzt die Grösse anschaust, wurde die DB kleiner.

Was die Datenbankoberfläche macht, sollte auch DBIPackTable() können.


catweasel - Do 18.07.02 17:06
Titel: Macht es eben nicht .....
Hi...

Sehr richtig.....
In der Datenbankoberfläche klappt das auch wunderbar. nur Die
der Funtionsaufruf bringt kein Ergebniss.
Das ist ja das Rätsel...

CU
Catweasel


Steffer - Do 18.07.02 17:35

Hmm, also bei mir klappt es ... liegt wohl an meinen Wunderfingern ;-))

Hier mal der Source:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure PackTable(Table: TTable);
begin
if not Table.Active or not Table.Exclusive
then begin
     Showmessage('Datenbank muss exclusiv geöffnet sein');
     exit;
     end;
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True));
Table.Open;
ShowMessage(Table.TableName + ' wurde gepackt');
end;


und hier die Demo wenn es noch immer nicht klappen sollte ...
http://www.faqsen.de/find.jsp?FAQ=1;495648554850495551505155;2


MrSpock - Do 18.07.02 20:43

@Steffer: Ich hab's nicht ausprobiert, aber das BDE - Handbuch (ist schon etwas älter!) sagt:

Zitat:
DBIInit must be called once by each client application before any other calls are made.


Es kann jedoch sein, dass es bei neueren BDEs so nicht mehr gibt oder der Text im Handbuch nicht ganz korrekt ist.


catweasel - Do 18.07.02 21:47
Titel: Danke für den Quellcode.. etwas mehr licht, aber neues Prob
Hi..

Erstmal Danke Steffer für den Quellcode.....
Jedesmal wenn ich deine Funktion aufrufe lande ich im "Datenbank muss exklusiv geöffnet sein" Zweig...
Dabei glaub ich eigentlich nicht, dass die vor mir einer aufmacht.....
Kann mir einer bei der Gelegenheit die verschiedenen "Betriebsarten" von Tabellen kurz näher bringen....
Wäre cool

Catweasel


Steffer - Do 18.07.02 22:23

Ei Kerle .... dafür ist die Demo ...

Du must in deinem TTable.Exclusiv:= True; setzen...

Nachtrag:
Hast du Exclusiv:= True; dann fang Table.Open in einem Try..except..Block ab.
Try = Keine anderer
Except = Die Datenbank ist durch einen anderen Anwender geöffnet


catweasel - Do 18.07.02 22:30
Titel: Nu läufts....
Hi...

Nu läufts auch bei mir....
lag tatsächlich an der exklusivmethode.....
War irgenwie verpeilt....
Danke für die Mühe....

CU
Catweasel