close

Вход

Забыли?

вход по аккаунту

?

ЛР №2 БД-2

код для вставкиСкачать
Министерство образования и науки РФ
Федеральное бюджетное государственное образовательное учреждение
высшего профессионального образования
"Тульский государственный университет"
Политехнический институт
Кафедра "Автоматизированные станочные системы"
Троицкий Д.И. доцент, к.т.н. МЕТОДИЧЕСКИЕ УКАЗАНИЯ
ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНОЙ РАБОТЫ №6
по дисциплине
ПРОГРАММИРОВАНИЕ
Направление подготовки: 230100 Информатика и вычислительная техника
Профиль подготовки: Системы автоматизированного проектирования
Форма обучения - очная, очно-заочная, заочная
Тула 2011 г.
Рассмотрено на заседании кафедры "Автоматизированные станочные системы"
протокол №1 от "31" августа 2011 г.
Зав. кафедрой________________А.Н. Иноземцев
Содержание
1. Пример работы с БД по технологии ADO4
2. Просмотр таблицы8
1. ПРИМЕР РАБОТЫ С БД ПО ТЕХНОЛОГИИ ADO
Рассмотрим задачу: создать приложение, осуществляющее просмотр, изменение и сохранение базы данных.
Приложение использует как источник данных БД, содержащую две таблицы: "Группа" и "Препод". Таблицы соединены связью: Запустите Delphi и создайте новое приложение (меню File-->New-->Application). Сначала в приложении будет только одна пустая форма. Традиционно компоненты, отвечающие за работу с базами данных, помещают не на форму, а в специальный модуль данных. Создадим его (меню File-->New-->Data Module). Модуль данных внешне похож на форму, но он никогда не отображается на экране в процессе работы программы. Сразу сохраните созданный модуль на диске (Ctrl+S) под любым именем, например, dm_unit.pas. В инспекторе объектов поменяйте в свойстве Name значение названия модуля данных по умолчанию (DataModule1) на более короткое, скажем, DM. Это имя придется часто писать в тексте программы. Обратите внимание, что это имя не должно совпадать с именем файла, в котором вы сохранили модуль данных.
На модуль данных надо поместить следующие компоненты:
ВидПанель инструментовНазвание элементаЧто делаетADOADOConnectionСоединение с ADOADOADOTable (2 шт.)Соединение с таблицейData AccessDataSourceСоединение таблицы с визуальными компонентами Далее на форму добавляем визуальные компоненты для работы с БД:
ВидПанель инструментовНазвание элементаЧто делаетData ControlsDBGridВыводит таблицу на экранData ControlsDBNavigatorКнопки для перемещения по таблицеData ControlsDBMemoОкно редактирования длинных текстов, хранимых в таблице Далее настраиваем данные элементы:
ADOConnection
Двойным щелчком мыши вызываем контекстное меню элемента, затем выбираем 'Use Connection String' затем 'Build' и настраиваем связь с нашей БД:
Чтобы при каждом подключении к БД не запрашивался пароль, свойство LoginPrompt надо поставить в False.
ADOTable
Первая таблица ADOTable1.
В свойстве Connection выбираем название нашей связи с БД, а в свойстве TableName - название необходимой таблицы. Теперь пробуем изменить значение свойства Active с False на True. Если выскакивает сообщение об ошибке, значит соединение с базой некорректное.
Вторую таблицу подключаем аналогично.
DataSource
Этот элемент необходим нам для визуального отображения таблицы в приложении.
В свойстве DataSet выбираем из списка название необходимой таблицы.
К данному моменту должно быть 5 готовых элементов:
1. ADOConnection
2. ADOTable1
3. ADOTable2
4. DataSource1
5. DataSource2
Теперь, для того, чтобы связать таблицы связью необходимо вернуться ко второй таблице:
В свойстве MasterSource выбираем DataSource1 (источник данных первой таблицы).
Затем в свойстве MasterFields необходимо выбирать поля, по которым связываем таблицы, для этого нажимаем троеточие.
Выбираем два поля и нажимаем Add. Поля перемещается в список выбранных полей Теперь можно подключать элементы визуального отображения.
2. ПРОСМОТР ТАБЛИЦЫ
На событии OnCreate модуля данных нужно записать код открытия соединения и таблиц: Компонент DBGrid, разумеется, размещается на форме, а не в модуле данных. Переключитесь (Shift+12) на форму и поместите на нее DBGrid. Теперь надо связать DBGrid и DataSource. Делается это так. Сначала вручную добавьте имя файла модуля данных (dm_unit.pas) в раздел USES формы:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, dm_unit;
Затем выполните компиляцию проекта без запуска программы (Ctrl+F9). Теперь в инспекторе объектов у компонента DBGrid установите свойство DataSource в значение DM.DVDDS. Теперь запускайте программу... Готово! На экране - наша БД. Ее можно редактировать, добавлять (клавиша Insert) или удалять (клавиша Delete) записи. Увы, пока таблица с БД на экране выглядит довольно безобразно. Во-первых, в заголовках колонок выводятся названия полей, а хотелось бы видеть русский текст вроде "Название фильма". Во-вторых, ширина колонок получилась неудобной, к тому же при разворачивании формы на весь экран эта ширина не меняется. Давайте приведем DBGrid в относительный порядок. Чтобы создать колонки с собственными заголовками, нужно позволить Delphi проанализировать структуру вашей БД и занести в программу ссылки на ее поля. Выполните следующие действия:
1. Переключитесь в модуль данных. 2. У компонента Database в свойство AliasName введите имя алиаса DVD. Для анализа структуры база будет открыта, поэтому и нужно явно указать имя алиаса. 3. Щелкните правой кнопкой мыши на компоненте Query и в контекстом меню выберите пункт Fields Editor. Откроется пустое окошко редактора полей.
4. Снова щелкните правой кнопкой мыши в окне редактора полей и выберите пункт Add fields. Через секунду Delphi отобразит список полей нашей БД. Осталось щелкнуть по кнопке OK. Итак, поля добавлены. Снова переключаемся на форму, щелкаем правой кнопкой мыши по DBGrid и выбираем в контекстом меню пункт Columns Editor. Откроется окно редактора колонок. Для добавления новой колонки щелкните по кнопке . В свойствах колонки задайте имя поля (FieldName), которое будет в ней отображаться. В инспекторе объектов раскройте пункт Title, в поле Caption введите желаемое русское название колонки. Здесь же можно выровнять заголовки по центру (свойство Alignment, значение taCenter), поменять цвет и шрифт заголовков. Аналогичным образом добавьте колонки для всех полей базы. Разумеется, поле ID добавлять не надо, оно является служебным. Поля пусть идут в следующем порядке: NAME_RUSSIAN; NAME_ENGLISH; NUMBER; SUBTITLES;YEARF.
Теперь надо настроить режимы отображения DBGrid. Закройте окно редактора колонок и раскройте пункт Options в редакторе свойств компонента DBGrid. Установите пункт dgIndicator в False - это необходимо для правильного задания ширины колонок. Ширину колонок мы будем пересчитывать динамически при изменении размеров формы. Соответственно, для формы надо создать обработчик события OnResize:
procedure TForm1.FormResize(Sender: TObject);
CONST w:ARRAY[0..4] OF REAL=(0.35,0.35,0.1,0.1,0.1);
VAR i:BYTE;
begin
FOR i:=0 TO LENGTH(w)-1 DO
DBGrid1.Columns[i].Width:=TRUNC((DBGrid1.Width- GetSystemMetrics(SM_CXVSCROLL)-LENGTH(w))*w[i])-1
end;
В константном массиве w хранятся относительные ширины колонок NAME_RUSSIAN, NAME_ENGLISH, NUMBER, SUBTITLES и YEARF соответственно. Сумма всех элементов этого массива должна быть равна единице. В цикле присваивается ширина в пикселах колонкам компонента с именем DBGrid1. Функция GetSystemMetrics(SM_CXVSCROLL) возвращает ширину вертикальной полосы прокрутки в пикселах. Она вычитается из ширины компонента DBGrid1.Width, чтобы получить ширину поля, на котором размещаются колонки. Кроме того, для учета ширины вертикальных линий, разделяющих колонки, из ширины поля надо вычесть число колонок (по пикселу на колонку). Наконец, полученную ширину умножаем на соответствующий элемент массива, берем целую часть от получившегося произведения и на всякий случай вычитаем единицу - из-за ошибок округления можно получить лишний пиксел, из-за которого на экране возникнет совершенно не нужная горизонтальная полоса прокрутки. Если все сделано правильно, DBGrid будет иметь вполне приличный вид. Для повышения удобства просмотра и редактирования БД в паре с DBGrid можно применить компонент DBNavigator, представляющий собой панель с кнопками перехода по записям, добавления, редактирования и удаления записей. Поместите DBNavigator на форму и установите его свойство DataSource в значение DM.DVDDS. DBGrid
В свойстве DataSource выбираем из списка необходимый источник данных. Чтобы он в списке появился, нужно прописать ссылку на модуль данных в оператор USES формы, например:
USES ...., DM;
и откомпилировать программу (Ctrl+F9). Если все связи правильны и свойство таблицы Active равно True, то DBGrid должна отображать соответствующую таблицу БД. Так как нам нужны не все поля для вывода, то нужно проделать следующее:
Двойным щелчком мыши на DBGrid1 вызываем контекстное меню
Добавляем все поля И удаляем ненужные. Те же действия и для DBGrid2.
Так же можно изменить отображение логического поля (по умолчанию True и False) на Да и Нет:
Двойным нажатием мышки на ADOTable2 вызываем контекстное меню и выбрав необходимое нам поле изменяем свойство DisplayValues:
DBMemo
Указываем в свойствах источник данных(DataSource) и отображаемое поле(DataField):
DBNavigator
Указываем в свойствах источник данных:
Так же задействованы:
Блок элементов для осуществления поиска:
Имя элемента Название GroupBox2 Поиск Label2 Текст: Edit2 ComboBox1 Button1 Начать Button2 Продолжить Блок элементов для осуществления фильтрации:
Имя элемента Название GroupBox1 Фильтрация (по категории) CheckBox1 Включить Label1 Текст: Edit1 Листинг с комментариями:
//Действия, происходящие при создании формы
procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
ADOTable1.Open; //открытие таблицы
ADOTable2.Open; //открытие таблицы
// заполняем список ComboBox1 названиями полей таблицы № 2 (Товары)
for i:=0 to DBGrid2.Columns.Count-1 do //так как отсчет идет с 0
ComboBox1.Items.Add(DBGrid2.Columns.Items[i].FieldName);
ComboBox1.ItemIndex := 0; //по умолчанию
end; //Действия, производимые при закрытии формы:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOTable1.Close; //закрытие таблицы
ADOTable2.Close; //закрытие таблицы
end; //Сортировка данных, производимая при нажатии на имя поля сетки
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if (column.Field.DataType <> ftBlob) and //если тип поля не рисунки
(column.Field.DataType <> ftMemo) //если тип поля не Memo
then ADOTable1.IndexFieldNames := column.FieldName
//проиндексировать таблицу по этому полю
else Application.MessageBox('Сортировка по этому типу данных невозможна!', 'Ошибка', MB_OK + MB_ICONERROR);
end;
procedure TForm1.DBGrid2TitleClick(Column: TColumn);
begin
if (column.Field.DataType <> ftBlob) and (column.Field.DataType <> ftMemo)
then ADOTable2.IndexFieldNames := column.FieldName
else Application.MessageBox('Сортировка по этому типу данных невозможна!', 'Ошибка', MB_OK + MB_ICONERROR);
end;
//Функция фильтрации, проверка при включении
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
ADOTable1.Filtered := CheckBox1.Checked; //переключатель состояния
if (ADOTable1.Filtered) then //если фильтр включен
begin
if Edit1.Text <> '' then //если поле ввода не пустое
begin
ADOTable1.Filter := '(Категория like ' + QuotedStr(Edit1.Text + '%')+ ')'; //фильтруем поле Категория //берем строку в апострофы
end
else ADOTable1.Filter := '';
end;
end;
//Фильтрация при изменении поля ввода
procedure TForm1.Edit1Change(Sender: TObject);
begin
if (Edit1.Text <> '') and (ADOTable1.Filtered) then
begin
ADOTable1.Filter := '(Категория like ' + QuotedStr(Edit1.Text + '%')+ ')';
end
else ADOTable1.Filter := '';
end;
//Поиск в таблице
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit2.Text = '' then //если поле ввода пусто
begin
Application.MessageBox('Введите искомую строку!', 'Ошибка', MB_OK + MB_ICONERROR);
exit; //остановка процедуры
end;
//если объект поиска задан
ADOTable2.First; //переход в начало таблицы
while not ADOTable2.Eof do //проверка до конца таблицы
begin
if pos(Edit2.Text, ADOTable2.FieldByName(ComboBox1.Text).AsString) > 0 then
//если в указанном поле находится запись с искомым куском
begin
Application.MessageBox(PChar('Номер записи = ' + IntToStr(ADOTable2.RecNo)), 'Результат', MB_OK + MB_ICONINFORMATION);
break;
end;
ADOTable2.Next; //переход на следующую запись
end;
end;
//Поиск следующей записи
procedure TForm1.Button2Click(Sender: TObject);
begin
if Edit2.Text = '' then
begin
Application.MessageBox('Введите искомую строку!', 'Ошибка', MB_OK + MB_ICONERROR);
exit;
end;
ADOTable2.Next;
while not ADOTable2.Eof do
begin
if pos(Edit2.Text, ADOTable2.FieldByName(ComboBox1.Text).AsString) > 0 then
begin
Application.MessageBox(PChar('Номер записи = ' + IntToStr(ADOTable2.RecNo)), 'Результат', MB_OK + MB_ICONINFORMATION);
break;
end;
ADOTable2.Next;
end;
Application.MessageBox('Соответствий нет!', 'Ошибка', MB_OK + MB_ICONINFORMATION);
end;
//Формирование отчета
//Сначала содержимое сетки заносим в memo
//затем из memo все экспортируем Excel и удаляем memo
procedure TForm1.Button3Click(Sender: TObject);
var
bm: TBookmark;
col, row: Integer;
sline: string;
mem: TMemo;
ExcelApp: Variant;
begin
Screen.Cursor := crHourglass;
DBGrid2.DataSource.DataSet.DisableControls;
bm := DBGrid2.DataSource.DataSet.GetBookmark;
DBGrid2.DataSource.DataSet.First;
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Товары';
mem := TMemo.Create(Self);
mem.Visible := false;
mem.Parent := Form1;
mem.Clear;
sline := '';
for col := 0 to DBGrid2.FieldCount-1 do
sline := sline + DBGrid2.Columns.Items[col].Title.Caption + #9;
mem.Lines.Add(sline);
for row := 0 to DBGrid2.DataSource.DataSet.RecordCount-1 do
begin
if (Row = 65535) then break;
sline := '';
for col := 0 to DBGrid2.FieldCount-1 do
sline := sline + DBGrid2.Fields[col].AsString + #9;
mem.Lines.Add(sline);
DBGrid2.DataSource.DataSet.Next;
end;
mem.SelectAll;
mem.CopyToClipboard;
Screen.Cursor := crDefault;
ExcelApp.Workbooks[1].WorkSheets['Товары'].Paste;
ExcelApp.Visible := true;
ExcelApp.Range['A1', Char(DBGrid2.FieldCount + 64) + '1'].Interior.ColorIndex := 36;
ExcelApp.Range['A1', Char(DBGrid2.FieldCount + 64) + '1'].Font.Bold := true;
ExcelApp.Workbooks[1].WorkSheets['Товары'].Columns.AutoFit;
if DBGrid2.DataSource.DataSet.RecordCount < 65536
then ExcelApp.Range['A1', Char(DBGrid2.FieldCount + 64) + IntToStr(DBGrid2.DataSource.DataSet.RecordCount+1)].Select
else ExcelApp.Range['A1', Char(DBGrid2.FieldCount + 64) + IntToStr(65536)].Select;
ExcelApp.Selection.NumberFormat := '@';
ExcelApp.Selection.Borders.LineStyle := 1;
ExcelApp.Range['A1', 'A1'].Select;
DBGrid2.DataSource.DataSet.GotoBookmark(bm);
DBGrid2.DataSource.DataSet.FreeBookmark(bm);
DBGrid2.DataSource.DataSet.EnableControls;
end;
Документ
Категория
Рефераты
Просмотров
110
Размер файла
194 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа