![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление некоторых записей [D7, dBase, FoxPro]
Demoniak © (2004-05-05 11:20:00)Надо удалить все записи содержащие подстроку 'Bad' в таблице... Я делаю так, но удаляется только первая запись содержащая нужную подстроку...
dbf.DisableControls;
dbf.First;
try
while not dbf.Eof do begin
if (pos('Bad', dbf.FieldByName('socksstat').AsString ) <> 0) then begin
dbf.Delete;
end;
dbf.Next;
application.ProcessMessages;
end;
finally
dbf.EnableControls;
dbf.First;
end;
Demoniak (2004-05-05 13:40:00) [1]Все- сделал сенкс
Кщд (2004-05-05 13:27:00) [2]запакуем после удаления?
Delphi syntax
function DbiPackTable (hDb: hDBIDb; hCursor: hDBICur; pszTableName: PChar; pszDriverType: PChar; bRegenIdxs: Bool): DBIResult stdcall;
Description
DbiPackTable optimizes table space by rebuilding the table associated with hCursor and releasing any free space.
Demoniak (2004-05-05 13:13:00) [3]Например, если удаляться первые 100 записей из скажем 1000, то ползунок скроллбара вообще будет не в начале скроллбара, даже при установки активной первую запись..
Demoniak (2004-05-05 13:11:00) [4]Ясно) Я в общем делаю так:
dbf.DisableControls;
dbf.First;
try
while dbf.Locate('socksstat', 'Bad', [loCaseInsensitive, loPartialKey]) do begin
dbf.Delete;
application.ProcessMessages;
end;
finally
dbf.EnableControls;
dbf.First;
end;
Все удаляется нормально, НО!! После удаления ненужных записей, DBGrid неправильно отображает данные. А именно: скроллбар как-бы быстрее прокручивается там, где были ненужные записи ). Сложно это объяснить однако, в общем скол глючит как-то странно...
Курдль (2004-05-05 12:32:00) [5]
> Я уже говорил, что НЕ могу использовать SQL запросы... А
> фильтровать БД - не подходит, надо чтоб ненужные записи
> были физически удалены...
Я разве сказал "спрятать"? Я сказал: "отфильтровать и поудалять оставшиеся"!
Соловьев (2004-05-05 12:28:00) [6]
> подстроку 'Bad'
у меня было такое что оператор(руки бы поотрывал) писал вместо русских символов английские и наоборот, благо выглядят одинаково. В твое ситуации надо попробовать разные комбинации букв - русских В,а и английских - B,a
sniknik (2004-05-05 12:12:00) [7]в dBase, FoxPro Delete не удаляет физически, и sqd не удаляет и твой метод тоже.
Demoniak (2004-05-05 12:07:00) [8]2 Sergey13 ©
Регистр такой же...
2 Курдль ©
Я уже говорил, что НЕ могу использовать SQL запросы... А фильтровать БД - не подходит, надо чтоб ненужные записи были физически удалены...
Курдль (2004-05-05 12:01:00) [9]Выбран методически неверный способ. Нельзя одновременно двигаться по набору данных и удалять его записи. Вам дали простой и изящный метод решения проблемы в [2] - ему и следуйте.
Если уж совсем невмоготу, как хочется попользоваться методом delete, то сначала отфильтруйте весь набор данных по Вашему условию, а потом уж пройдитесь по нему и удалите все, что видно.
Sergey13 (2004-05-05 11:55:00) [10]2Demoniak ©
Посмотри на регистр символов. Может тут что.
Demoniak (2004-05-05 11:54:00) [11]2 Johnmen © :
Нет )) Там видно в ДБГриде, что еще штук 20 точно с таким условием...
Johnmen (2004-05-05 11:53:00) [12]>Demoniak © (05.05.04 11:47) [3]
>Вот так, тоже не работает:
Значит только первая запись удовлетворяет условию...
Demoniak (2004-05-05 11:47:00) [13]2 Johnmen © :
Вот так, тоже не работает:
dbf.DisableControls;
dbf.First;
try
while not dbf.Eof do begin
if (pos('Bad', dbf.FieldByName('socksstat').AsString ) <> 0) then begin
dbf.Delete;
end else dbf.Next;
// application.ProcessMessages;
end;
finally
dbf.EnableControls;
dbf.First;
end;
2 Sergey13 © :
Не могу так сделать, т.к. я не использую BDE и компонент Query соответственно тоже....
Sergey13 (2004-05-05 11:35:00) [14]Как вариант
delete from dbf_table
where socksstat like '%Bad%'
Johnmen (2004-05-05 11:31:00) [15]else dbf.Next;
Убрать application.ProcessMessages;