Проблема с Cross-tab'ом
vovanus1009991
Киев
Доброго всем времени суток. Обращаюсь за помощью к специалистам.
Проблема в следующем: есть один DBCrosstab, справа от него я питаюсь рисовать Crosstаb с такою же высотою строк - все вроде получаеться, но когда я пытаюсь изменить высоту заглавия Crosstаb, то высота строк выщитывается от прежней высоты заглавия. Пример этого 1я картинка. 2я картинка - без изменения высоты заглавия.
1)
А вот еще одна проблема: если количество строк небольшое, то все отображается нормально - DBCross возле Cross, а если строк больше чем может уместиться на одной странице, то на следущей странице отображается только DBCross, а после ее окончания на следущей странице Cross. Пример виден у пдф-файле.
Буду очень благодарен за советы.
Проблема в следующем: есть один 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. Пример виден у пдф-файле.
Буду очень благодарен за советы.
Комментарии
Для заголовка используйте PageHeader + 4 MemoView.
Проблема в том, что мне нужно использовать именно DBCross - это связано с самой базой, иначе мне придеться самостоятельно разбивать данные в БД, а так это делает за меня DBCross. Дело в том, то все данные у меня храняться в поле data, а выводить нужно лишь некоторые cid - которые выбирает пользователь.
Вот структура таблицы БД откуда беруться данные:
Далее - извлечение данных. Здесь уже зависит от конкретной реализации: можно через where cid in (список_значений), либо через фильтр в таблице.
Но через MemoView эта задача решается меньшим ремором, чем через CrossTab.
Можно вообще всё через SQL-запрос сделать, но если нет, то:
1) Как пользователь выбирает список записей?
2) Чем они отображаются?
Так, попробую описать (просто не знаю как толково это сделать): программа на делфи, БД - SQLite - и вот тут самое неприятное - очень странная там структура таблицы. Для работы из БД использую UniDAC. Вот сам запрос:
Также не поленитесь посмотреть все Demo-примеры, идущие с компонентом (или скачайте frxDemo с сайта).
Подскажите, пожалуйста, поподробней как это можно сделать, хотябы сам алгоритм - вродебы и документацию смотрел, и демки все... А как сделать не получаеться...
В отчёте - 1 MasterData, в нём 4 MemoView. В каждом MemoView - значение из БД: [ТАБЛИЦА."ПОЛЕ"].
Выше MasterData разместить 1 PageHeader, в нём 4 MemoView. В каждом MemoView - текст шапки таблицы.
Не знаю как ещё подробнее. Более подробно - это сделать за тебя самостоятельно весь проект с нуля...
Спасибо, буду разбираться, но наверное будет проще поменять сам запрос.