Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

А.С.Грошев.Базы данных.Уч.пособие

.pdf
Скачиваний:
150
Добавлен:
12.04.2015
Размер:
3.1 Mб
Скачать

добавить

в

него

 

ные

таблицы

базы

и

 

вильно установить между

 

ними связи, как показано

 

на рис.2.24 (для постоян-

 

ных

связей

базы иногда

 

возникает

неправильное

 

направление, связь долж-

 

на идти от поля главной

 

таблицы к индексу дочер-

 

ней). Для связи между

 

таблицами

Spisok

и

 

Ocenki необходимо уста-

 

новить свойство

OneTo-

Рис. 2.24. Окно данных отчета

Many = .T. . Кроме того,

 

для таблицы Ocenki в окне Properties для Data Environment зададим фильтр

VAL(Ocenki.ball)>0 AND VAL(Ocenki.ball)<6 AND

Ocenki.data_b=>{^2002/01/07} AND Ocenki.data_b<={^2002/01/25}, т.к. среди баллов могут быть отметки о неявке (Н), зачете (6) и пр. и мы хотим отобрать только оценки за заданный период времени (в фильтре используется задание формата дат в виде {^ГГГГ/ММ/ДД}).

Для дальнейшего оформления отчета необходимо присутствие на экране двух панелей инструментов – Report Controls и Layout.

Первая панель содержит те объекты, которые можно располагать на отчетах (рис. 2.25).

Label – надпись в отчете Field – поле, показывающее данные поля таблицы,

значение переменной или расчетные значения Line – линия

Rectangle – прямоугольник

Rounded Rectangle – скругленный прямоугольник Picture – картинка или другой объект из файла

Рис. 2.25. Панель объектов отчета

Так как наша задача – представить отчет с группировкой по факультетам, курсам, группам, необходимо добавить новые группы в отчет и модифицировать соответственно индексный файл главной таблицы. Выбрав пункт Data Grouping в контекстном или главном меню (раздел Report), добавим необходимые группы (рис.2.26).

61

Рис. 2.26. Окно группировки данных в отчете

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

(VAL(OCENKI.BALL)).

Для итоговых полей в разделе Calculations… следует правильно ука-

зать в пункте Calculate Average

(среднее) и в пункте Reset – поле соответствующей группы или End of Report для зоны Summary. Для таблицы Spisok следует модифицировать созданный мастером сложный индекс с именем WIZARD_1 – добавить в него

поле FIO: STR(n_fclt,2,0) + STR(kurs,1,0) + n_grup + fio.

Отчет в конструкторе будет иметь вид, показанный на рис. 2.27.

Рис. 2.27. Окончательный вид отчета в конструкторе

62

При предварительном просмотре (Preview) или после печати на принтере мы получим отчет, показанный на рис. 2.28.

Рис. 2.28. Отчет, напечатанный на принтере

Задание № 2.5

1.Разработать отчет для выданного задания. При недостаточном количестве данных в базе для получения наглядного отчета добавить их с использованием экранной формы.

2.Напечатать отчет на принтере.

63

2.7. Отбор данных из базы с использованием SQL-запросов

Ранее отмечалось, что для работы с данными, отобранными в соответствии с каким-либо условием, может быть использована команда SET FILTER TO <условие> – установить фильтр для открытой таблицы базы данных.

Однако, большими возможностями обладает так называемый SQLзапрос – команда SELECT … , сформированная в соответствии с правилами языка запросов (Structured Query Language).

Запрос позволяет отбирать данные по заданным сложным условиям из нескольких таблиц различных баз данных, с размещением результатов выполнения запроса на экране, во временной таблице (cursor), в новой таблице, в текстовом файле или в массиве переменных. При этом возможны сложные виды упорядочения информации и группировки данных с получение расчетных групповых результатов.

Отбор осуществляется непосредственно из файла на диске, т.о. одновременно те же таблицы могут быть открыты с какими-либо установленными фильтрами (например, в программе, работающей с данными только за текущий месяц).

В VFP и других системах фирмы Microsoft (Word, Excel) можно использовать конструкторы запросов, что упрощает и ускоряет написание запросов. Кроме того, в VFP есть мастера для разработки запросов разного вида. Однако использование этих средств не позволяет реализовать все возможности языка запросов. Максимальные возможности – при написании запроса в текстовом виде в любом программном модуле в соответствии с синтаксисом команды SELECT (см. Приложение 1).

Принцип формирования запросов наиболее легко освоить при использовании мастера запросов. Для этого, как обычно, выбираем на стандартной панели или в меню команду New, далее выбираем Query и нажимаем кнопку Wizard. В появившемся списке выбираем пункт Query Wizard – стандартный запрос.

На первом шаге следует выбрать таблицы и поля, которые следует включить в запрос. Если предварительно база данных не была открыта, следует ее выбрать с помощью кнопки рядом с полем списка Databases and tables. Выбор полей может быть выполнен из нескольких таблиц базы (рис.

2.29).

На шаге 2 следует добавить в список связей выражение SPISOK.NZ = OCENKI.NZ, что мастер сам предложит Вам сделать.

64

Рис. 2.29. Мастер запросов – шаг 1

На шаге 2а Вам нужно ответить на вопрос, какие записи при объединении таблиц следует включать в результаты (join conditions – условия присоединения):

only matching rows – отбираются только записи при их одновременном присутствии в обеих связанных таблицах для заданных условий отбора и свя-

зей (INNER JOIN);

all rows from table SPISOK – отбираются все записи таблицы SPISOK, со-

ответствующие условиям отбора, и связанные записи другой таблицы при их наличии (LEFT OUTER JOIN);

all rows from table OCENKI – отбираются все записи таблицы OCENKI,

соответствующие условиям отбора, и связанные записи другой таблицы при их наличии (RIGHT OUTER JOIN);

all rows from both table – отбираются все записи таблиц SPISOK и

OCENKI, соответствующие условиям отбора, независимо от наличия связанных записей другой таблицы (FULL JOIN).

Выбираем первый вариант для нашего запроса.

На шаге 3 могут быть заданы условия отбора данных (количество условий – не более двух, в конструкторе запросов или в тексте запроса можно увеличить их количество). Зададим условия – SPISOK.N_FCLT=5 and

OCENKI.SEMESTR=3 (рис. 2.30).

Шаг 4 – задание условий сортировки данных. Здесь можно выбрать последовательно 3 поля таблиц, по которым следует сортировать данные, например, n_fclt, kurs, n_grup – упорядочить по факультетам, внутри их по курсам, внутри курсов – по группам. В последующем условия сортировки

65

Рис. 2.30. Мастер запросов – шаг 3

можно усложнить, добавив, например, еще поле FIO – для упорядочения студентов в списках групп по фамилиям. На шаге 4а можно задать процент или количество рассматриваемых записей, здесь мы оставим без изменений условие all records – все записи.

На последнем 5 шаге выберем вариант Save query and modify it in Query Designer – «Сохранить запрос и модифицировать его в конструкторе запросов», зададим путь и имя для сохранения файла запроса.

В результате на диске будет создан текстовый файл запроса с расширением *.qpr (например, std1.qpr), который может быть открыт как текстовый файл или в конструкторе запросов с отображением всех условий запроса.

Как видим на рис. 2.31, в верхней половине конструктора запросов показаны таблицы, используемые для отбора данных и связи между ними, в нижней части – присутствуют страницы для выбора полей таблиц, условий присоединения, отбора данных, упорядочения, группировки (отсутствовала возможность в мастере стандартных запросов) и прочее. Щелчок правой кнопкой мыши в окне вызовет контекстное меню, в котором можно выбрать позицию Output settings и задать тип сохранения результата отбора данных –

Browse, Cursor, Table, Graph, Screen, Report или Label. По умолчанию данные сохраняются в курсоре (временной таблице, автоматически уничтожающейся при завершении работы) и показываются на экране как Browse.

Модифицируем запрос для упорядочения студентов в группах по их среднему баллу. Для этого на странице Fields добавим вычисляемое поле AVG(val(Ocenki.ball)) as s_ball (написать с помощью построителя выражений в поле Functions and expressions, затем нажать кнопку Add и занести в спи-

66

Рис. 2.31. Конструктор запросов

сок полей). Добавим группу SPISOK.NZ на странице Group by и условие val(Ocenki.ball)>0. Зададим также сохранение результатов в файле таблицы на диске с именем Q_std1.dbf. После чего текст запроса будет выглядеть следующим образом (в контекстном меню можно воспользоваться командой

View SQL):

SELECT Spisok.nz, Spisok.fio, Spisok.n_fclt,; Spisok.kurs, Spisok.n_grup, Ocenki.semestr,; Ocenki.n_predm, AVG(val(Ocenki.ball)) as s_ball;

FROM students!spisok INNER JOIN students!ocenki ; ON Spisok.nz = Ocenki.nz;

WHERE Spisok.n_fclt = 5 AND Ocenki.semestr = 3; AND VAL(Ocenki.ball)>0 = .T.;

GROUP BY Spisok.nz;

ORDER BY Spisok.n_fclt, Spisok.kurs,Spisok.n_grup; INTO TABLE c:\students\xt-2-3\q_std1.dbf

Выполнив запрос (кнопка Run на стандартной панели) мы получим в таблице q_std1.dbf результат отбора данных, который можно просмотреть на экране или использовать для печати отчета.

Задание № 2.6

1.Разработать несколько вариантов запросов для выданного задания.

2.Разработать и напечатать отчет для одного из запросов.

67

2.8. Разработка проекта и исполняемой программы

Основой разработки программ для операционной системы Microsoft Windows в большинстве современных систем (VFP, Delphi, Visual C++, Visual Basic и пр.) является проект (Project).

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

Создать новый проект можно с помощью мастера разработки проекта или самостоятельно. Более целесообразно использовать мастер, зачастую с этого и следует начинать при разработке сложной системы (после разработки базы данных – сразу создать проект с помощью мастера системы VFP 6.0 – 7.0 – этот мастер при генерации стандартного проекта создает также необходимые Вам экранные формы, панели инструментов, отчеты, меню и пр.).

Однако иногда бывает необходимо создать небольшую исполняемую программу, работающую с базой данных, – для этого можно создать простейший проект следующим образом.

Создаем новый файл проекта (New – Project – New file), выбираем для нее папку и даем имя Students.pjx. В соответствующие группы пустого окна проекта добавляем созданные ранее нами экранную форму и отчет. Если Вы хотите добавить в проект базу данных, она должна быть помечена как внешняя (Exclude).

После этого окно проекта будет иметь вид, приведенный на рис. 2.32 (форма Spisok.scx выделена в нем жирно как головная программа):

На странице All представлены все виды компоненты, которые могут входить в состав проекта. При работе с большими проектами удобнее пользоваться отдельными страницами проекта

(Data, Documents, Classes, Code, Other, в VFP версии 9.0 добавлена страница избранных свойств

Favorites).

Рис. 2.32. Проект

68

Рис. 2.33. Компиляция проекта

Справа в окне проекта расположена группа кнопок, нижняя из которых

Build… – компиляция проекта. Если мы нажмем на нее, появится список для выбора типа компиляции проекта (для тех, кто забыл – компиляция – перевод исходного текста программы на машинный язык, исполняемый в данной операционной системе).

Если скомпилировать такой проект в exe-файл (рис. 2.33), на диске появится файл students.exe, но для данного состава проекта запускаться и работать он будет только из системы VFP (так же, как файл приложения

*.app), т.к. в нем нет головной программы с командой запуска процесса обработки событий (read events).

Для получения программы, работающей в операционной системе Windows, нужно сделать следующее:

1)выбираем раздел Code – Programs (программные файлы), нажимаем New…, в чистом окне пишем 2 строки:

do form spisok read events

сохраняем файл в своей папке с названием program1 или с другим названием и указываем в проекте, что это головная программа (правый клик на файле и выбрать команду Set Main);

2)открываем форму Spisok и в окно события формы Destroy Event вписываем фразу: clear events (чтобы после закрытия формы за-

вершался процесс обработки событий и завершалась работа программы).

Далее снова компилируем программу и проверяем ее работу, запуская из папки Windows. Мы увидим, что окно экранной формы при запуске программы появляется внутри другого окна, имеющего некоторое стандартное меню. Если Вы хотите, чтобы на экране было только окно Вашей формы Spisok, можно изменить свойство формы ShowWindow на 2-As Top-Level Form и добавить первой строкой в головной файл проекта команду: _SCREEN.Visible=.F. (Вместо 2-го пункта можно создать в папке программы файл config.fpw и в нем написать строку SCREEN = OFF). В результате мы получим небольшую по размеру (около 250 Кб) программу, имеющую все основные возможности для работы с базой данных. Для запуска такой программы на другом компьютере потребуется сама база данных, файл этой про-

69

Рис. 2.35. Третья страница построителя приложения
Рис. 2.34. Первая страница построителя приложения

граммы (с расширением *.exe) и в доступном каталоге (например, Windows – System) библиотечные файлы Vfp7r.dll (размер около 3 Мб) и Vfp7rrus.dll.

Другой путь разработки проекта – использовать мастер разработки приложения (Application Wizard). После выбора New – Project – Wizard по-

является окно, в котором нужно задать название проекта (student) и путь его сохранения (оставим галочку у фразы создать структуру каталогов). После генерации основы проекта и появления окна проекта на экране, появляется также многостраничная форма построителя проекта (Application Builder), в которой на первой странице (рис. 2.34) следует указать, будут ли в проекте использоваться окна информации о программе и авторе (Splash и About), окно Start для выбора формы или отчета в начале работы с программой и окно

User login для зада-

ния имени пользователя и его пароля.

Наиболее важной страницей построителя является третья (рис. 2.35) – Data – раздел данных. На ней мы выбираем созданную ранее базу данных Students, после чего на этой странице появляется список всех таблиц базы с возможностью отметить те из них, для которых нужно сгенерировать экранные формы и отчеты.

Далее нажимаем кнопку Generate и для всех отмеченных таблиц базы создаются стандартные формы и отчеты.

На странице 4 Forms следует указать некоторые особенности использования каждой их форм в программе:

70