AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.12.2004, 10:00   #1  
eva is offline
eva
Участник
 
34 / 10 (1) +
Регистрация: 05.10.2004
Адрес: -
Высота строк в отчетах
Доброе утро всем.
Подскажите, пожалуйста, как в отчете сделать высоту строк равной высоте максимальному полю (есть несколько полей, высота всех разная)?
За ранее благодарна.
Старый 30.12.2004, 10:16   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Установите у всех полей и секции свойство Height = auto
Старый 30.12.2004, 11:53   #3  
eva is offline
eva
Участник
 
34 / 10 (1) +
Регистрация: 05.10.2004
Адрес: -
у всех полей свойство Height = auto и это не помогает, поле не увеличивается по высоте.
Старый 30.12.2004, 12:43   #4  
Hezl is offline
Hezl
Участник
Аватар для Hezl
 
138 / 16 (1) ++
Регистрация: 21.04.2004
Адрес: Moscow, Russia
Можно поставить значение Column height, но тогда высота контролов будет равна высоте всей секции. Как вариант можно использовать свойство ModelFieldName - тогда все размеры элемента управления (если они auto) будут совпадать с размерами контрола, указанного в свойстве ModelFieldName. Но это не совсем правильно, так как тогда придется вручную указывать все остальные размеры и координаты местоположения.
Старый 30.12.2004, 12:58   #5  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Может поможет
PHP код:
    real                nameHeight;
    
ReportStringControl stringControl element.design().controlName("Name");
    ;
    
nameHeight stringControl.heightOfWordWrappedString100mm('aaa');

    if (
nameHeight != stringControl.height100mm())
        
stringControl.height100mm(nameHeight); 
Старый 30.12.2004, 13:14   #6  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Ну а как же свойство DynamicHeight. Установите его в true.
Старый 30.12.2004, 13:17   #7  
eva is offline
eva
Участник
 
34 / 10 (1) +
Регистрация: 05.10.2004
Адрес: -
при установке DynamicHeight в true расширяются только выбранные поля, а мне надо чтобы все поля в строке по максимальному
Старый 30.12.2004, 13:21   #8  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Цитата:
Изначально опубликовано eva
при установке DynamicHeight в true расширяются только выбранные поля, а мне надо чтобы все поля в строке по максимальному
Не выставляйте у остальных границы и все... Вам сетка нужна?
Старый 30.12.2004, 13:27   #9  
eva is offline
eva
Участник
 
34 / 10 (1) +
Регистрация: 05.10.2004
Адрес: -
Сетка нужна
Старый 30.12.2004, 13:54   #10  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Как делаю я...
Сетку делать трудно (по крайней мере, я пока не нашел легкого решения...).
Особенно, если поля разной высоты...

Схема такая:
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  
eva is offline
eva
Участник
 
34 / 10 (1) +
Регистрация: 05.10.2004
Адрес: -
Всем, огромное спасибо за ответы.
Старый 30.12.2004, 14:05   #12  
Hezl is offline
Hezl
Участник
Аватар для Hezl
 
138 / 16 (1) ++
Регистрация: 21.04.2004
Адрес: Moscow, Russia
2 gudzon
А почему не сделать у вертикальных линий высоту Column height? Тогда не надо будет программно устанавливать высоту каждой вертикальной линии.
Старый 30.12.2004, 14:23   #13  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Цитата:
Изначально опубликовано Hezl
2 gudzon
А почему не сделать у вертикальных линий высоту Column height? Тогда не надо будет программно устанавливать высоту каждой вертикальной линии.
Точно, к сожалению, в чем проблема я не помню... Кажется Axapta не может справиться со строками разной высоты... Т. е. первая строка - один символ, вторая - три и т.д. Если вспомню - напишу...
Старый 30.12.2004, 23:02   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано gudzon
Кажется Axapta не может справиться со строками разной высоты...
Справиться со строками разной выстоы - может.
Нарисовать сетку границами контролов для строк переменной ширины - нет (стандартными средствами без программирования).

Не рисуйте сетку.
Старый 31.12.2004, 03:16   #15  
Chris2005
Гость
 
n/a
Сетка делается довольно просто. Посмотреть можно в отчете SalesPurchInvoice_RU метод prepareDynamicSection.
За это сообщение автора поблагодарили: Gustav (5).
Старый 21.12.2006, 14:43   #16  
Dronas is offline
Dronas
Участник
 
213 / 14 (1) ++
Регистрация: 16.11.2004
Подытожим:

Для использования динамического масштабирования высоты строки необходимо:
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  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
универсальная параметрическая штучка
Тоже наконец "посчастливилось" повозиться с рисованием сетки и расчетом высоты вертикальных "палок" (которые 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);
        }
    }
}
Примечание: Наличие вложенного метода processControl - не более, чем рудимент от первоначальной попытки декомпозиции задачи. При желании можно смело избавиться от него, перенеся необходимые операторы в общий цикл.

Пример вызова - в методе 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  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Вопрос к знатокам - метод 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  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Я вообще писал доработку и выкладывал в "Полезное" по ровнянию строк автоматическому практич. для любого отчета.
eval каждый раз вычисляет заново.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Теги
высота строк отчета, отчет, сеть

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
Пользовательский генератор строк-перечислений...- 2: Доп.вкладка для SysQueryForm Gustav DAX: База знаний и проекты 1 04.05.2007 18:04
Высота строк грида Pustik DAX: Программирование 1 14.07.2006 09:26
Очень маленькая высота строк в таблице формы (1-2 мм) Gustav DAX: Программирование 11 17.06.2006 11:57
Высота строк в отчетах динамически velk DAX: Программирование 5 26.10.2004 11:55

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:30.