Como faço um pack na tabela?

Delphi

09/04/2003

Como faço para dar pack na tabela???
Até agora estou usando da seguinte forma:

No OnShow do form Pack coloquei:

Tabela.Open
Tabela.Exclusive := true;

E no form coloquei um botão, e no OnClick coloquei:

Tabela.Pack;

O que esta errado???

Obrigado


Inutaishou

Inutaishou

Curtidas 0

Respostas

Anonymous

Anonymous

09/04/2003

siga o seguinte exemplo que dá certo.

// Pack tabelas Paradox ou dBASE

procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
Table.Active := False; // fecha a tabela
Table.Exclusive := True; // tabela no modo exclusivo
Table.Active := True; // abre a tabela no modo exclusivo
// verificação do tipo da tabela: PARADOX ou DBASE
Check(DbiGetCursorProps(Table.Handle, Props));

// Se a tabela é do tipo PARADOX chama DbiDoRestructure...
if Props.szTableType = szPARADOX then begin
// preenche a estrutura com brancos
FillChar(TableDesc, sizeof(TableDesc), 0);
// Pega o Handle para o Cursor e tabela...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Põe o nome da tabela no descritor da tabela
StrPCopy(TableDesc.szTblName, Table.TableName);
// Põe o tipo da tabela no descritor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Coloca a tabela no modo Pack...
TableDesc.bPack := True;
// Fecha a tabela para que a reestruturação possa continuar...
Table.Close;
// chamada a DbiDoRestructure...

Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil
, nil, False));
end
else
// Se a tabela é dBASE simplesmente chamamos DbiPackTable...
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// condição de erro, a tabela só pode ser PARADOX ou dBASE...
raise EDatabaseError.Create(´A tabela precisa ser dBase ou PARADOX´);

Table.Open; // devolve a você a tabela já aberta

end;


GOSTEI 0
Dor_poa

Dor_poa

09/04/2003

procedure TablePack( oTable : TTable );
// Dá um pack em uma Tabela
var
iResult: DBIResult;
szErrMsg: DBIMSG;
pTblDesc: pCRTblDesc;
bExclusive: Boolean;
bActive: Boolean;
begin
with oTable do
begin
bExclusive := Exclusive;
bActive := Active;
DisableControls;
Close;
Exclusive := True;
end;
case oTable.TableType of
ttdBASE: begin
oTable.Open;
iResult := DbiPackTable( oTable.DBHandle, oTable.Handle,
nil,nil, True );
if iResult <> DBIERR_NONE then
begin
DbiGetErrorString( iResult, szErrMsg );
MessageDlg( szErrMsg, mtError, [mbOk], 0 );
end;
end;
ttParadox: begin
GetMem( pTblDesc, SizeOf( CRTblDesc ));
FillChar( pTblDesc^, SizeOf( CRTblDesc ), 0 );
with pTblDesc^ do
begin
StrPCopy( szTblName, oTable.TableName );
StrPCopy( szTblType, szParadox );
bPack := True;
end;
iResult := DbiDoRestructure( oTable.DBHandle, 1,
pTblDesc,nil, nil, nil, False );
if iResult <> DBIERR_NONE then
begin
DbiGetErrorString( iResult, szErrMsg );
ShowMessage( szErrMsg, mtError, [mbOk], 0 );
end;
FreeMem( pTblDesc, SizeOf( CRTblDesc ));
end;
else
ShowMessage( ´Impossível compactar uma tabela deste tipoe!´);
end;
with oTable do
begin
Close;
Exclusive := bExclusive;
Active := bActive;
EnableControls;
end;


GOSTEI 0
Vitor Rubio

Vitor Rubio

09/04/2003

Tentei fazer das duas maneiras citadas acima e ambas ocasionaram um access violation daqueles que aparecem o código assembly no debug e dá um ´pau´ dos mais estranhos;

Estou usando windows XP

Alguem sabe o que eu posso fazer?

Grato!


GOSTEI 0
Vitor Rubio

Vitor Rubio

09/04/2003

Esqueci de mencionar: Minha tabela é dbf do FoxPro, tem diferença do dBase normal? como eu dou um pack nesta tabela?

Grato!


GOSTEI 0
POSTAR