Базы данных и ADO Сортировка и фильтрация данных в Recordset

          Назад



9.5.5 Сортировка и фильтрация данных


Сортировка и фильтрация данных в Recordset, свойства Sort и Filter, ограничения фильтрации и сортировки

Данные в Recordset помещаются в том порядке, как они пришли из источника. Если специальный порядок сортировки в запросе не указан, то данные возвращаются в соответствии с параметрами источника данных (например, на SQL Server они будут по умолчанию упорядочены по кластерному индексу, который по умолчанию создается для первичного ключа). Можно произвести сортировку на сервере (указав в запросе выражение ORDER BY), а можно — сортировку на клиенте (при помощи свойства Sort объекта Recordset).

Общее правило выглядит так: если есть возможность, всегда нужно выполнять сортировку на сервере. Сервер намного лучше оптимизирован для выполнения подобных операций, на нем обычно больше оперативной памяти и процессорных ресурсов. На клиенте сортировку выполнять следует только тогда, когда это невозможно сделать на сервере (например, вы получаете данные от хранимой процедуры, в тексте которой сортировка не предусмотрена). Однако, в принципе, сортировка в Recordset менее ресурсоемка, чем могла бы быть (данные физически не перемещаются, только создается новый индекс для поля, по которому производится сортировка), поэтому ее вполне можно использовать в программах даже для большого количества данных.

Применение свойства Sort связано с двумя серьезными ограничениями:

  • его можно использовать только тогда, когда курсор открыт на клиенте (то есть для свойства CursorLocation должно быть установлено значение adUseClient — по умолчанию он открывается на сервере);
  • его нельзя использовать с некоторыми драйверами, например, нельзя сортировать данные при подключении к SQL Server или Oracle.

Применение этого свойства выглядит очень просто:

rs.Sort = "CompanyName"

При этом, то что передается этому свойству, должно быть названием столбца (то есть именем объекта Field) в Recordset.

Можно передавать несколько названий столбцов и порядков сортировки:

rs.Sort = "Country ASC, CompanyName DESC"

Recordset вначале будет отсортирован по стране, а потом — по имени компании в убывающем порядке ( по умолчанию используется ASC — по возрастанию).

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

rs.Sort = ""

В Recordset записи можно фильтровать. Отфильтрованные записи остаются в Recordset, но являются невидимыми при выполнении операции перемещения и поиска и курсор на отфильтрованных записях не установить. В принципе, всего можно обойтись фильтрацией записей в запросе к источника или вставить дополнительные проверки при операциях перемещения, но иногда с синтаксической точки зрения удобнее использовать именно фильтрацию. Для фильтрации используется свойство Filter.

Это свойство может принимать три типа значений:

  • строковое значение, по синтаксису аналогичное передаваемому методу Find():

rs.Filter = "LastName = 'Smith' AND FirstName = 'John'"

Можно использовать оператор Like с подстановочными символами (только * и %). Отличие от Find() заключается в том, что в Find() просто устанавливается курсор на первую найденную подходящую запись, а в Filter все неподходящие становятся невидимыми.

  • массив закладок;
  • несколько (5) специальных значений — все конфликтующие записи, записи, ожидающие сохранения на источнике и т.п.

Снять фильтрацию можно точно так же, как и сортировку:

rs.Filter = ""




Далее