Помогите ПЛЗЗЗЗЗЗЗЗ!!!! DBF copy structure

snwmn
Дата: 11.03.2003 17:04:03
Уважаемые,
помогите создать копию таблицы без ее содержания,
имеется 1.dbf ннужно создать 2.dbf со структурой 1.dbf но без записей.
При копировани файла 1.dbf в 2.dbf и помледующем удалении записей "DELETE ...." из 2.dbf размер файла остается прежним, что не удовлетворяет требованиям. Помогите
Спасибо зарание.
Lisichkin
Дата: 11.03.2003 17:09:03
Была программа во времена Clipper 5.0 DBU.exe - она делела все
возможные операции с dbf файлами.
_Александр_
Дата: 11.03.2003 17:09:47
А что же там тогда остается? Скорее всего вы делаете пометку на удаление, а не само удаление.
snwmn
Дата: 11.03.2003 17:14:32
Требуется все это проделать средствами Delphi а не внешними программами
StrSQL:='DELETE FROM TABLE';
fmMain.Query1.Close;
fmMain.Query1.SQL.Clear;
fmMain.Query1.SQL.Append(StrSQL);
fmMain.Query1.Open;
Lisichkin
Дата: 11.03.2003 17:18:44
Согласно формату dbf файла, удаление записи не приводит к ее физическому удалению - запись только помечается на удаление, и может быть востановленна в любой момент.
Физическое удаление помеченных на удаление записей происходит после выполнения команды PACK.
Aleksei
Дата: 11.03.2003 17:23:39
И где эту команду PACK поставить?
Lisichkin
Дата: 11.03.2003 17:26:28
Хороший вопрос :) (PACK команнда FOXPRO/CLIPPER/ и т.д.)
Через что осуществляется доступ к dbf - ADO, BDE, ... ?
snwmn
Дата: 11.03.2003 17:34:45
BDE
можно оттолкнутся от дргого???
Создание пустой таблицы по структуре существующей???
_Александр_
Дата: 11.03.2003 17:39:10
Могу предложить извращенный способ.
выполнить Select from ... into table2 where несуществующее_условие
Lisichkin
Дата: 11.03.2003 17:40:58
Прошу пощения, что гну свою линию:

строка из Help'a BDE

Example 1: Pack a Paradox or dBASE table.

This example will pack a Paradox or dBASE table therefore 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 exclusively 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 not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive 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 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;