Topic: Сумма вычисляемых полей

Добрый день!

У меня в таблице есть два вычисляемых поля:

total_s:  (некая сумма денег)

(
   select printf("%.2f",sum(cost)) from s_history where (s_history.id_numbers = t_history.id_numbers) and (date(s_history.sd) >= date(t_history.sd)) and (date(s_history.ed) <= date(t_history.ed))
)

и total_p: (еще сумма денег)

(
 select printf("%.2f",sum(cost)) from p_history where (p_history.id_t_history = t_history.id)
)

Я хочу еще одно, total = total_s + total_p
Но если просто так и написать в новом вычесляемом поле то вылетает ошибка что "total_s" не найдено.

Решил сделать "проще" и посчитать это дело прямо при выводе в таблицу,
добавил ненужный столбец и пытаюсь его заполнить:

procedure numStat_TableGrid1_OnChange (Sender: string);
var
   i,c: integer;
begin
     c := numStat.TableGrid1.RowCount - 1;
     for i := 0 to c do
     begin
         numStat.TableGrid1.Cells[7,i] :=  FloatToStr(strtofloat(numStat.TableGrid1.Cells[5,i]) + strtofloat(numStat.TableGrid1.Cells[6,i]));
     end;
end;

Что тоже не работает, заявляя, например: " '189.08' is not a valid floating point value." Я вот хоть убей не понимаю, почему оно нот вэлид smile

Подскажите пожалуйста, куда крутить?

Re: Сумма вычисляемых полей

попробуйте такое вычисляемое поле:

(
   select printf("%.2f",sum(cost)) from s_history where (s_history.id_numbers = t_history.id_numbers) and (date(s_history.sd) >= date(t_history.sd)) and (date(s_history.ed) <= date(t_history.ed))
)

+

(
 select printf("%.2f",sum(cost)) from p_history where (p_history.id_t_history = t_history.id)
)
Dmitry.

Re: Сумма вычисляемых полей

DriveSoft wrote:

попробуйте такое вычисляемое поле:

(
   select printf("%.2f",sum(cost)) from s_history where (s_history.id_numbers = t_history.id_numbers) and (date(s_history.sd) >= date(t_history.sd)) and (date(s_history.ed) <= date(t_history.ed))
)

+

(
 select printf("%.2f",sum(cost)) from p_history where (p_history.id_t_history = t_history.id)
)

Дмитрий, это работать скорее всего будет, но, к сожалению, мне нужны именно все три значения - одно, второе и сумма. выборка для каждого из значений итак немаленькая, и считать одно и то-же просто для того чтобы сложить мне кажется ужасным расточительством...

Re: Сумма вычисляемых полей

Dreada
Зависит от количества записей, протестируйте, если будет работать медленно, можно будет оптимизировать с помощью скрипта.

Dmitry.

Re: Сумма вычисляемых полей

Разобрался почему не работало сложение в скрипте - оказывается преобразование строки в число с запятой чувствительно к системной настройке "разделителя дробной части".
У меня в числе была точка, а ей подавай запятую. На разных машинах может быть по-разному, так что для уверенности, если у кого будет похожая ошибка, можно делать так:

function StrToFloatSep(s: string):extended;
var res:string;
begin
  if DecimalSeparator<>'.' then
     res:=ReplaceStr(s, '.', DecimalSeparator);
  if DecimalSeparator<>',' then
     res:=ReplaceStr(s, ',', DecimalSeparator);
  result:= strtofloat(res);
end;