Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
Доброго времени суток.

Не первый день уже сижу над этой проблемой...

Имеется кросс (2 ColumnLevels, 3 RowLevels, 1 CellLevel). Данные 2го уровня (т е 1го индекса) столбцов содержат ...ну, очень длинные названия. При этом данные первого уровня строк содержат не очень длинные названия. Все остальные данные заголовков содержат относительно короткие обозначения.

В Cells содержится строка, недлинная (всегда состоящая из 2 строчек(формируется в запросе)): длиной от 3 и до 6-7 символов.

А, да, еще: страница бесконечна(ибо кол-во столбцов заранее неизвестно) + у кросса AutoSize = true.

Вопрос в том, как ограничить ширину столбцов, не сужая при этом ширину первого из столбцов (который содержит не очень длинные названия)

Картинка с другого сайта.

На этом изображении MaxWidth у кросстаба не ограничен (т е почти не ограничен = 5000). Поэтому все названия "расползаются" на всю ширину. Для тех данных, что в первом столбце (т е для нас это RowField[0]), такая ширина вполне приемлема, а вот для тех данных, которые в третьей строке заголовка столбцов ( т е ColumnField[2]), это абсолютно неприемлемо, потому что отчет со всеми данными "расползается" в бесконечность, и выглядит вот так:

Картинка с другого сайта.
(это изображение просто, чтоб было понятно, что на напечатанном листе данные нечитаемы)


Если попытаться ограничить ширину столбцов, то сужаются абсолютно все столбцы. И первый (тот, что, как правило, содержит не оч длинные названия тоже).

Картинка с другого сайта.

Тогда форма становится читаемой, но пользователи не понимают, зачем нужна "такая высокая" строчка для данных с названием "Название длинное 7". + разумеется, эти самые названия могут быть разной длины для разных баз данных.

Вот как выглядит форма, если MaxWidth = 60

Картинка с другого сайта.
Вроде даже и ничего, если не считать того, что кол-во листов можно было бы сократить за счет удлинения ширины первого столбца. + Если столбцов совсем мало, а строчек столько же (что тоже вполне вероятно даже для одной и той же БД с разными запросами), кросс растянется по левой стороне листа на нескольких (или хотя бы на 2) листах.

Картинка с другого сайта.

И, конечно же, мы получаем умные предложения от пользователей типа: "Вы бы первый столбик немножко расширили, и форма поместилась бы на 1 страницу, а то нам бумагу экономить надо"....


Сейчас данная ситуация обходится ручным подсчетом....В запросе вычисляется количество столбцов, вычисляется наиболее приемлемая ширина первого столбца, и далее нехитрым мат вычислением считается кол-во символов, оптимально помещающихся по ширине. И в данные столбцов 2го уровня отправляется уже отредактированная с переносом строк информация. В этом случае при малом кол-ве столбцов и большом кол-ве строк форма сама "растягивается" по странице:

Картинка с другого сайта.

А при большом кол-ве столбцов форма сжимается по вертикали:
Картинка с другого сайта.

Эта схема в общем-то работает (ну, если не считать некоторой погрешности в вычислениях, когда именно переносить названия данные столбцов 2го уровня, особенно при нестандартных форматах, типа А3)

Но...сейчас появилась необходимость добавления еще одного уровня столбцов. Делается это динамически (и лишь для определенных наборов данных).
И тогда отчет выглядит несколько иначе:
Картинка с другого сайта.

И работающая схема с вручную посчитанными переносами части строк в столбцах 2го уровня перестает работать, ибо для некоторых из столбцов названия не нужно делить вручную на несколько строк.

Были попытки посмотреть в сторону вертикальных бэндов, но, если честно, не совсем разобралась + в этом отчете в шапке сверху используется вложенный отчет, а с вертикальными бэндами это вложенный отчет работать перестал.

Может, кто-нибудь уже сталкивался с похожей проблемой? Заранее премного благодарна.
10 май 18, 15:19    [21400206]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
DimaBr
Member

Откуда:
Сообщений: 10783
Не использовать Кросс.
10 май 18, 15:58    [21400414]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
DimaBr
Не использовать Кросс.

Ок. Что использовать?
10 май 18, 15:59    [21400417]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
DimaBr
Member

Откуда:
Сообщений: 10783
А длинные названия столбцов повернуть на 90 градусов и всё поместится на одну страницу
10 май 18, 16:00    [21400427]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
DimaBr,
Не могу ((((
Форма стандартизованная.... Пользователи не поймут
10 май 18, 16:01    [21400430]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
gpi
Member

Откуда: г. Волноваха, Украина
Сообщений: 692
Устанавливайте ширину столбцов кросса в событии кросса OnCalcWidth
10 май 18, 17:57    [21400763]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
gpi
Устанавливайте ширину столбцов кросса в событии кросса OnCalcWidth

Уже пробовала...Но...
OnCalcWidth срабатывает перед выводом КАЖДОГО cell (НО НЕ row или column) и просто-напросто обрезает все данные, которые в ячейку columnа не вместились.

Картинка с другого сайта.

Уже пыталась так делать (((( У меня тоже так сделать - была первая мысль. Но спасибо за идею )
11 май 18, 10:40    [21402297]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
OlyaLora
которые в ячейку columnа не вместились

вместо того, чтоб "растянуть" ячейку вниз
11 май 18, 10:44    [21402308]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
DimaBr
Member

Откуда:
Сообщений: 10783
Вот ответ на все ваши вопросы по Кросу.
Подготовьте данные для отчёта и печатайте в удобном для вас виде. Отчёт не должен ФОРМИРОВАТЬ данные, он должен их печатать из датасета (ну итожки конечно не в счёт)
11 май 18, 10:59    [21402346]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
DimaBr
Отчёт не должен ФОРМИРОВАТЬ данные, он должен их печатать из датасета (ну итожки конечно не в счёт)

Он их и не формирует. Даже если, предположим, убрать динамическое создание колонок (которое, кстати, появилось лишь только из-за того что РАЗНЫЕ строки датасета Fast воспринимает как одну и ту же из-за совпадения части ключа) и оставить жить два разных макета (чего бы тоже не очень-то и хотелось, ибо при изменении одного макета необходимо будет непременно помнить об изменении и второго), то мы вернемся к предыдущей схеме, т е "ручному" управлению расстановок символа конца строки в данных, что тоже нехорошо и некрасиво, потому что по-хорошему, я не знаю, как правильно посчитать, после какого именно символа ставить конец строки для оптимального вида печати (да и сдается мне, не должна об этом задумываться, потому что, как раннее написал gpi, OnCalcWidth должен посчитать это и без меня, коль скоро отчет в этом случае данные ни коим образом не формирует).
11 май 18, 11:22    [21402410]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
Кстати говоря, несколько лет назад, впервые столкнувшись с данной проблемой (когда ни о каких там динамических столбцах и речи не шло), после долгих попыток сделать отчет удобочитаемым, я написала в и их тех поддержку и приложила не свои готовые данные, а макет, в котором просто вручную заполнила кросс, и проблема проявилась абсолютно точно также. Какое-то время со мной общался парень из тех.поддержки, потом он перевел вопрос на разработчика.....и всё, больше никаких вестей от них не поступало...
11 май 18, 11:28    [21402425]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
vavan
Member

Откуда: Казань
Сообщений: 3196
OlyaLora, а если это было еще в старом саппорте то и тикет небось пропал бесследно?
11 май 18, 11:38    [21402454]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
gpi
Member

Откуда: г. Волноваха, Украина
Сообщений: 692
OlyaLora
gpi
Устанавливайте ширину столбцов кросса в событии кросса OnCalcWidth

Уже пробовала...Но...
OnCalcWidth срабатывает перед выводом КАЖДОГО cell (НО НЕ row или column) и просто-напросто обрезает все данные, которые в ячейку columnа не вместились.

Картинка с другого сайта.

Уже пыталась так делать (((( У меня тоже так сделать - была первая мысль. Но спасибо за идею )

1,2,3 - это не column, это row header. Ширину row header, к сожалению, не установишь. Попробуйте, поможет ли MaxWidth в этом случае. А ширину column (4 и далее) мoжно задавать и в OnCalcWidth

vavan
OlyaLora, а если это было еще в старом саппорте то и тикет небось пропал бесследно?

Если тикет создан до декабря 2012 г. и в декабре 2012 г. был закрыт, то после 2014 или 2015 гг. был удалён
11 май 18, 11:52    [21402511]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
gpi
Попробуйте, поможет ли MaxWidth в этом случае. А ширину column (4 и далее) мoжно задавать и в OnCalcWidth

Да тоже уже пробовала. Обрезает длинные названия. Причем степень "зарезания" зависит от выставленной MaxWidth.

Отчет с MaxWidth = 100, а в OnCalcWidth ширина = 60 (заголовки 7 и 8 столбцов обрезаны, но не сильно (хотя, думаю, определение "не сильно" вряд ли устроит пользователя))
Картинка с другого сайта.

А вот отчет с уже MaxWidth = 200, а в OnCalcWidth ширина = 60 (заголовки 7 и 8 столбцов обрезаны, и уже прям сильно)
Картинка с другого сайта.

А это отчет с уже MaxWidth = 500, и нет OnCalcWidth (заголовки 7 и 8 столбцов не обрезаны, но зато и форма нечитаема)
Картинка с другого сайта.
11 май 18, 12:47    [21402795]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
Можно, конечно, каким-то образом попытаться вычислить оптимальное соотношение величин MaxWidth и Width в OnCalcWidth, давая fastreportу возможность "обрезать слишком длинные" с его точки зрения данные, но мы-то знаем, что это нехорошо, и пользователям вряд ли понравится....
Уверена, что первое, что услышу будет:"Просто сделайте ячейки с названиями подлиннее" )))
11 май 18, 12:53    [21402825]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
vavan,
Попытаюсь сейчас поискать.
11 май 18, 12:54    [21402832]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
чччД
Guest
Что вы так уродуетесь, выводите в иксель
11 май 18, 13:15    [21402914]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
gpi
Member

Откуда: г. Волноваха, Украина
Сообщений: 692
Пример для FRDemo. FR 5.6.14

К сообщению приложен файл (60.fr3 - 11Kb) cкачать
11 май 18, 13:20    [21402933]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
Тикет, кстати открыт до сих пор. А прошло уже почти 4 года ))))

Картинка с другого сайта.

Но и не решен

Картинка с другого сайта.
11 май 18, 14:08    [21403081]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
чччД
Что вы так уродуетесь, выводите в иксель

Отчету не один год. И он работает.
+
Это как в анекдоте про мальчика, который про солнце спрашивал у папы-программиста

Если не найду другого выхода, то, наверное, придется...
Но, опять же, спасибо за идею. Мож, лучше в какой-нибудь другой (и желательно бесплатный ))) ) отчетник?...
11 май 18, 14:12    [21403096]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
gpi
Пример для FRDemo. FR 5.6.14

Эммм...мы с Вами, наверное, не оч друг друга поняли. Вот чуть переделала макет. Кстати, почти такой же я отправляла и ребятам из фаста.

С названиями, правда, понапутала, но смысл, думаю, прозрачный: слова "длинное" в заголовках не видать вообще...

К сообщению приложен файл (61.fr3 - 26Kb) cкачать
11 май 18, 14:20    [21403124]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
DimaBr
Member

Откуда:
Сообщений: 10783
Ваш Кросс данные не суммирует ? У вас проблема в формировании заголовка колонок ?

Создайте мемки на бенде Header или ColumnHeader, сделайте его растягиваемым и мемки растягиваемыми.
Зная количество колонок в датасете, можно получить ширину колонки, создать мемки на Detail-бенде и на Header-бенде.

Зачем пытаться использовать Кросс, если количество колонок заранее известно ?
11 май 18, 15:00    [21403276]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
DimaBr
Ваш Кросс данные не суммирует ?

Пока, да. Не суммирует. Но это не значит, что завтра это не понадобится ;)


DimaBr
У вас проблема в формировании заголовка колонок ?

Именно. Точнее, проблема в формировании заголовка, влезающего на страницу таким образом, чтоб всё было максимально читаемым.

DimaBr
Зачем пытаться использовать Кросс, если количество колонок заранее известно ?


Оно НЕИЗВЕСТНО заранее. Варьируется от запроса и от базы. от 1 и до....ну, порядка 50ти точно встречала. Известно оно мне будет только тогда, когда запрос выполнен. Для каждого из запросов (и в каждой отдельно взятой базе данных) количество колонок будет разным
11 май 18, 15:25    [21403385]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
DimaBr
Создайте мемки на бенде Header или ColumnHeader, сделайте его растягиваемым и мемки растягиваемыми.
Зная количество колонок в датасете, можно получить ширину колонки, создать мемки на Detail-бенде и на Header-бенде.


Я правильно поняла, что мемки нужно будет создавать динамически? (кол-во колонок-то неизвестно)
В общем-то, меня это не пугает, просто не уверена, что это наиболее оптимальный способ решения. Если уж создавать всё руками, то проще действительно писать сразу в excel
11 май 18, 15:28    [21403399]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 108
Приложенный отчет, понятное дело, имеет конкретное кол-во столбиков. Надо ж было как-то обозначить проблему, а весь проект с базой, а еще лучше с несколькими...сами понимаете
11 май 18, 15:32    [21403416]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить