Среднее без нулей в Cross-table

отредактировано 04:39 Раздел: FastReport 4.0
Проблема такая: у меня есть Cross-table. По столбцам и по колонкам считается среднее значение. Но некоторые ячейки пустые (нули скрываются), однако среднее считается вместе с нулями.
Т.е. если у меня в строке 8 колонок и заполнены только 4 из них, а 4 пустые, то FastReport посчитает сумму по ним и поделит на 8, а мне необходимо, чтобы на 4, т.е. если ячейка пустая (ноль), ее не надо учитывать для подсчета среднего.
Подскажите, пожалуйста, как это сделать?

Комментарии

  • отредактировано 04:39
    Я давно прошу добавить: скрыть колонку где все нули....
    мб в 5 версии появится.
    Так и у вас подсчет среднего по условию.
    т.е в скрипте пишем условие по какому считать и ссылку на эту проверку.
  • отредактировано 04:39
    Konst написал: »
    т.е в скрипте пишем условие по какому считать и ссылку на эту проверку.
    А вы можете пояснить, как условие написать в скрипте? Я просто не очень давно работаю с FastReport и пока не очень хорошо знаю его возможности.
  • отредактировано January 2011
    Есть один вариант решения, который мне подсказали. Если у кого-то есть более простой вариант, то отзовитесь, пожалуйста!
    Было предложено так:
    var
      ColSums   : array of Variant;
      ColCounts : array of Variant;
    
      RowSums   : array of Variant;
      RowCounts : array of Variant;
    
    
    
    procedure DBCross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant); begin
        if Length(RowSums) < (RowIndex + 1) then
        begin
          SetLength(RowSums, (RowIndex + 1));
          SetLength(RowCounts, (RowIndex + 1));
        end;
    
        if Length(ColSums) < (ColumnIndex + 1) then
        begin
          SetLength(ColSums, (ColumnIndex + 1));
          SetLength(ColCounts, (ColumnIndex + 1));
        end;
    
    
      if DBCross1.IsTotalColumn(ColumnIndex) then
      begin
        if RowCounts[RowIndex] > 0.0000001 then
           Memo.Text := Format('%2.2n', [RowSums[RowIndex] / RowCounts[RowIndex]]);
      end
      else if DBCross1.IsTotalRow(RowIndex) then
      begin
        if ColCounts[ColumnIndex] > 0.0000001 then
          Memo.Text := Format('%2.2n', [ColSums[ColumnIndex] / ColCounts[ColumnIndex]]);
      end
      else
      begin
        if Value > 0.0000001 then
        begin
          RowSums[RowIndex] := RowSums[RowIndex] + Value;
          RowCounts[RowIndex] := RowCounts[RowIndex] + 1;
    
          ColSums[ColumnIndex] := ColSums[ColumnIndex] + Value;
          ColCounts[ColumnIndex] := ColCounts[ColumnIndex] + 1;
        end;
      end;
    end;
    
    procedure Page1OnBeforePrint(Sender: TfrxComponent); begin
      SetLength(ColSums, 0);
      SetLength(ColCounts, 0);
      SetLength(RowSums, 0);
      SetLength(RowCounts, 0);
    end;
    
  • gpigpi
    отредактировано 04:39
    Попробуйте использовать выражение для значения ячеек
    <IIF(<Dataset."FieldName"> = 0, null, <Dataset."FieldName">)>

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

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