![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Бесконечная рекурсия походу.
|
|
#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 |