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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.08.2008, 18:42   #1  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
отключение сортировки при lookup
каким образом можно запретить (отключить) возможность сортировки при лукапе?

данные источника просматриваются с помощью класса SysTableLookup

очевидный путь с перекрытием метода Sort() на поле данных в гриде, создаваемом динамически, не подходит, так как при создании этого поля данных неизвестно его имя (а после при задании, видимо, уже теряется ссылка на соответствующий метод).

также интересно, что если на грид повесить не поле данных, а контрол вида FormControl::String и указать ему источник данных и поле данных, то сортировка на нём в гриде работает, а вот метод Sort() при этом не вызывается.

в качестве временного и неполного решения пока отключил заголововки столбцов в гриде.

куда ещё можно копнуть? есть ли какие-то способы заставить не менять порядок отображения через источник данных (запрос) или задать "корректное" имя контрола с полем данных на гриде?

мерси.

AX4.0, SP1
__________________
Felix nihil admirari
Старый 08.08.2008, 15:01   #2  
altap is offline
altap
MCTS
MCBMSS
 
26 / 18 (1) ++
Регистрация: 28.09.2005
Вообщем на досуге посидел, надеюсь, что поможет.
В классе SysTableLookup модифицировал метод buildGrid к такому виду:
X++:
protected FormBuildGridControl buildGrid(FormBuildGridControl _formBuildGridControl,
                                         FormBuildDataSource  _formBuildDataSource,
                                         Form                   form) //передаем форму в метод для поиска ее ноды
{
    FormBuildControl                formBuildControl;
    Object                          obj;
    boolean                         returnItem;
    boolean                         method;
    int                             fieldId;
    int                             i, j;
    //-->
    TreeNode                        gridNode, controlNode, methodsNode;
    MemberFunction                  newMethod;
    str                             source;
    TreeNodeIterator                iterator;
    //<--
    ;

    for (i = 1; i <= conlen(lookupItems); i++)
    {
        [fieldId, returnItem, method] = conpeek(lookupItems, i);

        if (!method)
        {
            formBuildControl = _formBuildGridControl.addDataField(_formBuildDataSource.id(), fieldId);

            if (i == 1 || returnItem)
            {
                controlIdx = formBuildControl.id();
                lookupField = fieldId;
            }

            obj = formBuildControl;

            if (labels[i])
            {
                obj = formBuildControl;
                obj.label(labels[i]);
            }

            //Дойдем до созданного контрола
            gridNode = form.AOTfindChild('Designs');
            gridNode = gridNode.AOTfindChild('Design');
            gridNode = gridNode.AOTfirstChild();

            iterator = gridNode.AOTiterator();
            controlNode = iterator.next();
            while (controlNode)
            {
                If (controlNode.AOTname() == obj.name()) break;
                controlNode = iterator.next();
            }

            //Перекроем метод sort
            methodsNode = controlNode.AOTfindChild('Methods');
            methodsNode.AOTadd('sort');
            newMethod   = methodsNode.aotfindChild('sort');

            source      = 'public int sort(SortOrder _sortDirection) ' +
                            '{ ' +
                            '    ; ' +
                            '    return 0; ' +
                            '}';

            newMethod.AOTsetSource(source, false);
            //Откомпилируем новый метод
            newMethod.AOTcompile(1);
        }
    }

    return _formBuildGridControl;
}
единственное, что не смог победить - это при компиляции метода выскакивает окошко сообщений компилятора...
Вдохновило это

Последний раз редактировалось altap; 08.08.2008 в 16:13.
За это сообщение автора поблагодарили: wojzeh (1).
Старый 08.08.2008, 20:50   #3  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от altap Посмотреть сообщение
Вообщем на досуге посидел, надеюсь, что поможет.
В классе SysTableLookup модифицировал метод buildGrid к такому виду:
гут. аккурат то, что требовалось. как-то совсем забыл про возможность добраться до свежесозданного элемента формы через AOT. главное, чтоб не тормозило шибко при работе нескольких пользователей.

чуток переделал код:

в описании переменных добавил:

X++:
   //-->
TreeNode                        gridNode, controlNode, methodsNode;
MemberFunction                  newMethod;
str                             source = 'public int sort(SortOrder _sortDirection){; return 0;}';
TreeNodeIterator                iterator;
//<--
в конце стандартного метода buildGrid добавил:
...
X++:
    //-->
    gridNode = _form.AOTfindChild('Designs');
    gridNode = gridNode.AOTfindChild('Design');
    gridNode = gridNode.AOTfirstChild();
    iterator = gridNode.AOTiterator();
    controlNode = iterator.next(); //methods of the grid control!
    controlNode = iterator.next();
    for (i = 1; i <= conlen(lookupItems); i++)
    {
            methodsNode = controlNode.AOTfindChild('Methods');
            newMethod    = methodsNode.AOTadd('sort');
            newMethod.AOTsetSource(source, false);
            newMethod.AOTcompile(1);
            controlNode = iterator.next();
    }
    //<--
    return _formBuildGridControl;
}
большое спасибо!
__________________
Felix nihil admirari
Старый 15.08.2008, 00:36   #4  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от altap Посмотреть сообщение
единственное, что не смог победить - это при компиляции метода выскакивает окошко сообщений компилятора...
я сделал вот так:

X++:
...
    this.setCompilerWarningsOff();
    for (i = 1; i <= conlen(lookupItems); i++)
    {
            //override sort method
            methodsNode = controlNode.AOTfindChild('Methods');
            newMethod   = methodsNode.AOTadd('sort');
            newMethod.AOTsetSource(source, false);
            //compile the method
            newMethod.AOTcompile();
            controlNode = iterator.next();
    }
    this.setCompilerWarningsOn();
...
а отключал-включал не мудрствуя лукаво:
X++:
class SysTableLookupWithoutSort extends SysTableLookup
{
    SysCompilerTarget   target;
}

public void setCompilerWarningsOff()
{
    ;
    target = SysUserInfo::compilerTarget();
    SysUserInfo::compilerTarget(sysCompilerTarget::MessageWindow);
    SysCompilerOutput::setCompilerTarget(sysCompilerTarget::MessageWindow);
    SysCompilerOutput::updateParm();
}

public void setCompilerWarningsOn()
{
    ;
    SysUserInfo::compilerTarget(target);
    SysCompilerOutput::setCompilerTarget(target);
    SysCompilerOutput::updateParm();
}
__________________
Felix nihil admirari
За это сообщение автора поблагодарили: AlGol (2).
Старый 27.08.2024, 11:28   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,944 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Тема старая но отпишу здесь, так как было обсуждение проблемы с коллегами по работе.
Предлагаемые здесь решения - антипаттерн. Нужно избегать модификации кода с добавлением методов на лету.

Лучше уж в executeQuery датасорса достать query перед super() и явно выставить сортировки какие нам надо, например так:

X++:
public void executeQuery()
{
    Query   query;
    ;

    query = this.queryRun() ? this.queryRun().query() : this.query(); // при первом запуске this.queryRun() равен null

    // прибиваем гвоздями сортировку как нам надо:
    query.dataSourceTable(TableNum(...)).sortClear();
    query.dataSourceTable(TableNum(...)).addSortField(fieldNum(..., ...));
    // или можно как-то иначе поработать с query - убрав из сортировки запрещенные поля
    
    super();
}
А в общем случае, SysTableLookup можно модифицировать подставив туда форму пустышку с датасорсом, но common табличкой как в SysTableBrowser

Последний раз редактировалось Logger; 27.08.2024 в 11:32.
Теги
ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
gatesasbait: How to define a custom lookup form for an extended datatype Blog bot DAX Blogs 0 09.07.2008 22:05
Создание Lookup формы Maxim Gorbunov DAX: База знаний и проекты 9 26.06.2007 16:44
Нагло глючит lookup Sada DAX: Программирование 1 08.06.2006 10:32
Динамические Lookup формы. Андрей Василюк DAX: База знаний и проекты 0 07.12.2001 07:07
Произвольная Lookup форма Maxim Gorbunov DAX: База знаний и проекты 0 30.11.2001 21:59

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

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

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