Подскажаите, а как быть с сотрировкой???

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Подскажаите, а как быть с сотрировкой???

Сообщение Antoxa » 13 май 2008, 06:37

В IBDataSet.SQL написано:
SELECT *
FROM Table1
ORDER BY FIELD3;

В таблице 3 записи, у который FIELD3=1,2,3 соответственно.

Меняю значения поля в 2-х записях местами, например 2 и 3, но записи не переупорядочиваются. В ADO+Gemini срузу менялись местами записи в Grid-е, а ч-з IBX как, неужели необходимо делать Close, Open??? :?

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 13 май 2008, 07:54

Кто у тебя выполняет запрос?
Если сервер - нужно этот запрос ему переслать. Что и делает Open после Close.
А если не сервер - то нафига вообще с SQL-ем заморачиваться - сортируй на клиенте результат как тебе нужно. :-)

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Сообщение Antoxa » 13 май 2008, 11:06

Tonal писал(а):Кто у тебя выполняет запрос?
Если сервер - нужно этот запрос ему переслать. Что и делает Open после Close.
А если не сервер - то нафига вообще с SQL-ем заморачиваться - сортируй на клиенте результат как тебе нужно. :-)
У меня связка IBDatabase1+IBDataSet1+IBTransaction1
получается, что сервер... Т.е. нужно считывать ID, затем close, open, затем locate на сохраненный ID ??? :shock:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 май 2008, 11:22

получается, что сервер...
получается, что ты не понимаешь.

если ты выдаешь запрос с указанием сортировки в order by, то сортировкой занимается СЕРВЕР, а не клиент. Клиент всегда только принимает записи с сервера, и он вообще понятия не имеет, сортированы эти записи или нет, и по какому критерию.
Клиент может сам отсортировать принятый массив записей, т.е. собственный буфер. Но опять же, сортировка эта пойдет только в явно заданном на клиенте виде, который может не совпадать с тем, в каком порядке сервер прислал запрос.
В ADO+Gemini срузу менялись местами
это значит, что ADO целиком перевыполняло запрос. Другие объяснения тут вряд-ли могут быть. Я сомневаюсь, что в ADO есть парсер запроса, который поймет что в запросе был ORDER BY, и при вставке записи правильно пересортирует локальный буфер.

Теперь понятно?

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Сообщение Antoxa » 13 май 2008, 19:08

kdv писал(а):Теперь понятно?
Ну, почти... :oops: А как же без ORDER BY отсортировать, т.е., как выполнить локальную сортировку, ведь у IBX компонентов нет процедуры sort...?

zz 5
Сообщения: 32
Зарегистрирован: 02 мар 2006, 10:52

Сообщение zz 5 » 14 май 2008, 13:21

Решение есть ! Либо сортировать массив вручную, как советовал kdv, либо использовать библиотеку FIBPlus,
в которой все уже реализовано 8).

Теперь цитирую из справки:
TFIBCustomDataSet.DoSortEx: Sorts records without reopening a query on the server.
Кстати, в FIBPlus есть настройка, позволяющая сохранять позицию измененной записи в отсрортированном НД.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 14 май 2008, 13:52

Я использовал связку TEhDbGrid + TMemTableEh + IBX.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Сообщение Antoxa » 14 май 2008, 14:53

Tonal писал(а):Я использовал связку TEhDbGrid + TMemTableEh + IBX.
Пока беду ч-з close, open, locate, т.к. в таблице будет 5-10 записей... А для дугих случаев (если будет необходимость) посмотру FIB, но там говорят в новой версии ошибок много, даже называют ее beta! :cry:

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Сообщение Antoxa » 14 май 2008, 14:56

А у Fib сайт весь в вирусах опять... :evil:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 май 2008, 19:07

А у Fib сайт весь в вирусах опять..
может и опять, но вирусняк тот же самый.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Сообщение Antoxa » 15 май 2008, 07:41

kdv писал(а):может и опять, но вирусняк тот же самый.
Видимо он и не исчезал!!!

Ответить