Технология создания многопользовательских форм, описанная в предыдущем
разделе, хорошо подходит для работы со справочниками. Справочник – небольшая
таблица. Все строки ее несложно отобразить на экране и выбрать требуемую. Для
работы с основными таблицами такая технология не пригодна. Попробуйте найти
нужную фамилию в телефонной книге, зная только номер телефона и район города.
Все ваши иллюзии по поводу быстрого решения этой задачи очень скоро рассеются.
Круг объектов, которые должны быть найдены, необходимо на первом этапе
значительно сузить. Для этой цели предназначена форма Search (рис. 4.18). По существу, это построитель запроса к
базе данных.
В данном случае (рис. 4.18) будет сформирован
запрос, результатом которого станет выборка, содержащая все здания участка
Авиационной улицы (номер 23), находящиеся только в железнодорожном районе
(номер 2) города. Приведем текст запроса на языке SQL (Structured Query Language - язык структурированных запросов), который будет
сформирован в результате работы формы Search. Visual FoxPro “говорит” на своем диалекте SQL. Этот
диалект отличается от стандарта примерно также, как отличается английский от американского английского.
SELECT Building.Street,Street.Name,Street.Sign,Street.First,;
Building.House,Building.District,District.Area,;
Building.Land,Building.Year,Building.Material,Wall.Wall,;
Building.Comment,Building.Wear,Building.Cost,;
Building.Line,Building.Square,Building.Picture,;
Building.Kind,Building.Elevator;
FROM Building,Street,District,Wall;
INTO TABLE C:\WINNT\TEMP\cBuilding;
WHERE Building.Street=Street.Street;
AND Building.District=District.District;
AND Building.Material=Wall.Material;
AND Building.Street=23
AND Building.District=2;
ORDER BY Name,Sign,House
Язык запросов SQL, официально признан стандартизованным языком в ANSI (American National Standards Institute - Американский национальный институт стандартов). С помощью SQL очень удобно разрабатывать приложения по работе с
базами данных и формировать запросы из этих приложений. Временем появления
языка SQL можно считать начало 1970-х годов, когда Е. Ф. Кодд
опубликовал свои первые работы по реляционной
алгебре.
Мы не будем подробно
описывать язык структурированных запросов. Этот раздел - всего лишь краткое
введение, которое знакомит пользователя с основами SQL.
Чтобы употреблять SQL в приложениях, прежде всего, необходимо понять, что
он собой представляет и каким образом устроен. Как уже говорилось, это
стандартизованный язык, который создан на основе английского.
Язык SQL используется для создания баз данных и работы с ними.
Он позволяет описывать сложные запросы при помощи очень небольшого кода.
Чрезвычайно важной характеристикой SQL
является стандартизованный подход к работе с базами данных. Итак, SQL -
это стандартизованный язык доступа к данным, и он поддерживается большинством
мощных систем баз данных, которые существуют в настоящее время на рынке,
включая Microsoft SQL-Server, ORACLE и DB2. Синтаксис и структура языка SQL определяются стандартом ANSI.
Язык
SQL - богатый язык с большим количеством разнообразных
команд. Однако все они относятся к одной из двух больших категорий: язык
определения данных (DDL) и язык управления данными (DML).
· Язык определения данных, как ясно из названия, используется для определения баз
и таблиц данных. С его помощью создается структура таблиц базы данных,
определяются их «бизнес-правила» и связи.
· Язык управления данными позволяет дополнять, обновлять, формировать запросы и
удалять данные из ваших таблиц.
На практике язык
определения данных применяется не очень часто. Как правило, он используется для
создания первоначальной структуры базы данных и изредка - для ее изменений.
Гораздо чаще употребляется язык управления данными, и это вполне естественно:
ведь предназначением любой базы данных является именно работа с данными в
рамках своей структуры.
Как вы уже знаете,
создавать таблицы и управлять ими можно с помощью навигационных команд языка Visual FoxPro.
Так, команда Replace позволяет обновлять данные, а Сору и Seek - запрашивать их из таблиц. Это достаточно мощные
команды, но для их оптимального использования требуется глубокое и детальное
знание таблиц. Также нужны значительное время и усилия, которые необходимо
затратить при разработке приложений. Здесь и проявляются преимущества SQL. Этот язык построен так, что позволяет обрабатывать
данные целыми наборами. Поэтому
при грамотном подходе можно с помощью всего нескольких строчек кода создавать
оптимизированные запросы. Еще одним достоинством SQL является его совместимость. При работе с базами в
архитектуре клиент-сервер ваши запросы могут поддерживаться самыми различными
платформами, а не только Visual
FoxPro. Наконец, последнее преимущество - это естественный
синтаксис, близкий к синтаксису английского языка. Более того, логика SQL соответствует той логике, которую можно ожидать при
работе с базами данных. Итак, преимущества языка SQL по сравнению с навигационным инструментарием Visual FoxPro
следующие:
· способность работать с набором записей при создании
оптимизированных запросов;
· совместимость со множеством
платформ;
· естественный синтаксис, близкий к синтаксису
английского языка.
Для работы с основными таблицами базы данных Real Estate мы
будем использовать преимущественно язык SQL. На рис. 4.19 приведена форма поиска здания Search, расположенная
в конструкторе форм.
Код события Init формы Search имеет
вид:
* Выбранные значения параметров поиска
PUBLIC SelectStreet,
SelectDistrict,SelectSign,;
SelectHouse,SortSelect
* SelectStreet - номер выбранной улицы
* SelectDistrict - номер выбранного
района
* SelectSign - выбранный признак адреса
* SortSelect - порядок сортировки записей в выборке
* Начальные значения
STORE 0 TO SelectStreet,
SelectDistrict
STORE [ ] TO SelectSign,
SelectHouse
SortSelect=1
Код
события Destroy (“последний
вздох”) формы Search:
* Убрать глобальные переменные из памяти
RELEASE SelectStreet,SelectSign,SelectHouse,;
SelectDistrict,SortSelect
* Закрыть временную таблицу-выборку
IF USED ('cBuilding')
USE IN cBuilding
ENDIF
Код события InteractiveChange поля со списком Combo1:
*
Обновление признака адреса в поле Text1
*
Взять значение в поле Sign таблицы Street
ThisForm.Text1.Value=Street.Sign
* Перерисовать объект Text1
ThisForm.Text1.Refresh
Код события Click кнопки Сброс:
*- Кнопка Сброс
* Сброс ранее введенных значений
STORE 0 TO SelectStreet,
SelectDistrict
STORE [ ] TO SelectSign,
SelectHouse
SortSelect=1
* Перерисовать форму
ThisForm.Refresh
Код события Click кнопки Поиск:
*-
Кнопка Поиск
Wait 'Ждите! Ваш запрос обрабатывает сервер.' WINDOW
NOWAIT
* Номер улицы
IF SelectStreet=0
*
Значение символьной переменной - пустая строка
* К оператору SELECT ничего добавлено не
будет
Sstreet=[]
ELSE
* Строка в квадратных скобках будет
добавлена
* к оператору SELECT как значение &Sstreet
* Обратите внимание на знак &
(амперсанд)
Sstreet=[and Building.Street=SelectStreet]
ENDIF
*
Номер дома
*
Уберем концевые пробелы из введенного номера дома
SelectHouse=ALLTRIM(SelectHouse)
IF LEN(SelectHouse)=0
Shouse=[]
ELSE
* Строка в квадратных скобках будет
добавлена
* к оператору SELECT как значение &Shouse
Shouse=[and Building.House==SelectHouse]
*
Знак == означает: в точности равно.
* Если поставить просто знак равенства
* Будут найдены все здания, номера которых
* начинаются с введенных символов.
ENDIF
*
Район
IF
SelectDistrict=0
Sdistrict=[]
ELSE
* Строка в квадратных скобках будет
добавлена
* к оператору SELECT как значение &Sdistrict
Sdistrict=[and Building.District=SelectDistrict]
ENDIF
*
Сортировка
*
Строка в квадратных скобках будет добавлена
* к
оператору SELECT как значение &Ssort
DO CASE
CASE SortSelect=1
* По адресу здания
Ssort=[Name,Sign,House]
CASE SortSelect=2
*
По району города
Ssort=[Area]
CASE SortSelect=3
* По площади участка
Ssort=[Land]
CASE SortSelect=4
*
По году постройки
Ssort=[Year]
ENDCASE
* Выполнение запроса
SELECT Building.Street,Street.Name,Street.Sign,Street.First,;
Building.House,Building.District,District.Area,;
Building.Land,Building.Year,Building.Material,Wall.Wall,;
Building.Comment,Building.Wear,Building.Cost,;
Building.Line,Building.Square,Building.Picture,;
Building.Kind,Building.Elevator;
FROM Building,Street,District,Wall;
INTO TABLE
C:\WINNT\TEMP\cBuilding;
WHERE Building.Street=Street.Street;
AND Building.District=District.District;
AND Building.Material=Wall.Material;
&Sstreet &Shouse
&Sdistrict;
ORDER
BY &Ssort
SELECT
cBuilding
*
Во временной выборке находится информация по зданиям,
*
отвечающим условиям составленного запроса.
*
Запись содержит полный набор полей из всех таблиц:
* Building, Street, District и Wall
*
Полученную выборку можно конвертировать в Excel, Access и др.
*
без дополнительной обработки
WAIT 'Готово!' WINDOW NOWAIT
IF
RECCOUNT()=0
=MESSAGEBOX('Зданий, отвечающих условиям
вашего запроса, '+;
'в базе нет. Повторите запрос,
изменив требования.';
,48,'Внимание')
RETURN
ENDIF
*
Временная таблица-выборка хранится в файлах
* cBuilding.dbf
и cBuilding.fpt в папке C:\WINNT\TEMP
*
Во втором хранится Memo-поле Building.Comment
*
Запуск формы для работы со зданиями
DO
FORM Building