Solved

*.mdx lost problem (dBase 7)

Posted on 1998-11-06
6
409 Views
Last Modified: 2013-11-24
Hi,

If the *.mdx files lost, I used to set the byte number 28 to 0 in *.dbf file.
But Dbase 7 changed DBF file structure. How can I do with it?

Or I think using BDE API is better than to modify the file physically.

Thanks.
0
Comment
Question by:yysun
  • 2
  • 2
  • 2
6 Comments
 
LVL 4

Expert Comment

by:dwwang
ID: 1345988
Hi, yysun, I think you are the yysun on Rich Forum, right?

See http://www.inprise.com/devsupport/bde/bdeapiex, index secction of BDE functions.
0
 

Author Comment

by:yysun
ID: 1345989
ÄúºÃ£¡dwwang,¾ÓÈ»µ½ÕâÀïÀ´·¢²ÆÁË£¿

I've alreadyed check that document, but all the functions there should use a valid handle of the table. But if the mdx file missed the table can not be opened. So no handle can be used?

What can I do then?
0
 

Expert Comment

by:elkiors
ID: 1345990
Is it not possible to rebuild the index files from info within the table ?

Darren
0
Simplifying Server Workload Migrations

This use case outlines the migration challenges that organizations face and how the Acronis AnyData Engine supports physical-to-physical (P2P), physical-to-virtual (P2V), virtual to physical (V2P), and cross-virtual (V2V) migration scenarios to address these challenges.

 
LVL 4

Accepted Solution

by:
dwwang earned 100 total points
ID: 1345991
Use Database Desktop, open the table, when prompt error, select the "open and detach", then the index infomation will be removed from the table.
0
 

Author Comment

by:yysun
ID: 1345992
How can I do it using Delphi like Database Desktop does?
0
 

Expert Comment

by:elkiors
ID: 1345993
Have a look at TTable.DeleteIndex and TTable.IndexDef methods and properties.

you could also call the BDE directly. Below is a block of code that was given to me as an answer on E-E for compacting dBase and Paradox tables. There's a bit in it that uses the BDE to re-index and re-structure the tables. Maybe this is of some use.

unit DBPack;

interface

uses BDE, DBTables, DB, sysutils;

procedure PackTable(Table: TTable);

implementation

// 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;

end.


Regards

Darren

0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
The new Microsoft OS looks great, is easier than ever to upgrade to, it is even free.  So what's the catch?  If you don't change the privacy settings, Microsoft will, in accordance with the (EULA) you clicked okay to without reading, collect all the…
The view will learn how to download and install SIMTOOLS and FORMLIST into Excel, how to use SIMTOOLS to generate a Monte Carlo simulation of 30 sales calls, and how to calculate the conditional probability based on the results of the Monte Carlo …
The viewer will learn how to use the =DISCRINV command to create a discrete random variable, use this command to model a set of probabilities and outcomes in a Monte Carlo simulation, and learn how to find the standard deviation of a set of probabil…

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question