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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2013, 02:51   #1
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
Восклицание Рассчитать дату рождения

Здравствуйте!
Подскажите пожалуйста, столкнулся с такой проблемой. Имеется БД на FireBird компонент для доступа к ней из Delphi FIBDataset, Fibtransaction, Datasource , DBGrid.
В БД имеется таблица TDeti c полями (ID(integer), DATEBIRTH(Date), FIO(varchar as 60), MarkARHIV(smallint)) необходимо сделать чтобы при достижении определенного возраста например 18 лет в поле MarkARHIV(smallint) перезаписывал параметр с 0 на 1.
Подскажите как это можно правильно реализовать.

Как в Delphi узнать возраст это я знаю через YearsBetween но если при запуске программы каждый раз проходить по набору данных данной функцией и перезаписывать то мне кажется что это будет очень долгий процесс можно это как то усовершенствовать или через запрос может как то это делается при выводе данных через.

Последний раз редактировалось DIMASIKXXX32; 24.01.2013 в 03:06.
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 24.01.2013, 03:31   #2
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Ну повесь job на БД. Пусть еженочно отрабатывает и проставляет.
Ежели конечно огнептиц держит job'ы.
Если нет можно написать програмку которая будет запускаться планировщиком каждую ночь, можно службу нарисовать.
Можно вьюху собрать в которой case'ом сделать твое поле 0/1 в зависимости от текущей даты.
Можно процедурку написать которая будет запускаться программой при входе. Но тогда стоит смотреть запускалась ли она сегодня ранее. Т.к. может вызвать затуп при одновременной работе пользователей.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)

Последний раз редактировалось rdama; 24.01.2013 в 03:33.
rdama вне форума Ответить с цитированием
Старый 24.01.2013, 03:45   #3
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
Ну повесь job на БД. Пусть еженочно отрабатывает и проставляет.
Ежели конечно огнептиц держит job'ы.
Если нет можно написать програмку которая будет запускаться планировщиком каждую ночь, можно службу нарисовать.
Можно вьюху собрать в которой case'ом сделать твое поле 0/1 в зависимости от текущей даты.
Можно процедурку написать которая будет запускаться программой при входе. Но тогда стоит смотреть запускалась ли она сегодня ранее. Т.к. может вызвать затуп при одновременной работе пользователей.
Спасибо за советы. прислушаюсь
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 24.01.2013, 09:08   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
необходимо сделать чтобы при достижении определенного возраста например 18 лет в поле MarkARHIV(smallint) перезаписывал параметр с 0 на 1.
я не знаю, конечно, Вашей задачи, но, есть высокая доля вероятности, что Вы придумали структуру плохо!
я бы сделал это поле ВЫЧИСЛЯЕМЫМ (либо в запросе, либо во вьюхе, не суть важно), причём не просто вычисляемым, но зависым от переданной даты.
Тогда можно получить список на определённую дату с проставленным признаком.
И, кстати, в этом же запросе я бы получал сразу и возраст на текущую дату.
Проставление признака (как Вы это придумали) может сыграть с вами злую шутку - если понадобится сформировать выборку за прошлый месяц/год(а), все имеющиеся дети (которые были в прошлом) перестаную существовать..
но, конечно, решать Вам!


Цитата:
Как в Delphi узнать возраст это я знаю через YearsBetween
это, кстати, строго говоря НЕВЕРНО! Вам нужно число полных лет от момента рождения, а не число лет между датами.
подумайте, если, например, ребёнок родился 31 декабря 2000 года, 1 января 2001 года какой у него возраст?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.01.2013, 11:13   #5
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я не знаю, конечно, Вашей задачи, но, есть высокая доля вероятности, что Вы придумали структуру плохо!
я бы сделал это поле ВЫЧИСЛЯЕМЫМ (либо в запросе, либо во вьюхе, не суть важно), причём не просто вычисляемым, но зависым от переданной даты.
Тогда можно получить список на определённую дату с проставленным признаком.
И, кстати, в этом же запросе я бы получал сразу и возраст на текущую дату.
Проставление признака (как Вы это придумали) может сыграть с вами злую шутку - если понадобится сформировать выборку за прошлый месяц/год(а), все имеющиеся дети (которые были в прошлом) перестаную существовать..
но, конечно, решать Вам!



это, кстати, строго говоря НЕВЕРНО! Вам нужно число полных лет от момента рождения, а не число лет между датами.
подумайте, если, например, ребёнок родился 31 декабря 2000 года, 1 января 2001 года какой у него возраст?
Спасибо за совет. Да кстати я уже заметил что через YearBetween не катит. а как точную дату подсчитать. И еще в запросе мне потом их не над находить это метка идет что типа они в архиве и на оборот убирает их из запроса через where

А может попробовать через YearSpan он выводит с дробной частью более точно просто обработать это дело

Последний раз редактировалось DIMASIKXXX32; 24.01.2013 в 11:26.
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 24.01.2013, 11:40   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

WHERE DATEADD(YEAR,18,DATEBIRTH)<CURRENT_ DATE - вернет всех кому больше 18 лет
WHERE DATEADD(YEAR,18,DATEBIRTH)=CURRENT_ DATE - вернет всех кому сегодня исполнилось 18 лет
WHERE DATEADD(YEAR,18,DATEBIRTH)>CURRENT_ DATE - вернет всех кому еще нет 18 лет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
по дате рождения и текущей дате (день, месяц, год) определить сколько дней до дня рождения (код на ПАСКАЛЕ) Николай1 Помощь студентам 1 16.02.2012 09:07
Рассчитать параметры TURBOMAX Помощь студентам 0 12.02.2012 21:36
Рассчитать выражение annosinceva Фриланс 11 26.03.2010 22:35
Как в профиле изменить дату рождения? Cj_ О форуме и сайтах клуба 2 16.11.2009 17:08
программа, которая запрашивает дату рождения и печатает название соответствующего знака Зодиака Алёночка2008 Помощь студентам 4 14.11.2008 10:49