Выборка, упорядочение и просмотр данных

Итак, что мы имеем? У нас есть база данных, есть несколько таблиц, есть экранная форма и, наконец, есть сами данные. А что мы умеем? Мы умеем заносить в базу данных новые записи и, соответственно, удалять какие-нибудь из них. Что ж, для начала не так уж и плохо. Но ведь мы знаем, что основное назначение системы управления базами данных — это быстрый поиск и предоставление пользователю тех записей, которые удовлетворяют заданным условиям. Вот именно этому, читая данную главу, мы сейчас и будем учиться.

Для того чтобы из таблицы выбрать данные, ее сначала нужно открыть. Каждая таблица, независимо от того, входит ли она в контейнер базы данных или является свободной таблицей, открывается в своей рабочей области. Принято считать, что в Visual FoxPro имеется 32 627 рабочих областей, в каждой из которых может храниться таблица и соответствующие ей индексы. И что все эти таблицы можно открыть одновременно. Это так, но на самом деле рабочих областей еще больше. Дело в том, что если мы будем использовать приватные сеансы данных (private data session), то 32 627 рабочих областей будут доступны в каждом сеансе!

Открыть таблицу (а сейчас мы говорим о свободных таблицах) можно, используя команду USE. Например, вот так: USE ROOMS. При этом таблица rooms будет открыта в первой рабочей области. После применения USE FLOORS В первой области у нас окажется таблица floors, a rooms соответственно будет закрыта. А как их использовать одновременно? Для этого в команде USE необходимо указать, в какой именно рабочей области будет открыта таблица:

1
2
USE ROOMS IN 1
USE FLOORS IN 2

Вот и все. Теперь для перехода к нужной таблице достаточно использовать уже знакомую нам команду SELECT и указать номер рабочей области:

1
2
SELECT 2
BROWSE

Но гораздо удобнее использовать не номер рабочей области, а псевдоним или алиас (alias) таблицы. Псевдоним всегда совпадает с именем таблицы, а читаемость программного кода при его использовании заметно улучшится.

1
2
SELECT FLOORS
BROWSE

Этот пример полностью идентичен предыдущему.
Таблицы, входящие в состав базы данных, открываются так же, но перед их открытием необходимо открыть саму базу данных:

1
2
3
OPEN DATABASE OLDFOX
USE ROOMS IN 1
USE FLOORS IN 2

Открывать базу данных необходимо потому, что связанные таблицы могут иметь длинные имена, триггеры и тому подобные вещи, присущие базе данных.

Ну и конечно, в состав этих команд можно включить указание пути:

1
2
OPEN DATABASE C:\OLDFOX\OLDFOX
USE C:\OLDFOX\ROOMS EXCLUSIVE

А можно и не включать, но в этом случае путь необходимо заранее указать:

1
SET PATH TO C:\OLDFOX

Команда LOCATE. Поиск записей

С помощью данной команды мы можем отыскать записи, удовлетворяющие заданному условию. При этом совершенно безразлично, в каком месте таблицы эти записи расположены, потому что LOCATE всегда начинает поиск с первой записи и последовательно просматривает все записи до конца таблицы, пока не найдет ту, которая соответствует заданному условию. В нашей экранной форме есть кнопка Найти и поле ввода Поиск по фамилии.

Допустим, нам нужно найти всех клиентов, фамилия которых начинается с букв ИВ. В поле ввода заносим соответствующие буквы и нажимаем кнопку, которая в событии click имеет следующий набор команд:

1
2
3
SELECT NAMES
LOCATE FOR CSECONDNAME=THISFORM.PAGEFRAME1.PAGE1.TEXT1.VALUE
THISFORM.REFRESH()

Если найдена запись, удовлетворяющая заданному условию, то указатель записей на ней и остановится. Но что делать, если у нас несколько таких записей, например, трое Ивановых, пятеро Ивиных и один Иванченко? Первое, что приходит в голову, — это запустить LOCATE еще раз. Но здесь скрывается небольшая проблема — LOCATE всегда начинает поиск с первой записи и завершает на найденной (а если не найдет, то на последней) и поэтому, сколько бы ты раз ее не запускал — столько раз она тебе и покажет того же самого Иванова.

Выход следующий: нужно совместно с LOCATE использовать еще одну команду — CONTINUE, которая продолжает поиск не с начала файла, а с уже найденной записи. В нашем случае можно для события Rightciick (Щелчок правой кнопкой мыши) кнопки Найти назначить выполнение этой команды. Теперь, если мы при помощи LOCATE найдем требуемую запись, для проверки наличия остальных достаточно несколько раз щелкнуть правой кнопкой мыши.

Команда SEEK. Поиск по значению индекса

Некоторой альтернативой команды LOCATE является команда SEEK, НО ДЛЯ ее использования необходимо наличие индекса. Если открыто несколько индексов, то нужно перед использованием данной команды “выбрать” какой-то один, т. к. команда работает с одним индексом. Установить индекс можно при помощи команды SET ORDER TO, использование которой будет рассмотрено далее. Попробуем найти запись в таблице rooms, значение индекса которой равно 202.

1
2
3
SELECT ROOMS
SET ORDER TO IDROOM
SEEK 202

Вот и все. Синтаксис команды очень прост, но необходимо помнить, что тип задаваемого значения должен совпадать с типом данных текущего индекса. То есть если индексируемое поле имеет тип character, то задаваемое в команде значение нужно заключить в кавычки.

Команда SET FILTER TO. Выбор группы записей

Для того чтобы выбрать группу записей, удовлетворяющих заданному условию или условиям, можно использовать команду SET FILTER TO. В рассмотренном ранее примере мы искали тех клиентов, у которых фамилия начинается на ИВ, и при этом последовательно перебирали записи, используя “спарку” LOCATE и CONTINUE. А используя SET FILTER то, мы можем сразу отобразить все необходимые записи:

1
2
3
SELECT NAMES
SET FILTER TO CFIRSTNAME="MB"
BROWSE

Команда SET FILTER TO также позволяет выбрать записи, удовлетворяющие нескольким условиям. Простой пример: отель твой процветает, дела идут “в гору” и тебе просто необходим надежный и верный помощник. В общем, ты решил жениться! И причем невесту ты собираешься выбрать среди постояльцев своего отеля. Но не бегать же по этажам, в самом деле! Зачем тогда СУБД? Ищем невесту:

1
2
3
4
SELECT NAMES
SET FILTER TO UPPER(СЗЕХ)="Ж".AND.DBIRTHDAY<=CTOD("01.01.1986");
.AND.DBIRTHDAY>=CTOD("01.01.1983")
BROWSE

Сортировка данных в таблицах

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

Постоянная сортировка. Ее суть заключается в том, что данные в таблице располагаются в строго установленном порядке. Для ее выполнения достаточно просто перезаписать существующую таблицу в нужном порядке. А что делать, если требуется другой порядок записей? Ведь очевидно, что в одной таблице нельзя иметь несколько порядков сортировки. В этом случае нужно еще раз перезаписать таблицу, т.е. создать еще одну копию.

Да уж, для повседневного использования этот способ является, мягко говоря, не совсем удобным. Но, тем не менее, знать и уметь это будет полезно. Создаем постоянную сортировку, используя команду SORT:

1
2
USE NAMES
SORT TO NEWNAMES ON CFIRSTNAME

После выполнения данной команды будет создана новая копия таблицы names (она будет иметь имя newnames), но записи в этой таблице будут располагаться В Отсортированном виде по полю cfirstname.

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

1
2
USE NAMES
INDEX ON ALLTRIM (CFIRSTNAME) TAG FIRSTN

А теперь достаточно выполнить команду SET ORDER TO FIRSTN и все, записи упорядочены.

А если нам нужно, помимо сортировки по фамилиям, упорядочить записи еще и по именам клиентов? В этом случае необходимо использовать составной индекс:

1
INDEX ON ALLTR(CFIRSTNAME)+ALLTR(CSECONDNAME) TAG FIRSTN

При этом Лис сообщит, что индекс с таким именем уже существует и спросит, не желаем ли мы его перезаписать? Чтобы он не спрашивал, а индекс переписывался автоматически, нужно добавить в нашу команду еще одно ключевое слово ADDITIVE:

1
2
USE NAMES
INDEX ON ALLTRIM (CFIRSTNAME) TAG FIRSTN ADDITIVE

Для отмены сортировки используется команда SET ORDER TO без дополнительных параметров.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100