- •Разработка баз данных средствами MySql
- •Содержание
- •Введение
- •1. Основы работы в субд MySql
- •Системы управления базами данных
- •Основные характеристики MySql
- •Команда create database
- •Работа с таблицами
- •Синтаксис команды create table
- •Удаление таблиц
- •Синтаксис команды drop table
- •Типы данных
- •Числовые данные
- •Строковые данные
- •Календарные данные
- •Тип данных null
- •Выбор типа данных
- •1 Вариант.
- •2 Вариант.
- •3 Вариант.
- •2. Работа с таблицами. Ввод, извлечение, поиск и удаление данных Запись данных в таблицы
- •Заполните таблицу employee_data 5-10 записями. Запрос данных из таблицы MySql
- •Выборка данных с помощью условий
- •Операторы больше и меньше
- •Поиск текстовых данных по шаблону
- •Предложение group by и having
- •Удаление записей из таблицы
- •Задание 1
- •Задание 2
- •Задание 3
- •3. Логические операции в MySql
- •Операторы in и between
- •Упорядочивание данных
- •Ограничение количества извлекаемых данных
- •Извлечение подмножеств
- •Ключевое слово distinct
- •Изменение записей
- •Задание 1
- •Задание 2
- •Задание 3
- •Вычисление среднего значения
- •Именование столбцов
- •Подсчет числа записей
- •Группировка данных
- •5. Математические функции в MySql. Строковые функции. Работа с датой Математические функции MySql
- •Строковые функции
- •Ascii(строка)
- •Concat(строка1, строка2, ...)
- •Особенности типа данных Date
- •Операции с датами
- •Определение диапазонов
- •Использование Date для сортировки данных
- •Выбор данных с помощью Date
- •Текущие даты
- •Тип столбца Null
- •Задание 1
- •Задание 2
- •Задание 3
- •6. Переменные и временные таблицы. Многотабличные запросы
- •7. Вложенные запросы в MySql
- •8. Хранимые процедуры и функции
- •9. Курсоры в MySql. Представления. Конструкции управления потоком данных
- •10. Анализ и моделирование предметной области
- •1. Выбор и текстовое описание предметной области
- •2. Разработка концептуальной er-модели предметной области
- •3. Определение функциональных требований
- •11. Проектирование базы данных
- •1. Создание логической реляционной модели базы данных
- •2. Нормализация логической реляционной модели базы данных
- •1Нф (Первая Нормальная Форма)
- •2Нф (Вторая Нормальная Форма)
- •3Нф (Третья Нормальная Форма)
- •12. Проектирование физической модели бд и ее реализация
- •1. Создание физической модели базы данных
- •2. Реализация физической модели базы данных в коде
- •13. Наполнение и тестирование бд
- •1. Наполнение базы данных
- •2. Тестирование базы данных
- •14. Создание приложения к бд в среде delphi 7, с использованием AnyDac framework 1.7.0
- •1. Начало работы
- •2. Связь с таблицами
- •3. Отображение таблицы на форме
- •4. Компонент adQuery
- •5. Экспорт данных в Excel
- •6. Работа с внешними ключами
- •Рекомендуемая литература
- •Разработка баз данных средствами MySql
- •460844, Г. Оренбург, ул. Советская, 19
5. Экспорт данных в Excel
Для этого нужно добавить на форму компоненты со вкладки Servers: ExcelApplication, ExcelWorkbook, ExcelWorksheet.
Далее приведен код процедуры экспорта, в которой отображается прогресс экспорта, для этого нужно дополнительно создать новую форму, включив е в список uses, на которой расположить ProgressBar и 4 компонента label:
Примерный вид прогресса:
procedure TForm1.ExportDBGrid(var dbgrid:TDBGrid);
const CellName: array [0..11] of char = ('a','b','c','d','e','f','g','h','i','j','k','l');
//размер этого массива должен быть >= количеству ячеек в DBGrid’е!
var index,Cl,V: OleVariant;
i,j,maxrec: integer;
begin
ExcelApplication1.Connect;
ExcelApplication1.Workbooks.Add(EmptyParam,0);
ExcelApplication1.Visible[0]:=false;//не показывает Excel пока экспортирует
ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook);
index:=1;
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets.item[index] as _worksheet);
ExcelWorksheet1.Activate(0);
maxrec:=0;//количество записей в DBGrid’е
dbgrid.DataSource.DataSet.Open;
if dbgrid.DataSource.DataSet.FindFirst then maxrec:=1;
while dbgrid.DataSource.DataSet.FindNext do inc(maxrec);
form2.ProgressBar1.Max:=maxrec;
Form2.Label4.Caption:=inttostr(maxrec);
form2.Show; //показывает форму с прогрессом
try
for i:=1 to maxrec do
begin
dbgrid.DataSource.DataSet.RecNo:=i;
for j:=0 to pred(dbgrid.FieldCount)do
begin
Cl:=CellName[j]+IntToStr(i);
V:= dbgrid.Fields[j].DisplayText;
ExcelWorksheet1.Range[Cl,Cl].Value2:=V;
end;
Form2.ProgressBar1.Position:=i;//двигает полосу прогресса
Form2.Label2.Caption:=inttostr(i);//текущая позиция
form2.ProgressBar1.Repaint;
form2.Repaint;
end;
finally
form2.Close;//закрыть окно прогресса
ShowMessage('Данные экспортированы');
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.Disconnect;//отключение от Excel
end;
end;
У этой процедуры есть два минуса – это низкая скорость экспорта и необходимость каждый раз закрывать программу Excel перед очередным экспортом, иначе будут ошибки.
6. Работа с внешними ключами
Допустим надо добавить в таблицу «классы» данные, среди которых есть поле «профиль», являющееся внешним ключом. Соответственно надо, чтобы пользователь вводил не ID номер, а просто выбрал из списка существующих вариантов нужный.
Для начала необходимо каким-то образом этот список заполнить. Создадим процедуру Init без параметров, которую будем вызывать каждый раз при добавлении, изменении, удалении любых данных из БД, и в которой как раз и будут инициализироваться все всплывающие списки. Можно добавить на форму компонент ADQuery и поменять его имя на InitQuery1 для удобства.
Будем заполнять Combobox1 названиями профилей
procedure TForm1.init;
begin
ComboBox1.Clear;//очищаем список
InitQuery1.SQL.Clear;
InitQuery1.SQL.Append(‘select profile_name from profiles’);//текст запроса
InitQuery1.Active:=true;
if InitQuery1.FindFirst then //если найдена 1-я запись то добавляем ее в список
ComboBox11.Items.Append(InitQuery1.Fields[0].DisplayText);
while InitQuery1.FindNext do //если найдена след. зпись то добавляем
ComboBox11.Items.Append(InitQuery1.Fields[0].DisplayText);
InitQuery1.Active:=false;
InitQuery1.SQL.Clear;
end;
После этой процедуры в ComboBox1 будут содержаться все названия профилей. Но это еще не все. Чтобы в поле class_profile_id добавлялся id номер профиля, необходимо написать такой запрос, в котором вместо значения внешнего ключа будет подзапрос, возвращающий ID:
insert into classes (class_num,class_char,class_profile_id)
values (:class_num,:class_char,(select profile_id from profiles where profile_name=:profile1))
Теперь при нажатии кнопки «Добавить» надо выполнить следующий код:
procedure TForm1.Button2Click(Sender: TObject);
begin
ADQuery1.Params.Items[0].AsInteger:=strtoint(edit1.Text);//номер класса
ADQuery1.Params.Items[1].AsString:=edit2.Text;//буква класса
ADQuery1.Params.Items[2].AsString:=ComboBox1.Text;
ADQuery1.ExecSQL;
ADTable1.Refresh;//чтобы данные сразу обновились
end;
Задание
Написать приложение к БД для собственого проекта с учетом добавления, изменения и удаления данных, сортировки, выборки и вычислимых запросов, реализовать генерацию отчетов.