CrossTab

отредактировано 17:18 Раздел: FastReport 3.0
Несколько вопросов и предложений по CrossTab (FR312, D7)

1. Как изменить высоту строк в ColumnHeader. Ширина меняется в OnCalcWidth, а где изменить высоту.
2. Свойство RepeatHeaders нужно сделать отдельно для колонок и для строк. Большие отчеты клеют обычно только по ширине, а ColumnHeader нужен на каждой странице.
3. Верхний левый пустой угол, очень некрасиво, особенно когда много фиксированных колонок, то для каждой из них необходимо наименование.
4. В Итогах желательно скрывать нули.
5. Добавить свойство "НЕ ВЫВОДИТЬ ИТОГИ" если только 1 значение, а то приходится каждый раз в скрипте считать сколько колонок(строк) вывел перед итогами по каждому уровню.Если этого не сделать, то отчет перегружен и нечитабелен.
6. Желательна возможность задавать ShowColumnHeader для каждого уровня.
7. Если в ячейке 2 строки и у нижней(или верхней) задаю фон, то и итог должен быть с этим же фоном.
8. В скрипте невозможно задать Memo.Frame.Typ (Ошибка "Неверная операция с вариантом")
9. Желательно иметь возможность задать несколько вертикальных Cross групп, часто необходимо добавить в конец либо в середине текст или уже подсчитанные итоги, либо возможность вывести рядом (не один под другим) CrossTaba

10. CrossTab в старом стиле не получилось вывести суммы с разбросом в нужные колонки (AdoQuery)
выводит так
строка1 сум1 сум2 сум3
строка2 сум1 сум2
строка3 сум1
нужно
строка1 сум1 сум2 сум3
строка1 сум1 сум2
строка1 сум1
также не получилось использовать внешнии AdoQuery

Комментарии

  • отредактировано 17:18
    можете описать как вы это делали?
    написал:
    "а то приходится каждый раз в скрипте считать сколько колонок(строк) вывел перед итогами по каждому уровню."
    если нетрудно приведите нужный кусочек скрипта
  • отредактировано 17:18
    Где то так
    const
         maxLevel=3;
    var
       RowLevel: array[0..Maxlevel] of integer;
       CurLevel: integer;
    
    
    procedure DBCross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
    begin
    with DBCross1 do
         if (IsTotalColumn(ColumnIndex) or IsGrandTotalColumn(ColumnIndex)
         or IsTotalRow(RowIndex) or IsGrandTotalRow(RowIndex)) and (Value=0) then
            Memo.Text := '';
    end;
    
    procedure DBCross1OnCalcHeight(RowIndex: Integer; RowValues: Variant; var Height: Extended);
    var
       i: integer;
    begin
    if DBCross1.IsGrandTotalRow(RowIndex) then
          begin
          if RowLevel[0] < 2 then Height := 0;
          end
       else
          if DBCross1.IsTotalRow(RowIndex) then
             begin
             if RowLevel[CurLevel] < 2 then Height := 0;
             for i := MaxLevel downto CurLevel do
                 RowLevel[i] := 0;
             dec(CurLevel);
             if CurLevel < 0 then CurLevel := MaxLevel
                else
                    Inc(RowLevel[CurLevel]);
             end
          else
             begin
             CurLevel := MaxLevel;
             Inc(RowLevel[CurLevel]);
             end;
    end;
    
    var
       i: integer;
    
    begin
    for i := 0 to MaxLevel do
        RowLevel[i] := 0;
    CurLevel := MaxLevel;
    end.
    

    Еще заметил такой глюк, не всегда правильно подсчитывается высота строк,
    в случае если длинное наименование переносится на несколько строк (3), а справа одна строка с суммой + Итог, то дополняется полустрокой,
    (т.е. когда высота текста чуть шире высоты данных) и дальше на этой странице все едет на эти полстроки.

    Еще бы хотелось иметь возможность задавать несколько ячеек в одном Столбце, а не только в одной строке. Нужно выводить например "Количество"
    и "Сумму" рядом, а не одно под другим.
  • IkarHCIkarHC Moscow
    отредактировано 17:18
    Чтобы не заводить похожую тему, позвольте "присоседиться"...

    Суть проблемы в следующем: Запрос возвращает следующий набор данных:
    Подъезд
    Этаж
    Номер квартиры
    Тип квартиры
    Площадь
    Статус (1 - продана, 0 - свободна)


    В кросстабе расположение полей следующее:
    Столбцы: Подъезд, Номер квартиры
    Строки: Этаж
    Ячейки: Тип квартиры, Площадь

    В редакторе кросстаба выбираю ячейки (Тип квартиры, Площадь),
    нажимаю кнопку условного выделения и в поле "Условие" пишу: <Статус > = 1, выбираю цвет шрифта и фона, нажимаю "Ок".

    При запуске отчета, условие выполняется для вообще всех ячеек (или не выполняется если написать =0).

    В общем идея в том, чтобы выделить цветом шрифта и фона проданные квартиры.

    Подскажите, что я делаю не правильно и как мне добиться желаемого результата?
  • IkarHCIkarHC Moscow
    отредактировано 17:18
    Ауууу... Очень нужно...
  • отредактировано 17:18
    В условии можно анализировать только VALUE, а не поле нобора данных. Для статуса тоже придется завести ячейку, в скрипте можно при значении "1" записать "ПРОДАНО".

    У разработчиков вопросы по кросстабу явно вызывает аллергию. Молчат как партизаны.
  • отредактировано 17:18
    написал:
    Ауууу... Очень нужно...
    Добавьте статус третим номером в ячейку (CellIndex = 2).
    Сделайте отчет двупроходным
    В обработчике OnPrintCell напишите что-то вроде

    procedure DBCross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
    var
    sKey, row, col : string;
    begin
    row := IntToStr( RowIndex );
    col := IntToStr( columnIndex );

    sKey := row + ':' + col;

    if not Engine.FinalPass then
    if (( VarToStr(value) = '1') and ( CellIndex = 2 )) then
    SET(sKey, $FF)
    else
    SET(sKey, $FFFFFF);
    if Engine.FinalPass then
    begin
    Memo.Color := GET(sKey);
    end;

    end;

  • IkarHCIkarHC Moscow
    отредактировано 17:18
    2 vlad_galaxy: Спасибо, все получилось.

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

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