|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как вычислить рекуррентную формулу
Здравствуйте!!!
Я делаю программу погрузки судна, где мне надо вычислить динамическую остойчивость, а она вычисляется рекуррентной формулой. Есть таблица http://cs413218.vk.me/v413218232/4d82/hJvBvamCAc0.jpg (на рисунку внизу возле диаграммы) и динам остойчивость вычисляется след образом вторая строка столбца Ld вычисляется тк Ld [2]=Lst[1]+Lst[2]+Ld[1] Я написала так Код: Код:
procedure TForm6.Table5CalcFields(DataSet: TDataSet); var i: integer; Sum,a: double; begin Sum := 0; Table5.Edit; Sum := Table5.FieldByName('Lst').Value; //Самая первая сумма Table5.FieldByName('Ld').Value := Sum; Table5.Post; while not Table5.Eof do begin Sum := Sum + Table5.FieldByName('Lst').Value; Table5.Edit; Table5.FieldByName('Ld').Value := Sum; Table5.Post; Table5.Next; end; end; Но не вычисляет! Буду очень благодарна! |
#2
|
||||
|
||||
Цитата:
Чтобы вычислить выражение "Ld [2]=Lst[1]+Lst[2]+Ld[1]", тебе нужно переместиться к записи с кодом 1, прочитать оттуда значения полей "Lst" и "Ld", потом переместиться к записи с кодом 2, прочитать оттуда значение поля "Lst", всё сложить и записать результат в поле "Ld". И всё это вряд-ли может располагаться в обработчике события "OnCalcFields". Пример вычисления выражения "Ld [2]=Lst[1]+Lst[2]+Ld[1]": Код:
var Sum: Double; begin Sum := 0; if Table5.Locate('Kodo', 1, []) then Sum := Sum + Table5.FieldByName('Lst').Value + Table5.FieldByName('Ld').Value else raise Exception.Create('Не найдена нужная запись'); if Table5.Locate('Kodo', 2, []) then Sum := Sum + Table5.FieldByName('Lst').Value else raise Exception.Create('Не найдена нужная запись'); Table5.Edit; Table5.FieldByName('Ld').Value := Sum; Table5.Post; end; |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
YuliyaKar (19.11.2013)
|
#3
|
|||
|
|||
А как так, что не в событии OnCalcFields, поле же вычисляемое.
Я сейчас попробую, посмотрим ,что получится Пишет ошибку, что переполнен стэк Последний раз редактировалось M.A.D.M.A.N., 19.11.2013 в 11:39. |
#4
|
||||
|
||||
Бесконечная рекурсия походу.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
|||
|
|||
По ходу да! Убрала этот код - работает, как и раньше!
|
#6
|
||||
|
||||
Цитата:
Событие "OnCalcFields" предназначено для вычисления полей в текущей записи. Поэтому во-первых в нём не нужно делать циклы с прохождением по записям и во-вторых в нём вообще запрещено перемещаться по записям. |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
YuliyaKar (19.11.2013)
|
#7
|
|||
|
|||
Теперь пишет, что не может переконверитировать значение Null в Double.
Поместила в событие FormShow. Просто куда его еще притулить - даже не знаю (( |
#8
|
||||
|
||||
Цитата:
Цитата:
|
#9
|
|||
|
|||
Я уже попробовала AsFloat.
Теперь пишет что это значение не типа float. По ходу типы не может совместить. Я переделала по событию нажатия кнопки, чтоб столбец Lst не был пустым Последний раз редактировалось YuliyaKar, 19.11.2013 в 12:28. |
#10
|
|||
|
|||
Код:
Sum := 0; if Table5.Locate('Kodo', 1, []) then Sum := Sum + Table5.FieldByName('Lst').AsFloat+ Table5.FieldByName('Sum').AsFloat else raise Exception.Create('Не найдена нужная запись'); for i:=2 to 8 do begin if Table5.Locate('Kodo', i, []) then Sum := Sum + Table5.FieldByName('Lst').AsFloat else raise Exception.Create('Не найдена нужная запись'); Table5.Edit; Table5.FieldByName('Sum').Value := Sum; Table5.Post; end; Написала вот так и поместила все в FormShow! Пока работает Polismen СПАСИБО!!! П.С. Polismen посмотрите, пожалуйста эту тему! Я пробую вставить значения строки в столбец1!! http://www.delphisources.ru/forum/sh...322#post133322 |