|
Тема
|
Съвет относно DBASE TDBGRID
|
|
Автор |
vaskko76 (непознат
) |
Публикувано | 26.09.06 14:56 |
|
Здравейте,
чрез table1.delete изтривам запис от TTable обаче въпреки че не се визуализира в TDBGRID записа си остава в DBF файла как запис може да се изтрие окончателно? Моля за съвет
| |
Тема
|
Re: Съвет относно DBASE TDBGRID
[re: vaskko76]
|
|
Автор |
Beco_ (Boogie chillun) |
Публикувано | 26.09.06 23:06 |
|
Добър въпрос. Въпреки, че веднага възниква друг: защо ти е нужно това ?
Маркираните за изтрити записи не се появяват с ТТаble, или SQL изрази. Има смисъл да ги триеш само, ако добавяш/изтриваш много на бр. записи от една таблица. Но ако наистина е така, значи нещо не си догледал в дизайна на БД. Но, ако все пак искаш да ги триеш перманентно виж това:
- Packing tables
| |
Тема
|
Re: Съвет относно DBASE TDBGRID
[re: vaskko76]
|
|
Автор | grey (Нерегистриран) |
Публикувано | 06.10.06 12:44 |
|
Ето една работеща функция. Взел съм я от примерните програми на Delphi.
Тази функция премахва физически маркираните като изтрити записи и освен това преиндексира асоциираните индекси. Не забравяйте да добавите BDE към клауза USES.
{USES BDE}
function PackDBaseTable(Table: TTable):Boolean;
var
WasActive: Boolean;
TempTable: TTable;
vDateOfOldFile:TDateTime;
FileHandle : Integer;
vFilePathName:string;
begin
result := True;
WasActive := Table.Active;
Screen.Cursor := crHourglass;
TempTable := TTable.Create(Table.Owner);
try
try
// close if open
if WasActive then
Table.Close;
TempTable.Active := False;
TempTable.DatabaseName := Table.DatabaseName;
TempTable.TableName := Table.TableName;
TempTable.Exclusive := True;
if (TempTable.DatabaseName <> '') and
(Pos('\',TempTable.DatabaseName) > 0) then
vFilePathName := TempTable.DatabaseName + TempTable.TableName
else
vFilePathName := ExtractFilePath(Application.ExeName) + TempTable.TableName;
try
vDateOfOldFile := FileDateToDateTime(FileAge(vFilePathName));
except
vDateOfOldFile := 0;
end;
try
TempTable.Open;
except
beep;
ShowMessage('Файл ' + Table.TableName + ' е отворен от друг потребител!' +
#13 + 'Индексирането е невъзможно.' +
#13 + 'Опитайте по късно.');
result := False;
end;
if TempTable.Active then
begin
// pack the table
Check (DBIPackTable(TempTable.DBHandle, TempTable.Handle, nil, nil, True));
TempTable.Close;
if vDateOfOldFile > 0 then
begin
FileHandle := FileOpen(vFilePathName,fmOpenWrite or fmShareDenyNone);
if FileHandle > 0 then
begin
{valid file handle}
FileSetDate(FileHandle, DateTimeToFileDate(vDateOfOldFile));
FileClose(FileHandle);
end
else
begin
{Open error: FileHandle = negative DOS error code}
end;
end;
end;
except
result := False;
raise;
end;
finally
TempTable.Free;
Screen.Cursor := crDefault;
// eventually reopen
if WasActive then
Table.Open;
end;
end;
| |
|
|
|
|