Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2016, 12:14   #1
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию Удаление записей из базы данных. Нужен совет

Всем доброго дня!

Прошу помочь советом. Вот код:

Код:
var
  d1, d2: TDate;
begin
 if Application.MessageBox('Удалить?','Подтвердите действие',MB_YESNO)=IDYES then
    begin
     form1.tab_zakaz_v.First;
     d1:=form1.tab_zakaz_v.FieldByName('time').AsDateTime;
     d2:=form24.DateTimePicker1.DateTime;
     while not form1.tab_zakaz_v.Eof do
     begin
      form1.tab_zakaz_v.Next;
      form24.Label3.Caption:=inttostr(form1.tab_zakaz_v.RecordCount);
      d1:=form1.tab_zakaz_v.FieldByName('time').AsDateTime;
       if d1<=d2 then
          begin
            form1.tab_zakaz_v.Edit;
            form1.tab_zakaz_v.Delete;
          end;
     end;
     form24.Close;
    end;
end;

Всё просто. Таблица просматривается от начала до конца и удаляются записи, дата которых РАНЬШЕ требуемой. По ходу перебора предполагалось, что на форму буде выводиться количество записей, оставшееся в таблице (строка выделена синим). НО этого не происходит. Форма как бы "подвисает" на всё время выполнения цикла.

Что не так? Подскажите...

Последний раз редактировалось Вадим Мошев; 23.07.2016 в 18:05.
Kvinto вне форума Ответить с цитированием
Старый 23.07.2016, 13:07   #2
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

Конечно будет подвисать. Нужно делать перход на следующую запись
Код:
while not form1.tab_zakaz_v.Eof do
begin
  form1.tab_zakaz_v.Next;
  form24.Label3.Caption:=inttostr(for m1.tab_zakaz_v.RecordCount);
  d1:=form1.tab_zakaz_v.FieldByName(' time').AsDateTime;
  if d1<=d2 then
  begin
    form1.tab_zakaz_v.Edit;
    form1.tab_zakaz_v.Delete;
   end;
   form1.tab_zakaz_v.Next
end;
А вообще можно оформить и одним запросом на удаление соответствующих записей. будет компактней и понятней
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 23.07.2016, 13:46   #3
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию

Переход на следующую запись там есть. Выше "синей" строки. Код работает, записи удаляются.
Kvinto вне форума Ответить с цитированием
Старый 23.07.2016, 13:47   #4
Kvinto
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Gregor Посмотреть сообщение
можно оформить и одним запросом на удаление соответствующих записей. будет компактней и понятней
Это как?
Kvinto вне форума Ответить с цитированием
Старый 23.07.2016, 14:00   #5
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

Код:
delete from Table1 where dt1 <= :dt2
где dt - параметр у TQuery;
Код:
Пример .
Query1.Sql.Text := 'delete from Table1 where dt1 <= :dt2'
Query1.ParamByName('d2').asDateTime := dt2
try
 Query1.ExecSql;
except
  //Тут выводи в лог ошибку
end
Долфи под рукой нет , поэтому что то типа мнемокода написал
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 23.07.2016, 14:01   #6
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

Цитата:
Сообщение от Kvinto Посмотреть сообщение
Переход на следующую запись там есть. Выше "синей" строки. Код работает, записи удаляются.
Может после Delete нужно сделать Post ?
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 23.07.2016, 14:03   #7
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию

и вообще ты сначала переходишь
Код:
form1.tab_zakaz_v.Next;
а потом работаешь с записью. а вдруг там уже EOF ?
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 23.07.2016, 14:41   #8
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

удаление пройдет быстрее чем глазом моргнуть если удалять 1 запросом и не заниматься мазахизмом
come-on вне форума Ответить с цитированием
Старый 23.07.2016, 15:25   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Edit перед Delete не нужен. Так же как и Post после Delete. И да, запросом более удачное решение
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен совет. База данных - многопользовательский доступ. KvintoSSS БД в Delphi 9 17.11.2014 21:54
Сжатие данных -> MySQL 5.5 -> innodb_file_per_table ? Нужен совет pompiduskus SQL, базы данных 0 21.05.2014 03:44
Как показать только определенное количество записей из базы данных? artemavd БД в Delphi 4 25.06.2012 05:55
База данных в Pascal ABC. Добавление и удаление записей. happypsu Помощь студентам 0 11.04.2012 01:07
Выборка по очереди записей из базы данных mulatoschka1990 Помощь студентам 3 18.03.2010 16:31