Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.11.2013, 10:47
YuliyaKar YuliyaKar вне форума
Прохожий
 
Регистрация: 13.11.2013
Сообщения: 37
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как вычислить рекуррентную формулу

Здравствуйте!!!
Я делаю программу погрузки судна, где мне надо вычислить динамическую остойчивость, а она вычисляется рекуррентной формулой.
Есть таблица 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  
Старый 19.11.2013, 11:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от YuliyaKar
Здравствуйте!!!
Я делаю программу погрузки судна, где мне надо вычислить динамическую остойчивость, а она вычисляется рекуррентной формулой.
Есть таблица http://cs413218.vk.me/v413218232/4d82/hJvBvamCAc0.jpg
(на рисунку внизу возле диаграммы)
и динам остойчивость вычисляется след образом
вторая строка столбца Ld вычисляется тк
Ld [2]=Lst[1]+Lst[2]+Ld[1]
Вообще-то над таблицами так не издеваются.
Чтобы вычислить выражение "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  
Старый 19.11.2013, 11:34
YuliyaKar YuliyaKar вне форума
Прохожий
 
Регистрация: 13.11.2013
Сообщения: 37
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А как так, что не в событии OnCalcFields, поле же вычисляемое.
Я сейчас попробую, посмотрим ,что получится

Пишет ошибку, что переполнен стэк

Последний раз редактировалось M.A.D.M.A.N., 19.11.2013 в 11:39.
Ответить с цитированием
  #4  
Старый 19.11.2013, 11:40
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Бесконечная рекурсия походу.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 19.11.2013, 11:41
YuliyaKar YuliyaKar вне форума
Прохожий
 
Регистрация: 13.11.2013
Сообщения: 37
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

По ходу да! Убрала этот код - работает, как и раньше!
Ответить с цитированием
  #6  
Старый 19.11.2013, 11:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от YuliyaKar
Пишет ошибку, что переполнен стэк
Повторю ещё раз - этот код вряд-ли может располагаться в обработчике события "OnCalcFields".
Событие "OnCalcFields" предназначено для вычисления полей в текущей записи. Поэтому во-первых в нём не нужно делать циклы с прохождением по записям и во-вторых в нём вообще запрещено перемещаться по записям.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
YuliyaKar (19.11.2013)
  #7  
Старый 19.11.2013, 11:47
YuliyaKar YuliyaKar вне форума
Прохожий
 
Регистрация: 13.11.2013
Сообщения: 37
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Теперь пишет, что не может переконверитировать значение Null в Double.
Поместила в событие FormShow. Просто куда его еще притулить - даже не знаю ((
Ответить с цитированием
  #8  
Старый 19.11.2013, 12:14
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от YuliyaKar
Теперь пишет, что не может переконверитировать значение Null в Double.
А если заменить ".Value" на ".AsFloat"?
Цитата:
Сообщение от YuliyaKar
Поместила в событие FormShow. Просто куда его еще притулить - даже не знаю ((
Если калькулируемому полю нужны значения из других записей, то тут разве что SQL-запросом нужно считать. Но прыгать по записям в событии "OnCalcFields" точно нельзя, потому что прыжок к другой записи вызовет новое событие "OnCalcFields" в котором опять прыжок и т.д. - получается бесконечная рекурсия и переполнение стека.
Ответить с цитированием
  #9  
Старый 19.11.2013, 12:17
YuliyaKar YuliyaKar вне форума
Прохожий
 
Регистрация: 13.11.2013
Сообщения: 37
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Я уже попробовала AsFloat.
Теперь пишет что это значение не типа float.
По ходу типы не может совместить.

Я переделала по событию нажатия кнопки, чтоб столбец Lst не был пустым

Последний раз редактировалось YuliyaKar, 19.11.2013 в 12:28.
Ответить с цитированием
  #10  
Старый 19.11.2013, 15:36
YuliyaKar YuliyaKar вне форума
Прохожий
 
Регистрация: 13.11.2013
Сообщения: 37
Версия Delphi: Delphi 7
Репутация: 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
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter