30.12.2004, 10:00 | #1 |
Участник
|
Высота строк в отчетах
Доброе утро всем.
Подскажите, пожалуйста, как в отчете сделать высоту строк равной высоте максимальному полю (есть несколько полей, высота всех разная)? За ранее благодарна. |
|
30.12.2004, 10:16 | #2 |
Участник
|
Установите у всех полей и секции свойство Height = auto
|
|
30.12.2004, 11:53 | #3 |
Участник
|
у всех полей свойство Height = auto и это не помогает, поле не увеличивается по высоте.
|
|
30.12.2004, 12:43 | #4 |
Участник
|
Можно поставить значение Column height, но тогда высота контролов будет равна высоте всей секции. Как вариант можно использовать свойство ModelFieldName - тогда все размеры элемента управления (если они auto) будут совпадать с размерами контрола, указанного в свойстве ModelFieldName. Но это не совсем правильно, так как тогда придется вручную указывать все остальные размеры и координаты местоположения.
|
|
30.12.2004, 12:58 | #5 |
Участник
|
Может поможет
PHP код:
|
|
30.12.2004, 13:14 | #6 |
программист
|
Ну а как же свойство DynamicHeight. Установите его в true.
|
|
30.12.2004, 13:17 | #7 |
Участник
|
при установке DynamicHeight в true расширяются только выбранные поля, а мне надо чтобы все поля в строке по максимальному
|
|
30.12.2004, 13:21 | #8 |
программист
|
Цитата:
Изначально опубликовано eva
при установке DynamicHeight в true расширяются только выбранные поля, а мне надо чтобы все поля в строке по максимальному |
|
30.12.2004, 13:27 | #9 |
Участник
|
Сетка нужна
|
|
30.12.2004, 13:54 | #10 |
программист
|
Как делаю я...
Сетку делать трудно (по крайней мере, я пока не нашел легкого решения...).
Особенно, если поля разной высоты... Схема такая: body - поля из таблицы. У всех полей убираете метки. У body ставите lineAbove = solid; lineBelow = solid; lineLeft = solid; lineRight = solid; У самого высокого поля ставите DynamicHeader = true, между полями ставите вертикальные shape нулевой высоты. Перекрываете метод ExecuteQuery у body так public void executeSection() { real mm100; ; mm100 = FullName.heightOfWordWrappedString100mm( tmpReportTable.FullName ); Shape_1.height(mm100/100.0+1, Units::mm); Shape_2_2.height(mm100/100.0+1, Units::mm); И т.д…. super(); } P.S. tmpReportTable.FullName – высокое поле Shape_1.height(mm100/100.0+1, Units::mm) – динамическая установка высоты. Ну и заголовок формируете в виде PageHeader (чтоб на новой странице появлялся) с обычным текстом. У текста ставите рамки… Текст надо сделать по ширине равным ширине полей из body (очень трудоемко)… Правда не знаю как сделать сетку если несколько полей с разной высотой… Но думаю это возможно. |
|
|
За это сообщение автора поблагодарили: Gustav (16). |
30.12.2004, 13:56 | #11 |
Участник
|
Всем, огромное спасибо за ответы.
|
|
30.12.2004, 14:05 | #12 |
Участник
|
2 gudzon
А почему не сделать у вертикальных линий высоту Column height? Тогда не надо будет программно устанавливать высоту каждой вертикальной линии. |
|
30.12.2004, 14:23 | #13 |
программист
|
Цитата:
Изначально опубликовано Hezl
2 gudzon А почему не сделать у вертикальных линий высоту Column height? Тогда не надо будет программно устанавливать высоту каждой вертикальной линии. |
|
30.12.2004, 23:02 | #14 |
Участник
|
Цитата:
Изначально опубликовано gudzon
Кажется Axapta не может справиться со строками разной высоты... Нарисовать сетку границами контролов для строк переменной ширины - нет (стандартными средствами без программирования). Не рисуйте сетку. |
|
31.12.2004, 03:16 | #15 |
Гость
|
Сетка делается довольно просто. Посмотреть можно в отчете SalesPurchInvoice_RU метод prepareDynamicSection.
|
|
|
За это сообщение автора поблагодарили: Gustav (5). |
21.12.2006, 14:43 | #16 |
Участник
|
Подытожим:
Для использования динамического масштабирования высоты строки необходимо: 1. у секции LineBody устанавливаем параметр height=0.0 mm 2. всем ячейкам строки установить свойство height=ColumnHeight 3. в методе executeSection перед super() добавить: X++: LineBody.height100mm(ERG_Vendor.heightOfWordWrappedString100mm(lineData.ItemName)); LineBody - соответственно наша секция ERG_Vendor - поле по которому будем масштабировать всю строку lineData.ItemName - значение в таблице, по которому будет масштабироваться поле (сори, что поднял, но всё же) |
|
|
За это сообщение автора поблагодарили: IKA (1). |
25.01.2008, 19:35 | #17 |
Moderator
|
универсальная параметрическая штучка
Тоже наконец "посчастливилось" повозиться с рисованием сетки и расчетом высоты вертикальных "палок" (которые shapes). С благодарностью воспринял идеи этой темы и, творчески передрав и реорганизовав код из упоминаемого источника (отчет SalesPurchInvoice_RU, метод prepareDynamicSection), оформил метод с параметрами. Мне нужно было рисовать сразу 3 разные сетки, поэтому вопрос о некоторой универсальной процедуре естественным образом встал сам собой. Получившийся метод я гордо поместил в класс Global и теперь тихо радуюсь. Приглашаю к этой тихой радости всех желающих.
Параметры метода: 1. секция, подлежащая динамическому расчету; 2. контейнер пар "control - значение" (где "значение" - характерная "максимальная" строка, по которой происходит расчет требуемой высоты контрола); 3. минимально допустимая высота элемента в секции (ниже которой не опускаемся, чтобы не было очень низких строк; unit - 1/100 mm, т.е. значение, например, 1200 соответствует в миру 12 миллиметрам) Каждая пара "контрол - значение" в свою очередь тоже контейнер. Кол-во передаваемых пар - по вашему желанию. Может быть достаточно и одного контрола, потенциально самого высокого в секции в плане DynamicHeight. Но можно - для уверенности - перечислить и все имеющиеся в секции контролы, задав им в качестве значения соответствующие поля таблиц или дисплей-методы. Метод, помещенный в класс Global: X++: static void prepareReportDynamicSection( ReportSection _section, container _pairsControlValue, int _minHeight100mm = 0) { ReportControl reportControl; ReportShapeControl reportShapeControl; Counter i; int childNodesCount; int maxHeight100mm, maxTop100mm; str currControl, currValue; void processControl( ReportControl _control, str _fieldValue ) { int ht100, tp100; ; ht100 = max( _control.heightOfWordWrappedString100mm( _fieldValue ), _control.heightOfWordWrappedString100mm(' '), // ' \n \n \n ' _minHeight100mm); tp100 = _control.top100mm(); maxHeight100mm = max( maxHeight100mm, ht100 ); maxTop100mm = max( maxTop100mm, tp100 ); } ; for(i = 1; i <= conlen(_pairsControlValue); i++) { [currControl, currValue] = conpeek(_pairsControlValue, i); processControl( _section.controlName(currControl), currValue); } childNodesCount = _section.AOTchildNodeCount(); for(i = 0; i < childNodesCount; i++) { reportControl = _section.controlNo(i); if (! reportControl) continue; if(reportControl.controlType() == ReportFieldType::BOX) { reportShapeControl = reportControl; if(reportShapeControl.type() != ShapeType::Horizontal) { reportShapeControl.height100mm(maxHeight100mm + 1 + maxTop100mm); } else { if(reportShapeControl.top100mm()) { reportShapeControl.top100mm(maxHeight100mm + 1 + maxTop100mm); } } } else { reportControl.height100mm(maxHeight100mm); } } } Пример вызова - в методе executeSection соответствующей секции: X++: public void executeSection() { prepareReportDynamicSection ( this, [ ['Control_1', element.getLineNum() ], ['Control_2', element.getItemDescr()], ['Control_3', table1.field1 ], ['Control_4', 'bla-bla-bla' ] ], 1200 ); super(); } |
|
|
За это сообщение автора поблагодарили: mazzy (5), Sergey Petrov (1), star52 (1). |
02.04.2009, 09:08 | #18 |
Читатель
|
Вопрос к знатокам - метод eval() у reportStringControl получает заранее рассчитанные данные или каждый раз вычисляет их заново? Если не вычисляет, то можно вообще вот такой метод вставить в Global и вызывать его из executeSection отчета, передавая ему текущую секцию:
X++: static void prepareReportDynamicSection(ReportSection _section) { ReportControl reportControl; ReportStringControl reportStringControl; ReportShapeControl reportShapeControl; Counter i; int childNodesCount; int maxHeight100mm = _section.height100mm(), maxTop100mm; childNodesCount = _section.AOTchildNodeCount(); for(i = 0; i < childNodesCount; i++) // step one { reportControl = _section.controlNo(i); if(!reportControl || reportControl.handle() != classnum(ReportStringControl)) continue; reportStringControl = reportControl; maxHeight100mm = max(reportStringControl.heightOfWordWrappedString100mm(reportStringControl.eval()), reportStringControl.heightOfWordWrappedString100mm(' '), maxHeight100mm); maxTop100mm = max(maxTop100mm, reportStringControl.top100mm()); } for(i = 0; i < childNodesCount; i++) // step two { reportControl = _section.controlNo(i); if (! reportControl) continue; if(reportControl.controlType() == ReportFieldType::Box) { reportShapeControl = reportControl; if(reportShapeControl.type() != ShapeType::Horizontal) { reportShapeControl.height100mm(maxHeight100mm + 1 + maxTop100mm); } else { if(reportShapeControl.top100mm()) { reportShapeControl.top100mm(maxHeight100mm + 1 + maxTop100mm); } } } else { reportControl.height100mm(maxHeight100mm); } } } |
|
02.04.2009, 10:54 | #19 |
NavAx
|
Я вообще писал доработку и выкладывал в "Полезное" по ровнянию строк автоматическому практич. для любого отчета.
eval каждый раз вычисляет заново.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
Теги |
высота строк отчета, отчет, сеть |
|
|