Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повторяющиеся событие по заданым параметрам 
:(
    Опции темы
AXS
  Дата 3.4.2010, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Снова нужен совет коллективного разума... smile
Требуется реализовать повторяющиеся события. Параметры событий в БД в формате 'startdate';'starttime';'alarmcount';'realarm';'enddate';'endtime';'actual';
'startdate' - дата начала события
'starttime' - время начала события
'alarmcount' - количество повторений события (если 0 то до enddate/endtime)
'realarm' - промежуток времени через который повторять событие
'enddate' - дата конца события
'endtime' - время конца события
'actual' - актуальность события (по умолчанию = 1; по достижении alarmcount или enddate/endtime становится = 0)

Для начала, что очевидно: SELECT * FROM `table` WHERE actual = 1;

А дальше ступор... Кто знаком с аналогичными задачами - надеюсь на содействие. 

PS: Пока сам покумекаю... (когда опишешь задачу другим, сам её лучше понимаешь smile Я поэтому всегда жене обьясняю что мне нужно сделать... Она в программировании не варит, но я сам начинаю лучше вникать в поставленые задачи smile )
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
maxdiver
Дата 3.4.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Если я правильно понял задачу, то сделай у задачи ещё дополнительный параметр - last_execution_time, который изначально равен 0. Потом, после SELECT, ты получаешь список задач, проходишь по нему, и для всех, у которых last_execution_time + realarm < текущего времени, их выполнять и обновлять для них last_execution_time. Понятно, ещё надо выкидывать те задачи, у которых end_time < текущего времени или по alarmcount задачу надо останавливать.
PM MAIL WWW ICQ   Вверх
AXS
Дата 3.4.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Цитата(maxdiver @ 3.4.2010,  09:19)
Если я правильно понял задачу, то сделай у задачи ещё дополнительный параметр - last_execution_time, который изначально равен 0. Потом, после SELECT, ты получаешь список задач, проходишь по нему, и для всех, у которых last_execution_time + realarm < текущего времени, их выполнять и обновлять для них last_execution_time. Понятно, ещё надо выкидывать те задачи, у которых end_time < текущего времени или по alarmcount задачу надо останавливать.

Сейчас проекта под рукой нет (вечером дома буду проверять), но если мы правильно поняли друг друга, надо:
1) Пары 'startdate' 'starttime' и 'enddate' 'endtime' заменить на вещественные поля (их суммы) оставив 'starttime' и 'endtime'
2) Добавить 'lastextime' - время (таймштамп точнее) последнего выполнения
3) Добавить 'alarmexcounted' - количество уже отработавших событий

И код по таймеру примерно такой:

Код

procedure TMainForm.tmrAlarmTimer(Sender: TObject);
var
  CurTime: string;
  lastextime, realarm, endtime: Double;
  alarmcount, alarmexcounted: Integer; // Количество повторений и количество уже выполненных
  actual: SmallInt;
begin
  CurTime:= FloatToStr(Date() + Time());
  SimpleQuery.Close;
  SimpleQuery.SQL.Text:='SELECT * FROM notes WHERE factual=1 AND (flastextime + frealarm) >= '+CurTime;
  SimpleQuery.Open;
  if SimpleQuery.FindFirst then
    repeat
      ExecuteMyEvent(SimpleQuery.Fields);
      lastextime:=  SimpleQuery.FieldByName('flastextime').AsFloat;
      realarm:=     SimpleQuery.FieldByName('frealarm').AsFloat;
      endtime:=     SimpleQuery.FieldByName('fendtime').AsFloat;
      alarmcount:=     SimpleQuery.FieldByName('falarmcount').AsInteger;
      alarmexcounted:= SimpleQuery.FieldByName('falarmexcounted').AsInteger;
      lastextime:=lastextime + realarm;
      inc(alarmexcounted);
      actual:=1;
      if (lastextime + realarm > endtime) or (alarmexcounted >= alarmcount) then
        actual:=0;
      AQuery.Close;
      AQuery.SQL.Text:='UPDATE notes SET '+
          'flastextime = '+FloatToStr(lastextime)+
          ', falarmexcounted = '+IntToStr(alarmexcounted)+
          ', factual = '+IntToStr(actual)+
                ' WHERE fkey='+SimpleQuery.FieldByName('fkey').AsString;
      AQuery.ExecSQL;
    until SimpleQuery.FindNext;
end;


PS: Код тупо написан в Notepad++ поэтому не обязательно рабочий ;)
PPS: Я полагаю этот код, хоть и должен работать, но всё же нуждается в оптимизации.... Посему не помечаю пока тему как решённую... 

Это сообщение отредактировал(а) AXS - 3.4.2010, 11:39
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
maxdiver
Дата 3.4.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Ну да, это я и имел в виду.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.