|
Вопрос # 5 410/ вопрос решён / |
|
Доброго времени суток уважаемые эксперты! Столкнулся с проблемой в базе есть столбец «Полныхлет», в нем храниться полный возраст студента, высчитывается исходя из даты рождения, когда добавляют студента. Проблема в том, что по истечению года например возраст должен поменяться, после того как студент уже занесен в базу. Поэтому я хочу сделать чтобы после запуска программы заново просчитывался полный возраст, для каждого студента. У меня не получается сделать перерасчет каждой записи в базе, при создание формы. Ниже приведен код, который компилируется, но после запуска выдает ошибку. Возможно он вообще не правильный. Очень прошу вас помочь. За ранние благодарен за помощь.
Приложение: Переключить в обычный режим- procedure TForm2.FormCreate(Sender: TObject);
- var
- today: TDateTime;
- yearcount:integer;
- begin
-
- begin
-
-
- begin
- today:=date();
-
-
-
-
-
- end;
- end;
-
- end;
 |
Вопрос задал: alexlafa (статус: Посетитель)
Вопрос отправлен: 14 июня 2011, 14:20
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: corban
Здравствуйте, alexlafa!
Как же работать с таблицами если дата-модуль еще не инициализировался? перенеси этот код в дата-модуль...
 |
Ответ отправил: corban (статус: 2-ой класс)
Время отправки: 15 июня 2011, 09:08
Оценка за ответ: 5
Комментарий к оценке: Ваш ответ очень помог!
|
Мини-форум вопроса
Всего сообщений: 36; последнее сообщение — 15 июня 2011, 12:00; участников в обсуждении: 6.
Страницы: [1] [2] [Следующая »]
|
min@y™ (статус: Доктор наук), 14 июня 2011, 14:26 [#1]:
Про вычисляемые поля слыхал?
Нафига хранить в базе возраст, если в ней же хранится дата рождения? Да ещё и пересчитывать всё это безобразие...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 15:12 [#2]:
Возраст нужен для отчетности.
|
|
min@y™ (статус: Доктор наук), 14 июня 2011, 15:15 [#3]:
Цитата (alexlafa):
Возраст нужен для отчетности.
Ну так и вычисляй его, когда нужно. Текущая дата минус дата рождения, вот и всё.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 14 июня 2011, 15:48 [#4]:
повтор вопроса № 5403, не?
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 16:25 [#5]:
Нет не повтор!
|
|
Gooddy (статус: 3-ий класс), 14 июня 2011, 18:00 [#6]:
...
Исключение или именно ошибка?
Чисти код! Чисти код! Чисти код!
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 18:24 [#7]:
вопрос 5403:Цитата (alexlafa):
Зарание благодарен!
этот вопрос:Цитата (alexlafa):
За ранние благодарен за помощь. за "ранние" чего? ответы? 
Заранее
и потом, заранее не благодарят
повторю вопрос min@y™: про вычисляемые поля слышал? создай вычисляемое поле. оно будет выдавать количество полных лет и при этом вычисляться каждый раз при каждом запросе. и вводить его не надо - всё само сделается. и в базе храниться не будет - ни места не занимает, ни обновления не требует.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 18:32 [#8]:
Цитата (alexlafa):
Ниже приведен код, который компилируется, но после запуска выдает ошибку а ошибку мы должны угадывать? у меня телепатор сейчас в ремонте, ошибку угадать не могу.
глянул код... ой, мамочки...
procedure TForm2.FormCreate(Sender: TObject);
var
today: TDateTime;
yearcount:integer;
begin
if datamodule3.ADOTable1['Полныхлет'].recordcount > 0 then
begin
datamodule3.ADOTable1['Полныхлет'].First;
while not datamodule3.ADOTable1['Полныхлет'].Eof do
begin
today:=date();
yearcount := (trunc(today) - trunc(strtodate (datamodule3.ADOTable1['Дата рождения']))) div 365;
datamodule3.ADOTable1['Полныхлет'].Edit;
datamodule3.ADOTable1['Полныхлет']:=IntToStr(yearcount);
datamodule3.ADOTable1['Полныхлет'].Post;
datamodule3.ADOTable1['Полныхлет'].Next;
end;
end;
datamodule3.ADOTable1['Полныхлет'].Close;
end;
количество полных лет вычисляем, отнимая даты и результат поделив на 365? мда...
а количество полных лет ещё и храним в ТЕКСТОВОМ виде?!
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 18:36 [#9]:
Ошибка вот такого содержания, это на событии formshow, а на создание другая ошибка была.
Project project1.exe raised exceotion class EVariantInvalidOpError with message
'Invalid variant operation'. Process stoped. Use Step or run continue.
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 18:45 [#10]:
попробуй удали этот код и перезапусти - ошибка останется?
и строку, на которой ошибка произошла надо указать
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 18:46 [#11]:
Егор: Полныхлет храниться в текстовом! Я сделал, вычесляймое поле, оно считалось, но не заносилось в базу, и не хранилось, а так же перестали добовляться студенты по не понятным мне причинам. Я просто уже сделал запросы, их множество, целая куча разных!А как сделать запрос не имея столбца в базе незнаю. Разбираться или менять все запросы нету времени осталось два дня до рециндента. И поэтому мне надо сделать пересчет полныхлет, и после изменять данные в базе.
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 18:48 [#12]:
база ms access?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 18:49 [#13]:
//Строчка на которой останавливаеться процесс!
if datamodule3.ADOTable1['Полныхлет'].recordcount > 0 then
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 18:49 [#14]:
Да база Access!
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 18:57 [#15]:
Цитата (alexlafa):
//Строчка на которой останавливаеться процесс!
if datamodule3.ADOTable1['Полныхлет'].recordcount > 0 then
а если так?
... datamodule3.ADOTable1.recordcount ...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 19:08 [#16]:
Сделал так, зацикливаеться, и с базой твориться что то ужасное))
var
today: TDateTime;
yearcount:integer;
begin
if datamodule3.ADOTable1.recordcount > 0 then
begin
datamodule3.ADOTable1.First;
while not datamodule3.ADOTable1.Eof do
begin
today:=date();
yearcount := (trunc(today) - trunc(strtodate (datamodule3.ADOTable1['Дата рождения']))) div 365;
datamodule3.ADOTable1.Edit;
datamodule3.ADOTable1['Полныхлет']:=IntToStr(yearcount);
datamodule3.ADOTable1.Post;
datamodule3.ADOTable1.Next;
end;
end;
datamodule3.ADOTable1.Close;
end;
|
|
bugmenot (статус: 3-ий класс), 14 июня 2011, 19:09 [#17]:
Цитата (alexlafa):
рециндента
Что такое рециндент?
Цитата (Егор):
отнимая даты и результат поделив на 365? мда...
Вы будете смеяться, но такая же аппроксимация (чуток точнее) предлагается в DateUtils.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 19:16 [#18]:
bugmenot: Это инженер-программист, на каком не будь предприятии, которому мы сдаем на проверку готовый дипломный проект, и он пару дней «шариться» в проге и пояснительной записке, ищет ошибке и указывает их, и на защите с тебя за них спрашивают. Проблема в том что после рециндента нечего нельзя менять в программе или записке!
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 19:24 [#19]:
Цитата (alexlafa):
с базой твориться что то ужасное и что же?
Цитата (alexlafa):
datamodule3.ADOTable1.Edit;
datamodule3.ADOTable1['Полныхлет']:=IntToStr(yearcount);
datamodule3.ADOTable1.Post;
datamodule3.ADOTable1.Next;
блин, заставь дурака богу молиться... я же не сказал ВЕЗДЕ убирать ['Полныхлет'], а только в одном месте
возвращай обратно
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 19:25 [#20]:
Цитата (alexlafa):
Это инженер-программист
тогда это не "рециндент", а рецензент. от слова "рецензия"
)))))))))))))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|