Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Сортировка в GRID - один индекс поверх другого?  [new]
FreeLSD
Member

Откуда:
Сообщений: 23
Есть GRID, в котором отображается подчиненная таблица. Фильтр установлен свойством ChildOrder. Необходимо в рамках данного фильтра организовать сортировку по другому полю. Если ставлю фильтр при помощи SET ORDER TO, сбрасывается предыдущий и теряется связь с родительской таблицей - GRID вообще ничего не отображает.
Можно ли сделать фильтрацию без индекса или каким- то способом установить два order'а последовательно?
7 сен 07, 18:00    [4637805]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Фильтр ставится при помощи

SET FILTER TO
7 сен 07, 18:14    [4637856]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если речь идет о том, чтобы в пределах связанных записей изменить порядок сортировки, то это можно сделать при помощи составного индекса по частичному совпадению ключа.

Вот здесь описано что именно имеется в виду

http://www.foxclub.ru/articles/index.php?id=36#OrdinaryRelationship

Однако это имеет смысл, если порядок сортировки один и тот же. Т.е. можно обойись одним составным индексом.

Если же порядок сортировки заранее не известен, то имеет смысл вместо RELATION делать выборку. Т.е. в Grid отображать не собственно таблицу, а выборку из нее отсортированную нужным образом. Выборку можно сделать любым удобным способом через Select-SQL, Local View или CursorAdapter
7 сен 07, 18:20    [4637872]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
FreeLSD
Member

Откуда:
Сообщений: 23
Виноват, SET ORDER TO - не фильтр, конечно, порядок
А как со скоростью при работе по частичному совпадению индекса? Потому что когда я пытался вытащить нужные записи по SET FILTER TO, а потом накатить нужный мне ORDER, застрелиться было можно, пока дождешься обновления формы :( (обе таблицы не маленькие)
7 сен 07, 18:53    [4637958]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Фильтр (SET FILTER TO) - это не что-то вычисленное один раз, а некий способ перебора записей. Т.е. при наложении фильтра сразу ничего не происходит, поэтому сама команда проходит мгновенно. Но затем, при попытке перейти на очередную запись, FoxPro проверяет удовлетворяет ли данная запись условию фильтра. Если нет, то запись пропускается и проверяется следующая запись.

Для отображения в Grid надо найти столько записей удовлетворяющих фильтру, сколько строк видно в Grid одномоментно. При первом открытии поиск таких записей начнется с самого начала таблицы.

Если количество записей НЕ удовлетворяющих условию фильтра мало, то поиск нужного количества записей произойдет быстро. Но вот если фильтр отбрасывает большое количество записей, то пока будет найдено нужное количество записей может пройти достаточно много времени. Причем выставленный главный индекс еще замедляет процесс поиска.

Правда, в VFP9 этот процесс для Grid можно оптимизировать (ускорить) если установить свойство Grid.Optimize = .T. Но это имеет смысл только в том случае, если по тому полю или выражению, по которому выполняется фильтрация есть индекс.

Связка по SET RELATION выполняется очень быстро, поскольку основана на индексе. Здесь торможения заметно не будет. Но такая связка годится только для простых случаев отображения данных.

Если предполагается разнообразная сортировка или дополнительная фильтрация записей подчиненной таблицы, то лучше делать выборку по коду главной таблицы.
7 сен 07, 23:35    [4638594]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
FreeLSD
Member

Откуда:
Сообщений: 23
В грид выбирается список телефонов предприятия по коду предприятия. Т.е. как раз случай, когда удовлетворяет условию мало записей, и SET FILTER работает очень медленно. SET RELATION устраивает вполне в плане выборки, но нужно еще внутри этой выборки сортировать по важности, например. Сортировку хотелось бы произвольную, чтобы пользователь сам устанавливал порядок, для этого создал отдельное поле.
Сейчас экспериментирую с составными индексами, дело осложняется тем, что главный идентификатор - число. Попробую что-то вроде str(id)+...
10 сен 07, 10:37    [4641902]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
FreeLSD
Сортировку хотелось бы произвольную, чтобы пользователь сам устанавливал порядок, для этого создал отдельное поле.

ВладимирМ
Если предполагается разнообразная сортировка или дополнительная фильтрация записей подчиненной таблицы, то лучше делать выборку по коду главной таблицы.
10 сен 07, 11:06    [4642112]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
FreeLSD
Member

Откуда:
Сообщений: 23
Это решение напрашивается, я б так и сделал, если бы писал форму с нуля. А так приходится переделывать, что есть, хочется обойтись "малой кровью", вот и хочу странного :)
10 сен 07, 11:50    [4642445]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
occurs
Guest
И можно вот так Set filter to ATC(cSearchExpression, cExpressionSearched [, nOccurrence]) > 0
10 сен 07, 11:58    [4642503]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
Dima T
Member

Откуда:
Сообщений: 15271
FreeLSD
Это решение напрашивается, я б так и сделал, если бы писал форму с нуля. А так приходится переделывать, что есть, хочется обойтись "малой кровью", вот и хочу странного :)
Форму надо бы порвать на две: встал на нужную организацию, нажал кнопку просмотр, открылась вторая форма, сделалась выборка в курсор и крути его как хочешь. На одной форме два грида лучше по relation иначе при каждом переходе надо новую выборку делать - тормоза при поиске нужной организации.

Как вариант частичного решения проблемы, если данные сильно не меняются отсортировать физически телефоны в нужном (наиболее часто требуемом) порядке. Только эту сортировку периодически обновлять надо. Т.к. при использовании индекса по ParentId в дочерней таблице записи идут в том порядке, в котором они в DBF записаны.

Вариант с кучей индексов типа str(id)+... тоже не самый лучший. В случае спецполя - тормоза будут при его заполнении, т.к. при этом индекс будет перестраиваться. И где гарантия что два пользователя одновременно не захотят одну организацию посмотреть?

Рекомендую подумать о курсорах (VIEW с параметром например) и заполнении второго грида по нажатию кнопки.
10 сен 07, 12:32    [4642781]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
FreeLSD
Member

Откуда:
Сообщений: 23
Dima T
Форму надо бы порвать на две: встал на нужную организацию, нажал кнопку просмотр, открылась вторая форма,

Так оно и есть, только во второй форме грид берет записи прямо из таблицы, без предварительной выборки.
10 сен 07, 12:43    [4642880]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в GRID - один индекс поверх другого?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
FreeLSD
Dima T
Форму надо бы порвать на две: встал на нужную организацию, нажал кнопку просмотр, открылась вторая форма,

Так оно и есть, только во второй форме грид берет записи прямо из таблицы, без предварительной выборки.


Замени таблицу на обновляемое параметризированное Local View или CursorAdapter. Модификация минимальная (можно добавить прямо в DataEnvironment), но "руки уже развязаны" в смысле дополнительной сортировки и фильтрации.
10 сен 07, 12:51    [4642936]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить