Deem |
Отправлено: 11.05.2004, 11:51 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
Вроде эта гадость позволяет делать, что я хочу : IBClientDataSet
Но что-то не могу разобратся. SQL-запрос читает большую итоговую таблицу, которую генерит процедура... Ждать очень долго. А захочешь сортировку по другому полю поставить — все сначала.
Спасите!!!! Не могу въехать. Возможно, это очень просто. Но после праздников хреново бошка варит. И вселенская лень....
Подскажите, как сортировать и фильтровать не вызывая снова запрос.
Для просмотра использую EhLib-овский ДБгрид .
|
|
full_lamer |
Отправлено: 11.05.2004, 11:58 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Попробуй сделать так: у меня получилось очень быстро только под себя перестрой иерархию:
цепочка такая:
Query1 -> DataSource1 -> Table1 -> DataSource2 -> Grid1
То есть
DataSource1->DataSet = Query1
Table1->MasterSource= DataSource1
DataSource2->DataSet = Table1
Grid1->DataSource = DataSource2
И уже в Table1 накладываешь фильтры....
|
|
full_lamer |
Отправлено: 11.05.2004, 12:06 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
А вот начет сортировать это можно посавить Query2 и:
Query2->DataSource = DataSource2
и сортировать Query2
соответсвено то бишь
DataSource1->DataSet = Query1
Table1->MasterSource= DataSource1
DataSource2->DataSet = Table1
Query2->DataSource = DataSource2
DataSource3->DataSet = Query2
Grid1->DataSource = DataSource3
я немного может быть переборщил со структурой....
|
|
full_lamer |
Отправлено: 11.05.2004, 12:10 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Да немного перемудрил:
DataSource1->DataSet = Query1 // просто выборка
Query2->DataSource = DataSource1
DataSource2->DataSet = Query2 // сортировка и фильтры здесь
Grid1->DataSource = DataSource2
|
|
olegenty |
Отправлено: 11.05.2004, 13:19 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
если формируешь хранимкой — так будет всегда.
я для подобных вещей использую компонент TgbDataSet, который, с некоторыми ограничениями, позволяет оч. быстро скроллироваться по офигенным наборам данных. один из минусов — быстро работает, когда запрос прописываешь к таблицам, без использования хранимок.
|
|
Deem |
Отправлено: 12.05.2004, 13:20 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
to Olegenty
Да со скролом все впорядке. EhDBGrid быстро скролирует. Я про то, чтобы изменять порядок сортировки и фильтры, при этом не отправлять запрос и не сосать данные с сервера (они же уже прочитаны на клиента). Хотел знать, как можно делать выборку стандартно из данных, уже находящихся на клиенте.
Попробую вариант Full_lamer. Но мне не понятно, из какой таблицы (как звать) будет выбирать SQL для Query2 ?
|
|
olegenty |
Отправлено: 12.05.2004, 13:30 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
по-моему это жестко зависит от компонентов доступа. например, ADO, в случае клиентского курсора, делает именно так, как ты говоришь... ну и клиентские наборы TIBClientDataSet, TpFIBClientDataSet — тоже. (не кроется ли тут ответ???)
я невнимательно первую мессагу читал. а на клиентском-то наборе просто св-ва компонента Filter, Filtered, IndexFieldNames меняешь, и всё работает... (Для ADO и TIBClientDataSet это верно, я пробовал раньше, пока на FIBPlus не перешёл...)
|
|
Admin |
Отправлено: 14.05.2004, 10:44 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Если база данных многопользовательская, то рекомендую
делать новый запрос к серверу, иначе данные могут
поменяться, и локальная сортировка/фильтрация вернет
старые данные, иначе (например для FireBird) вы можете
делать локальную сортировку/фильтрацию, без
запроса к серверу и повтороного считывания данных.
Для повышения скорости , по полям поиска запроса
создайте индексы.
//---
Если выборка, полученая в результате запроса не очень большая,
(SQL-запрос читает большую итоговую таблицу, которую генерит процедура),
и нужно только сортировать и фильтровать ее,
то можете воспользоваться таблицей в памяти (типа RxMemoryData
или kbmMemTable) и поместить выборку в эту таблицу, связать
ее с Grid — все. Например в RxMemoryData сортировка
выполняется очень просто: (Field... — поля сортировки)
MemTable->SortOnFields("Field1;Field2;Field3",false,false);
также фильтрация (по событию onFilterRecord).
для обновления таблицы можно предусмотреть кнопку -
"Обновить данные" или воспользоваться событиями (Event)
для автоматического обновления, в случае изменения данных
другим клиентом.
Отредактировано Admin — 14/05/2004, 11:47
|
|
Deem |
Отправлено: 17.05.2004, 10:49 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
Спасибо всем. Я уже опробовал несколько вариантов. Просто сначала я пытался найти способ писать запрос в данным, полученным по запросу на клиент. Попробовал пользоаться свойствами компонентов доступа TIBDataSet — вроде тоже нормально работает. Спасибо.
|
|