- •Типы данных
- •Простые типы данных
- •Структурированные типы данных
- •Ссылочные типы данных
- •Типы данных, используемые в реляционной модели
- •Сотрудники (Номер_сотрудника, Фамилия, Зарплата, Номер_отдела)
- •1 Иванов 1000 1
- •2 Петров 2000 2
- •3 Сидоров 3000 1
- •Простые и составные ключи
- •Естественные и суррогатные ключи
- •1 6 Первая нормальная форма. Первая нормальная форма (1nf)
- •Вторая нормальная форма (2nf)
- •Целостность сущностей
- •Внешние ключи
- •Замечания к правилам целостности сущностей и внешних ключей
- •Для родительского отношения
- •Для дочернего отношения
- •Применение стратегий поддержания ссылочной целостности
- •При обновлении кортежа в родительском отношении
- •При удалении кортежа в родительском отношении
- •При вставке кортежа в дочернее отношение
- •При обновлении кортежа в дочернем отношении
- •2.1. Имена таблиц и полей
- •2.2. Создание таблицы
- •2.3. Создание полей
- •Свойства компонента
- •Методы компонента
- •Операторы sql
- •Операторы ddl (Data Definition Language) - операторы определения объектов базы данных
- •Операторы dml (Data Manipulation Language) - операторы манипулирования данными
- •Операторы защиты и управления данными
- •Отбор данных из одной таблицы
- •Отбор данных из нескольких таблиц
- •Использование имен корреляции (алиасов, псевдонимов)
- •Использование агрегатных функций в запросах
- •Использование агрегатных функций с группировками
- •Использование подзапросов
- •Использование объединения, пересечения и разности
- •Синтаксис оператора выборки данных (select)
- •Синтаксис оператора выборки
- •Синтаксис соединенных таблиц
- •Синтаксис условных выражений раздела where
- •Порядок выполнения оператора select
- •Стадия 1. Выполнение одиночного оператора select
- •Стадия 2. Выполнение операций union, except, intersect
- •Стадия 3. Упорядочение результата
- •Как на самом деле выполняется оператор select
- •Оператор соединения
- •Оператор пересечения
- •Оператор деления
- •Панель компонент Rave
- •Компоненты вывода
- •Классы Rave
- •Мост к данным
- •Об именовании компонент подключения данных
- •Управление видимостью подключения
- •Пользовательские подключения данных
- •5. Настройка подключений данных Использование событий для настройки ваших подключений данных
- •Визуальная среда создания отчетов
- •Описание tRvRenderPreview
- •Свойства tRvRenderPreview
- •События tRvRenderPreview
- •Описание tRvRenderPrinter
- •Свойства и события tRvRenderPrinter
- •Описание tRvRenderPdf
- •Описание tRvRenderHtml
- •Описание tRvRenderRtf
- •Описание tRvRenderText
- •4. Rave подключения данных Мост к данным
- •Об именовании компонент подключения данных
- •Управление видимостью подключения
- •Пользовательские подключения данных
- •5. Настройка подключений данных Использование событий для настройки ваших подключений данных
- •Событие OnGetCols
- •Событие OnValidateRow
- •Событие OnRestore
Оператор соединения
Реляционная алгебра:
Оператор SQL:
SELECT A.Поле1, A.Поле2, …, B.Поле1, B.Поле2, …
FROM A, B
WHERE c;
или
SELECT A.Поле1, A.Поле2, …, B.Поле1, B.Поле2, …
FROM A CROSS JOIN B
WHERE c;
Оператор пересечения
Реляционная алгебра:
Оператор SQL:
SELECT *
FROM A
INTERSECT
SELECT *
FROM B;
Оператор деления
Реляционная алгебра:
Оператор SQL:
SELECT DISTINCT A.X
FROM A
WHERE NOT EXIST
(SELECT *
FROM B
WHERE NOT EXIST
(SELECT *
FROM A A1
WHERE
A1.X = A.X AND
A1.Y = B.Y));
Замечание. Оператор SQL, реализующий деление отношений трудно запомнить, поэтому дадим пример эквивалентного преобразования выражений, представляющих суть запроса.
Пусть отношение A содержит данные о поставках деталей, отношение B содержит список всех деталей, которые могут поставляться. Атрибут X является номером поставщика, атрибут Y является номером детали.
Разделить отношение A на отношение B означает в данном примере "отобрать номера поставщиков, которые поставляют все детали".
Преобразуем текст выражения:
"Отобрать номера поставщиков, которые поставляют все детали" эквивалентно
"Отобрать те номера поставщиков из таблицы A, для которых не существует непоставляемых деталей в таблице B" эквивалентно
"Отобрать те номера поставщиков из таблицы A, для которых не существует тех номеров деталей из таблицы B, которые не поставляются этим поставщиком" эквивалентно
"Отобрать те номера поставщиков из таблицы A, для которых не существует тех номеров деталей из таблицы B, для которых не существует записей о поставках в таблице A для этого поставщика и этой детали".
Последнее выражение дословно переводится на язык SQL. При переводе выражения на язык SQL нужно учесть, что во внутреннем подзапросе таблица A должна быть переименована, для того чтобы отличать ее от экземпляра этой же таблицы, используемой во внешнем запросе.
Выводы
Фактически стандартным языком доступа к базам данных в настоящее время стал язык SQL (Structured Query Language).
Язык SQL оперирует терминами, несколько отличающимися от терминов реляционной теории, например, вместо "отношений" используются "таблицы", вместо "кортежей" - "строки", вместо "атрибутов" - "колонки" или "столбцы".
Стандарт языка SQL, хотя и основан на реляционной теории, но во многих местах отходит он нее.
Основу языка SQL составляют операторы, условно разбитые не несколько групп по выполняемым функциям:
Операторы DDL (Data Definition Language) - операторы определения объектов базы данных.
Операторы DML (Data Manipulation Language) - операторы манипулирования данными.
Операторы защиты и управления данными, и др.
Одним из основных операторов DML является оператор SELECT, позволяющий извлекать данные из таблиц и получать ответы на различные запросы. Оператор SELECT содержит в себе все возможности реляционной алгебры. Это означает, что любой оператор реляционной алгебры может быть выражен при помощи подходящего оператора SELECT. Этим доказывается реляционная полнота языка SQL.
Различают концептуальную схему выполнения оператора SELECT и фактическую схему его выполнения. Концептуальная схема описывает, в какой логической последовательности должны выполняться операции, чтобы получить результат. При реальном выполнении оператора SELECT на первый план выступает достижение максимальной скорости выполнения запроса. Для этого используется оптимизатор, который, анализируя различные планы выполнения запроса, выбирает наилучший из них.
46 Компоненты Delphi для работы с БД: TQuery (назначение, свойства, методы события).
Компонент TQuery реализует все основные функции стандартного компонента запроса, описанные в гл. 12. Прямым предком компонента является класс TDBDataSet.
Для подключения к базе данных используется свойство DatabaseName, в котором задается псевдоним BDE или путь к базе данных.
Текст запроса определяется свойством SQL, для задания которого применяется простой редактор, открывающийся при щелчке на кнопке свойства в Инспекторе объектов (рис. 16.6).
Для управления текстом запроса во время выполнения приложения можно использовать возможности класса TStrings.
Основные свойства и методы компонента TQuery представлены в табл. 16.9.
Таблица 16.9. Свойства и методы компонента TQuery
Объявление |
Тип |
Описание |
Свойства |
||
property Constrained: Boolean; |
Pb |
При значении True запрещает внесение в набор данных таких значений, которые не соответствуют условиям отбора запроса. Применимо для локальных БД |
property DataSource: TDataSource; |
Pb |
Ссылается на компонент TDataSource, из набора данных которого задаются значения параметров |
property Local: Boolean; |
Ro |
Значение True означает, что запрос обращается к локальной таблице |
property ParamCheck: Boolean; |
Pb |
При значении True параметры запроса обновляются при изменении свойства SQL во время выполнения |
property ParamCount: Word; |
Ro |
Возвращает число параметров в запросе |
property Params [Index : Word]TParams; |
Pb |
Индексированный список объектов TParams, каждый из которых соответствует одному параметру запроса |
property Prepared: Boolean |
Pu |
Возвращает результат выполнения операции подготовки запроса к выполнению |
property RequestLive: Boolean; |
Pu |
При значении False результат запроса нельзя редактировать, независимо от того, редактируемый результат или нет. При значении True результат запроса можно редактировать, но только если он "живой" |
property RowsAffected: Integer; |
Ro
|
Возвращает число модифицированных записей набора данных с момента последнего выполнения запроса |
property SQL: TStrings; |
Pb |
Содержит текст запроса |
property SQLBinary: PChar; |
Pu |
Внутреннее свойство для обеспечения работы с ВОЕ |
property StmtHandle: HDBIStmt; |
Ro |
Возвращает экземпляр объекта, соответствующего запросу в BDE. Используется при прямом вызове функций BDE |
property Text: PChar; |
Ro |
Указатель на символьный массив, содержащий передаваемый в BDE текст запроса |
property UniDirectional: Boolean; |
Pb |
Определяет тип используемого курсора данных |
Методы |
||
procedure ExecSQL; |
Pu |
Выполняет запрос без открытия набора данных |
procedure GetDetailLinkFields (MasterFields, DetailFields: TList) ; override; |
Pu |
Заполняет списки параметров метода экземплярами объектов полей двух таблиц запроса, находящихся в отношении "один-ко-многим" |
function ParamByName (const Value: string) : TParam; |
Pu |
Возвращает ссылку на экземпляр объекта параметра с именем, переданным в параметре Value |
procedure Prepare; |
PU |
Готовит запрос к выполнению |
procedure UnPrepare; |
Pu |
Освобождает ресурсы, занятые при подготовке запроса к выполнению |
Рис 16.6. Редактор свойства SQL компонента TQuery
47 Визуальные компоненты Delphi для манипулирования данными.
В данной статье мы кратко остановимся на иерархии классов Delphi и рассмотрим некоторые компоненты VCL Delphi, которые располагаются на закладках Standard и Additional.
Настало время рассмотреть компоненты, входящие в библиотеку визуальных компонентов (Visual Component Library) Delphi. Библиотека визуальных компонентов содержит большое число классов <готовых к употреблению>. Вся VCL построена по иерархическому принципу. Хотя VCL и называется библиотекой визуальных компонентов, на самом деле в нее входят также и невизуальные компоненты. Отметим, что визуальными называются компоненты, которые видны на форме как во время создания приложения, так и во время работы приложения. Невизуальные компоненты - видны только во время разработки приложения.
Все компоненты VCL являются классами. И все они являются потомками базового класса TObject. Данный класс является абстрактным и содержит базовые методы, которые наследуются классами-потомками. Основные методы класса TObject - это: Create - метод, вызываемый для создания объекта; Destroy - метод, вызываемый для удаления объекта; Free - метод, вызываемый для уничтожения объекта, при вызове данного метода освобождается память, выделенная для данного объекта.
Прямыми потомками класса TObject являются классы TPersistent, TException и TIniFile.
Нам для рассмотрения компонентов Delphi наиболее интересен класс TPersistent, который добавляет к методам класса TObject метод Assign. Этот метод позволяет передавать поля и свойства одного объекта другому.
Потомками класса TPersistent являются классы TComponent, TClipboard и TStrings. Именно класс TComponent является базовым классом для всех компонентов VCL Delphi, расположенных в палитре компонентов.
Сразу после установки Delphi, в палитре компонентов мы видим 19 закладок:
Каждая закладка объединяет стандартные компоненты Delphi в группы по отдельным признакам. Рассмотрим эти закладки:
Standard - здесь расположены стандартные компоненты, обеспечивающие некоторые функции интерфейса пользователя.
На этой закладке расположены следующие компоненты (слева направо):
Название |
Название на русском языке |
Краткое описание компонента |
Frames |
Фреймы |
Фрейм - это похожий на форму компонент, который используется для размещения внутри него других компонентов. Может размещаться на формах или других фреймах. Для создания нового фрейма нужно выбрать пункт меню File/New Frame (Файл/Новый Фрейм) |
MainMenu |
Главное меню |
Служит для создания главного меню вашего приложения. Расположите этот компонент на форме и, после двойного щелчка на нем, добавьте новые пункты вашего меню |
PopupMenu |
Всплывающее меню |
Служит для создания так называемого всплывающего меню - меню, которое отображается после щелчка правой кнопкой мыши в определенной области приложения |
Label |
Метка |
Служит для простого отображения текстовой информации, которую пользователь не может редактировать во время работы приложения |
Edit |
Поле для ввода |
Служит для отображения текстовой информации, которую пользователь может изменять. Удобно применять для ввода или редактирования какой-либо текстовой информации |
Memo |
Многострочное поле |
Работает как и поле для ввода, только позволяет вводить (редактировать) несколько строк текста |
Button |
Кнопка |
Обычная кнопка предназначена для выполнения какого-либо кода по наступлению события нажатия на кнопку пользователем |
CheckBox |
Флажок |
Представляет опцию, благодаря которой пользователь может переключать положение (вкл./выкл.) |
RadioButton |
Переключатель |
Данный переключатель работает обычно в группе с другими. Если на форме располагается несколько таких переключателей, то только один из них может принимать включенное положение |
ListBox |
Список |
Предназначен для вывода нескольких строк текста. Пользователь может выбрать любую из этих строк простым нажатием на ней |
ComboBox |
Выпадающий список |
Является как бы комбинацией списка и поля для ввода. Пользователь может ввести самостоятельно текст в поле, либо выбрать нужный из предоставленного списка |
ScrollBar |
Полоса прокрутки |
Предназначена для смены видимой области отображения формы. Нужна для просмотра большого количества информации, которая просто не помещается на экран |
GroupBox |
Группа |
Создает так называемый контейнер, который может содержать внутри себя компоненты. Эти компоненты объединяются в одну группу. Служит в основном для удобства работы с разными группами компонентов на одной форме |
RadioGroup |
Группа переключателей |
Создает группу переключателей. Эти переключатели не зависят от других групп или одиночных переключателей |
Panel |
Панель |
Используется для созданий строк состояния или панелей инструментов. На панели могут размещаться другие компоненты |
ActionList |
Список действий |
Позволяет вашему приложению централизовано реагировать на какие-либо действия пользователя. Например, копирование данных из поля для ввода |
Additional - на этой закладке располагаются дополнительные интерфейсные компоненты.
Данная закладка содержит следующие компоненты (слева направо):
Название |
Название на русском языке |
Краткое описание компонента |
BitBtn |
Кнопка с рисунком |
Кнопка, которая, помимо текста, может отображать рисунок |
SpeedButton |
Кнопка быстрого доступа |
Такие кнопки обычно располагаются на панели инструментов. Они не могут содержать текста, а содержат только рисунки |
MaskEdit |
Поле для ввода по шаблону |
Компонент похож на поле для ввода, только позволяет вводить информацию по определенным правилам, например - паспортные данные, почтовый индекс, номер телефона и др. |
StringGrid |
Таблица со строками |
Компонент позволяет работать со строками текста, размещая их в таблицу. Позволяет быстро создавать приложения, наподобие электронных таблиц |
DrawGrid |
Таблица |
Позволяет работать с произвольной информацией в таблице |
Image |
Рисунок |
Служит для отображения графического растрового файла, иконки или метафайла |
Shape |
Геометрическая фигура |
Позволяет отображать произвольные геометрические фигуры. Например, эллипс, треугольник, прямоугольник и другие |
Bevel |
Фаска |
Позволяет украсить ваше приложение, путем размещения <трехмерных> линий или прямоугольников |
ScrollBox |
Область прокрутки |
Создает контейнер, который автоматически добавляет полосы прокрутки, в случае необходимости, без вмешательства программиста |
CheckListBox |
Список переключателей |
Отображает похожий на список компонент, который позволяет выбирать сразу несколько строк одновременно |
Splitter |
Разделитель |
Размещается между двумя выровненными компонентами-контейнерами и позволяет пользователю во время работы приложения изменять размеры этих компонентов с помощью перемещения разделителя |
StaticText |
Статический текст |
Компонент похож на метку, но имеет некоторые дополнительные возможности (о них мы поговорим в дальнейшем) |
ControlBar |
Панель инструментов |
Позволяет быстро создавать панели инструментов |
ApplicationEvents |
События приложения |
Компонент, который позволяет обрабатывать события на уровне приложения (а не отдельной формы), например, запуск приложения, минимизация, и др. |
Chart |
Диаграмма |
Позволяет отображать диаграммы различной формы и вида |
К сожалению, объем статьи не позволяет рассмотреть примеров применения данных компонентов. Поэтому рассмотрением применения вышеперечисленных компонентов на конкретных примерах мы займемся в следующий раз.
48 Процедура создания отчетов в Delphi.
49 Rave Report: компоненты вывода.