Сортировка
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Здравствуй, All!
Есть проблема: нада отсортировать (отдельно одно, отдельно другое) записи по полям (Date и Amount, индексы: indDate и indAmount) но у меня ничего не выходит. Отсортировать нада с помощью Table. Я пробовал через IndexDefs.
Вот как это делал я:
Убывание для поля Date с индексом indDate:
Table1.IndexName:='indDate';
..............
Table1.IndexDefs[Table1.IndexDefs.IndexOf(Table1.IndexName)].Options:=Table1.IndexDefs[Table1.IndexDefs.IndexOf(Table1.IndexName)].Options+[ixDescending]
Возрастание - просто + заменить на -. Для поля Amount аналогично.
Подскажите, пожалуйста, что неправильно.
Есть проблема: нада отсортировать (отдельно одно, отдельно другое) записи по полям (Date и Amount, индексы: indDate и indAmount) но у меня ничего не выходит. Отсортировать нада с помощью Table. Я пробовал через IndexDefs.
Вот как это делал я:
Убывание для поля Date с индексом indDate:
Table1.IndexName:='indDate';
..............
Table1.IndexDefs[Table1.IndexDefs.IndexOf(Table1.IndexName)].Options:=Table1.IndexDefs[Table1.IndexDefs.IndexOf(Table1.IndexName)].Options+[ixDescending]
Возрастание - просто + заменить на -. Для поля Amount аналогично.
Подскажите, пожалуйста, что неправильно.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Создайте все необходимые индексы и переключайте их через Table1.IndexName.
Разумеется Ascending и Descending индексы должны быть созданы отдельно.
Разумеется Ascending и Descending индексы должны быть созданы отдельно.
Спасибо... а если например у меня ключевое поле Date (оно ведь не может иметь индекс - если не прав исправьте), то как мне отсортировать по этому полю?
И подскажите, как это понять?Разумеется Ascending и Descending индексы должны быть созданы отдельно.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Если речь идет о парадоксе, то
Поля типа Date могут быть проиндексированы, ибо они суть арифметические.
Они могут также входить и в композитные индексы (по нескольким полям).
А если не о Paradox, то давно пора уточнить, о какой базе речь.
Поля типа Date могут быть проиндексированы, ибо они суть арифметические.
Они могут также входить и в композитные индексы (по нескольким полям).
А если не о Paradox, то давно пора уточнить, о какой базе речь.

Ещё добавлю, что для сортировки используются не только первичный индекс, но и вторичные(SecondaryIndex)
а там от формата поля помтоему мало что зависит... (создать можно например в DataBaseDeskTop , а в программе останется только переключить индекс)
а там от формата поля помтоему мало что зависит... (создать можно например в DataBaseDeskTop , а в программе останется только переключить индекс)
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Бр-р-р-р-р... Это был вопрос?а там от формата поля помтоему мало что зависит...

Во первых разберемся, что такое индекс: Среди элементов А[3], A[1], A[0] волне понятно какой стоит на первом (нулевом) месте, какой на втором, какой на третьем. Это как раз благодаря индексу.
В БД индекс это то же самое. Фактически индекс - это служебная таблица, состоящая из индексируемого поля (полей) и еще одной колонки, содержащей ссылку на реальную запись в индексируемой таблице. Эта служебная таблица всегда сортирована по всем полям, кроме последнего.
Т.е. при добавлении записи (или при изменении проиндекстрованного(ных) полей) индексная таблица перестраивается.
Для сортировки таблицы по индексу берется соответствующий индекс и сканируется. На каждом элементе индекса берется ссылка на запись (последняя колонка), а затем выборка записи по ссылке из таблицы с даными.
Примечательно, что если в запросе "select ... from table order by ..." в предложении select перечислены только поля, входящие в соответствующий индекс, то таблица с данными боычно вообще не используется - достаточно индексной таблицы!
Индексы не допускающие повторений называются уникальными.
Индексы построенные на основе нескольких полей - композитными.
Один из уникальных индексов называют (просто говорят - "пусть будет этот") - индексом первичного ключа.
Остальные уникальные называют индексами вторичных ключей (Кстати, внутри они ничем не отличаются друг от друга, кроме состава полей!).
И, наконец, неуникальные индексы называют просто индексами.
Ни о каком формате речи не идет вовсе, т.е. от формата поля (если я правильно понимаю о чем идет речь) не только мало что зависит, а не зависит вообще ничего. Числа и даты сортируются по значению, строки по алфавиту. Всё.формата поля помтоему мало что зависит...
Где их надо создавать отдельно?Разумеется Ascending и Descending индексы должны быть созданы отдельно.
У меня в таблице 3 поля: Date (ключевое, но как я понял, я для него все равно могу создать индекс, поправьте, если ошибаюсь), Price (с индексом indPrice и с Decsending), Note (c индексом indNote и с Decsending).
Для того что бы организовать сортировку по убыванию, я просто переключаю индексы IndexName.
А вот как организовать сортировку по возрастанию для каждого из этих полей? Объясните еще раз, поподробнее

Речь идет о парадоксе.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Используя DBD добавьте все необходимые индексы. По одному полю можно посторить 2 индекса: как прямой, так и обратный.
Т.е. у Вас 3 поля, стало быть можно объявить одно поле первичным ключом, и добавить еще 5 индексов. Тогда переключая индексы можно будет организовать сортировку по любому полю в любом направлении.
PS
Для больших таблиц держать столько индексов - очень дорогое удовольствие, поэтому на практике вместо TTable используют TQuery, подменяя в нем предложение order by в запросе, в зависимости от выбранного в данный момент режима сортировки, а индексы создают только по полям, где сортировка необходима наиболее часто.
Индекс, делающий это поле ключевым (т.е. индекс первичного ключа) (а именно благодяря индексу поле становится ключевым) тоже можно использовать для сортировки.Date (ключевое, но как я понял, я для него все равно могу создать индекс, поправьте, если ошибаюсь)
Т.е. у Вас 3 поля, стало быть можно объявить одно поле первичным ключом, и добавить еще 5 индексов. Тогда переключая индексы можно будет организовать сортировку по любому полю в любом направлении.
PS
Для больших таблиц держать столько индексов - очень дорогое удовольствие, поэтому на практике вместо TTable используют TQuery, подменяя в нем предложение order by в запросе, в зависимости от выбранного в данный момент режима сортировки, а индексы создают только по полям, где сортировка необходима наиболее часто.