C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сортировка и фильтрация на клиенте, IBase/FireBird и IBX
Deem
Отправлено: 11.05.2004, 11:51


Мастер участка

Группа: Участник
Сообщений: 327



Вроде эта гадость позволяет делать, что я хочу : IBClientDataSet

Но что-то не могу разобратся. SQL-запрос читает большую итоговую таблицу, которую генерит процедура... Ждать очень долго. А захочешь сортировку по другому полю поставить — все сначала. smile.gif
Спасите!!!! Не могу въехать. Возможно, это очень просто. Но после праздников хреново бошка варит. И вселенская лень....
Подскажите, как сортировать и фильтровать не вызывая снова запрос.
Для просмотра использую 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

я немного может быть переборщил со структурой.... wink.gif
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 — вроде тоже нормально работает. Спасибо.

Вернуться в Работа с базами данных в C++Builder