Crosstab выводить сводные ячейки с разными агрегатными функциями

отредактировано July 2013 Раздел: FastReport 4.0
Добрый день.

Есть отчёт вида см. рис.
Title2 в отчёте имеет 3 значения: "Кол-во, шт.", "Цена, руб.", "Расход, шт."
На каждое значение Title2 в кросс-табе формируется свой набор FACT, NORM, DELTA.
В свойства кросса включено, что для итогов нужно FACT, NORM и DELTA суммировать,
а как сделать так чтобы можно динамически задавать агрегатную функцию отдельно для FACT, NORM и DELTA
в зависимости от текущего значения Title2, например,
для Тitle2 = "Кол-во, шт.", нужно чтобы итоговый FACT, NORM и DELTA считался через SUM
для Title2 = "Цена, руб.", нужно чтобы итоговый FACT, NORM и DELTA считался через Average
для Title2 = "Расход, шт.", нужно чтобы итоговый FACT считался как SUM, NORM как MIN, DELTA считался через Average

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

Комментарии

  • gpigpi
    отредактировано 12:23
    Стандартными средствами - никак. Только считать итоги в скрипте отчёта в событии кросса OnPrintCell
  • отредактировано July 2013
    gpi написал: »
    Стандартными средствами - никак. Только считать итоги в скрипте отчёта в событии кросса OnPrintCell
    Идею понял.

    На первоначальном этапе было бы достаточно реализовать хотя бы так, пожалуйста, помогите:
    procedure DBCross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
    begin
    
      if (Title2 = 'Цена, руб.') then //как правильно спросить в этом событии кросса, что сейчас подзаголовок = 'Цена, руб.' 
      begin 
         if DBCross.IsTotalRow(RowIndex) then
         begin              
           Memo.Text := '-';   
          end;    
    
          if DBCross.IsGrandTotalRow(RowIndex) then
          begin
             Memo.Text := '-';  
           end;
       end;
    
       //остальные: 'Кол-во, шт.' и 'Расход, шт.' пускай суммируются.
      ...
    end;
    


    В самом лучшем варианте это преобразовать представленные внизу алгоритм в жизнь на языке crosstab
    но как правильно все это записать.
    т.е. как я понимаю алгоритм должен выглядеть как-то
    var
    //итоговые значения для Title2 = 'Кол-во, шт.'
      Title2_FACT1: double;
      Title2_NORM1: double;
      Title2_DELTA1: double;
    
    //итоговые значения для Title2 = 'Цена, руб.' 
      Title2_FACT2: double;
      Title2_NORM2: double;
      Title2_DELTA2: double;
    
    //итоговые значения для Title2 = 'Расход, шт.' 
      Title2_FACT3: double;
      Title2_NORM3: double;
      Title2_DELTA3: double;
    
    
    procedure DBCross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
    begin
    
      if Title2 = Кол-во, шт.' then //как это правильно записать используя параметры пришедшие в это событие
      begin 
        if (Value <> Null) then
        begin 
          if CurrColumn = 'FACT' then //как правильно записать, чтобы определить что сейчас колонка FACT
            Ttile2_FACT1 := Ttile2_FACT1 + Value;
          if CurrColumn = 'NORM' then
            Ttile2_NORM1 := Ttile2_NORM1 + Value;
          if CurrColumn = 'DELTA' then
            Ttile2_NORM1 := Ttile2_DELTA1 + Value;
       end;
      end;
    
      if Title2 = 'Цена, руб.' then //как это правильно записать используя параметры пришедшие в это событие
      begin 
        if (Value <> Null) then
        begin 
          if CurrColumn = 'FACT' then //как правильно записать, чтобы определить что сейчас колонка FACT
            Ttile2_FACT1 := AVG???; //как правильно считать среднее, вызвать может-быть какую то стандартную функцию
    
          if CurrColumn = 'NORM' then
            Ttile2_NORM1 := AVG???;
    
          if CurrColumn = 'DELTA' then
            Ttile2_NORM1 := AVG???;
       end;
      end;
    
      ...
    end;
    
    if DBCross.IsGrandTotalRow(RowIndex) then
    begin
      
    //как-то присваиваем значения:
      Title2_FACT1: double;
      Title2_NORM1: double;
      Title2_DELTA1: double;
    
    end;
    

    Пожалуйста, помогите
  • отредактировано 12:23
    Очень жду помощи по данному вопросу
  • gpigpi
    отредактировано July 2013
    Доброй ночи!

    Переводим названия параметров на русский (этого достаточно, чтобы понять, как работает кросс. Если делать это на свежую голову, а не так, как я в 1:20 ночи)
    написал:
    //как правильно записать, чтобы определить что сейчас колонка FACT
    if CellIndex = 0 then ...
    написал:
    if Title2 = Кол-во, шт.' then //как это правильно записать используя параметры пришедшие в это событие
    Код для FRDemo отчёт "Cross from non-DB data" 60.fr3
    procedure Cross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
    begin
         if VarToStr(ColumnValues[1]) = '1' then Memo.Color := clRed;                                                                                                           
    end;;
    
  • отредактировано 12:23
    спасибо!

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

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