- •Bde та ado
- •Введение
- •Введение в базы данных
- •Типы субд
- •Стандарт odbc
- •Технологии взаимодействия delphi с бд
- •Особенности технологии bde
- •Особенности технологии ado
- •Таблицы бд и связи между ними
- •Первичные ключи и индексы
- •Демонстрационная бд "поставщик книг"
- •Использование odbc для подключения источника данных. Внешний псевдоним бд
- •Создание внешнего псевдонима бд
- •Создание проекта с бд в технологии bde
- •Особенности использованияbdeдля соединения с источником данных
- •Структура проекта с бд и визуальными компонентами
- •Активизация проекта
- •Главная форма проекта
- •Модуль данных
- •Создание модуля данныхTDataModule
- •Создание компонента tDatabase
- •Создание компонента tTable
- •Создание компонентаTDataSource
- •Связь модуля главного окна с модулем данных
- •Связь сеткиTdbGrid и навигатораDbNavigatorcисточником данныхTDataSource
- •Связь главный-детальный между наборами данных
- •Задание реляционной связи между наборами данных
- •Активизация наборов данных
- •Недостатки полученных решений и пути их устранения
- •Объекты-столбцы сетки dbGrid
- •Объекты-поля наборов данных
- •Создание объектов-полей
- •Присоединение к наборам данных новых полей
- •Присоединение полей из других таблиц. Подстановочные поля
- •Вычисляемые поля
- •Обработчики событий компонент работы с бд
- •Обработчики событий OnGetText полей нд и компонента визуализации данныхTdbGrid
- •Установка системных переменных в обработчике событяOnCreate
- •Бизнес-правила иобработчики событий компонент работы с бд
- •Implementation
- •Sql запросы к бд
- •КомпонентtQuery
- •СозданиекомпонентаtQuery
- •ИспользованиякомпонентаtQuery
- •Свойство sql
- •Методы Open и ExecSql
- •Параметрические запросы
- •Параметрические запросы и свойство DataSource компонента tQuery
- •Связь главный-детальный с компонентомTQuery в качестве детального набора данных
- •Доступ к полям запроса
- •Обращение к значению поля при помощи свойств объектов-полейValueиAsXxxx
- •Обращение к значению поля при помощи свойств набора данных Fields и FieldValues
- •Обращение к значению поля при помощи функции набора данных FieldByName
- •Программный доступ к данным запроса
- •Общая схема программного доступа к данным запроса
- •Последовательная навигация по записям
- •Обзор событий компонентаtQuery
- •Хранимые процедуры и триггеры
- •Хранимые процедуры
- •Создание хранимых процедур
- •Вызов хранимых процедур
- •Триггеры
- •Наборы данных
- •Обзор событий класса tdbDataSet
- •Реализация каскадных изменений и бизнес-правил
- •Другие события
- •Технология ado
- •Основные особенности технологии ado
- •Реализация технологии ado в Delphi
- •Создание проекта с бд в технологии ado. Установка связи с бд
- •Создание модуля данных
- •Начало настройки связи
- •Выбор провайдера
- •Настройка провайдера
- •Настройка провайдераMicrosoftJet4.0oledbProvider
- •Настройка провайдера Microsoft ole db Provider for odbc Drivers
- •Завершение настройки связи
- •Настройка оставшихся компонент модуля данных
- •Особенности использования компонентов ado
- •Базовые объекты ado
- •ОбъектRecordset
- •ОбъектCommand
- •ОбъектParameter
- •Компонент tadoCommand
- •Свойства, методы и события ado компонентов-наборов
- •Общие свойства с bde-компонентами
- •Специфические свойства
- •Методы класса tCustomAdoDataSet
- •События класса tCustomAdoDataSet
- •Компонент tadoDataSet
- •Компонент tadoTable
- •Компонент tadoQuery
- •Компоненты визуализации данных вDelphi
- •Компонент tdbGrid
- •Свойства
- •Дополнительные возможности сетки
- •Компоненты визуализации полей текущей записи
- •Компонент tdbText
- •Компонент tdbEdit
- •Компонент tdbCheckBox
- •Компонент tdbRadioGroup
- •Списочные компоненты
- •Компонент tdbMemo
- •Компонент tdbRichEdit
- •Компонент tdbCtrlGrid
- •Компонент tdbNavigator
- •Приложение 2. Бд "поставщик книг"
- •Рекомендованная литература
Implementation
procedure TDM.tbNaklsBeforeDelete(DataSet: TDataSet);
begin
//Изменяем финансовое или обменное сальдо партнера
//в соответствии с типом накладной:
tbFirms.Edit; //Редактируем НД tbFirms
case tbNaklsNType.AsInteger of
0,3,6: tbFirmsFFinDelta.AsFloat := tbFirmsFFinDelta.AsFloat +
tbNaklsNSum.AsFloat;
4: tbFirmsFChgDelta.AsFloat := tbFirmsFChgDelta.AsFloat +
tbNaklsNSum.AsFloat;
5: tbFirmsFChgDelta.AsFloat := tbFirmsFChgDelta.AsFloat –
tbNaklsNSum.AsFloat;
else tbFirmsFFinDelta.AsFloat := tbFirmsFFinDelta.AsFloat –
tbNaklsNSum.AsFloat;
end;
tbFirms.Post; //Запоминаем сделанные изменения в НД Firms
IsNaklDel := True; //Блокируем часть действий обработчика tbMoveBeforeDelete (описание переменной IsNaklDel см. выше - в секции Private класса TDM)
while not tbMove.EOF do //Пока в списке книг есть хотя бы одна книга,
//удаляем ее
tbMove.Delete; //Удаление текущей записи (книги) в НД tbMove
//Восстанавливаем работу обработчика tbMoveBeforeDelete
IsNaklDel := False;
end;
Полный код обработчика MoveBeforeDelete приведен ниже
procedure TDM.tbMoveBeforeDelete(DataSet: TDataSet);
var
Sum: real;
begin
tbBooks.Edit; //Редактируем НД tbBooks
//Изменяем количество книг на складе с учетом типа накладной:
//если по накладной были получены книги, из общего количества
//книг на складе вычитаем количество книг в удаляемой записи,
//в противном случае - прибавляем
case tbNaklsNType.AsInteger of
0,3,4,6: tbBooksBQuan.Value := tbBooksBQuan.Value - tbMoveMQuan.Value;
else
tbBooksBQuan.Value := tbBooksBQuan.Value + tbMoveMQuan.Value;
end;
tbBooks.Post; //Запоминаем изменения НД tbBooks
//Если обработчик активизирован при удалении накладной, его работу
//нужно завершить, в противном случае (при удалении записи в сетке
// DBGrid2) следует изменить сальдо партнера и сумму в накладной
if IsNaklDel then Exit; //Активизация при удалении накладной?
//-Да. Завершаем работу
Sum := tbMoveMQuan.AsInteger * tbMoveMPrice.AsFloat;
//Изменяем финансовое или обменное сальдо партнера
tbFirms.Edit; //Редактируем НД Firms
case tbNaklsNType.AsInteger of
0,3,6: tbFirmsFFinDelta.AsFloat := tbFirmsFFinDelta.AsFloat + Sum;
4: tbFirmsFChgDelta.AsFloat := tbFirmsFChgDelta.AsFloat + Sum;
5: tbFirmsFChgDelta.AsFloat := tbFirmsFChgDelta.AsFloat - Sum;
else tbFirmsFFinDelta.AsFloat := tbFirmsFFinDelta.AsFloat - Sum;
end;
tbFirms.Post; //Запоминаем изменения в НД Firms
//Изменяем сумму в накладной
tbNakls.Edit; //Редактируем НД tbNakls
tbNaklsNSum.AsFloat := tbNaklsNSum.AsFloat - Sum;
tbNakls.Post; //Запоминаем изменения в НД tbNakls
end;
Sql запросы к бд
Характерной особенностью компонента TQuery(запрос) является использование в нем языкаSQL. С помощью этого языка программист составляетSQL-запрос, который помещается в предназначенное для этого свойство SQL компонента TQuery.
После активизации свойства Active = Trueлибо вызова методовOpenилиExecSQLкомпонентаTQueryэтот запрос передается машине баз данныхBDE, которая имеет встроенный интерпретаторSQL, позволяющий ей выполнять описанные в запросе действия.
Если запрос требует получения из БДнужных сведений (запросSELECT), сформированные с помощьюBDEданные помещаются в локальную таблицу в виде временного файла в каталоге запуска программы, и компонентTQueryстановится владельцем этой таблицы.
Данные из временной таблицы через компонент-посредник TDataSourceпередаются визуальным компонентам и отображаются в них точно так же, как если бы они были получены компонентомTTable. Однако, в отличие отTTable, пользователь не может изменять эти данные, так как они представляют собой лишь копию реальных данных.
Для изменения хранящейся в БДинформации формируются специальные запросы (INSERT,UPDATE,DELETE и т.д.). В этом случаеBDEне формирует новые и никак не использует ранее созданные временные таблицы, но лишь интерпретирует запрос и уведомляет программу о том, насколько успешно прошло его выполнение. Таким образом, необходимость программного изменения запроса в случае модификацииНДявляется другим характерным отличием компонентовTQueryотTTable.