Сортировка и фильтрация данных в Recordset, свойства Sort и Filter, ограничения фильтрации и сортировки
Данные в Recordset помещаются в том порядке, как они пришли из источника. Если специальный порядок сортировки в запросе не указан, то данные возвращаются в соответствии с параметрами источника данных (например, на SQL Server они будут по умолчанию упорядочены по кластерному индексу, который по умолчанию создается для первичного ключа). Можно произвести сортировку на сервере (указав в запросе выражение ORDER BY), а можно — сортировку на клиенте (при помощи свойства Sort объекта Recordset).
Общее правило выглядит так: если есть возможность, всегда нужно выполнять сортировку на сервере. Сервер намного лучше оптимизирован для выполнения подобных операций, на нем обычно больше оперативной памяти и процессорных ресурсов. На клиенте сортировку выполнять следует только тогда, когда это невозможно сделать на сервере (например, вы получаете данные от хранимой процедуры, в тексте которой сортировка не предусмотрена). Однако, в принципе, сортировка в Recordset менее ресурсоемка, чем могла бы быть (данные физически не перемещаются, только создается новый индекс для поля, по которому производится сортировка), поэтому ее вполне можно использовать в программах даже для большого количества данных.
Применение свойства Sort связано с двумя серьезными ограничениями:
Применение этого свойства выглядит очень просто:
rs.Sort = "CompanyName"
При этом, то что передается этому свойству, должно быть названием столбца (то есть именем объекта Field) в Recordset.
Можно передавать несколько названий столбцов и порядков сортировки:
rs.Sort = "Country ASC, CompanyName DESC"
Recordset вначале будет отсортирован по стране, а потом — по имени компании в убывающем порядке ( по умолчанию используется ASC — по возрастанию).
Чтобы отменить сортировку (и вернуться к записям в том порядке, в котором они были возвращены с источника), достаточно присвоить этому свойству пустое значение:
rs.Sort = ""
В Recordset записи можно фильтровать. Отфильтрованные записи остаются в Recordset, но являются невидимыми при выполнении операции перемещения и поиска и курсор на отфильтрованных записях не установить. В принципе, всего можно обойтись фильтрацией записей в запросе к источника или вставить дополнительные проверки при операциях перемещения, но иногда с синтаксической точки зрения удобнее использовать именно фильтрацию. Для фильтрации используется свойство Filter.
Это свойство может принимать три типа значений:
rs.Filter = "LastName = 'Smith' AND FirstName = 'John'"
Можно использовать оператор Like с подстановочными символами (только * и %). Отличие от Find() заключается в том, что в Find() просто устанавливается курсор на первую найденную подходящую запись, а в Filter все неподходящие становятся невидимыми.
Снять фильтрацию можно точно так же, как и сортировку:
rs.Filter = ""