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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 10:18   #1
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию Удалить записи из таблицы, если дата в записи старше 30 дней

Как удалить записи базы если запись была создана более 30 дней.
Код:
if Optionform.RzEdit3.Text<>'' then
 begin
 data_system := Date;
s1:=strtoInt(Optionform.RzEdit3.Text);
mainform.ADOQuery2.Active:=false;
mainform.ADOQuery2.SQL.Clear;
mainform.ADOQuery2.SQL.Text := 'select Date_posting from base';

 mainform.ADOQuery2.Open;

 While not mainform.ADOQuery2.Eof do
  begin
     mainform.ADOQuery2.Next;
end;

  if  data_system-s>s1 then
begin
mainform.ADOQuery2.SQL.Clear;
mainform.ADOQuery2.SQL.Text := 'DELETE FROM base WHERE Date_posting>'
    end;
Aleksandr вне форума Ответить с цитированием
Старый 28.03.2013, 10:57   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Рассчитать в какую-нибудь переменную дату "30 дней назад" и передать ее как параметр в запрос.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 28.03.2013, 11:16   #3
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

не уверен что подойдет к какой-то конкретной СУБД, но для Firebird примерно:
Код:
DELETE FROM base WHERE 'now' - date_posting > 30
now - можно заменить каким-либо параметром и подойдет под любую БД
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 28.03.2013, 15:03   #4
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Сделал вот так, но выдает ошибку.
Код:
var

data_system: TDate;
s:TDate;
begin
if Optionform.RzEdit3.Text<>'' then
 begin
data_system := Date;
mainform.ADOQuery2.Active:=false;
mainform.ADOQuery2.SQL.Clear;
mainform.ADOQuery2.SQL.Text := 'DELETE FROM base WHERE ''data_system'' - date_posting >' +Optionform.RzEdit3.Text;
mainform.ADOQuery2.Open;
mainform.ADOQuery2.Post;
    end;
Изображения
Тип файла: jpg ошибка.jpg (13.0 Кб, 287 просмотров)

Последний раз редактировалось Aleksandr; 28.03.2013 в 15:05.
Aleksandr вне форума Ответить с цитированием
Старый 28.03.2013, 15:14   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

та ошибка (её очень просто устранить) которую Вы получаете,
ничто, по сравнению с ошибкой в реализации подхода!!

Вы получаете ошибку потому как пытаетесь "ОТКРЫТЬ" (Open) набор данных.
Это допустимо только в том случае, если запрос возвращает набор данных (команда SELECT ... )
в случаях выполнения команды надо вызывать метод .ExecSQL;
Код:
mainform.ADOQuery2.ExecSQL;
метод .Post вообще не из этой "оперы" и вызывать его в данном месте вообще не надо!

НО! Это всё технические детали.
Ваш запрос всё равно работать НЕ БУДЕТ!

давайте начнём с того, что Вы нам скажете, какая у Вас СУБД ?

И потом, Вы точно уверены, что записи нужно из таблицы УДАЛЯТЬ?
Подумайте, что будет, если кто-то переведёт время на год вперёд и запустит Вашу программу?
Ведь намного удобнее и проще НЕ ВЫБИРАТЬ ненужные записи (добавить условие в select, например)
Откатить удаление пользователю уже не удастся, записи будут удалены безвозратно!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.03.2013, 15:29   #6
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

База у меня сделана на MySQL. Данные мне все таки нужно удалять так как у меня каждую секунду записываются данные из com порта. И поэтому база очень сильно растет. Я в Optionform.RzEdit3 указываю количество дней по истичении которых я удаляю записи.
Aleksandr вне форума Ответить с цитированием
Старый 28.03.2013, 15:32   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Согласен в какой-то мере с Сергеем, но удалять иногда приходится. И если очень сильно хочется удалить, то сделал бы так
Код:
var s: String;
    d: TDateTime;

  ADOQuery1.SQL.Text:='DELETE FROM base WHERE date_posting<=:CalcDate';
  d:=Trunc(DateTimePicker1.DateTime); //если плясать от заданной даты
//или
  d:=Date-30; //если плясать от системной за минусом 30 дней
  ADOQuery1.Parameters.ParamByName('CalcDate').Value:=d;
  ADOQuery1.ExecSQL;
Что касается системной даты, то можно запросить её и с SQL-сервера. Понадежней будет, хотя тоже не истина в последней инстанции
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.03.2013 в 15:42.
Аватар вне форума Ответить с цитированием
Старый 28.03.2013, 15:54   #8
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Всем огромное спасибо.
Aleksandr вне форума Ответить с цитированием
Старый 28.03.2013, 16:54   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Что касается системной даты, то можно запросить её и с SQL-сервера. Понадежней будет, хотя тоже не истина в последней инстанции
угу. а ещё лучше будет, если в запросе прописать работу с датами прямо в запросе (тогда и будет браться дата с сервера).
К сожалению, не владею MySQL в нужном объёме.

ну, согласно доке это будет примерно так:
Код:
 ADOQuery1.Close;  {необязательно, на всякий случай...}

 ADOQuery1.SQL.Text:='DELETE FROM base '+
     '   WHERE TO_DAYS(NOW()) - TO_DAYS(date_posting) > 30';
 ADOQuery1.ExecSQL;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.03.2013, 21:19   #10
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

А как сделать так чтобы делать эту проверку каждый день?
Aleksandr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь между значением атрибута в записи одной таблицы и наименованием сторонней таблицы АлексИванов Общие вопросы по программированию, компьютерный форум 1 21.08.2012 15:37
Вывести список студентов старше 17 лет. Записи. Паскаль. iSkulll Помощь студентам 2 10.02.2011 20:29
Вычитание дат(дата-дата=кол.дней) zallza Общие вопросы Delphi 1 31.05.2010 22:50
Как из одной таблицы удалить записи, содержащиеся в другой Kingson Microsoft Office Access 4 13.04.2010 22:39
Отредактируйте,пожалуйста,задачу на записи, вычисляющую дату через m дней. JiLiYa Паскаль, Turbo Pascal, PascalABC.NET 2 26.12.2008 09:29