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

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

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

Имеется кросс (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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Откуда: г. Волноваха, Украина
Сообщений: 730
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

Откуда:
Сообщений: 88
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

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

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

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

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

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

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

Но и не решен

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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

Откуда:
Сообщений: 88
Приложенный отчет, понятное дело, имеет конкретное кол-во столбиков. Надо ж было как-то обозначить проблему, а весь проект с базой, а еще лучше с несколькими...сами понимаете
11 май 18, 15:32    [21403416]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 88
Пришла мне тут идея удлинять динамически Corner кросса (хотя бы примерно посчитать насколько относительно можно)...

Не прокатило....он расширяет заголовок, но не того уровня )))

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

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

К сообщению приложен файл. Размер - 88Kb
11 май 18, 17:03    [21403748]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
DimaBr
Member

Откуда:
Сообщений: 10482
OlyaLora
DimaBr
Зачем пытаться использовать Кросс, если количество колонок заранее известно ?


Оно НЕИЗВЕСТНО заранее. Варьируется от запроса и от базы. от 1 и до....ну, порядка 50ти точно встречала. Известно оно мне будет только тогда, когда запрос выполнен. Для каждого из запросов (и в каждой отдельно взятой базе данных) количество колонок будет разным

В любом случае вы возвращаете поля каким то запросом и количество полей на момент формирования отчёта известно, фастом их можно посчитать (например возвращается датасет, где поля с данными именуются Data_1, Data_2, Data_3,...).
Далее создаёте динамически нужно количество мемок на заголовке и на детализации.
Я так делаю сплошь и рядом. То в определённое место нужно втулить динамическое количество колонок (для разных подразделений своё количество). То динамичесий лист в ширину с произвольным количеством колонок. В конце формирования устанавливаем ширину листа.
11 май 18, 20:55    [21404122]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 88
_Den_Z__
Кросс не умеет пересчитывать высоту заголовков после построения, если ширина колонки была уменьшена принудительно, в момент построения.

Да эт я давно поняла уже....

_Den_Z__
Выглядеть будет как на скриншоте.

Уррраааааа!!!!!!
+
Прям бальзам для моей души ))))

Спасибо-спасибо-спасибо!!!!

_Den_Z__
Сейчас посмотрел , ничего не мешает это добавить, будет в ближайшем билде.

Эммм....а в ближайшем - это в каком, если не секрет? )))
(собираюсь вообще обновиться до 6 версии, там много всего вкусного обещают )))), но для этого надо среду обновлять, а с этим делом сложнее и дольше, поэтому точно не в ближайшие 2-3... недели
14 май 18, 10:48    [21407380]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 88
DimaBr
Далее создаёте динамически нужно количество мемок на заголовке и на детализации.
Я так делаю сплошь и рядом. То в определённое место нужно втулить динамическое количество колонок (для разных подразделений своё количество). То динамичесий лист в ширину с произвольным количеством колонок. В конце формирования устанавливаем ширину листа.

Честно говоря, ни разу так не делала - как-то получалось обходиться кроссом. Иногда скриптами допиливала (ну, то же самое слияние строк/столбцов с одинаковой частью ключа). DetailData вообще никогда не пользовалась еще. Думаю, тут и рука уже должна быть набита + если вручную всё это дело считать, надо быть предельно внимательным: и про то, что форматы листов могут быть разными, и про самые разные вариации запросов не забыть...(поэтому всё время боюсь, чего-то, да не учесть)
Но за идею, безусловно, огромнейшее спасибо. Если решу в эту сторону думать, непременно буду обращаться за советами ))
14 май 18, 11:18    [21407493]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
_Den_Z__
Guest
OlyaLora,
автор
Эммм....а в ближайшем - это в каком, если не секрет? )))

Уже можете скачать через панель пользователя у нас на сайте. Билд 5.6.15.
В 6ке тоже будет исправлено.
14 май 18, 12:32    [21407767]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 88
_Den_Z__
Уже можете скачать через панель пользователя у нас на сайте. Билд 5.6.15.
В 6ке тоже будет исправлено.

Ок. Преогромнейшее спасибо!
14 май 18, 12:40    [21407781]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
gpi
Member

Откуда: г. Волноваха, Украина
Сообщений: 730
OlyaLora
но для этого надо среду обновлять, а с этим делом сложнее и дольше, поэтому точно не в ближайшие 2-3... недели

FR 5 и FR 6 поддерживают одинаковые версии IDE, так что среду обновлять не придётся
14 май 18, 14:42    [21408290]     Ответить | Цитировать Сообщить модератору
 Re: FastReport. Уменьшить ширину столбцов crossa, не меняя при этом ширину первого  [new]
OlyaLora
Member

Откуда:
Сообщений: 88
_Den_Z__,
Еще раз спасибо. Проверила - работает ))
21 май 18, 11:47    [21425312]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить