19.08.2010, 17:22 | #1 |
Участник
|
Сортировка и вывод полей в lookUp-е
Доброго времени суток. Возникла проблема, никак не поборю )))
Нужно создать лукап, в который выводятся данные из таблицы Месяцы (inf_Months) по условию для одного поля. Условие не меняется все время работы с лукапом. Таблица хранит месяца работы (ежемесячные периоды), открытые или закрытые. Структура таблицы следующая: 1. PeriodDate - тип Date, заполняется как первое число каждого месяца в виде 01.08.2010 2. MonthID - текстовое значение периода в виде "2010 Август" 3. PeriodStatus - признак Открыт/Закрыт (тип Enum) так вот нужно в лукапе вывести ТОЛЬКО MonthID, но отсортированное по значению PeriodDate. Текст лукапа должен содержать также MonthID. Трудность состоит в сортировке... При первом открытии списка все хорошо, после выбора значения и повторном открытии с сортировкой какая-то беда. Ни по индексу не хочет сортировать, ни по полю. Сортирует верно только если поле сортировки (PeriodDate) добавляется с признаком _returnItem = True, но выводить в текст нужно другое поле. Заранее спасибо за помыщь Код: Query q = new query(); QueryBuildDataSource qbds = q.addDataSource(tablenum(inf_Months)); SysTableLookup stl = SysTableLookup::newParameters(tablenum(inf_Months), this); inf_Months tblM; FormRun fr; ; qbds.addRange(fieldnum(inf_Months, PeriodStatus)).value(SysQuery::value(inf_PeriodStatus::Open)); stl.parmQuery(q).dataSourceNo(1).addSortIndex(indexnum(inf_Months, PK_inf_Months)); stl.addLookupfield(fieldnum(inf_Months, PeriodDate)); stl.addLookupfield(fieldnum(inf_Months, MonthID)); fr = stl.formRun(); this.performFormLookup(fr); |
|
20.08.2010, 01:29 | #2 |
Участник
|
перед строкой
qbds.addRange(fieldnum(inf_Months, PeriodStatus)).value(SysQuery::value(inf_PeriodStatus::Open)); попробуйте вставить qbds.addSortField(FieldNum(inf_Months,PeriodDate)); |
|
20.08.2010, 08:37 | #3 |
Участник
|
Можно нескромный наводящий вопрос?
Строка: stl.parmQuery(q).dataSourceNo(1).addSortIndex(indexnum(inf_Months, PK_inf_Months)); ...подразумевает индекс по какому полю? ...может эта строка лишняя? |
|
20.08.2010, 10:13 | #4 |
Участник
|
Цитата:
qbds.orderMode(OrderMode::OrderBy); и учитывая вопрос от ansoft получается X++: Query q = new query(); QueryBuildDataSource qbds = q.addDataSource(tablenum(inf_Months)); SysTableLookup stl = SysTableLookup::newParameters(tablenum(inf_Months), this); //inf_Months tblM; // зачем объявлять и не использовать? FormRun fr; ; qbds.orderMode(OrderMode::OrderBy); qbds.addSortField(FieldNum(inf_Months,PeriodDate)); qbds.addRange(fieldnum(inf_Months, PeriodStatus)).value(SysQuery::value(inf_PeriodStatus::Open)); //stl.parmQuery(q).dataSourceNo(1).addSortIndex(indexnum(inf_Months, PK_inf_Months)); // ...может эта строка лишняя? //stl.addLookupfield(fieldnum(inf_Months, PeriodDate)); // так вот нужно в лукапе вывести ТОЛЬКО MonthID stl.addLookupfield(fieldnum(inf_Months, MonthID)); fr = stl.formRun(); this.performFormLookup(fr); |
|
20.08.2010, 11:56 | #5 |
Участник
|
Цитата:
Цитата:
первый выбор 2010 Январь 2010 Февраль ... 2010 Ноябрь 2010 Декабрь 2011 Январь 2011 Февраль ... Выбрали "2010 Январь", следующий лукап 2010 Декабрь ... 2010 Январь 2011 Январь 2011 Февраль В общем бред а как его лечить - не знамо |
|
20.08.2010, 12:37 | #6 |
Роман Долгополов (RDOL)
|
Все работает как должно работать
Чтобы быстро спозиционироваться на выбранную строку в лукапе ядро разбивает запрос на два - один возвращает значения меньше выбранного, второй - больше или равно выбранного. Ядро перед выводом склеивает результаты, и выделяет первую строку результатов второго запроса. То есть сортировка должна быть ровно по тому полю по которому лукап. Хотите что то свое - рисуйте свою LookupForm и там делайте что хотите |
|
|
За это сообщение автора поблагодарили: AlGol (2), S.Kuskov (3). |
20.08.2010, 14:27 | #7 |
Участник
|
Цитата:
Сообщение от db
Все работает как должно работать
Чтобы быстро спозиционироваться на выбранную строку в лукапе ядро разбивает запрос на два - один возвращает значения меньше выбранного, второй - больше или равно выбранного. Ядро перед выводом склеивает результаты, и выделяет первую строку результатов второго запроса. То есть сортировка должна быть ровно по тому полю по которому лукап. Хотите что то свое - рисуйте свою LookupForm и там делайте что хотите |
|
20.08.2010, 17:13 | #8 |
Участник
|
ну...
аксата 3.10 sp 3 kr 3 вот мой пример использования сортировки в лукапе здесь правда через класс TableLookup_RU X++: client static void lookupBranches(Object _lookupCtrl) { TableLookup_RU sysTableLookup = new TableLookup_RU(); Query query = new Query(); QueryBuildDataSource qbds = query.addDataSource(TableNum(LGBranches_PLM)); ; qbds.orderMode(OrderMode::OrderBy); qbds.addSortField(FieldNum(LGBranches_PLM,Name)); sysTableLookup.parmTableId(tableNum(LGBranches_PLM)); sysTableLookup.parmCallingControl(_lookupCtrl); sysTableLookup.addLookupfield(fieldNum(LGBranches_PLM, BranchId)); //sysTableLookup.addLookupfield(fieldNum(LGBranches_PLM, Name)); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); } |
|
|
За это сообщение автора поблагодарили: JustNick (1). |
20.08.2010, 18:25 | #9 |
Участник
|
но не позиционирует.
есть вариант, пусть чуть громоздкий, но это на любителя (либо форма либо так) __lookup.xpo как-то понадобилось скрыть код в лукапе, а отображать только наименование... вот для такой задачи также можно применить доработку SysTableLookup |
|
|
За это сообщение автора поблагодарили: JustNick (1). |