Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление некоторых записей [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо