Board index » delphi » 2ND Post: Packing table causes error..???

2ND Post: Packing table causes error..???

I have several dbase tables and I am using standard routine to pack
tables (dbase ver 7). One table cause error everytime. How can I
detect what caused the proble during packing?

I am getting an error first time I run pack in one of the tables, when
I do it again, there is no errors detected.. why? I am using the
following scenario

function TfmPACKTABLE.PackTable(tbl:TTable; db:TDatabase):DBIResult;
  var
    crtd: CRTblDesc;
  begin
    Result := DBIERR_NA;
    with tbl do if Active then Active := False;
    with db do if not Connected then Connected := True;
    FillChar(crtd,SizeOf(CRTblDesc),0);
    StrPCopy(crtd.szTblName,tbl.TableName);
    crtd.bPack := True;
    Result := DbiDoRestructure(db.Handle,1,@crtd,nil,nil,nil,FALSE);
  end;

procedure TfmPACKTABLE.BitBtn1Click(Sender: TObject);

var Error:integer;

begin
Error:=0;
Animate1.Active:=True;
    lblTAble.Caption:='Reservation Table';
    lblTable.Refresh;
if PackTable(dmPMMS.taBOOKING,dmPMMS.dbPMMS) = DBIERR_NONE then
   ProgressBar.PartsComplete:=1
    else
     begin
      MessageBeep(0);
      Error:=Error+1;
      lblError.Caption:=IntToStr(Error);
      lblError.Refresh;
     end;

 

Re:2ND Post: Packing table causes error..???


To pack a dbase table you need to call dbiPackTable.

See the following example:

Example 2: Pack a Paradox or dBASE table.

             This example will pack a Paradox or dBASE table therfore
removing already deleted rows in a table. This function will also
regenerate all out-of-date
             indexes (maintained indexes).
             This example uses the following input:
             PackTable(Table1)
             The function is defined as follows:

             // Pack a Paradox or dBASE table
             // The table must be opened execlusively before calling
this function...
             procedure PackTable(Table: TTable);
             var
               Props: CURProps;
               hDb: hDBIDb;
               TableDesc: CRTblDesc;

             begin
               // Make sure the table is open exclusively so we can get
the db handle...
               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');

               // Get the table properties to determine table type...
               Check(DbiGetCursorProps(Table.Handle, Props));

               // If the table is a Paradox table, you must call
DbiDoRestructure...
               if Props.szTableType = szPARADOX then
               begin
                 // Blank out the structure...
                 FillChar(TableDesc, sizeof(TableDesc), 0);
                 //  Get the database handle from the table's cursor
handle...
                 Check(DbiGetObjFromObj(hDBIObj(Table.Handle),
objDATABASE, hDBIObj(hDb)));
                 // Put the table name in the table descriptor...
                 StrPCopy(TableDesc.szTblName, Table.TableName);
                 // Put the table type in the table descriptor...
                 StrPCopy(TableDesc.szTblType, Props.szTableType);
                 // Set the Pack option in the table descriptor to
TRUE...
                 TableDesc.bPack := True;
                 // Close the table so the restructure can complete...
                 Table.Close;
                 // Call DbiDoRestructure...
                 Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil,
nil, FALSE));
               end
               else
                 // If the table is a dBASE table, simply call
DbiPackTable...
                 if Props.szTableType = szDBASE then
                   Check(DbiPackTable(Table.DBHandle, Table.Handle, nil,
szDBASE, TRUE))
                 else
                   // Pack only works on PAradox or dBASE; nothing
else...
                   raise EDatabaseError.Create('Table must be either of
Paradox or dBASE ' +
                            'type to pack');

               Table.Open;
             end;

Quote
> function TfmPACKTABLE.PackTable(tbl:TTable; db:TDatabase):DBIResult;
>   var
>     crtd: CRTblDesc;
>   begin
>     Result := DBIERR_NA;
>     with tbl do if Active then Active := False;
>     with db do if not Connected then Connected := True;
>     FillChar(crtd,SizeOf(CRTblDesc),0);
>     StrPCopy(crtd.szTblName,tbl.TableName);
>     crtd.bPack := True;
>     Result := DbiDoRestructure(db.Handle,1,@crtd,nil,nil,nil,FALSE);
>   end;

Other Threads