Проблема с Cross-tab'ом

vovanus1009991vovanus1009991 Киев
отредактировано April 2014 Раздел: FastReport 4.0
Доброго всем времени суток. Обращаюсь за помощью к специалистам.
Проблема в следующем: есть один DBCrosstab, справа от него я питаюсь рисовать Crosstаb с такою же высотою строк - все вроде получаеться, но когда я пытаюсь изменить высоту заглавия Crosstаb, то высота строк выщитывается от прежней высоты заглавия. Пример этого 1я картинка. 2я картинка - без изменения высоты заглавия.
1)
var Sum0, Sum1, Sum2, i: Integer;
       b: array of Integer;
       HeightArr: array of Extended;
       HeightHead:Extended;                 

procedure DBCross1OnPrintCell(Memo: TfrxMemoView; RowIndex, ColumnIndex, CellIndex: Integer; RowValues, ColumnValues, Value: Variant);
var s, numRow, numCol:Integer;
var a: array of integer;    
begin         
       SetLength(a,DBCross1.RowCount);
       SetLength(b,DBCross1.RowCount);           
         
       numRow:=DBCross1.RowCount;
       numCol:=DBCross1.ColCount;
         
       if ColumnIndex = DBCross1.ColCount-1 then
       begin                   
               a[RowIndex]:=Value;
               b[RowIndex]:=Value;                   
               Sum0:=Sum0+Value;                                         
               //ShowMessage('a['+vartostr(RowIndex)+']='+ vartostr(a[RowIndex]));                   
       end;           
                  
       if (RowIndex = DBCross1.RowCount-1) AND (ColumnIndex = DBCross1.ColCount-1) then
       begin                   
               //ShowMessage('OK='+ vartostr(RowIndex));
               s:=0;
               for i:=0 to DBCross1.RowCount-1 do
               begin
                       s:=s+a[i];                                                                          
               end;
               //ShowMessage('sum='+ vartostr(sum));
               Memo2.Text:='Загальна кількість: '+vartostr(s);
               Memo4.Text:=vartostr(s);                                    
       end;                                  
end;
                             
procedure DBCross1OnPrintColumnHeader(Memo: TfrxMemoView; HeaderIndexes, HeaderValues, Value: Variant);
begin
       //ShowMessage('Value='+ vartostr(Value));
       //ShowMessage('Memo='+ vartostr(Memo.Height));
       HeightHead:=Memo.Height;           
end;
//Обчислення ваги кожного рядка                                                                     
procedure Cross1OnBeforePrint(Sender: TfrxComponent);
begin
  for i:=0 to DBCross1.RowCount-1 do
  begin              
       with Cross1 do
       begin
               AddValue([i+1], ['Вага, %'], [(b[i]/Sum0)*100]);
               //AddValue([i+1], ['№, п/п'], [i+1]);                   
       end;
  end;          
end;
//Обчислення висоти рядків DBCross1        
procedure DBCross1OnCalcHeight(RowIndex: Integer; RowValues: Variant; var Height: Extended);
begin
       SetLength(HeightArr,DBCross1.RowCount);             
       HeightArr[RowIndex]:=Height;           
end;
//Обчислення висоти рядків "Вага"                                                                           
procedure Cross1OnCalcHeight(RowIndex: Integer; RowValues: Variant; var Height: Extended);
begin
  Height:=HeightArr[RowIndex];                      
end;

procedure Memo3OnBeforePrint(Sender: TfrxComponent);
begin
  Memo3.Text:= <frxDBDataset1."name">;          
end;

procedure Cross1OnPrintColumnHeader(Memo: TfrxMemoView; HeaderIndexes, HeaderValues, Value: Variant);
begin
  Memo.Height:=HeightHead;            
end;

procedure DBCross1OnAfterData(Sender: TfrxComponent);
begin
  //ShowMessage('DBCross1.RowCount2=');
  SetLength(HeightArr,DBCross1.RowCount);      
  //ShowMessage('DBCross1.RowCount3='+vartostr(DBCross1.RowCount));      
end;

begin
      Sum0 := 0;
      Sum1 := 0;
      Sum2 := 0;
      SetLength(HeightArr,1);      
      //ShowMessage('DBCross1.RowCount1='+vartostr(DBCross1.RowCount));  
end.

А вот еще одна проблема: если количество строк небольшое, то все отображается нормально - DBCross возле Cross, а если строк больше чем может уместиться на одной странице, то на следущей странице отображается только DBCross, а после ее окончания на следущей странице Cross. Пример виден у пдф-файле.
Буду очень благодарен за советы.

Комментарии

  • отредактировано 01:20
    Если отчёт не планируется развивать по иерархии вложенности, то для такой тривиальной задачи рекомендую MasterData + 4 MemoView.
    Для заголовка используйте PageHeader + 4 MemoView.
  • vovanus1009991vovanus1009991 Киев
    отредактировано 01:20
    Nightmareterrible написал: »
    Если отчёт не планируется развивать по иерархии вложенности, то для такой тривиальной задачи рекомендую MasterData + 4 MemoView.
    Для заголовка используйте PageHeader + 4 MemoView.

    Проблема в том, что мне нужно использовать именно DBCross - это связано с самой базой, иначе мне придеться самостоятельно разбивать данные в БД, а так это делает за меня DBCross. Дело в том, то все данные у меня храняться в поле data, а выводить нужно лишь некоторые cid - которые выбирает пользователь.
    Вот структура таблицы БД откуда беруться данные:

  • отредактировано 01:20
    В чём программа? Исходники ваши? Если да, то подключается frxDBDataSet - к нему необходимый ADO, DBE или что там у вас.
    Далее - извлечение данных. Здесь уже зависит от конкретной реализации: можно через where cid in (список_значений), либо через фильтр в таблице.
    Но через MemoView эта задача решается меньшим ремором, чем через CrossTab.
    Можно вообще всё через SQL-запрос сделать, но если нет, то:
    1) Как пользователь выбирает список записей?
    2) Чем они отображаются?
  • vovanus1009991vovanus1009991 Киев
    отредактировано April 2014
    Nightmareterrible написал: »
    В чём программа? Исходники ваши? Если да, то подключается frxDBDataSet - к нему необходимый ADO, DBE или что там у вас.
    Далее - извлечение данных. Здесь уже зависит от конкретной реализации: можно через where cid in (список_значений), либо через фильтр в таблице.
    Но через MemoView эта задача решается меньшим ремором, чем через CrossTab.
    Можно вообще всё через SQL-запрос сделать, но если нет, то:
    1) Как пользователь выбирает список записей?
    2) Чем они отображаются?

    Так, попробую описать (просто не знаю как толково это сделать): программа на делфи, БД - SQLite - и вот тут самое неприятное - очень странная там структура таблицы. Для работы из БД использую UniDAC. Вот сам запрос:

  • отредактировано 01:20
    Да. Можно сделать проще. В документации всё подробно описано, просто нужно приложить немного усилий.
    Также не поленитесь посмотреть все Demo-примеры, идущие с компонентом (или скачайте frxDemo с сайта).
  • vovanus1009991vovanus1009991 Киев
    отредактировано 01:20
    Nightmareterrible написал: »
    Да. Можно сделать проще. В документации всё подробно описано, просто нужно приложить немного усилий.
    Также не поленитесь посмотреть все Demo-примеры, идущие с компонентом (или скачайте frxDemo с сайта).

    Подскажите, пожалуйста, поподробней как это можно сделать, хотябы сам алгоритм - вродебы и документацию смотрел, и демки все... А как сделать не получаеться...
  • отредактировано 01:20
    Кидаешь на форму frxDBDataSet, к нему подключаешь свой DataSet, в котором у тебя данные.
    В отчёте - 1 MasterData, в нём 4 MemoView. В каждом MemoView - значение из БД: [ТАБЛИЦА."ПОЛЕ"].
    Выше MasterData разместить 1 PageHeader, в нём 4 MemoView. В каждом MemoView - текст шапки таблицы.

    Не знаю как ещё подробнее. Более подробно - это сделать за тебя самостоятельно весь проект с нуля...
  • vovanus1009991vovanus1009991 Киев
    отредактировано 01:20
    Nightmareterrible написал: »
    Если бы все так просто было... Но спасибо за ответы. Если кому-то интересно, то подробное описание проблемы здесь Вывод кросс-таб, просто не хочеться опять все переписывать.
  • gpigpi
    отредактировано 01:20
    Приложите шаблон отчёта, а ещё лучше - тестовый проект
  • gpigpi
    отредактировано 01:20
    На sql.ru Вам предложили один из вариантов
    написал:
    в кросс-табе в ран-тайме можно выставить любое нужное кол-во колонок и, правильно указывая адресацию в AddValue, размещать данные хоть из 10 таблиц...
  • vovanus1009991vovanus1009991 Киев
    отредактировано 01:20
    gpi написал: »
    На sql.ru Вам предложили один из вариантов

    Спасибо, буду разбираться, но наверное будет проще поменять сам запрос.
  • vovanus1009991vovanus1009991 Киев
    отредактировано 01:20
    Привет всем. Решение здесь, вдруг кому-то пригодится. Решение здесь.

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

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