Topic: Как правильно сделать обсчет даты?

Где-то помню натыкался на решение, но сейчас не могу найти....
Есть начальная дата. И есть необходимость просчитать, какая дата будет через N дней. Типа учета срока хранения. Как это правильно сделать? Я так понимаю, что через вычисляемое поле? Но потыкался я там в формулах и не понял ничего. И еще вопрос-продолжение - результат будет виден сразу или необходимо закрыть-открыть карту ввода данных? А в таблицу с результатами поиска он вычисленное значение подставит? А можно ли (я так понимаю, что через некий скрипт) чтобы по истечению заданного количества дней позиция как-то отмечалась (типа статуса), что у нее вышел срок?
Ну и из разряда хотелок - можно ли сделать всплывающее окно при старте БД, в котором бы отражались близкие к окончанию срока позиции?

Ох, обнаглел я совсем, вы уж извиняйте меня, если что не так! :-[

Re: Как правильно сделать обсчет даты?

5maniac5 wrote:

Где-то помню натыкался на решение, но сейчас не могу найти....
Есть начальная дата. И есть необходимость просчитать, какая дата будет через N дней.

Тема Дата в ComboBox, пользователь Aiperi.Bekboeva задавала такой вопрос. Пример-проект в 10 посте.
http://myvisualdatabase.com/forum/viewtopic.php?id=167

Re: Как правильно сделать обсчет даты?

Можно с вычисляемым полем, либо воспользоваться скриптом, если необходимо чтобы дата на форме обновилась сразу же.

допустим есть два компонента выбора даты на форме, в первый (DateTimePicker1) вводим начальную дату , а во втором компоненте (DateTimePicker2) будет появляться дата +N дней.


у компонент выбора даты есть событие OnChange, которое срабатывает, когда пользователь выбирает дату

procedure Form1_DateTimePicker1_OnChange (Sender: string);
begin
     Form1.DateTimePicker2.Date := Form1.DateTimePicker1.Date + 5; // прибавляем 5 дней
end;

так же можно сделать поиск по интервалу дат, чтобы отфильтровать записи, у которых подходит срок.
в этом сообщении написано, как это сделать
http://myvisualdatabase.com/forum/viewt … d=207#p207


всплывающее окно при старте так же можно сделать, у компонента TableGrid есть настройки, где можно в пункте 3. указать фильтр записей, примерно такого вида:
(datefield > date('now')) and (datefield < date('now', '+5 days'))
будут показаны записи, у которых дата больше текущей и меньше текущей+5 дней

также в настройках нужно поставить галочку, Автовыполнение запроса

Dmitry.

4 (edited by 5maniac5 2014-06-17 05:32:20)

Re: Как правильно сделать обсчет даты?

Спасибо за подсказки! А можно как-то регулировать самостоятельно цифру прибавлений? Т.е. в дополнительное поле ввожу, сколько мне надо дней добавить к дате и уже тогда производится отсчет? Или просто вместо цифры 5 в Вашем примере прописывать доп.окно? Тогда еще вопрос - поле должно быть с каким свойством (текст, число, веществ.число)? спасибо1

Re: Как правильно сделать обсчет даты?

5maniac5
Дополнительное поле в базе данных для количества дней должно быть числом,  на форме разместить компонент TextBox куда будете вводить необходимое количество дней, тогда код будет таким

procedure Form1_DateTimePicker1_OnChange (Sender: string);
var
     i: integer;
begin
     // проверяем корректность ввода количества дней
     try
         i := StrToInt(Edit1.Text); // Edit1 - компонент содержит количество дней
     except
         i := 0; // если например в Edit1 ввели текст, то возникла ошибка преобразования в число
     end;

     Form1.DateTimePicker2.Date := Form1.DateTimePicker1.Date + i; // прибавляем i дней
end;


// события изменения данных в Edit1
procedure Form1_Edit1_OnChange (Sender: string);
begin
    Form1_DateTimePicker1_OnChange(''); // вызываем код из события Form1_DateTimePicker1_OnChange чтобы обновить данные
end;
Dmitry.

Re: Как правильно сделать обсчет даты?

Добрый день. Подскажите, что не так.
Создал форму,  разместил как выше сказано, скрипт скопировал, вставил над begin
end.

При запуске выдает сообщение "Undeclared identifier  Edit1".
Что забыл сделать? Извините, если вопрос покажется глупым.
Спасибо.

Re: Как правильно сделать обсчет даты?

Уже сам разобрался
вместо            i  := StrToInt(Edit1.Text);
должно быть i := StrToInt(Form1.Edit1.Text);