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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.11.2004, 18:41   #1  
olesh is offline
olesh
Участник
 
58 / 26 (1) +++
Регистрация: 02.04.2002
Адрес: Москва
Пользовательские настройки и модификация форм
Наши пользователи активно используют настройки форм, делают по несколько "конфигураций" для себя (Аксапта 3.0). Но после модификации сложных форм (типа SalesTable), даже при минимальном изменении (добавлении одного поля, например), частенько при открытии формы или применении сохраненной настройки Аксапта вылетает. Приходится удалять сделанные настройки и бедным пользователям приходится все делать заново, что их совсем не радует.

Вопрос - как бы решить эту неприятную проблему?
Старый 02.11.2004, 09:55   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Посмотрите таблицу SysLastValue.
Типом recordType == Usersetup... там должно быть...
Возможно, следует экспортить / импортить её перед загрузкой модификаций...

Поищите не форуме, это уже как-то обсуждалось.
http://www.axforum.info/forums/searc...=&pagenumber=2

С Уважением,
Георгий
Старый 02.04.2014, 12:05   #3  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Добрый день!

Есть похожая проблема, DAX 2009: у настроенных пользователями форм при последующих модификациях слетают со своего места некоторые поля и болтаются на вкладке Обзор поверх других полей.


Помогает сброс, но пользователям приходится заново настраивать внешний вид формы, загрузка уже не помогает.
Есть ли решение?
Миниатюры
Нажмите на изображение для увеличения
Название: Пример 2.jpg
Просмотров: 1207
Размер:	105.9 Кб
ID:	8807  
Старый 03.04.2014, 11:12   #4  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Такая проблема действительно имеет место быть.
Если мне не изменяет память, то есть два варианта:
1. При переносе проектов, в которые входит форма с пользовательскими настройками, нужно - не импортировать такую форму, а вставлять модифицированные места через сравнение.
2. Можно сохранить настройки пользователя, импортировать проект, а потом импортировать настройки пользователя.
Старый 30.03.2017, 09:53   #5  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Добрый день, коллеги!

Хотелось бы понять, насколько распространена описанная мной выше проблема с летающими полями? Скажите, пжл, есть ли еще у кого-то? Нужно решение кому-нибудь?
Старый 30.03.2017, 10:08   #6  
online
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Бывает изредка.
Решение конечно нужно.

Нас достает больше другая проблема - падение формы после подъема изменений. Жаль пользователей которым приходится заново настраивать формы.
Старый 30.03.2017, 10:54   #7  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
В таком случае предложу свое решение. Его плюс в том, что при наличии летающих контролов, форму не нужно перенастраивать, все делается автоматически при нажатии одной кнопки.
Опытным путем удалось установить, что летающие поля при перечислении всех контролов формы встречаются дважды. При этом "летают" только доступные для редактирования поля. Заявленная функция находит такие поля и скрывает их, добавляя вместо них эти же поля. Вообще опять же опытным путем установил, что лучше добавлять поля, чем переносить их из датагрупп. Насколько я понял, в переносе полей и кроется проблема, т.к. они начинают встречаться на форме и в новом, и в изначальном месте, id у контролов совпадает.
Дисплей-методы не летают ввиду того, что недоступны для редактирования, даже если встречаются дважды. А эдит-методы мной не тестировались.

Добавляем на форму SysSetupForm кнопку:

X++:
void clicked()
{
    ;

    super();

    sysSetupForm.upc_flyingControlsRecreate();
}
В класс SysSetupForm добавляем следующие методы:
Перечисление летающих контролов:
X++:
container upc_flyingControlNumSet()
{
    Set set         = new Set(Types::Integer),
        flyingSet   = new Set(Types::Integer);

    void printControls(Object o)
    {
        FormBuildControl    formBuildControl;
        Object              control;
        int                 i;
        ;

        for (i=1; i<=o.controlCount(); i++)
        {
            formBuildControl    = o.controlNum(i);
            control             = formBuildControl;

            if( set.in(formBuildControl.id())           &&
                !formBuildControl.userHide()            &&
                this.formControlIsDataBound(control)    &&
                control.dataSource()                    &&
                control.dataField() )
            {
                flyingSet.add(formBuildControl.id());
            }

            set.add(formBuildControl.id());

            if (formBuildControl.isContainer())
                printControls(formBuildControl);
        }
    }
    ;

    printControls(this.design());

    return flyingSet.pack();
}
Вывод в инфолог летающих контролов:
X++:
void upc_flyingControlsPrint()
{
    Set                 set;
    SetIterator         si;
    FormControl         formControl;
    ;

    set = Set::create(this.upc_flyingControlNumSet());
    si  = new SetIterator(set);
    while(si.more())
    {
        formControl = editFormRun.control(si.value());
        info(strfmt('%1 %2', formControl.id(), formControl.name()) );

        si.next();
    }
}
Пересоздание контролов (скрытие сущетсвующего и добавление нового):
X++:
void upc_flyingControlsRecreate()
{
    Set                 set;
    SetIterator         si;
    FormTreeItem        formTreeItem;
    Object              control;
    int                 cnt;
    ;

    set = Set::create(this.upc_flyingControlNumSet());
    si  = new SetIterator(set);
    while(si.more())
    {
        control         = this.formControl(si.value());
        formTreeItem    = formControlTree.getItem(this.formControlTreeControl2Idx(si.value()));

        this.upc_formControlTreeUserAdd(
            control,
            formControlTree.getParent(formTreeItem.idx()),
            formTreeItem.idx() );

        control.userHide(true);
        cnt++;

        si.next();
    }

    info(strfmt('Обработано полей: %1.', cnt));
}
Добавление контрола на основе существующего:
X++:
public FormControl upc_formControlTreeUserAdd(
    Object      _control,
    TreeItemIdx _parentItemIdx,
    TreeItemIdx _insertAfterItemIdx = 0 )
{
    Object          newControl,
                    insertAfterControl;
    Object          parentControl;
    TreeNodeName    treeNodeName;
    int             i;
    ;

    if (formControlTree.getItem(_parentItemIdx))
    {
        parentControl = this.formControlTreeIdx2Control(_parentItemIdx);

        if (parentControl &&
            !parentControl.isContainer())
        {
            _insertAfterItemIdx = _parentItemIdx;
            _parentItemIdx      = formControlTree.getParent(_insertAfterItemIdx);
            parentControl       = this.formControlTreeIdx2Control(_parentItemIdx);
        }
    }

    if (!parentControl)
    {
        parentControl = this.design();
    }

    if (parentControl)
    {
        parentControl.useUserLayout(true);

        if (_insertAfterItemIdx)
        {
            insertAfterControl = this.formControlTreeIdx2Control(_insertAfterItemIdx);
        }

        if( this.formControlIsDataBound(_control)   &&
            _control.dataSource() )
        {
            if(_control.dataField())
            {
                newControl      = parentControl.addDataField(
                    _control.dataSource(),
                    _control.dataField(),
                    insertAfterControl);
            }
            else if(_control.dataMethod())
            {
                i               = 0;
                do
                {
                    i++;
                    treeNodeName    = strfmt('%1_%2_%3', curuserid(), i, _control.dataMethod());
                }
                while(this.formControlIsNameUsed(treeNodeName));

                newControl      = parentControl.addControl(
                    SysFormRun::controlType(classidget(_control)),
                    treeNodeName,
                    insertAfterControl);

                newControl.dataSource(_control.dataSource());
                newControl.dataMethod(_control.dataMethod());
                newControl.label(_control.label());
                newControl.helpText(_control.helpText());
            }
        }

        if (newControl)
        {
            newControl.markAsUserAdd(true);
            this.formControlTreeAddControl(
                newControl,
                _parentItemIdx,
                _insertAfterItemIdx,
                true);
        }
    }

    return newControl;
}
Ветка с датаметодом есть, но она не тестировалась мной.

Последний раз редактировалось byte; 30.03.2017 в 10:57.
За это сообщение автора поблагодарили: Logger (10), dech (5), Ace of Database (3).
Теги
настройка формы

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
И снова про пользовательские настройки форм Ace of Database DAX: Администрирование 4 01.12.2006 12:05
Слетают пользовательские настройки wit DAX: Функционал 0 22.06.2006 10:58
Еще раз про пользовательские настройки форм Ace of Database DAX: Функционал 8 21.09.2005 10:46
Пользовательские настройки и точки останова loka DAX: Программирование 5 27.04.2005 14:48
Можно ли загрузить пользовательские настройки одновременно для нескольких форм? zlata DAX: Функционал 2 08.12.2003 10:58
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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