Como faço um pack na tabela?
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
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
Curtidas 0
Respostas
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;
// 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
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;
// 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
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!
Estou usando windows XP
Alguem sabe o que eu posso fazer?
Grato!
GOSTEI 0
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!
Grato!
GOSTEI 0