Baza danych Pack Table

0

Mam problem z baza danych a mianowicie :
Uzywam Dbase for windows i po usunieciu jakiegos wpisu z poziomu Delphi indexy w bazie nie zmieniaja sie .
Przyklad
mam wpisy o indexach 1 , 2 , 3, 4
kasuje pozycje 2
i pozosaje mi 1 , 3, 4,
Aby w bazie danych to zrobic 1, 2, 3 nalezy uzyc RESTRUKTURE i zaznaczyc Pack Table i dac Save ...

A pytanie moje jak to zrobic z poziomu Delphi nie wykorzystujac zadnego dodatkowego komponentu
Na przyklad po kliknieciu na Button ze mi Od razu wykona sie REstrukture Pack Table.

Z gory dzieki za odpowiedz [cya]

0

Oczywiście jest to możliwe. :-)

Tabela musi być otwarta w trybie Exclusive. Przy okazji odświeżane są wszystkie indeksy. Przedstawiona procedura działa na tabelach Paradox i DBase. W bloku deklaracji (uses) trzeba zadeklarować BDE.

procedure PackTable (Table :TTable);
var
Props : CURProps;
hDb : hDBIDb;
TableDesc : CRTblDesc;
begin
if Table.Active = False
then raise EDatabaseError.Create ('Table must be opened to pack');
if Table.Exclusive = False
then raise EDatabaseError.Create ('Table must be opened exclusively to pack');
Check (DbiGetCursorProps (Table.Handle, Props));
if Props.szTableType = szPARADOX
then begin
FillChar (TableDesc, sizeof(TableDesc), 0);
Check (DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
StrPCopy (TableDesc.szTblName, Table.TableName);
StrPCopy (TableDesc.szTblType, Props.szTableType);
TableDesc.bPack:=True;
Table.Close;
Check (DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, FALSE));
end
else if Props.szTableType = szDBASE
then Check (DbiPackTable (Table.DBHandle, Table.Handle, nil, szDBASE, TRUE))
else raise EDatabaseError.Create ('Table must be either of Paradox or dBASE type to pack');
Table.Open;
end;

0

Proponuję Ci zastosować bazę PARADOX'a i problem z głowy w DELPHI po wyżej 4.

Kiedyś bawiłem się bazami D-BASE ale jednak przekonałem sie że Paradox do użytku domowego jest lepszy.

Pakowanie bazy PARADOX'a nastepuje automatycznie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1