Вычисления во время формирования отчета

отредактировано 16:29 Раздел: FastReport 2.xx VCL
Необходимо произвести следующие действия:
Есть два поля (float) необходимо в каждой записи умножить их друг на друга, а внизу страницы вывести сумму этих произведений.
Я понимаю так, что делать это надо через скрипт, но можно, пожалуйста, чуть подробней?
Для примера (сделано, как написанно в документации):
function GetNaim: string;	
begin	
Result:='string';	
end;	
procedure TForm2.frReport1UserFunction(const Name: String; p1, p2,	
  p3: Variant; var Val: String);	
begin	
if AnsiCompareText('GetNaim', Name) = 0 then	
    val := GetNaim();	
end;
Кладу в отчёт DetailFooter на него поле с текстом и пишу там GetNaim. И в скрипт тоже писал. Как сделать правильно, подскажите пожалуйста?
Ошибка происходит в модуле FR_Class в этой процедуре:
procedure TfrReport.OnGetParsFunction(const name: String; p1, p2, p3: Variant;	
   var val: String);	
var	
  i: Integer;	
begin	
  val := '0';	
  for i := 0 to frFunctionsCount - 1 do	
    if frFunctions[i].FunctionLibrary.OnFunction(name, p1, p2, p3, val) then	
      exit;	
  if AggrBand.Visible then  // <-- здесь!	
    if Assigned(FOnFunction) then FOnFunction(name, p1, p2, p3, val);	
end;

Комментарии

  • отредактировано 16:29
    А в самом отчете тоже самое не судьба чтоли сделать?
    Бросай футер а в нем считай свою сумму [SUM(Выражение)].
  • отредактировано December 2005
    Окей. Я попробую. SUM будет сделанно для каждого поля?
  • отредактировано 16:29
    SUM(ADOTable1."Количество"] * [ADOTable1."Цена за единицу");

    Работает не верно. Необходимо, чтоб считало произведение для каждой записи отдельно, а потом уже складывало все произведения.
    Вобще-то у меня есть функция в дельфи, если это невозможно сделать функцией в ФР скажите, пожалуйста, как вывести результат моей функции в отчёт.
  • отредактировано 16:29
    Событие OnUserFunction вобще не обрабатывается при предпросмотре отчета.

    procedure TForm2.frReport1UserFunction(const Name: String; p1, p2,
    p3: Variant; var Val: String);
    begin
    ShowMessage('ok');
    end;

    Сообщение не появляется.
  • отредактировано 16:29
    Тема закрыта. Вопрос решён самостоятельно. Если кому интересно, то делается это так.

    Кладём в отчёте новое поле. И в нём пишем текст любой переменной, скажем [Peremena] (Внимание, квадратные скобки обязательны! Собсна почти в этом и была моя ошибка.)

    Затем:
    procedure TForm2.frReport1GetValue(const ParName: String;	
      var ParValue: Variant);	
    begin	
    if CompareText(ParName, 'Peremena') = 0 then	
    ParValue := "ляляля";	
    end;
    


    Теперь присвоится текст ляляля. Также можно присвоить значение, возвращаемое функцией и вобще что угодно.
    Обработка события GetValue происходит тогда, когда в отчёте встречается непонятная переменная.

    А когда происходит обработка события UserFunction - непонятно.
  • отредактировано 16:29
    iddqd написал:
    SUM(ADOTable1."Количество"] * [ADOTable1."Цена за единицу");

    Работает не верно. Необходимо, чтоб считало произведение для каждой записи отдельно, а потом уже складывало все произведения.
    Вобще-то у меня есть функция в дельфи, если это невозможно сделать функцией в ФР скажите, пожалуйста, как вывести результат моей функции в отчёт.
    Тогда тебе произведение [ADOTable1."Количество"] * [ADOTable1."Цена за единицу"] нужно выло считать на МастерДата в Мемо, а сумму считать на Футере по этому Мему.
    Или вот еще вариант. Объявить переменную в отчете к примеру vSum=0, и потом в МастерДата ее увеличивать vSum=vSum+[ADOTable1."Количество"] * [ADOTable1."Цена за единицу"]. Соответственно в Меме где должна быть сумма написать [vSum] и все.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.