|
Вопрос # 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]
|
alexlafa (статус: Посетитель), 14 июня 2011, 19:28 [#21]:
ДА )))
|
|
alexlafa (статус: Посетитель), 14 июня 2011, 19:32 [#22]:
Егор: //Если убрать только в одном месте то выдаеться такая же ошибка, останавливаясь на этой строке
datamodule3.ADOTable1['Полныхлет'].First;
|
|
Егор (статус: 10-ый класс), 14 июня 2011, 19:36 [#23]:
а, да. гоню. всё правильно сделал.
пройдись отладчиком - почему зацикливается-то? и что означает фраза "с базой твориться что то ужасное"?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
bugmenot (статус: 3-ий класс), 14 июня 2011, 21:12 [#24]:
На самом деле тут мало смешного, ибо программист в силу особенностей мышления стремится писать без ошибок. Лично я бы не допустил к работе, если бы меня таким неприличным словом назвали.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Мережников Андрей (статус: Абитуриент), 14 июня 2011, 21:43 [#25]:
Цитата (Егор):
datamodule3.ADOTable1['Полныхлет']:=IntToStr(yearcount);
вот это надо подправить на
datamodule3.ADOTable1['Полныхлет'].value:=IntToStr(yearcount);
или
datamodule3.ADOTable1['Полныхлет'].asinteger:=yearcount;
вообще хранить числовые значения в строковых полях - это "супер"
|
|
alexlafa (статус: Посетитель), 15 июня 2011, 05:33 [#26]:
Попробовал подправить двумя вариантами, у обоих точно такая же реакция как и раньше. Из ДБГрида исчезают записи, полоса
прокрутки о пускается вниз и не подниматься вверх, зацикливаеться.
datamodule3.ADOTable1.FieldByName('Полныхлет').Value:=IntToStr(yearcount);
datamodule3.ADOTable1.FieldByName('Полныхлет').asinteger:= yearcount ;
|
|
Мережников Андрей (статус: Абитуриент), 15 июня 2011, 05:35 [#27]:
Цитата (alexlafa):
yearcount := (trunc(today) - trunc(strtodate (datamodule3.ADOTable1['Дата рождения']))) div 365;
эту конструкцию надо заменить на:
yearcount:=YearsBetween(today,datamodule3.ADOTable1['Дата рождения'].asDatetime);
вопрос зацикливания пока не рассматривал
|
|
alexlafa (статус: Посетитель), 15 июня 2011, 05:47 [#28]:
YearsBetween - а это что?!
|
|
Мережников Андрей (статус: Абитуриент), 15 июня 2011, 05:48 [#29]:
обычно зацикливание происходит, если вот эту строку
Цитата (alexlafa):
datamodule3.ADOTable1.Next;
либо забыли совсем, либо поставили после цикла.
еще вариант, вместо
Цитата (alexlafa):
not datamodule3.ADOTable1.Eof
поставили
not datamodule3.ADOTable1.Bof
или not забыли
|
|
alexlafa (статус: Посетитель), 15 июня 2011, 05:55 [#30]:
yearcount :=YearsBetween(today,datamodule3.ADOTable1.FieldByName('Дата рождения').asDatetime); все равно такаяже реакция %-(
|
|
alexlafa (статус: Посетитель), 15 июня 2011, 05:58 [#31]:
Мережников Андрей: Пересмотрел процедуру полность, все на своих местах, и так как надо!
|
|
Мережников Андрей (статус: Абитуриент), 15 июня 2011, 06:02 [#32]:
Цитата (alexlafa):
YearsBetween - а это что?!
функция такая. Описание можно найти в help. Я уже писал, что мои поправки не влияют на зацикливание.
Выше уже давался совет - проверить выполнение программы трассировкой.
|
|
Мережников Андрей (статус: Абитуриент), 15 июня 2011, 06:10 [#33]:
к ADOTable1 "подвешен" какой-то DBGrid? Там "случайно" не прописана какая-нибудь реакция на события?
точно используется datamodule3.adotable1.edit, а не append?
|
|
Мережников Андрей (статус: Абитуриент), 15 июня 2011, 06:11 [#34]:
Цитата (alexlafa):
все на своих местах, и так как надо!
если бы было так, как надо, то и работало бы так, как надо.
|
|
alexlafa (статус: Посетитель), 15 июня 2011, 06:26 [#35]:
К ADOTable1 "подвешен" какой-то DBGrid? Да, есть DBGrid, подвешанный к ADOtalble! У меня событие только одно в DBGrid-е DBGrid1CellClick событие для отображения студента, в Adotable вообще нет!
|
|
alexlafa (статус: Посетитель), 15 июня 2011, 12:00 [#36]:
Сделал на событие создание датамодуль, сделал еще один ADOTALBE2, а то если бы использовал ADOTALBE1 то Дбгрид пустой был почему то пукстой, теперь пересчитывает, и все работает. Благодарю всех за помощь
|
15 июня 2011, 12:02: Статус вопроса изменён на решённый (изменил автор вопроса — alexlafa)
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|