Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Kак пересортировать таблицу после изменения поля в самой таблице?   Найти похожие ветки 

 
Rentgen ©   (2006-08-18 08:28) [0]

Всем привет!
Подскажите пожалуйста:
Есть ДБГрид и СКЛ-запрос с сортировкой.
как пересортировать таблицу после изменения поля в самой таблице?
т.е. если изменить сортирующее поле, то должна пройти пересортировка.

компоненты:
DBGrid;
DataSource;
ADOQuery;
ADOConnection.



BDS2006
Acces2006


 
sniknik ©   (2006-08-18 08:38) [1]

ничего не делать... т.к.
> если изменить сортирующее поле, то должна пройти пересортировка.
если его изменить то сортировка таки происходит... подозрение правда что ты не там/не то меняеш... ну да это не проблема, меняй там и то.


 
Rentgen ©   (2006-08-18 08:57) [2]

дело в том, что пользователь меняет значение в самом Гриде.
после изменений в гриде ничего у меня не обновляется и не
пересортировывается :(
где-то видимо нужно параметр выставить.
подскажите?


 
sniknik ©   (2006-08-18 09:06) [3]

> после изменений в гриде ничего у меня не обновляется и не
> пересортировывается :(
значит у тебя нет отсортированного поля, то в каком порядке поля получены с сервера это не сортировка, вернее не локальная сортировка а на стороне сервера все правила которой там на сервере и остались...

> где-то видимо нужно параметр выставить.
там где данные, параметр(вернее метод) с таким ну совсем уж неассоциируемым ;о) названием - Sort. (ни за что не догадаться.... :о)))))


 
Rentgen ©   (2006-08-18 09:35) [4]

Или мы друг-друга не понимаем или я туплю, НО:
есть грид привязанный к DatSet.
DataSet привязан к ADOQuery.
ADOQuery к ADOConnection.

У ADOQuery строка SQL: "SELECT * FROM Nominal ORDER BY IndSort"

далее меняем в гриде поле в столбце IndSort , жмем интер, но строка стоит на месте.
т.е.
Грид:
1
2 - меняем на 5 (должно перейти после 4).
3
4
** ничего не происходит :(


 
Rentgen ©   (2006-08-18 09:37) [5]

да и еще:
комманда
ADOQuery -> Requery();
дает нужный результат.
можно конечно поставить её на АфтерПост, но(!)
данные меняются не только юзером в гриде, но и программно. вообщем будет както не правильно после каждого поста делать реквери :(


 
roottim ©   (2006-08-18 09:49) [6]

Прикрутить волшебную кнопку "Обновить" и повесить хоткей. Когда захочет юзер свежую информацию - тогда он ее и получит.


> данные меняются не только юзером в гриде, но и программно

что? одновременно ?  тогда колизии неизбежны.


 
Rentgen ©   (2006-08-18 09:58) [7]


> Прикрутить волшебную кнопку "Обновить"

хочется интерактивности

> что? одновременно ?

к счастью нет :). просто неправильно истолковал.

может есть ещё идеи по сабжу?


 
roottim ©   (2006-08-18 10:02) [8]

[3]


 
Stanislav ©   (2006-08-18 10:02) [9]

Rentgen ©   (18.08.06 09:58) [7]

sniknik ©   (18.08.06 09:06) [3]  - Sort.
Есть еще гриды, которые сами сортируют.


 
Dok   (2006-08-18 10:18) [10]


> Есть еще гриды, которые сами сортируют.
>

а ага на миллионе записей :)


 
Dok   (2006-08-18 10:19) [11]


> Rentgen ©   (18.08.06 09:58) [7]
>
>
> > Прикрутить волшебную кнопку "Обновить"
>
> хочется интерактивности

на больших обемах будешь ждать, интерактивность это если у тебя управление ядерным реактором или ракетой, в остальных случайях бесполезная фича для тупых пользователей.


 
Dok   (2006-08-18 10:21) [12]


> данные меняются не только юзером в гриде, но и программно.
>  вообщем будет както не правильно после каждого поста делать
> реквери :(

вот это умная мысль.


 
sniknik ©   (2006-08-18 10:55) [13]

> У ADOQuery строка SQL: "SELECT * FROM Nominal ORDER BY IndSort"
после выполнения этого запроса
ADODataSet1.Sort:= "IndSort";

> 2 - меняем на 5 (должно перейти после 4).
а теперь? (меняется значение в рекордсере на переходе с записи на запись, до этого оно в "инплейсеэдит-е")


 
Stanislav ©   (2006-08-18 11:10) [14]

Dok   (18.08.06 10:18) [10]
Зачем миллион на клиенте?


 
Dok   (2006-08-18 11:33) [15]


> Stanislav ©   (18.08.06 11:10) [14]
>
> Dok   (18.08.06 10:18) [10]
> Зачем миллион на клиенте?

Затем чтобы получить корректную сортировку. Если ты выберешь не все записи и будешь сортироать на клиенте - то достоверность этих данных 0. Если на сервере отсортируешь и выберешь 100 , то  тогда тебе ставится 5-ка.


 
Rentgen ©   (2006-08-18 11:47) [16]


> sniknik ©   (18.08.06 10:55) [13]
>
> > У ADOQuery строка SQL: "SELECT * FROM Nominal ORDER BY
> IndSort"
> после выполнения этого запроса
> ADODataSet1.Sort:= "IndSort";

Вот оно!!!
работает!!!
спасибо!!!
(Query1.Sort := "IndSort";)


 
Dok   (2006-08-18 12:24) [17]


> Вот оно!!!
> работает!!!
> спасибо!!!
> (Query1.Sort := "IndSort";)

профайлер запусти


 
sniknik ©   (2006-08-18 13:24) [18]

> профайлер запусти
и что там смотреть? особенно с учетом того что база Acces2006, (!!!!) кстати, 2006 (????), ладно неважно, главное что это скорее всего mdb. (т.е. не программа access имеется в виду, а база)

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


 
Dok   (2006-08-18 14:43) [19]


> и что там смотреть? особенно с учетом того что база Acces2006,
>  (!!!!) кстати, 2006 (????), ладно неважно, главное что
> это скорее всего mdb. (т.е. не программа access имеется
> в виду, а база)

сорри , думал мс скл


 
Stanislav ©   (2006-08-18 15:02) [20]

Dok   (18.08.06 11:33) [15]  
???
Ниче непонял.
Все правильно там отсортируется.


 
Dok   (2006-08-18 15:25) [21]


> Все правильно там отсортируется.

Где правильно отсортируется? Локально? Без закачки всех записей?


 
evvcom ©   (2006-08-18 15:46) [22]

> [21] Dok   (18.08.06 15:25)
> Без закачки всех записей?

Что ты называешь закачкой всех записей? Возвращенных запросом (он далеко не обязательно миллион вернет) или всех возможных записей таблиц(ы)?


 
Dok   (2006-08-18 16:04) [23]


> Что ты называешь закачкой всех записей? Возвращенных запросом
> (он далеко не обязательно миллион вернет) или всех возможных
> записей таблиц(ы)?

Вам нужно отсиртировать набор данных из БД? Вы выполняете запрос: select * from table. Фитчите 50 записей. И сортируете локально. Где гарантия что если бы Вы отсортировали на сервере, то в эти 50 записей попали бы тоже эти 50 записей?


 
Stanislav ©   (2006-08-18 16:06) [24]

Dok   (18.08.06 15:25) [21]

На клиенте. Конечно без закачки всех записей.
Допустим в таблице хранятся все ученики города их 100000, а мне нужно только 1-А класс 5-й школы, я отберу запросом только 40 записей, соответствующих этому классу и отсортирую по порядку на клиенте - и все будет правильно.


 
Dok   (2006-08-18 16:36) [25]


> На клиенте. Конечно без закачки всех записей.
> Допустим в таблице хранятся все ученики города их 100000,
>  а мне нужно только 1-А класс 5-й школы, я отберу запросом
> только 40 записей, соответствующих этому классу и отсортирую
> по порядку на клиенте - и все будет правильно.

что будет правильно? допустим между буквами А и Я выкинутся М и К, а сортировка на клиенте скажет что таких нет школьников, вот если бы ты на сервере сорировал то без вопросов.


 
Stanislav ©   (2006-08-18 16:47) [26]

А зачем мне видеть М и К с других школ?


 
Dok   (2006-08-18 16:49) [27]


> А зачем мне видеть М и К с других школ?

почему же других, этой же школы. Они идут 41 и 42 записями.


 
saxon   (2006-08-18 16:55) [28]


> А зачем мне видеть М и К с других школ?

Чтоб пойти и в бубен им надавать. :))

Это он к тому что, надо всетаки сортировать на сервере, а вот уж из уже сортированных тянуть на клиент тока 40 (ну или стока скока надо).


 
Stanislav ©   (2006-08-18 16:58) [29]

Если этого - же класса, то попадут и они
Такая структура:
ID
IDSCHOOL
IDCLASS
FIO

Я отбераю Select * from UCHEN WHERE IDSCHOLL=543 AND IDCLASS=1
А на клиенте сколько записей пришло с сервера столько и отсортирую хоть 1 хоть 100 хоть все.


 
Dok   (2006-08-18 17:11) [30]


> Если этого - же класса, то попадут и они

С какой это стати? Если Вы зафитчите 40?
Выборка возвращает:
А
Б
Я
...
Ж --- 40-я
М --- 41-я
К  --- 42-я
Сортировка локально:
А
Б
Ж --- М и К отсутсвуют
...
Я
На сервере:
А
Б
К
М
...
Ж
Чувствуем разницу?


 
Stanislav ©   (2006-08-18 17:18) [31]

а я не буду фитчить 40, я отберу по параметру в SQL запросе, сколько попадет, столько попадет, но не 100000. Я же нигде не указал конкретно вернуть 40 записей, если бы я написал
Select TOP 40 * from UCHEN WHERE IDSCHOLL=543 AND IDCLASS=1
Тогда другой вопрос.


 
Dok   (2006-08-18 17:44) [32]

ну в общем то да. но сортировать на клиенте - это ламерство. имхо.


 
Anatoly Podgoretsky ©   (2006-08-18 23:42) [33]

Rentgen ©   (18.08.06 09:58) [7]
> Прикрутить волшебную кнопку "Обновить"
хочется интерактивности

Это интерактивность в самом чистом виде.


 
Anatoly Podgoretsky ©   (2006-08-18 23:45) [34]

Dok   (18.08.06 10:19) [11]
Не путаешь с real time, а говоришь про интерактивность?


 
Stanislav ©   (2006-08-19 11:20) [35]

Dok   (18.08.06 17:44) [32]
Ламерство? помоему ламерство это нагружать сервер ненужными сортировками.
У меня в сети работает одновременно 150 чел. Первоначальный запрос я отдаю юзеру отсортированный естественно на сервере, а остальные сортировки, которые хочется дяде Васе или тете Маше, делаются локально, неперезапрашивать же запрос на сервере из-зи того что тетя Маша хочет видеть другую сортировку.


 
evvcom ©   (2006-08-21 08:45) [36]

> [23] Dok   (18.08.06 16:04)

Ты перепутал мухи и котлеты. Как ты в [32] говоришь? Ламерство? Вот запросы

> select * from table

и есть ламерство. Мое имхо. Без обид. Естественно такой запрос потянет мулик записей на клиента. И не только локальная машина умрет на сортировке, но и крутому серваку придется нелегко сортировать миллион записей. Потому

> [15] Dok   (18.08.06 11:33)
> > Stanislav ©   (18.08.06 11:10) [14]
> > Dok   (18.08.06 10:18) [10]
> > Зачем миллион на клиенте?
> Затем чтобы получить корректную сортировку.

тоже то ли ламерство, то ли еще что-то. Естественно корректная сортировка не получится без фетча "всех" записей, но всех - это тех, которые вернул запрос, а не всего миллиона. Так что давай разделяй там у себя, мухи отдельно, котлеты отдельно.
P.S. Кстати, не знаю как eh-грид, а у dx не доступна локальная сортировка без флага FetchAllRows.


 
Dok   (2006-08-21 10:32) [37]


> Ламерство? помоему ламерство это нагружать сервер ненужными
> сортировками.
> У меня в сети работает одновременно 150 чел. Первоначальный
> запрос я отдаю юзеру отсортированный естественно на сервере,
>  а остальные сортировки, которые хочется дяде Васе или тете
> Маше, делаются локально, неперезапрашивать же запрос на
> сервере из-зи того что тетя Маша хочет видеть другую сортировку.
>

Первоначальный запрос у тебя всегда меньше 100 записей? Или другими словами - как ты определяешь, что сервер не надо загружать такой сортировкой, пусть клиент сортирует?


 
Dok   (2006-08-21 10:34) [38]


> select * from table
>
> и есть ламерство. Мое имхо. Без обид. Естественно такой
> запрос потянет мулик записей на клиента. И не только локальная
> машина умрет на сортировке, но и крутому серваку придется
> нелегко сортировать миллион записей

ничего страшного в этом запросе нет, если не фитчить все записи


 
Dok   (2006-08-21 10:37) [39]


> тоже то ли ламерство, то ли еще что-то. Естественно корректная
> сортировка не получится без фетча "всех" записей, но всех
> - это тех, которые вернул запрос, а не всего миллиона.

Зашла Маша, включила прогу, ей загрузились на текущий момент данные. Она сидит себе сортирует, отчеты строит. Тут другая Катя доводила еще 10 записей. И после этого директор звонит Маше и говорит - Машенька а дайка мне отчет по том-то и том-то. Умначая Машенька печата отчет и бежит к директору с данными без введенных Кати.


 
Stanislav ©   (2006-08-21 12:06) [40]

Запрос всегда меньше 1000000 записей.
Никак не определяю, основное время занимает не сортировка, а перезапрос , ты же не сможешь отсортировать на сервере без перезапроса.
Имеется ввиду оперативная работа, отчет всегда строится на основании запроса к серверу.


 
Dok   (2006-08-21 12:54) [41]


> Запрос всегда меньше 1000000 записей.

а вот если у Вас 100 записей и сортировка по 10 полям, причем по разным направлением?


 
Stanislav ©   (2006-08-21 13:00) [42]

>а вот если у Вас 100 записей и сортировка по 10 полям, причем по разным >направлением?

Для этого есть индексы. Если сортировка не так уж важна, а занимает много времени, то небуду сортировать.
Но при 100 записях и правильно построеных индекасх запрос с сортировкой по 10 полям "летать" будет (а направление указывается в индексе)


 
evvcom ©   (2006-08-21 14:19) [43]

> [39] Dok   (21.08.06 10:37)

Теперь объясни, как от этого спасет твой способ, способ по вытягиванию на клиента всего "мильёна"?
P.S. А чтобы "умначая Машенька" не оказалась дурнячей в глазах директора, отчет надо строить по данным закрытого периода. И соответственно за ввод данных в закрытый период давать по рукам (программно, конечно :)). А если отчет строится по оперативным данным, то где-то в отчете так и писать "оперативные данные". Все это исправляется обычно после инцидента. :)


 
Dok   (2006-08-21 14:29) [44]


> Теперь объясни, как от этого спасет твой способ, способ
> по вытягиванию на клиента всего "мильёна"?

где я такое говорил? Я говорил что нужно сортировать на серваке а не клиентом.


 
Stanislav ©   (2006-08-21 15:09) [45]

Dok   (21.08.06 14:29) [44]

Сортировать нужно там где это будет более эффективно и нельзя сказать что эффективная сортировка только серверная или только клиентская.


 
Dok   (2006-08-21 15:26) [46]


> Stanislav ©   (21.08.06 15:09) [45]

убедил :)


 
Stanislav ©   (2006-08-21 15:28) [47]

:-)


 
Anatoly Podgoretsky ©   (2006-08-21 19:16) [48]

Dok   (21.08.06 10:37) [39]
Зашла Маша, включила прогу, ей загрузились на текущий момент данные. Она сидит себе сортирует, отчеты строит. Тут другая Катя доводила еще 10 записей. И после этого директор звонит Маше и говорит - Машенька а дайка мне отчет по том-то и том-то. Умначая Машенька печата отчет и бежит к директору с данными без введенных Кати.

И что, ну обнавила Маша данные, но пока она печатала и бежала, Катя с Олей навводили еще записей.
Надо просто в отчете поставить надпись - по состоянию на .....
И для скандалов в базе иметь поле типа временная метка.


 
MsGuns ©   (2006-08-22 09:22) [49]

>sniknik ©   (18.08.06 10:55) [13]
>> У ADOQuery строка SQL: "SELECT * FROM Nominal ORDER BY IndSort"
>после выполнения этого запроса
ADODataSet1.Sort:= "IndSort";

Нет. В Sort будет "", а "IndSort" только после

 ADODataSet1.Sort := "IndSort";


 
Anatoly Podgoretsky ©   (2006-08-22 09:28) [50]

Найди отличия
ADODataSet1.Sort:= "IndSort";
ADODataSet1.Sort := "IndSort";

Правильно, на один пробел в коде больше.


 
Anatoly Podgoretsky ©   (2006-08-22 09:28) [51]

Найди отличия
ADODataSet1.Sort:= "IndSort";
ADODataSet1.Sort := "IndSort";

Правильно, на один пробел в коде больше.


 
MsGuns ©   (2006-08-22 10:22) [52]

>Anatoly Podgoretsky ©   (22.08.06 09:28) [50]

Не совсем в тему, Анатолий.
Речь шла о том, что если в сиквеле запроса стоИт "ORDER BY IndSort", то после его открытия в св-ве Sort будет <пусто>, а то, что ты и Коля написал, там может появиться лишь если программно это туда засунуть.


 
MsGuns ©   (2006-08-22 10:30) [53]

В целом по сабжу:
Способ сортировки зависит от требования "интерактивности" проводимых в базе изменений.
Упрощенно может быть два режима:
1. "Интерактивный" или серверный.
После изменения каждой записи на клиенте, изменение посылается на сервер для "всеобщего обозрения", сам же НД нереоткрывется. В этом режиме все пользователи приложения видят одни и те же записи в НД, что соответствует требованию интерактивности.
В этом случае ничего не надо пересортировывать, т.к. после кадого поста НД перечитывается и, соответсвенно, пересортировывается.
Редактирование "гридом" не самый лучший способ реализации такого подхода, ибо требует больших накладок по обработке возникающих при редактировании непосредственно методами датасета событий., да и "тормозит" некисло, что делает работу пользователя некомфортной (и это мягко сказано).
Предпочтительнее реализация параллельной технологии: датасетом смотрим, квери правим, датасет переоткрываем и позиционируем


 
MsGuns ©   (2006-08-22 11:28) [54]

Второй способ - буферный или "клиентский".
Данные на клиенте кэшируются и по достижении какого-то предела или по требованию пользователя (кнопке) отсылаются на сервер. "Конкуренты" не видят изменений до тех пор, пока пакет не будет отослан и подтвержден клиентом-инициатором изменений.
Другими словами, каждый клиент видит только "свои" изменения и не видит "чужих".
Для имитации интерактивности (в данном случае, а именно для занятия каждой записью "своего" места в датасете соглано сортировке) можно использовать "локальную" сортировку, которая легко реализуется с помощью, например, TClientDataSet. Такие датасеты достаточно комфортны в режиме "гридного" редактирования, не "тормозят" и весьма похожи на знакомую каждому "освидченному" пользователю работу в Excel.
Однако здесь другая проблема - согласование пакетов корректур разных клиентов между собою. Иногда решается простой репликацией, а иногда - целыми схемами - в зависимости от решаемых задач. ИМХО, данная технология очень подходит для "документой" схемы работы с БД, когда два пользователя не могут (не должны) одновременно править один и тот же документ (накладную, счет-фактуру, лицевой счет и т.д.)

Что выбрать в каждом конкретном случае решать разработчику. Главное - это максимальный компромисс между удобством интерфейса, надежностью и достоверностью данных и сложностью программной реализации.


 
Anatoly Podgoretsky ©   (2006-08-22 11:42) [55]

MsGuns ©   (22.08.06 10:22) [52]
Это так, но твой код дает другую интерпритацию.


 
sniknik ©   (2006-08-22 20:16) [56]

MsGuns ©   (22.08.06 09:22) [49]

>>sniknik ©   (18.08.06 10:55) [13]
>>> У ADOQuery строка SQL: "SELECT * FROM Nominal ORDER BY IndSort"
>>после выполнения этого запроса
>ADODataSet1.Sort:= "IndSort";

>Нет. В Sort будет "", а "IndSort" только после

что нет? не надо делать ADODataSet1.Sort:= "IndSort"; после запроса, на том основании что оно после него равно ADODataSet1.Sort = ""???
читай, что написано то, заодно и то что ответ привел к решению. (ну хоть ктото правильно понял).


 
evvcom ©   (2006-08-25 09:22) [57]

> [53] MsGuns ©   (22.08.06 10:30)
> Редактирование "гридом" не самый лучший способ реализации
> такого подхода, ибо требует больших накладок по обработке
> возникающих при редактировании непосредственно методами
> датасета событий., да и "тормозит" некисло

Голые слова. Может руки кривые, раз тормозит некисло? Грид-то здесь причем? Грид только работает с датасетом, потому у тебя проблемы в датасете, но не в гриде.

> Предпочтительнее реализация параллельной технологии: датасетом
> смотрим, квери правим, датасет переоткрываем и позиционируем

Ну и чем этой "технологии" мешает грид?
MsGuns, такое впечатление, что ты где-то какой-то кусок знаний вырвал, попробовал, у тебя не все хорошо получилось, и на основании этого ты теперь даешь экспертные оценки.



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.029 c
1-1157801018
guav
2006-09-09 15:23
2006.10.22
Прозрачный ТМемо


2-1160299105
lobach
2006-10-08 13:18
2006.10.22
Поиск


15-1159470172
EkZot
2006-09-28 23:02
2006.10.22
Как прервать цикл for


3-1156831947
worldmen
2006-08-29 10:12
2006.10.22
Список алиасов из BDE.


2-1160217820
иаиа
2006-10-07 14:43
2006.10.22
Подсветка в RichEdit