06.08.2008, 18:42 | #1 |
Участник
|
отключение сортировки при lookup
каким образом можно запретить (отключить) возможность сортировки при лукапе?
данные источника просматриваются с помощью класса SysTableLookup очевидный путь с перекрытием метода Sort() на поле данных в гриде, создаваемом динамически, не подходит, так как при создании этого поля данных неизвестно его имя (а после при задании, видимо, уже теряется ссылка на соответствующий метод). также интересно, что если на грид повесить не поле данных, а контрол вида FormControl::String и указать ему источник данных и поле данных, то сортировка на нём в гриде работает, а вот метод Sort() при этом не вызывается. в качестве временного и неполного решения пока отключил заголововки столбцов в гриде. куда ещё можно копнуть? есть ли какие-то способы заставить не менять порядок отображения через источник данных (запрос) или задать "корректное" имя контрола с полем данных на гриде? мерси. AX4.0, SP1
__________________
Felix nihil admirari |
|
08.08.2008, 15:01 | #2 |
MCTS
|
Вообщем на досуге посидел, надеюсь, что поможет.
В классе 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 |
Участник
|
Цитата:
чуток переделал код: в описании переменных добавил: X++: //--> TreeNode gridNode, controlNode, methodsNode; MemberFunction newMethod; str source = 'public int sort(SortOrder _sortDirection){; return 0;}'; TreeNodeIterator iterator; //<-- ... 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 |
Участник
|
Цитата:
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 |
Участник
|
Тема старая но отпишу здесь, так как было обсуждение проблемы с коллегами по работе.
Предлагаемые здесь решения - антипаттерн. Нужно избегать модификации кода с добавлением методов на лету. Лучше уж в 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(); } Последний раз редактировалось Logger; 27.08.2024 в 11:32. |
|