Инструкция написана к лабораторным работам для студентов-экономистов.
Лабораторная работа № 4.
Использование преимуществ клиент-серверной архитектуры
при проектировании приложений БД в Delphi.
Созданная на прошлом занятии программа не реализует всех преимуществ архитектуры клиент-сервер. В частности при расположении БД где-либо в сети она требует пересылки по сети всех таблиц целиком. Если таблицы достаточно большие, это может серьёзно загрузить сеть. При работе с Intebase-сервером, запущенном на локальном компьютере, эти недостатки ярко себя не проявляли, при работе в сети они могут существенно замедлить работу.
Итак, модифицируем нашу программу для работы в сети. Модификация будет проведена для TCP/IP — сети. К сожалению, в рамках данных методических указаний подключение к сетевому серверу будет жестко записано в программном коде без возможности это подключение поменять. Предположим, наш сервер БД запущен на узле interbasehost, а база данных расположена на нем в каталоге c:\databases, тогда процедуру подключения к БД (обработчик меню «open») можно переписать следующим образом:
begin
MyBase.Params.Values['database']:='interbasehost:c:\databases\querty.fdb';
MyBase.Open;
Stud_Table.open;
Usp_Table.Open;
Disc_Table.open;
end;
Следующий наш шаг — настройка объектов TsimpleDataSet таким образом, чтобы они содержали только нужные пользователю данные (например, студентов только одной группы, дисциплины только одной кафедры и т.п.).
Для этого дополним нашу форму DataModule1 еще одной парой SimpleDataSet + DataSource. Переименуем их, например, в Group_Set и Group_Source. Установим свойства в следующие значения компонента Group_Set:
connection MyBase
commandType ctQuery
commandText Select distinct gruppa from student;
У компонента Group_Source зададим свойство
Dataset Group_Set
В первой строке задается вид объекта Group_Set это будет запрос. во второй строке записывается текст этого запроса на SQL.
Замечание. При изменении свойства CommandText в запросах настоятельно рекомендуется имена таблиц и полей писать с соблюдением регистра!
Далее поместим на главную форму компонент ComboBox, и поменяем его свойства
DataSource DataModule1.Group_source
Name Group_select
Теперь на главной форме у нас добавлен список имеющихся групп. Чтобы в нем отображалась хотя бы одна запись, после подключения к БД (в обработчике подключения) следует добавить строчки (помним, что эти строки внутри блока with DataModule1 do...):
Group_set.Open;
SDIAppForm.Group_select.Items.clear; //очистим старый список групп
Group_set.First;
while not Group_set.Eof do
begin
{*} SDIAppForm.Group_select.Items.Add(Group_set.FieldByName('gruppa').Value);
Group_Set.Next;
end;
Строка, помеченная звездочкой добавляет в список групп очередную новую группу.
Отображаемый список групп пока никак не влияет на состав студентов в списке. Для того, чтобы отображались только студенты выбранной группы необходимо у объекта Stud_Table поменять свойства:
Dataset.CommandType ctQuery
Dataset.CommandText Select * from student where gruppa=:gruppa;
Последняя строчка представляет собой так называемый параметрический запрос, результатом которого будут все поля таблицы student, значение группы у которых равно параметру :gruppa. Значение этого параметра следует менять по событию выбора новой группы в компоненте Group_Select на главной форме. После смены значения параметра следует закрыть и вновь открыть компонент Stud_Table. Полный текст обработчика таким образом может выглядеть так:
Stud_Table.Params.ParamByName('gruppa').Value:=SDIAppForm.Group_select.Text;
Stud_Table.Close;
Stud_Table.Open;
Для работы с параметрическими запросами компонентов TSimpleDataset необходимо в инспекторе объектов дважды щелкнуть справа от их свойства Params и добавить как минимум необходимые имена параметров и значения по умолчанию. Свойство Params следует менять именно у компонента TSimpleDataset (не переходя по ветви дерева на ветку DataSet->Params!!!).
В том случае если вы не хотите работать с параметрическими запросами, например они вам непонятны, их можно не использовать, а последний фрагмент кода переписать например, вот так:
Stud_Table.Close;
Stud_Table.DataSet.CommandText:='Select * from student where gruppa='+ chr($27) + SDIAppForm.Group_select.Text+ chr($27)+';';
Stud_Table.Open;
В этом случае SQL запрос каждый раз динамически создается «с нуля», а затем запускается на выполнение. Обратите внимание на точки с запятой в конце строк и функцию chr($27) она возвращает символ одиночной кавычки (апострофа), иным способом добавить который к данному SQL запросу довольно путано.
Далее аналогичным образом добьемся отображения только нужных нам оценок. Фильтрация, использованная в предыдущей работе, лишь визуально скрывает чужие оценки, на самом деле по сети передавалась бы вся таблица оценок. Для устранения этого недостатка изменим свойства компонента Usp_Table
Dataset.commandType ctQuery
Dataset.commandText Select * from uspevaemost where st_bilet=:st_bilet;
перепишем обработчик события AfterScroll объекта Stud_Table таким образом чтобы он отрывал Usp_Table как параметрический запрос:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.