Книга
Книга
Вячеслав Понамарев
(самоучитель)
БАЗЫ ДАННЫХ
В DELPHI 7
00Прочитав Э7у книгу, вы узнаете:
0
0
что такое брвы данных и »сак различаются их типы
какие средства работы с бодами данных имеются в Delphi]
кок написать приложение, работающее с базами данных
СЕРИЯ
(самоучитель)
!^ППТЕР9
Вячеслав Понамарев
СсАмоучитель)
БАЗЫ ДАННЫХ
В DELPHI 7
!^ППТЕР^
Москва • Санкт-Петербург * Нижний Новгород • ВоронежРостов-на-Дону • Екатеринбург • СамараКиев • Харьков - Минск
2003
ББК 32.973.233-018я7
УДК 681.324.06(075)
П56
П56 Базы данных в Delphi 7. Самоучитель / В fk>s*«es.—二 ~Е Питер, 2003. —224 с.: ил.
ISBN 5-314-00194-2
Среди разработчиков программ для Windoss g>^:・ япг исш「,♦ пользуется среда быстрой разработки приложений Delphi. Эта полул^^лгть лвшяшки. 'Т'.^г гтой освоения и легкостью использования В этой книге урок за урост -ют^ьдиитт тиг* г 匸 базами данных. Демонстрнруютс! широкме возможности по созданик- ^^г^оажл >皿,мун н рассказывается о большом наборе стандартных компонентов, с по)*л=ь^ кгтпшьх м&нг .. ззавать приложения достаточно высокого уровня сложности.
Самоучитель предназначен для читателей, знак««ыл : юкпмж» >Че»-- ориентированного программирования и уже имеющих опыт написаниж ггьъя grai» • r_:t Delphi.
SS< 32.973.233-018Я7
•二К 681.324.06(075)
Информация, содержащаяся в данной книге, получена из исто ■> —са 二■ ,— j——»■< «шзаг* -w-эс** «а< надежные. Тем не менее, имея в виду возможные человеческие или техничеао* эы*5ш ^^w№?* — «к»»~ ■юа-гровать абсолютную точность и полноту приводимых сведений и не несет отйетстве**сг> за ■‘‘■■■ui- ашме»* :жп»~>^е : *:гользоеанием книги.
〔SBN 5-314-00194-2〔SBN 5-314-00194-2U А^ 工кь»^ дом «Питер», 2003
〔SBN 5-314-00194-2
〔SBN 5-314-00194-2
Краткое содержание
Введение10
Занятие 1. Основные понятия и определения12
Занятие 2. Проектирование баз данных24
Занятие 3. Средства Delphi 7 длядоступа к данным34
Занятие 4. Средства для работы с базами данных51
Занятие 5. Палитра компонентови работа с базами данных76
Занятие 6. Модификация данныхи связанные таблицы105
Занятие 7. Отчеты в Delphi 7Ill
Занятие 8. Создание простых баз данных143
Занятие 9. Построение клиент-серверных баз данных158
Занятие 10. Сервер InterBase168
Занятие И. Основы языка SQL178
Занятие 12. Технология ADO193
Приложение. Коды ошибок Borland Database Engine205
Литература219
Содержание
Введение 10
Кому адресована эта книга 10
Соглашения, принятые в книге 10
Благодарности И
От издательства И
Занятие 1. Основные понятия и определения 12
Что такое база данных 12
Типы баз данных 13
Взаимосвязи данных 13
Основные типы баз данных 13
Форматы таблиц баз данных 16
Локальные и клиент-серверные приложения - .-19
Что нового мы узнали? 23
Занятие 2. Проектирование баз данных..........24
Ключи и индексы 24
Взаимосвязи данных 26
Нормализация модели базы данных 28
Автоматизация разработки приложени!!…… 32
Что нового мы узпалн? 33
Занятие 3. Средства Delphi 7 для доступа к даммым34
Новые возможности Delphi 7 по работе с /;:. •:、 二34
Наборы данных 36
Общие свойства компонентов Table и Qu,~37
Состояния наборов данных 39
Режимы наборов данных 40
Работа с полями наборов данных 41
Набор данных Table .д 45
Набор данных Query 47
Источник данных48
Что нового мы узнали?50
Занятие 4. Средства для работы с базами данных51
Borland Database Engine, архитектура BDE51
Настройка BDE54
Программа BDE Administrator54
Параметры драйверов и конфигураций57
Программа Database Desktop65
Работа с псевдонимами баз данных69
Работа с псевдонимами в BDE Administrator69
Работа с псевдонимами в Database Desktop71
Программа Data Pump71
Архитектура dbExpress74
Что нового мы узнали?75
Занятие 5. Палитра компонентов и работа с базами данных・“・・ 76
Компоненты для работы с локальными базами данных76
Операции с таблицами89
Сортировка набора данных92
Перемещение по набору данных93
Фильтры99
Поиск102
Что нового мы узнали?104
Занятие б« Модификация данных и связанные таблицы ......105
Редактирование, добавление и удаление данных105
Редактирование набора данных106
Добавление записей108
Удаление записей109
Работа со связанными таблицами110
Что нового мы узнали?110
Занятие 7. Отчеты в Delphi 7 ...Ill
Конструктор отчетор Rave ReportsИ1
Визуальный дизайнер Rave Reports112
Область навигации. Панели инструментов115
Область навигации. Панель компонентов116
Структура приложения» использующего Rave Reports119
Компоненты страницы отчета120
Компоненты управления отчетом126
Конструктор отчетов Quick Report137
Что нового мы узнали?142
Занятие 8. Создание простых баз данных........143
Ваша первая локальная база данных143
Что нового мы узнали?157
Занятие 9. Построение клиент-серверных баз данных...158
Основы технолопш * клиент-сервер» 158
Использование хранимых процедур 160
Язык хранимых процедур и триггеров 161
Использование триггеров 163
Генераторы 164
Работа с транзакциями 165
Что нового мы узнали? 167
Занятие 10. Сервер InterBase168
Что нового в InterBase 6.5 168
Организация данных 169
Настройка InterBase-сервера 170
Графический интерфейс программы IBConsole 171
Регистрация локального сервера InterBase 172
Соединение с базой данных из приложения 174
Что нового мы узнали?177
Занятие 11. Основы языка SQL 178
Основные сведения о языке SQL178
Функции языка SQL180
Операторы определения данных180
Операторы манипулирования данными182
Навигатор SQL Explorer185
Отладчик SQL Monitor188
Конструктор запросов SQL Builder190
Что нового мы узнали?192
Глава 12. Технология ADO 193
Обзор ADO193
Компоненты ADO в Delphi 7195
События в ADO200
Асинхронная работа с сервером201
Асинхронное соединение201
Асинхронное выполнение команды202
Асинхронная выборка данных202
Создание простейшего приложения» использующего ADO202
Что нового мы узнали?204
Приложение. Коды ошибок Borland Database Engine205
Литература 219
Введение
Среди разработчиков программных продуктов под Windows в России особой популярностью пользуется среда быстрой разработки приложений! Delphi. Эта популярность завоевана прежде всего ее простотой, легкостью в изучении н использовании. Среда Delphi позволяет разрабатывать как обычные приложения, так и приложения для работы с базами данных. Delphi предоставляет пр<зграммисту широкие возможности создания интерфейса пользователя, а также бссыпой набор стандартных компонентов, с помощью которых можно создавать приложения достаточно высокого уровня сложности.
Среда Delphi обладает практически всеми возможностями современных систем управления базами данных. Она имеет встроенную поли гжку языка структурированных запросов (SQL). С помощью Delphi можно разрабатывать как локальные, так и удаленные базы данных.
Все примеры данной книги были опробованы в версии Delphi 7 Enterprise.
Предполагается, что при изучении данной книги читатель будет иметь доступ к установленной на компьютер седьмой версии Delphi. Рекомендуется изучать книгу, одновременно отрабатывая все примеры на компьютере.
Кому адресована эта книга
Данная книга предназначена тем, кто знаком с основами объектно-ориентированного программирования. Надеюсь, что читатель знаком с работой в Delphi и уже имеет опыт написания простых программ в этой среде.
Книга написана таким образом, чтобы читателю не пришлось пользоваться дополнительной литературой. Однако многие вопросы остались вне рассмотрения, поэтому в книге приведен список рекомендуемой литературы, из которой можно почерпнуть вспомогательные сведения, если они потребуются.
Большая просьба к читателям сообщить свое мнение о книге автору. Я буду благодарен за информацию обо всех ошибках, которые, возможно, имеются в данном издании. Просьба писать на следующий электронный адрес: ponamarev@maU.ru.
Соглашения, принятые в книге
В книге были использованы следующие типографские соглашения:
листинги, идентификаторы, имена функций, классов, переменных, команд выделены моноширинным шрифтом;
курсивом выделены новые термины, которые впервые встречаются в тексте книги, а также ключевые понятия;
специальным шрифтом выделены имена элементов интерфейса: окон, пунктов меню, вкладок и т. д.;
важные моменты, на которые стоит обратить внимание, оформлены как примечания й советы.
Благодарности
Выражаю благодарность всем, без чьего содействия данная книга не была бы написана.
Благодарю весь коллектив издательства «Питер» за поддержку и понимание.
От издательства
Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства http://www.piter.com вы найдете подробную информацию о наших книгах.
Занятие 1
Основные понятия и определения
Что такое база данных
Типы баз данных
Форматы таблиц баз данных
Локальные и клиент-серверные приложения баз данных
В материалах этой главы вы найдете сведения, пеобмил мьл').;ькдому начинающему программисту, который хочет научиться создавать нри/к-женпя для работы с базами данных. Вы узнаете, что такое базы данных, из чс! з ”мн обычно состоят, для чего используются. Кроме того, в материале этою зз1ипи>1 рассказывается об основных типах баз данных, рассматриваются раз/шчпя и \ i .и'нпя применения тех или иных типов баз данных.
Что такое база данных
Множество фирм н компаний всего мира используют компьк)те])ы для хранения и обработки служебной информации. Эта ип(|к)рмацпя содержится в так называемых базах данных.
База данных — это хранилище для больнкно количества систематизированных данных, с которыми можно производить определенные действия (добавление, удаление, изменение, копирование, упорядочивание и т. 〃.).
Все данные, находящиеся в базе данных, можно представить в виде записей или объектов.
Для успешной работы с базами данных нужны программные средства, которые обеспечивали бы доступ к нужной информации, внесение каких-либо изменении в базу данных и другие действия с данными. Для решения этой задачи используются системы управления базами данных.
Системауправления базами данных fСУБД) — это совокупность языковых и программных средств, обеспечивающих создание, использование и ведение базы данных.
Все СУБД делятся на две группы:
локальные;
сетевые.
Локальные — это СУБД, работающие на одном компьютере.
К ним относятся dBase, FoxPro, Microsoft Access и т. д.
Сетевые — это СУБД, позволяющие нескольким компьютерам использовать одну и ту же базу данных с помощью технологии клиент-сервер.
Примерами сетевых СУБД являются InterBase» Oracle, Microsoft SQL Server и т. д. О локальных и сетевых СУБД подробнее будет рассказано ниже.
Типы баз данных
Прежде чем рассматривать основные типы баз данных, нужно отметить, что все данные, помещенные в базу данных, каким-либо образом связаны между собой.
Взаимосвязи данных
Взаимосвязи данных могут быть одного из четырех типов:
один к одному;
ОДИН КО МН0П1М;
много к одному;
много ко многим.
Давайте рассмотрим принципы построения таких взаимосвязей.
Вид взаимосвязи один к одному подразумевает, что каждая запись одного объекта базы данных будет указывать на единственную запись другого объекта. Например, с одним клиентом может быть связан только один заказ.
Взаимосвязь один ко многим означает, что одной записи объекта базы данных будет соответствовать несколько записей других объектов. Например, один клиент может иметь несколько квартир. Тогда с записью клиента будут связаны записи о его квартирах.
Вид взаимосвязи много к одному равносилен рассмотренному выше виду «один ко многим» и отличается от него только направлением.
Последний вид взаимосвязи много ко многим устанавливается между двумя типами объектов базы данных. Например, когда у одного банкира может быть несколько клиентов и, одновременно, один клиент может пользоваться услугами несколь- кихбанков.
Основные типы баз данных
По принципу хранения данных все базы данных разделяются на несколько основных типов:
иерархические;
сетевые;
реляционные.
Иерархические базы данных
Иерархические базы данных применялись в начале 60-х годов. Они построены в виде обычного дерева. Данные здесь делятся на две категории: главные и подчи- ценные. Таким образом, один тип объекта является главным^ а остальные, находящиеся на более низких ступенях иерархии, — подчиненными (рис. 1.1).
Наивысший в иерархии объект называется корневым, остальные объекты носят название зависимых объектов.
База данных, организованная по иерархическому принципу, удобна для работы с информацией, которая соответствующим образом упорядочена. В остальных случаях работа с такой моделью будет достаточно сложной.
Сетевые базы данных
Сетевые базы данных начали применяться практически одновременно с иерархическими. В этих базах данных любой объект может быть как главным, так и подчиненным (рис. 1.2).
Рис. 1.2. Схема базы данных сетевого типа
Таким образом, в сетевой модели базы данных каждый объект может иметь сколько угодно связей с другими объектами. Из-за сложности представления данных в таком виде от сетевой модели базы данных в большинстве случаев также пришлось отказаться.
Реляционные базы данных
Именно реляционные базы данных (от англ, relation — отношение) стали широко использоваться в программировании начиная с 70-х годов. В таких базах данных объекты и взаимосвязи между ними представляются в виде прямоугольных таблиц, состоящих из строк и столбцов (рис. 1.3).
Каждая таблица здесь представляет собой объект базы данных. Такую базу данных легче всего можно реализовать на компьютере. В дальнейшем мы будем рассматривать именно реляиноннме базы данных.
Итак, таблицы, которые составляют базу данных, находятся на магнитном диске в отдельной папке. Папка в целом является базой данных, а входящие в нее таблицы хранятся в виде отдельных файлов. С этими файлами можно производить произвольные операции» которые допускаются операционной системой.
Большинство приложений Windows при попытке обращения к одному файлу сразу несколькими приложениями выдают сообщение об ошибке совместного доступа. Для таблиц базы данных такое ограничение крайне неудобно, поэтому им свойственна особенность» которая заключается в том, что несколько приложений могут получить доступ к файлу таблицы одновременно. Такой режим доступа назы вается многопользовательским.
Если внимательно посмотреть на файлы таблиц базы данных, то можно заметить, что для одной таблицы обычно создается несколько файлов. Это 巾айлы, которые содержат дополнительную информацию, относящуюся к таблице. Объединяет эти фа访刀н одинаковое имя, но при этом они имеют разные расширения. Имя файлов таблицы определяет имя самой таблицы.
Рассмотрим теперь, из чего состоят таблицы базы данных. Как уже упоминалось, в каждой из них структурно выделяются строки и столбцы (рис. 1.4).
Столбцы таблнцы обычно называют полями, а строки — записями. К полям таблицы пре/гьяаляются следующие требования:
поле должно иметь уникальное имя в пределах одной таблицы;
поле должно содержать данные то刀ько одного заранее определенного типа;
любая таблица должна иметь как минимум одно поле.
С таблниамн реляционной базы данных можно выполнять следующие действия:
создавать таблицу н刀и определять ее структуру;
изменять структуру таблицы;
изменять имя таблн口ь】;
удалять таблицу с диска.
ВНИМАНИЕ
При переименовании таблицы помните, что имя таблицы можно изменить только с помощью специальных программ, например Database Desktop. Простое изменение имени файла таблицы с помощью проводника Windows не приведет к переименованию таблицы.
Форматы таблиц баз данных
Давайте рассмотрим несколько форматов таблиц баз данных, по.хдсрживаемых средой Delphi.
Следует заметить, что Delphi не имеет своего собственного «|х>рмата таблиц, но содержит средства, позволяющие работать со многими внешними форматами. К числу серверных таблиц баз данных, поддерживаемых Delphi, относятся: ■ DB2;
Informix;
InterBase;•
Microsoft SQL Server;
Oracle;
Sybase.
В число локальных таблиц баз данных, поддерживаемых средой Delphi, входят:
Microsoft Access;
dBase;
FoxPro;
Paradox.
Наиболее часто используемыми нзлокальньпс баз данных являются dBase и Paradox.
каждой из них есть свои особенности, которые мы и рассмотрим.
Базы данных dBase были первыми базами данных для персональных компьютеров. Они поддерживаются большинством сред программирования для разработки приложений баз данных. Таблицы, входящие в состав базы данных dBase, являются простыми и используют мало файлов. В таблице 1.1 перечислены основные расширения файлов таблиц dBase н их назначение.
Таблица 1.1. Файлы таблиц dBase
Расширение файла
Содержание файла
*.dbf
Непосредственно данные таблицы
*.dbt
Большие двоичные данные (BLOB, Binary Large Object). В их число входят двоичные данные, memo-поля и OLE-поля
*.mdx
Индексы, которые поддерживаются средствами dBase
♦.ndx
Не поддерживаемые индексы. Такие индексы должны обрабатываться программно
Поля в таблице базы данных dBase должны удовлетворять следующим условиям:
имя поля может состоять из букв и цифр, но начинаться — с буквы;
не допускается включение в имя поля специальных символов и пробелов;
максимальное количество символов в имени поля — 10.
В таблице 1.2 перечислены основные типы полей таблиц dBase, указаны их обозначения в программе Database Desktop и приведено описание.
Таблица 1.2. Основные типы полей таблиц dBase
Тип поля
Обозначение в Database Desktop
Описание
Binary
В
Двоичные значения 8 виде последовательности байтов, хранящейся в файле с расширением *.dbt. Длина не ограничена
Character
c
Символьная строка. Длина ограничена 255 символами
Date
D
Значение даты
Float
F
Число с плавающей запятой в диапазоне от -10308 до 10308. Точность представления — 15 знаков после десятичной точки
Logical
L
Булевская (логическая) переменная. Может принимать одно из двух значений: true (истина) или false (ложь)
Memo
M
Неограниченная последовательность символов, хранящихся в файле с расширением *.dbt
Number
N
Двоично-десятичный формат представления чисел
OLE
0
Данные, поддерживаемые технологией связывания и внедрения объектов OLE (Object Unking and Embedding)
Преимуществом баз данных dBase является поддержка их многими средами программирования. К недостаткам относятся отсутствие контроля целостности связей и отсутствие защиты данных.
Рассмотрим теперь базы данных Paradox. Они являются более развитыми по сравнению с dBase. Таблицы Paradox содержат достаточно большое число типов полей, поддерживают целостность ссылок, автоматически проверяют вводимые данные на совместимость по типу и поддерживают парольную защиту данных.
Основные расширения таблиц базы данных Paradox перечислены в табл. 1.3.
Таблица 1.3. Файлы таблиц Paradox
Расширение файла
Содержание файла
*.db
*.mb
*.рх
♦,xg* и *.yg*
*.val
*.tv и *.fam
*.net
Данные таблицы
Большие двоичные данные (BLOB, Binary Large Object)
Ключ (главный индекс)
Индексы
Параметры для проверки типов вводимых данных и целостности ссылок
Форматы вывода таблицы в приложении Database Desktop
Применяется для контроля доступа к таблице по сети
Поля в таблице Paradox должны удовлетворять следующим требованиям:
имя поля может состоять из букв (включая символы кириллицы) и цифр, но начинаться должно обязательно с буквы;
в имени поля допускается использовать символы пробела. -. $ н другие специальные символы;
не рекомендуется (хотя и не запрещается) использовать в имени поля символы точки, восклицательного знака и |,так как они зарезервированы средой Delphi;
максимальная длина имени поля составляет 25 символов:
ключевые поля таблицы должны быть первыми в ее структуре.
СОВЕТ
Если вы хотите обеспечить совместимость данных таблицы Paradox с таблицами других форматов (например, dBase), именуйте поля со следующими ограничениями: длина имени поля не должна быть более 10 символов, имя должно состоять только из латинских букв и цифр.
Таблица 1.4 содержит список полей, которые поддерживаются базой данных Paradox, а также их краткое описание.
Таблица 1.4. Основные типы полей таблиц Paradox
Тип поля
Обозначение в Database Desktop
Описание
Alpha
A
Символьная строка, ограниченная 255 символами
Autoincrement
+
Поле, автоматически увеличивающее значение новой запив. Обычно используется для ключевого поля
BCD
#
Двоично-десятичная форма представления числа
Binary
В
Двоичное значение в виде последовательности байтов. Длина не ограничена. Первые 240 байтов хранятся в файле таблицы, остальные — в файле с расширением *.mb
Bytes
Y
Последовательность байтов длиной до 255
Date
D
Значение даты. Значения от 01.01.9999 до н. э. до 31.12.9999
Formatted Memo
F
Неограниченная последовательность форматированных символов
Тип поля
Обозначение в Database Desktop
Описание
Graphic
G
Графическое изображение в одном из форматов: ♦.bmp, *.eps, *.gl£ *.рсх, *.t№ После загрузки в поле таблицы изображение преобразуется в формат *.bmp. Значение поля данного типа хранится 8 файле с расширением *.mb
Logical
L
Булево значение: true или false
Longlnteger
I
Целочисленное поле. Диапазон возможных значений от -2 147 483 648 до 2 147 483 647
Memo
M
Неограниченная последовательность символов. Первые 240 символов хранятся в файле таблицы, остальные — в файле с расширением *.mb
Money
$
Хранит денежные величины. Отличается от типа Number тем, что отображает денежный знак. Символ знака зависит от настроек операционной системы
Number
N
Число с плавающей запятой. Может принимать значения от -10307 до 10308. Точность —15 знаков после запятой
OLE
0
Хранит данные, поддерживаемые технологией OLE.
Значения содержатся 8 файле с расширением *.mb
Short
S
Целое число. Может принимать значения от -32 768 до 32 767
Time
T
Содержит значения времени
TimeStamp
@
Содержит значения даты и времени
Локальные и клиент-серверные приложения баз данных
Приложение, созданное с помощью Delphi, осуществляет доступ к базе данных через специальный процессор баз данных, который называется BDE (Borland Database Engine).
5DE — это набор драйверов и динамически присоединяемых библиотек (файлов *.dll), которые обеспечивают доступ к данным.
Если вы используете в своих приложениях BDE, то нужно обеспечить его установку на все компьютеры, на которых будут работать ваши приложения.
Процессор баз данных BDE позволяет наиболее эффективно работать с таблицами баз данных типа dBase и Paradox.
Все базы данных можно условно разделить на две большие группы в зависимости от взаимного расположения приложения и таблиц базы данных:
локальные;
клиент-серверные.
Локальные — это базы данных, таблицы которых расположены на том же компьютере, что и работающие с ними приложения. В таком случае говорят, что база данных имеет локальную архитектуру (рис. 1.5).
Компьютер
Рис. 1.5. Локальная архитектура базы данных
Приложения, которые работают с локальными базами данных, называются одноярусными (single-tiered applications), так как и приложение и база данных расположены на одном и том же компьютере (ярусе).
Кроме представлен ной выше организации локальной базы данных возможно осуществление многопользовательского доступа к данным таблиц. Такой вариант предусматривает наличие сети компьютеров с сервером. Данный способ организации базы данных называется файл-сервером (рис. 1.6).
Рис 1.6. Файл-сереерная архитектура базы данных
Как вы можете видеть, на каждом иэ компьютеров-клиентов сети создается локальная копия базы данных сервера. Эта копия периодически обновляется.
Такая архитектура построения базы данных используется в сетях с малым количеством пользователей. Разработка приложения для работы с таким типом базы данных практически не отличается от создания обычного приложения для локальной базы данных.
К числу недостатков данной архитектуры можно отнести:
создание копий базы данных и работа с ними на отдельных компьютерах обусловливает необходимость периодического обновления всей базы данных. Это повышает сетевой трафик (нагрузку сети) и ведет к снижению быстродействия всей системы;
при изменении данных, сделанном одним пользователем, они не сразу передаются в локальные копии базы данных других пользователей, поэтому любой пользователь может видеть уже устаревшую информацию;
необходима синхронизация работы пользователей. Она должна заключаться во временном блокировании записей, с которыми работает пользователь, для других пользователей. Таким образом, оказывается невозможным одновременный доступ к одной и той же записи с нескольких компьютеров;
существуют трудности организации контроля доступа к данным» идентификации пользователя и поддержки целостности данных.
От всех этих сложностей избавлены клиент-серверные базы данных.
Клцент-серверные базы данных (удаленные базы данных) — это базы данных, в которых таблицы расположены на сервере сети, а приложения для работы с этими таблицами находятся на пользовательских компьютерах (клиентах), подключенных к серверу. В данном случае говорят, что база данных имеет архитектуру «клиент-сервер».
Клиент-серверные базы данных работают с помощью запросов на языке SQL (Structured Query Language). SQL-запросы применяются для любых операций с таблицами базы данных, расположенной на сервере.
В Ю7иент-серверных приложениях баз данных вся информационная система делится на две разнородные части:
клиент базы данных;
сервер базы данных.
Клиент базы данных — это приложение пользователя, которое обеспечивает формирование и передачу запросов серверу, а также отображение полученных результатов. Кроме того, приложение-оиеит должно обеспечивать интерфейс пользователя базы данных.
Сервер базы данных — специальная программа, которая управляет удаленной базой данных и обеспечивает выполнение запросов клиентов и выдачу результатов запросов.
Приложения, работающие с клиент-серверными базами данных, называются двухъярусными (рис. 1.7) или многоярусными (рис. 1.8) приложениями (two-tiered и multi-tiered applications).
Компьютер 1
Компьютер п
валенный сервер
Рис. 1.7. Двухъярусная архитектура «клиент-сервер»
При использовании двухъярусной архитектуры любой клиент посылает серверу SQL-запрос на предоставление данных из таблиц. Сервер обрабатывает этот запрос и возвращает клиенту только те данные, которые были определены запросом. Очевидны следующие преимущества такой архитектуры:
передача только востребованной информации, а не всей базы данных, что приводит к снижению трафика сети;
обеспечение безопасности данных и возможности установки прав доступа к информации для отдельных групп пользователей, связанные с тем, что работа с данными осуществляется одной программой — сервером базы данных;
упрощение клиентских приложений за счет сокращения кода, необходимого для обработки данных и обеспечения доступа к ним.
Несмотря на указанные достоинства, следует заметить, что обслуживание сервера и самой базы данных требует наличия в организации соответствующего специалиста. Такого специалиста называют администратором базы данных. В круг его обязанностей обычно входит обеспечение механизма защиты данных, поддержание их целостности, резервное копирование и восстановление данных и многое другое. Для того чтобы еще больше упростить приложения клиентов базы данных, была разработана многоярусная архитектура базы данных, пример которой (трехъярусная архитектура) приведен на рис. 18
Рис 1.8. Трехъярусная архитектура «клиент-сервер»
В многоярусной архитектуре часть кода приложений клиентов перенесена в сервер приложений.
Сервер приложений — это программа, которая содержит средства доступа к данным и программный код, являющиеся наиболее общими для всех приложений- клиентов базы данных.
Преимущество данной архитектуры заключается в упрощении программ-клиентов и уменьшении их кода.
Выбор типа базы данных зависит от многих факторов, не последним из которых является наличие сети иэ нескольких компьютеров. Выбирая тип создаваемой базы данных, ответьте на следующие вопросы:
■ сколько человек будут использовать таблицы базы данных? Клиент-серверные базы данных разработаны для одновременного доступа к ним нескольких пользователей. Локальные базы данных обычно работают с одним пользователем;
■ какое количество данных будет содержаться в таблицах базы данных? Клиент- серверные базы данных могут содержать намного больше данных, чем локальн ые базы данных;
какая скорость доступа к данным вас устроит? Локальные базы данных обеспечивают более быстрый доступ к данным по сравнению с клиент-серверными;
■ как вы планируете администрировать базу данных? Локальные базы данных менее требовательны к настройке и администрированию.
Что нового мы узнали?
На этом занятии мы выяснили, что такое:
база данных;
основные типы баз данных;
архитектуры баз данных.
Занятие 2
Проектирование баз данных
Ключи и индексы
Взаимосвязи данных
Нормализация модели базы данных
Автоматизация разработки приложений
Это занятие посвящено внутренней структуре реляционных баз данных. Вы узнаете о взаимосвязях между таблицами реляционной базы данных. Мы рассмотрим понятия ключа и индекса. В конце занятия мы расскажем о нормализации построенной модели базы данных.
Ключи и индексы
Поля таблицы могут определять так называемые ключи н индексы.
Ключ — это комбинация нескольких полей, данные в которых однозначно определяют запись Таблицы.
Ключи бывают простыми и сложными (составными). Простой ключ — это ключ, состоящий из одного поля. Сложный или составной ключ включает в себя данные нескольких полей. Данные простого ключа должны быть уникальными. Составной ключ может иметь повторы в отдельных полях, но не во всех одновременно. Соответственно поля, Но которым строится ключ, называются ключевыми полями. В каждой таблице может быть только один ключ.
Ключ иногда называют первичным ключом или главным индексом.
Для чего же служит ключ? Прежде всего, для обеспечения однозначного определения записей таблицы. Кроме того, ключ предназначен для более быстрого выполнения запросов к базе данных. По ключевым полям организуется связь между таблицами базы данных. У ключа есть еще много других функций, они будут объясняться по мере изложения материала книги.
Сведения о ключе таблицы могут храниться как вместе с данными таблицы, так и в отдельном файле. Этот файл имеет такое же имя, что и файл таблицы, но другое расширение. Например, в базе данных Microsoft Access информация о ключе содержится вместе с данными в одном файле, который имеет расширение .MDB. A Paradox выделяет для информации о ключе отдельный файл с расширением .РХ. Ключевой файл содержит значения ключа, которые располагаются в определенном порядке. Для каждого из значений ключа имеется уникальная ссылка, которая указывает местоположение соответствующей записи в файле таблицы. Таким образом, во время поиска в таблице будет выполнен прямой доступ к необходимой записи на основании упорядоченных значений ключа, а не последовательный перебор записей таблицы. Тем самым значительно увеличивается скорость доступа к искомой информации, хотя в результате размер базы может сильно вырасти (возможно, даже в два раза) за счет хранения дополнительной ключевой информации. Ключевые поля вам придется определять самостоятельно, поэтому следуйте представленным ниже правилам, которые помогут достаточно эффективно выбрать эти поля: ■ ключ не должен содержать поля, которые можно удалить, не нарушив при этом уникальности ключа;
ключевым полем не может быть поле, содержащее графику, или поле типа memo, включающее в себя комментарии;
нежелательно выбирать в качестве ключевого поля поле, содержащее фамилии людей, так как существует большая вероятность включения в ^зу данных однофамильцев и при этом будет нарушена уникальность ключа;
если вы используете поле, по которому производится нумерация записей (на・ пример, автоинкрементное поле), то имеет смысл сделать его ключевым, поскольку номер записи будет уникальным;
старайтесь задавать ключевые поля в каждой таблице базы данных, даже если их присутствие на первый взгляд не является необходимым.
Индекс — это комбинация нескольких полей, которые служат для быстрого доступа к необходимой информации.
Основным отличием индекса от ключа является то, что поля индекса могут определять не одну, а несколько записей. Таким образом, индекс не всегда однозначно определяет запись в таблице базы данных.
Индексы так же, как и ключи, могут быть простыми и составными. Простой индекс состоит из одного поля, а составной — из нескольких полей.
Поля, по которым строится индекс, называют индексными полями. Процесс создания индекса называется индексированием таблицы.
В зависимости от используемого типа базы данных, индексы могут храниться как вместе с данными, так в отдельных файлах.
Индекс используется для увеличения скорости доступа к данным, для быстрой сортировки данных таблицы, а также для поддержки других функций» которые будут рассмотрены далее.
В отличие от ключа, который является уникальным в каждой таблице, индексов в ней может быть несколько. Это в первую очередь необходимо для быстрой
сортировки по нужному полю или полям. Если эти поля проиндексированы, то сортировка по ним будет выполнена значительно быстрее, чем по обычным полям. В любой момент времени можно активировать любой из индексов таблицы. Именно по активному (текущему) индексу обычно будет выполняться сортировка записей таблицы. Следует, однако, заметить, что, несмотря на наличие нескольких индексов, таблица может не иметь текущего индекса.
Вообще говоря, поведение индексов и ключей зависит от типа используемой базы данных. Так, например, в таблицах Paradox ключ автоматически является главным индексом, который не имеет имени. В то же время в таблицах dBase ключ в принципе не создается, вместо него используется один из индексов. Но в общем случае ключевые поля обычно автоматически индексируются.
ВНИМАНИЕ
Процесс создания ключа в ряде случаев может привести к неожиданным результатам. Например, при создании ключа в таблице базы данных Paradox будут автоматически отсортированы записи по значениям ключа.
Взаимосвязи данных
На первом занятии мы уже кратко перечислили возможные взаимосвязи между данными внутри одной базы данных. Теперь рассмотрим особенности этих взаимосвязей для реляционных баз данных.
Реляционная база данных может состоять из одной или нескольких таблиц. В ситуации, когда в базе данных имеется всего одна таблица, организация данных довольно проста и никаких связей нет. Но в большинстве случаев база данных содержит в себе несколько таблиц» которые связаны между собой тем или иным способом. Процесс организации связей между таблицами называется связыванием таблиц.
ПРИМЕЧАНИЕ
В других литературных источниках встречается понятие соединения таблиц, которое является тем же самым связыванием. Также в других источниках вместо термина связь используется термин отношение.
Связи между таблицами могут устанавливаться как в процессе проектирования базы данных, так и в процессе выполнения приложения. В реляционной базе данных могут присутствовать как связанные, так и отдельные таблицы.
Для того чтобы связать две или несколько таблиц базы данных, предусмотрены так называемые поля связи.
ПРИМЕЧАНИЕ :
Вместо понятия поля связи в некоторых источниках упоминается термин совпадающие паля.
Нужно заметить, что, независимо от используемого типа базы данных, поля связи обязательно должны быть индексированными.
При связывании таблиц используются понятия главной таблицы и подчиненной таблицы.
Главная таблица (родительская таблица или master) — это таблица, в которой содержатся основные данные.
Подчиненная таблица (дочерняя таблица или detail) — таблица, значения в полях которой зависят от значений главной таблицы.
Главная таблица может иметь несколько подчиненных таблиц.
Таким образом, при перемещении по записям главной таблицы будет автоматически производиться перемещение по записям подчиненной таблицы.
В каждой подчиненной таблице для организации связи с главной таблицей берется индекс, состав полей которого должен частично или полностью совпадать с составом полей главной таблицы.
Само название связи между таблицами реляционной базы данных формируют по типу таблиц: главный—подчиненный, родительский—дочерний или master—detail. Как было уже сказано на первом занятии, существует четыре вида связи между таблицами:
один к одному;
один ко многим;
много к одному;
много ко многим.
Вид связи один к одному означает, что каждой записи в главной таблице соответствует одна запись в подчиненной таблице. При этом не исключается случай, когда некоторым записям главной таблицы может не найтись соответствующих записей в подчиненной таблице. Этот вид связи используется обычно для упрощения структуры одной таблицы с большим количеством полей путем разбиения ее на несколько таблиц. При этом в главной таблице остаются поля с наиболее важной ин(|юрмацией, а остальные поля распределяются между подчиненными таблицами. Вид связи один ко многим означает, что одной записи главной таблицы может ставиться в соответствие несколько записей в подчиненной таблице. При этом не исключается случай, когда записи главной таблицы не будет поставлено в соответствие ни одной записи в подчиненной таблице. Этот вид связи применяется в базах данных наиболее часто. При перемещении по записям в главной таблице будут автоматически становиться доступными записи в подчиненной таблице, у которых значение поля связи равно значению поля связи текущей записи главной таблицы.
В качестве примера организации такого вида связи можно привести базу данных, состоящую из двух таблиц, которая содержит данные о покупателях и товаре. В первой, главной таблице хранятся сведения о покупателях (фамилия, имя, отчество» наименование организации и т. п.), во второй — сведения о приобретенном данным покупателем товаре. Один покупатель может приобрести один или несколько товаров.
Вид связи много к одному является аналогом вида один ко многим, но отличается направлением, то есть одной записи в подчиненной таблице может соответствовать несколько записей главной таблицы.
Последний вид связи много ко многим означает, что одной записи главной таблицы могут быть сопоставлены несколько записей подчиненной таблицы и, наоборот,
одной записи подчиненной таблицы может соответствовать несколько записей главной таблицы.
Ярким примером организации такого вида связи является база данных типа «Расписание», под разуме в аю щая, что в одной учебной аудитории может заниматься несколько групп и наоборот, одна группа может заниматься в нескольких аудиториях. Таким образом, данные об аудиториях могут находит1>ся н одной таблице, а о группах — в другой. При этом трудно утверждать, что одна из таблиц является главной, а вторая — подчиненной.
Данный вид связи является наиболее сложным, поэтому он применяется очень редко. Заметим, что при работе со связанными таблицами нужно выполнять некоторые дополнительные действия. Так, при удалении записи главно" таблицы необходимо удалять все соответствующие ей записи из подчиненных таб. ит. Такое удаление называется каскадным. При добавлении записи в подчииснную таблицу обязательно нужно устанавливать значение поля связи этой записи равным значению соответствующего поля связи записи из главной таблицы. Изменения значений поля связи главной таблицы нужно производить только вместе с спшнегствующим изменением значений поля связи в подчиненных таблицах. Ес.ш .что не будет сделано, может нарушиться соответствие между записями гланиои и подчппенныхтаблиц.
Нормализация модели базы данных
/{ля построения эффективной структуры базы данных нужно на всех этапах проектирования ориентироваться на то, чтобы создаваемая структура обеспечивала: ■ достаточно быстрый доступ к данным;
отсутствие повторяющихся записей;
целостность данных.
Кроме того, в процессе разработки структуры базы данных может возникнуть так называемая избыточность информации.
Избыточность информации — это повторение (дублирование) данных, содержащихся в базе данных.
Тем не менее повторение одних и тех же данных может присутствовать в базе данных и не вести к избыточности данных, В этом случае говорят о простом или неизбыточном повторении данных. Такое повторение данных может иметь место, например, при указании города проживания сотрудника организации. Пример простого повторения данных приведен в табл. 2.1.
Таблица 2.1. Простое повторение данных
ФИО сотрудникаГород проживания сотрудника
Иванов Иван ИвановичАбакан
Петров Петр ПетровичАбакан
Сидоров Иван ПетровичЧерногорск
Михайлов Василий Борисович ■Минусинск
Семенов Иван ДаниловичАбакан
Васильев Сер「еМ АнатольевичАбакан
Из приведенной выше таблицы видно, что четыре сотрудника проживают в одном и том же городе. Для каждого из этих сотрудников город проживания является уникальным.
Избыточность данных может приводить к различным аномалиям:
аномалии удаления;
аномалии обновления;
аномалии ввода.
Аномалии удаления возникают тогда, когда удаляется какая-либо из записей, содержащая дублированные данные. В этом случае будет потеряна сопутствующая информация. Например, при удалении любой из записей из табл. 2.1 пропадет информация о ФИО сотрудника.
Аномалии обновления имеют место, если значение поля одной записи изменяется, а аналогичные значения того же поля для всей таблицы остаются без изменения.
Аномалии ввода можно встретить, когда во время ввода новых записей в таблицу для ее полей заданы недопустимые значения либо не задано значение поля, которое обязательно должно заполняться.-
В таблице 2.2 приведен пример избыточного повторения данных.
Таблица 2.2. Избыточное повторение данных
ФИО сотрудника
Город проживания
Почтовый индекс
Иванов Иван Иванович
Абакан
662600
Петров Петр Петрович
Абакан
Null
Сидордв Иван Петрович
Черногорск
655150
Михайлов Василий Борисович
Минусинск
600000
Семенов Иван Данилович
Абакан
Null
Васильев Сергей Анатольевич
Абакан
Null
В этой таблице появилась новая колонка (поле), в которой хранятся почтовые индексы мест проживания сотрудников. Как вы можете видеть, почтовый индекс города Абакан имеется только в первой записи, а для всех остальных введено нулевое значение Null. В этом случае при работе с таблицей возникает несколько очевидных проблем:
для отображения индекса места проживания сотрудника потребуется искать его в другой записи таблицы по названию города;
объем базы данных будет достаточно большим, так как для хранения нулевых значений потребуется столько же памяти, сколько и для обычных значений;
если будет удалена первая запись, содержащая значение индекса для города Абакан, то мы автоматически лишимся информации об индексе для всех сотрудников, проживающих в Абакане.
А что, если вместо нулевых значений поставить значение индекса во всех записях? Этим самым мы решим лишь третью проблему, связанную с удалением записи, но избыточность информации останется.
В таблице с избыточными данными содержится мнЪго повторяющихся данных в различных записях. Для избавления от избыточности можно разбить одну большую
таблицу на несколько маленьких. Например, данные из табл. 2.2 можно просто разместить в двух таблицах меньшего размера (табл. 2.3 и 2.4). Первая будет содержать данные о сотруднике и городе его проживания, а вторая — об индексах всех мест проживания сотрудников фирмы.
Таблица 2.3. Данные о сотрудниках
ФИО сотрудиика
Город проживания сотрудника
Иванов Иван Иванович
Абакан
Петров Петр Петрович
Абакан
Сидоров Иван Петрович
Черногорск
Михайлов Вао<лий Борисович
Минусинск
Семенов Иван Данилович
Абакан
Васильев Сергей Анатольевич
Абакан
Таблица 2.4. Список городов и их индексов
Город проживания сотрудника
Почтовый индекс города
Абакан
662620
Минусинск
600000
Черногорск
655150
В данном примере табл. 2.3 и 2.4 связаны между собой по полю города проживания сотрудника. Для того чтобы получить информацию о почтовом индексе, нужно сначала из первой таблицы извлечь название города, а затем по названию из второй таблицы получить почтовый индекс данного города. Естественно, это приведет к большим затратам времени для доступа к необходимой информации, но зато окупится значительным уменьшением объема памяти, необходимой для хранения данных. Тем более что в данном случае информация о почтовом индексе нужна не очень часто.
Таким образом, разбивая большую таблицу с избыточными данными на несколько более мелких таблиц, мы уменьшаем избыточность данных. Тем не менее это не значит, что избыточности данных в таких таблицах уже не будет. Хотя в нашем примере повторения данных все же остались (в табл. 2.3), это допустимое неизбыточное дублирование данных (см. табл. 2.1).
Пример с разбиением таблицы относится к ряду операций по приведению таблиц к так называемой нормальной форме. Этот процесс получил название нормализации базы данных.
Процесс нормализации базы данных предназначен для уменьшения избыточности информации в базе данных.
Существует несколько так называемых нормальных форм базы данных. Давайте рассмотрим их все в теории, а затем на практике попробуем привести сложную информационную систему последовательно к этим нормальным формам.
Итак» большинство литературных источников выделяют такую последовательность нормальных форм базы данных:
первая нормальная форма;
вторая нормальная форма;
третья нормальная форма;
усиленная третья нормальная форма (нормальная форма Бойса—Кодда);
четвертая нормальная форма;
пятая нормальная форма.
Каждая из нормальных форм получается последовательно из предыдущей нормальной формы. Кроме того, каждая последующая нормальная форма сохраняет свойства предыдущей нормальной формы и удаляет некоторые аномалии, присущие своей предшественнице.
Рассмотрим» что же представляют собой эти нормальные формы.
Условиям первой нормальной формы удовлетворяет таблица, в которой:
каждое поле содержит неделимую информацию;
отсутствуют повторяющиеся группы полей.
Таблица, соответствующая второй нормальной форме, должна отвечать следующим требованиям:
таблица должна быть приведена к первой нормальной форме;
любое поле таблицы, не являющееся ключевым, должно однозначно идентифицироваться ключевыми полями.
Третья нормальная форма предъявляет к таблице следующие требования:
таблица должна быть приведена ко второй нормальной форме;
каждое из неключевых полей таблицы должно однозначно идентифицироваться только значениями ключевых полей и не зависеть от любого другого неключевого поля.
Таким образом, третья нормальная форма исключает возможность идентификации значений неключевого поля таблицы значениями неключевых полей таблицы.
Мы не будем задерживаться на других (более сложных) нормальных формах, так как они практически не применяются на практике. По крайней мере, при создании даже достаточно сложных моделей данных автору не приходилось использовать нормальные формы выше третьей.
Рассмотрим теперь процесс нормализации базы данных на конкретном примере. Спроектируем базу данных для хранения информации о читателях библиотеки.
Итак, нам необходимо первоначальное распределение данных по полям таблицы. Сделаем предварительный набросок полей (табл. 2.5).
Таблица 2・5・ Структур3 ненормализованно" таблицы
КнигаКнигаЧитатель
Книга
Книга
Мы спроектировали три поля. Поле «читатель» содержит информацию о читателе: ФИО, возраст, адрес, телефон, паспортные данные. В поле «дата» находится число, когда читатель взял книгу из библиотеки. Поле «книга» должно хранить полную информацию о книге: название, авторы, издательство, количество страниц.
Созданная нами таблица из трех полей имеет простую,沙《^^ 乃 UU 加500川&一 сматривать как базу данных, состоящую из одной таблицы. Однако эта таблица не соответствует требованиям, предъявляемым к нормальным формам. Попробуем привести ее к первой нормальной форме. 产 了
Первое и последнее поля таблицы не отвечают требованию о неделимости информации поля. Разобьем поле ^читатель» на пять полей: ФИО читателя, возраст, адрес, телефон и паспортные данные. Также выделим из поля «книга» четыре поля: название книги, авторы, издательство и количество страниц. В результате у нас получится таблица иного вида (табл. 2.6).
Таблица 2・6・ Таблица в первой Ермальной форме ФИО Возраст Адрес Телефон Паспорт Дата Книга Автор Издательство Страницы
Второму требованию первой нормальной формы табл. 2.6 удовлетворяет. Таким образом, мы преобразовали таблицу к первой нормальной форме.
Для того чтобы привести табл. 2.6 ко второй нормальной форме, нужно добавить в нее дополнительное ключевое поле. Назовем это поле <номер выданной книги». Каждая последующая выданная книга будет иметь свой уникальный номер.
Теперь осталось внести изменения, сводящие нашу таблицу к третьей нормальной форме. Для этого разобьем таблицу на две: таблицу читателей и таблицу книг. Затем свяжем эти таблицы по ключевому полю «номер выданной книги» (табл. 2.7 и 2.8).
Таблица 2・7・ Таблица читателей
Номер ФИОВозраст АдресТелефон Паспорт
Таблица 28 Таблица кни「
Номер Дата Книга Автор ИздательствоЧисло страниц
Автоматизация разработки приложений
Процесс проектирования структуры и нормализации базы данных может быть весьма трудоемким, так как иногда таблицы содержат hrcko.ilkc сотен полей, а база данных может включать сотни таких таблиц. Организовать правильную взаимосвязь данных в таких случаях вручную очень тяжело. Для облс1чсния этой задачи были разработаны специальные системы автоматизации разработки приложений (CASE, Computer Aided Software Engineering).
Системы CASE — это приложения, которые предназначены для проектирования информационных систем (анализ и формулирование требований, проектирование баз данных, тестирование, генерирование кода и многое другое).
Таким образом, среда Delphi также является средством CASE, поскольку она позволяет создавать приложения.
Мы не будем останавливаться на рассмотрении существующего множества средств CASE. Скажем лишь, что в состав Delphi включена программа Data Module Designer, которая позволяет проектировать базы дашпих с таблицами в формате Paradox. При этом структура базы данных и связи между таблицами представляются в графической форме.
Для работы с Data Module Designer нужно внбрать пункт главного меню Delphi File ► New ► Data Module (Файл ► Создать ► Модуль данных). При этом откроется окно редактора модулей данных (рис. 2.1), в который можно помещать стандартные компоненты для работы сданными. Об этих компонентах мы расскажем наследующем занятии.
Рис 2.1. Окно редактора модулей данных
Что нового мы узнали?
На этом занятии мы узнали:
что такое ключи и индексы и зачем они нужны;
каковы основные виды связей таблиц;
что такое три основные нормальные формы таблиц и способы нормализации;
что такое средства CASE.
2 Зак 956
Занятие 3
Средства Delphi 7 для доступа к данным
Новые возможности Delphi 7 по работе с базами данных
Наборы данных
Источник данных
На этом занятии мы рассмотрим наборы компонентов, которые присутствуют в библиотеке компонентов Delphi 7, предназначенных для работы с базами данных. Вы узнаете, что такое набор данных, iicwhiiiik данных и познакомитесь с другими понятиями, связанными с базами данных.
Начнем с рассмотрения новых возможностей Delphi 7. Если вы не являетесь новичком в Delphi, можете пропустить этот раздел и перейти к рассмотрению наборов данных.
Новые возможности Delphi 7 по работе с базами данных
Каждая из версий Delphi приносит какие-либо новшества в работу с базами данных. Так, в Delphi 5 ярким примером такой новации может являться поддержка технологии ADO. В Delphi 6 также были включены многие новые возможности, в том числе и для работы с базами данных. А именно:
в Delphi 6 добавлен принципиально новый механизм доступа к данным, называющийся dbExpress. Он обеспечивает исключительно быстрый и простой доступ к серверам баз данных;
наборы данных в Delphi встали поддерживать два новых типа полей: TFMTBCDField и TSQETimeStampField;
добавлено несколько новых компонентов для упрощения работы с клиентскими наборами данных, а также с двухъярусными и многоярусными приложениями баз данных.
Рассмотрим перечисленные выше особенности Delphi 6 более подробно.
dbExpress представляет собой совокупность небольших по размеру драйверов» которые обеспечивают быстрый доступ к серверам баз данных, поддерживающих язык SQL Список допустимых типов баз данных вы можете найти в табл. 3.1. Для каждой из баз данных dbExpress предоставляет определенный драйвер. Таким образом, если вы планируете распространять свое приложение, то в него нужно будет включить дополнительный файл драйвера, который представляет собой обычную библиотеку динамической компоновки (DLL).
Разберемся, какой из файлов библиотек вы должны будете включить в комплект поставки вашей программы. В таблице 3.1 перечислены типы баз данных и библиотеки динамической компоновки, необходимые для работы с ними.
Таблица 3.1. Типы поддерживаемых баз данных
Тип базы данных
Имя файла
InterBase
DBEXPINTDLL
DB2
DBEXPDB2.DLL
Oracle
DBEXPORA.DLL
MySQL
DBEXPMYS.DLL
Новый тип поля TFMTBCDField обеспечивает истинный двоично-десятичный формат поля. Напомним, что в Delphi 5 использовался тип TBCDField, который хранил двоично-десятичные данные в формате Currency. Данный тип переводил данные формата Currency в BCD (Binary-Coded Decimal) и наоборот.
ПРИМЕЧАНИЕ
Для поддержки нового типа поля процедуры CurrlbBCO и BCDToCurr были перемещены из модуля DB в модуль FMTBCD.
Другой новый тип поля TSQLTimeStampHeld предназначен для поддержки времени и даты в формате, требуемом драйверам dbExpress.
Были добавлены три новых клиентских набора данных:
TBDEQientDataSet;
TSQLCIientDataSet;
TIBCIientDataSet
Эти компоненты предназначены для простых приложений и объединяют в себе поставщик данных и набор данных. Если создаваемое приложение требует многократного обновления данных с сервера или использует отношение ^главный—подчиненный» между таблицами, то лучше всего использовать вместо указанных клиентских наборов.данных внешний поставщик данных и отдельный клиентский набор данных.
Компонент TCIientDataSet в Delphi 6 обладает тремя новыми-свойствами:
ConnectionBroker — применяется в случае, когда у вас в приложении имеется несколько наборов данных, которые задействуют одно и то же соединение с сервером базы данных. Данное свойство позволяет централизованно, с помощью изменения только одного значения, изменять значения свойства у всех наборов данных, использующих данное соединение;
DisableStringTnm — позволяет контролировать ввод символов пробела в значениях, которые заносят пользователи в поля таблиц. Данное свойство имеет буле- выйтип. Если значение свойства — true, то данные сохраняются в поле таблицы в том виде, как их вводит пользователь, в ином случае все пробелы, вводимые пользователем, будут отсечены;
XMLData — позволяет получить доступ из клиентского набора данных к XML- данным.
Новый набор компонентов позволяет вам работать с ХМ L-документами. Мы их рассмотрим в последующем.
Кроме того, в Delphi 6 была реорганизована палитра компонентов. Компоненты, которые основаны на BDE (Borland Database Engine, процессор баз данных Borland), перемещены на отдельную закладку BDE. Добавлены новые закладки: InterBase Admin, dbExpress и DataSnap. Об этих закладках и их компонентах читайте далее в этой главе.
Среда Delphi 7 также привнесла изменения в рйботу с базами данных:
Драйверы dbExpress теперь стали поддерживать Informix SE, Oracle 9i, DB2 72 InterBase 6.5 и MySQL 3.23.49. Кроме того, был добавлен новый драйвер для Microsoft SQL 2000..
Корпорация Borland решила отказаться от использования SQL Links. Начиная с 2002 года SQL Links не будет развиваться и включаться в состав Delphi. Для реализации доступа к серверам баз данных SQL корпорация Borland рекомендует использовать механизм dbExpress.
Файл Borland Database Engine (BDEINST.CAB) больше не имеет цифровую подпись. Этот файл включается в поставку Delphi лишь для обеспечения совместимости программ, созданных в ранних версиях Delphi.
Произошли изменения в некоторых компонентах для работы с базами данных и были добавлены новые:
в свойстве DefaultRowsetSize компонентаTSQLDataSet (вкладка dbExpress) теперь установлено значение по умолчанию, равное 20;
вместо компонента TSQLOientDataSet введен новый компонент TSimpleDataSet находящийся на вкладке dbExpress палитры компонентов.
Наборы данных
Среда Delphi работает с таблицами баз данных» которые физически располагаются на диске. Поэтому такие таблицы мы будем называть физическими. Для доступа к данным, содержащимся в физических таблицах, применяются наборы данных. Набором данных называется совокупность записей, выделенных по определенным правилам из одной или нескольких физических таблиц базы данных.
Набор данных по определению не будет представлять собой физическую таблппу, поэтому будем называть набор данных логической таблицей. Именно с логическими таблицами работает большинство из стандартных компонентов Delphi. Можно представлять себе взаимодействие физической и лошческой таблицы по аналогии, как физического файла и файловой переменной.
Итак, из всего вышесказанного можно сделать вывод, что нам при создании приложений баз данных придется работать в основном с наборами данных (или логическими таблицами).
ВНИМАНИЕ
Во многих других системах управления базами данных вместо термина набор данных используются выборка или таблица.
Среда Delphi имеет несколько стандартных компонентов для работы с наборами данных. К их числу относятся такие компоненты, как Table, Query, StoredProc » дру- nie. Работа со всеми этими компонентами будет подробно описана далее.
Доступ к данным в Delphi обеспечивает класс TDataSet, который представляет наборы данных в виде совокупности строк и столбцов. Строки являются записями, а столбцы — полыми таблицы базы данных. Класс TDataSet обеспечивает возможность редактирования набора данных» а также предоставляет средства для перемещения (навигации) по записям. Многие из свойств, событий н методов класса TDataSet я в л я ются абстрактными. Они называются абстрактными, так как не могут быть использованы непосредственно классом TDataSet, а лишь в его классах-потомках. Прямым потомком класса TDataSet является класс TBDEDataSet. Этот класс инкапсулирует в себе функциональные возможности Borland Database Engine (BDE)— п])оцессора баз данных фирмы Borland. BDE — это совокупность файлов динамических библиотек (DLL) и драйверов, которые отвечают за доступ к данным. Для более подробного знакомства с BDE обратитесь к занятию 4.
Класс TBDEDataSet имеет класс-потомок TDBDataSet, в котором определены дополнительные свойства V1 методы, обеспечивающие возможность связывания набора данных с физическими таблицами базы данных.
Далее мы рассмотрим два компонента Table и Query, которые являются потомками класса TDBDataSet Мы изучим их общие свойства на примерах операций с наборами данных. Эти компоненты расположены на закладке BDE палитры компонентов Delphi 7.
Общие свойства компонентов Table и Query
Свойство Active имеет тип Boolean и позволяет открывать или закрывать набор данных. Его можно установить в окне инспектора объектов, но чаще всего такие операции с наборами данных производят во время выполнения приложения, например:
Table].Active:=false: // Закрывает набор данных, задаваемых
// компонентом Tablel
Queryl.Active.=trije: 〃 Открывает набор данных, задаваемых . // компонентом Query1
Более подробно о свойстве Active рассказывается ниже.
Свойство DatabaseName имеет тип String и задает полный путь к каталогу базы данных, например: 'C:\Database\MyDBF'. В значении этого свойства можно указать вместо пути к каталогу базы данных ее псевдоним.
Псевдоним (alias) представляет собой специальное имя для обозначения каталога базы данных и применяется для указания местонахождения файлов базы данных.
Более подробно о работе с псевдонимами мы расскажем на четвертом занятии. Все существующие псевдонимы для баз данных будут показаны в окне инспектора объектов при щелчке левой кнопкой мыши на поле со списком напротив свойства DatabaseName.
СОВЕТ
Старайтесь всегда использовать псевдонимы, так как это позволит вам легко изменять местоположение файлов базы данных, не меняя кода программы. После изменения местоположения файлов достаточно будет изменить название каталога, на который ссылается псевдоним базы данных.
Для компонента Table допустимо применение только свойства DatabaseName при задании пути к базе данных. Компонент Query имеет допол нiпел ьную возможность: в запросе SQL можно задать путь доступа к любой из таблиц базы данных.
Рассмотрим, как задается путь к нужной базе данных во время работы приложения:
во-первых, необходимо установить свойство Active компонента Table или Query в false (закрыть набор данных);
затем указываем путь к базе данных либо ее псевдоним;
после чего можно открыть набор Данных, присвоив свойству Active значение true:
Закрываем набор данных Закрываем набор данных Задаем местонахождение базы данных с помощью псевдонимаЗакрываем набор данных Закрываем набор данных Задаем местонахождение базы данных с помощью псевдонимаTablel.Active:*=fdlse;//
Закрываем набор данных Закрываем набор данных Задаем местонахождение базы данных с помощью псевдонима
Закрываем набор данных Закрываем набор данных Задаем местонахождение базы данных с помощью псевдонима
Queryl.Active:cfalse://
Tablel.DatabaseName;-'MyDB';//
//
Queryl.DatabaseName:=*C:\Database\MyDBF':
Свойство TableName компонента Table имеет тип String и содержит имя текущей таблицы базы данных. В терминах Delphi каталог — это база данных, а файлы каталога — таблицы. Поэтому после указания пути к базе данных через свойство DatabaseName можно выбрать нужную таблицу из раскрывающегося списка свойства TableName в окне инспектора объектов (там будут отображены все названия файлов таблиц, находящихся в выбранном каталоге). Кроме того, значение этого свойства можно задавать и во время работы приложения, предварительно закрыв набор данных:
Tablel.Active:=false:
Tabi el.DatabaseName:e,C:\Database\MyOBF';
Tablel.TableName:c,MyTable';-
Свойство RecordCount имеет тип Longint н содержит число записей, находящихся в текущий момент времени в наборе данных. Значение данного свойства не отображается в окне инспектора объектов — оно доступно только для чтения во время выполнения приложения.
Строка
Editl.Text:=IntToStr(Tablel.RecordCount):
выводит в компонент Editl количество записей набора данных ПЬ1е1.
Свойство RecNo имеет тип Longint pi содержит номер текущей записи набора данных. Это свойство также доступно только для чтения во время работы приложения. Для перемещения по записям набора данных используются вызовы соответствующих методов: First, Last, Next, Prior и MoveBy:
Tablel.First:
Tabi el.Next;
// Переход к первой записи набора данных // Переход к следующей записи
Tablel.Last;
// Переход на последнюю запись // набора данных
Tablel.Prior;
// Переход на предыдущую запись
Tablel.Movefty (-12);
// Переход на 12 записей назад от // текущей
Если вы используете в своем приложении таблицы Paradox, то можно напрямую производить ввод чисел в свойство RecNo для перехода на нужную запись набора данных:
Tablel.RecNo:=15:// Переход на 15-ю запись набора данных
Состояния наборов данных
Как мы уже видели ранее, наборы данных могут принимать два состояния: открытое или закрытое. При установке свойства Active в true набор данных будет открыт. Для закрытия набора данных нужно присвоить свойству Active значение 启Ise.
Набор данных можно открыть как во время работы, так и во время создания приложения. В случае, когда открыть набор данных нельзя, генерируется исключительная ситуация и выдается сообщение об ошибке. Свойство Active при этом сохраняет значение felse.
ВНИМАНИЕ
При изменении свойств DatabaseName или TableName необходимо обязательно закрыть набор данных, чтобы избежать исключительной ситуации.
Кроме того, вы можете открыть набор данных с помощью вызова метода Open и закрыть с помощью метода Close:
Tablel.Close; // Закрываем набор данных
Query1.Open; // Открываем набор данных
Вызов этих методов имеет смысл, если вы хотите выполнить какие-либо действия перед открытием или после открытия набора данных, а также перед закрытием или после закрытия.
Итак, метод Орел открывает набор данных. При вызове данного метода генерируются события BeforeOpen и AfterOpen. Вы можете написать программы-обработчики этих событий. Это очень полезно, если вы хотите не открывать набор данных до тех пор, пока не выполнились какие-либо условия. Ниже представлен пример такого обработчика:
procedure TForml.Tab!elBeforeOpenCDataSet: TDataSet):
begin-''
if a<>true then Abort:
end:
В данном примере, если переменная а не имеет значение true, открытие набора данных Tablel будет прервано. Это достигается вызовом процедуры Abort, в результате работы которой генерируется исключительная ситуация и операция открытия данных отменяется. При этом на экран не будет выведено никаких сведений об ошибках. Естественно, вы можете добавить команды вывода сведений для пользователя о том, что данные недоступны.
Примером использования события AfterOpen может служить приведенный ниже листинг:
procedure TForml.TabielAfterOpenCDataSet: TDataSet):■
begin
ShowMessageC''Таблица "+Tablel,TableNan)e+" готова к работе');<
end:
Здесь после открытия набора данных выводится текстовое сообщение о готовности таблицы к работе. Имя таблицы содержится в свойстве TableName.
Метод Close закрывает набор данных. При его вызове генерируются события BeforeOose и AfterClose.
ВНИМАНИЕ:
При закрытии набора данных необходимо принудительно сохранять сделанные изменения в текущей записи с помощью вызова метода Post, так как метод Close автоматически не сохраняет данные текущей записи.
Можно использовать обработчик события BefbreClose для вызова метода Post:
procedure TForml.TabielBeforeCloseCDataSet: TDataSet): begin
if (Tablel.State-dsInsert) or (Tablel.State-KisEdit) then
Tablel.Post;
end:
В данном примере сначала осуществляется проверка, в каком режиме находится набор данных Tablel, при помощи значения свойства State. Если он находится в режиме вставки новой записи (dslnsert) или редактирования текущей записи (dsEdit), то перед закрытием набора данных все внесенные изменения сохраняются.
ВНИМАНИЕ
При выходе из приложения несохраненные данные теряются, и обработчик события BeforeClose не вызывается.
К обработке события AfterClose можно прибегать для выдачи пользователю сообщения о закрытии набора данных.
Режимы наборов данных
В примере использования события BeforeClose мы упомянули о режиме набора данных (свойстве State). Остановимся на этом немного подробнее. Наборы данных в разные моменты времени могут находиться в различных режимах, например неактивном, фильтрации данных, вставки, редактирования и т. д. Программист может читать значение свойства State, но изменять его напрямую нельзя. Для того чтобы перевести набор данных в один из режимов, нужно либо вызвать соответствующий метод, либо воспользоваться адекватными визуальными компонентами, речь о которых пойдет ниже.
Перечислим возможные режимы, в которых может находиться набор данных. Их всего тринадцать:
dslnactive — неактивный. В этом режиме набор данных является закрытым и доступ к данным невозможен;
dsBrowse — режим просмотра. Данный режим устанавливается по умолчанию для любого открытого набора данных. В этом режиме данные могут свободно просматриваться, но никаких изменений в них внести нельзя;
dsEdit — режим редактирования. В этом режиме возможно только редактирование текущей (активной) записи набора данных;
dslnsert — режим вставки. В данном состоянии активной является новая запись, которую можно редактировать, а затем либо принять изменения (post) либо отменить их (discard);
dsSetKey — режим поиска, который доступен только для компонентов Table ■ и ClientDataSet. В этом режиме происходит отбор записей, которые соответствуют некоторому критерию. Можно просматривать офаниченный набор данных (соответствующих критерию), но нельзя их редактировать или вставлять новые записи;
dsCalcFields — расчет вычисляемых полей, в процессе которого невычисляемые поля таблицы не могут быть отредактированы и нельзя вставлять новые записи. Этот режим использует событие OnCalcRelds;
dsFilter — режим фильтра. В этом режиме показываются только те данные, которые соответствуют фильтру, при этом невозможно редактировать или вставлять записи. Режим использует событие OnFilterRecord;
dsNewValue — режим доступа к свойству New Value. Данный режим является временным;
dsOldValue — режим доступа к свойству OldValue. Также является временным;
dsCurValue — режим доступа к свойству CurV&lue Как и предыдущие, временный режим;
dsBlockRead — режим чтения блока данных. В этом режиме при переходе на следующую запись набора данных (при вызове метода Next) все визуальные компоненты, отображающие данные, не обновляются и не происходят никакие события;
dsIntemalCalc — режим внутренних вычислений. Временный режим, в нем значения полей, свойство TFleld.HeldKind которых установлено в fldntemalCalc, вычисляются;
dsOpening — режим открытия набора данных. Подразумевает состояние еще не завершенного открытия набора данных. Этот режим активируется, когда набор данных открывается для асинхронной выборки.
Работа с полями наборов данных
Поле набора данных представляет собой столбец таблицы. В среде Delphi предусмотрен специальный объект Field для работы с полями. Данный объект имеет тип TField. Наследниками этого объекта являются TlntegerField, TFIoatField и т. д. Для того чтобы программист мог работать с отдельными полями набора данных, в Delphi определены специальные методы и свойства, которые мы и рассмотрим.
Свойство FieldCount имеет тип Integer и содержит число полей данного набора данных. Свойство доступно только для чтения. Приведем пример чтения значения свойства FieldCount:
a:=7ablel.FieldCount; //а- переменная типа Integer
ВНИМАНИЕ
Количество полей набора данных может не быть равным числу полей физической таблицы базы данных, так как в набор данных могут быть не включены некоторые поля таблицы.
Свойство Fields имеет тип TFields и хранит список всех несоставных полей набора данных. Его можно представить себе в виде массива, который содержит поля набора данных, каждое под своим номером (индексом). Вы можете обращаться к конкретному полю набора данных при помощи указания его индекса (Index). Нумерация индексов начинается с нуля и заканчивается значением FieldCount-1. Если приложению известен тип данных конкретного поля, то его значение можно прочитать с помощью свойства Fields:
Editl.Text :<ablel. Fields. F1elds[l].AsString;
Кроме того, допускается запись значения в нужное поле набора данных:
Tablel.Edit: // Переводим набор данных в режим редактирования
Tablel.Fields.F1elds[l].AsString:-Editl.Text;
Tablel.Post: // Записываем данные в таблицу
Вы, вероятно, обратили внимание на то, что при вставке в поле значения мы применили такое свойство объекта Field, как AsString. Данное свойство позволяет обращаться к содержимому поля как к строковому значению. Кроме рассмотренного свойства, имеются еще несколько: Aslnteger — обращение как к целой величине, AsFloat — как к вещественной, AsVariant — как к вариантной, AsCurrency — как к денежной, AsDateTime — как к <дате-времени» и AsBoolean — обращение как к логическому (булевому) значению.
ВНИМАНИЕ
При доступе к полю набора данных нужно всегда четко представлять; какого оно типа. Так как, например, если вы обращаетесь к строковому полю с использованием свойства AsRoat, возникнет исключительная ситуация.
Обращение к полям по их номеру не всегда эффективно, поскольку номер поля — величина не постоянная. Номера полей зависят от многих факторов: от порядка полей в физической таблице базы данных, от состава полей набора данных в настоящий момент времени, от значений свойств визуальных компонентов. Поэтому доступ к полю по его номеру чреват ошибками. На практике для доступа к полям разработчики чаще всего используют методы FindField и FieldByName.
Метод HndField (const FieldName: string): TField; обнаруживает поле по его имени. Если такое поле найдено, то метод возвращает объект ти па TField, то есть поле, соответствующее параметру FieldName. В случае отрицательного результата возвращается значение niL Данный метод похож на рассматриваемый далее метод FieldByName за исключением того, что он возвращает значение nil в случае, когда поле не найдено, а метод FieldByName генерирует исключительную ситуацию.
ВНИМАНИЕ
Параметр FieldName указывает имя поля физической таблицы базы данных, которое было задано при первичном проектировании таблицы.
Метод FieidByName(const FieldName: string): TField; также ищет поле по его имени. В случае успешного поиска возвращается иоле, соответствующее параметру HeldName. В противном случае генерируется исключительная ситуация EDatabaseError.
Вы можете выбрать как первый, так н второй метод для работы с полями ^ это дело вкуса.
Рассмотрим пример кода, в котором заменим значение поля с помощью вызова метода FindField:
Tablel.Edit; // Переводим набор данных в режим редактирования
Tablel.FindField('Number').As Integer:=10;
Tablel.FindFieldf'Name').AsString:='B34ecnaB'.
Tablel .FindFieldf 'Surname') .AsString:-'riOHdMape8';
Tabi el.Post: // Записываем данные в таблицу
Мы уже немного научились использовать объект поля Field. Теперь остановимся на нем более подробно.
Как уже было сказано ранее, объект Field имеет тип TField, который является абстрактным классом. Поэтому вместо него применяются классы-наследники, перечисленные в табл. 3.2.
Таблица 3.2. Наследники класса TField
Класс-наследник
Вид поля набора данных
TADTField
Поле абстрактного типа данных (Abstract Data Туре) может использовать определенные типы, созданные на сервере баз данных. Может содержать массивы, ссылки и другие данные
TAgregateFteld
Составное поле. Позволяет объединять разнородные данные полей набора данных
TArrayReld
Поле массива. Содержит набор полей одного типа
TAutoIncField
Поле, автоматически увеличивающее свое значение (автоинкрементное). Может служить счетчиком записей набора данных. Диапазон значений: от -2 147 483 648 до 2 147 483 647. Этот тип поля чаще всего используется в качестве уникального первичного ключа
TBCDField
Двоично-десятичное поле (Binary-Coded Decimal). В основном требуется для хранения денежных величин. Обычно такое поле содержит десятичные значения. Так как Delphi ранее не поддерживала собственного типа BCD, для работы с этим полем компилятор использует денежный тип Currency, из-за чего значение этого поля ограничено 20 значащими цифрами
TBLOBHeld
Данное поле содержит ссылки на большие двоичные объекты (Binary Large OBjects). Этот тип поля является прямым предком для двух других типов полей: TGraphicField и TMemoField
TBooleanField
Поле логического (булевого) типа. Может иметь значения true или false
TBytesField
Последовательность байтов фиксированной длины
TCurrencyField.
Поле содержит значения денежного типа (положительные или отрицательные) от 5,0x10也4 до IJxlO306 с точностью до 15 знаков после запятой
TDataSetField
Поле обеспечивает доступ к вложенному набору данных
TDateField
Поле содержит дату
TDateTimeField
Поле содержит дату и время
TFIoatField
Данное поле содержит вещественные значения. Они могут находиться в диапазоне от 5,0х10'зм до l/xlO308 с точностью до 15 знаков после запятой
продолжение 芋
Таблица 3.2 {продолжений
Класс-наследник
Вид поля набора даиных
TFMTBCDReld
Данные представлены в истинной двоично-десятичной форме
TGraphicField
Графическое поле
TGUIdField
Поле предназначено для работы с уникальными глобальными идентификаторами (Globally Unique Identifiers, GUIDs)
TIDispatchField
Поле содержит указатели на интерфейсы Idispatch
TIntegerField
Поле для хранения целочисленных 32-битных значений со знаком.
Может содержать числа в диапазоне от -2 147 483 648 до 2 147 483 647
TLargelntField
Поле большого целочисленного значения (64-битного)
TMemoField
Memo-поле, служит для хранения текста
TReferenceField
Поле содержит ссылки или указатели на другие объекты
TSmalllntReld
Поле маленького целочисленного значения (16-битного). Допускаются числа в диапазоне от -32 768 до 32 767
TbQLTimeStampField
Содержит данные о дате и времени в формате, совместимом с драйверами dbExpress
TStringField
Строковое поле. Заполняется строками простого текста длиной до 8192 символов
TTimeField
Поле времени
TVarBytesField
Поле байтов переменного размера. Значение длины содержится в первых двух байтах
TVariantReld
Поле вариантного типа
TWideStringField
Поле длинных строк
TWo rd Field
Поле целочисленного 1б-битного значения без знака. Диапазон значений от 0 до 65 535
В дальнейшем мы будем применять термин TField для обозначения любого из объектов, перечисленных в табл. 3.1.
Для того чтобы проверить, какой тип пмеет конкретное поле таблицы, используйте свойство DataType типа TFieldType. Оно может принимать значения, представленные в табл. 3.3.
Таблица 3.3. Значения свойства Datalype
Значение
Описание
ftUnknown
Неопределенный тип
ftString
Поле символа или строки
ftSmalllnt
16-битное целое поле
ftlnteger
32-битное целое поле
ftWord
16-битное целое поле без знака
ftBoolean
Логическое (булевское) поле
ftHoat
Поле вещественных чисел
FtCurrency
Поле денежных значений
FtBCD
Поле двоично-десятичных значений
FtDate
Поле даты
FtTime
Поле времени
FtDateTime
Поле даты и времени
FtBytes
Поле байтовых значений фиксированной длины
FtVarBytes
Поле байтовых значений переменной длины
Значение
Описание
FtAutoInc FtBLOB FtMemo ftGraphic ftFmtMemo ftParadoxOLE ftDBaseOLE ftTypedBinary ftCursor ftFixedChar ftWideString ftLargelnt ftADT ftArray ftReference ftDataSet ftOraBLOB ftOraCLOB ftVariant ftlnterface ftIDispatch ftGUlD ftTimeStamp ftFMTBCD
Поле, автоматически увеличивающее свое значение
ВЮВ-поле
Мето-поле
Графическое поле
Мето-поле, содержащее форматированный текст
Поле OLE для таблиц Paradox
Поле OLE для таблиц dBase
Двоичное поле •
Курсор хранимой процедуры Oracle
Символьное поле фиксированной длины
Поле длинной строки
Поле большого целого числа
Поле данных абстрактного типа
Поле массива
Поле, содержащее ссылки и указатели на объекты
Поле типа TDataSet
ВЮВ-поле в таблице Oracle 8
CLOB-поле в таблице Oracle В
Данные неизвестного или неопределенного типа
Поле ссылок на интерфейсы (IUnknown)
Поле ссылок на интерфейсы (IDispatch)
Поле GUID
Поле даты и времени, доступное с помощью средств dbExpress
Поле двоично-десятичного значения, являющегося слишком большим для ftBCD
Теперь мы можем перейти к рассмотрению особенностей наборов данныхTbbte и Query.
Набор данных Table
Набор данных Table представлен в Delphi компонентом fable. Этот набор данных в каждый момент времени может быть связан только с одной таблицей базы данных. Компонент Table рекомендуется применять при работе с локальными базами данных, такими как Paradox или dBase.
Рассмотрим основные свойства набора данных Table. В таблице 3.4. приведены все свойства, которые отображаются в окне инспектора объектов.
Таблица 3.4. Свойства компонента Table
Название свойства
Тип свойства Описание
Active
BooleanОпределяет, является ли набор данных открытым. Если
свойство имеет значение False, то набор данных закрыт и с данными ничего не может сделать ни пользователь, ни программа. Если данное свойство установлено в True, то с данными можно осуществлять произвольные действия (изменять, добавлять, удалять и т. д.)
продолжение^
Таблица 3.4 (продолжений
Название свойства
Тип свойства
Описание
AutoCalcFields
Boolean
Определяет, как будет осуществляться работа с автоматически вычисляемыми полями. Если свойство установлено в Уиле, то значения таких полей будут автоматически вычисляться в случае открытия набора данных, перевода набора данных в режим редактирования (dsEdit), передачи фокуса с одного визуального компонента на другой или из одной колонки визуального компонента в другую
AutoRefresh
Boolean
Определяет порядок обновления на сервере базы данных визуальных компонентов для отображаемых полей. Если значение свойства — False (по умолчанию), то автоматическое обновление будет отсутствовать. Для обновления данных в этом случае программист должен предусмотреть вызов процедуры Refresh. Если значение свойства — True, то обновления будут осуществляться автоматически
CachedUpdates
Boolean
Установка значения свойства в True позволяет кэшировать изменения, сделанные в базе данных. При этом данные хранятся в оперативной памяти, и для их переноса в базу данных применяется метод ApplyUpdates. Для отмены сделанных изменений вызывается метод CancelUpdates. Для очистки содержимого кэша используется метод CommitUpdates
Constraints
TCheckConstraints
Определяет ограничения целостности на уровне записи, накладываемые на значения отдельных полей набора данных
DatabaseName
String
Определяет имя базы данных, связанной с набором данных
Defaultindex
Boolean
Определяет, будут ли данные в таблице отсортированы по полю первичного ключа или главного индекса. Значение свойства по умолчанию — True
Exclusive
Boolean
Есри значение свойства — True, то другие приложения не смогут обратиться к уже открытому набору данных (применимо только к таблицам Paradox и dBase). Необходимо обязательно закрывать открытую таблицу при смене значения данного свойства
ReldDefc
TReldDefc
Задает набор полей, которые определяют набор данных. Позволяет программно, во время выполнения приложения создавать таблицы и их поля
Hlter
String
Содержит текст текущего фильтра для набора данных. В визуальных компонентах будут отображаться только те данные, которые соответствуют условиям данного фильтра
Filtered
Boolean
Определяет, будет ли учитываться значение свойства Rlter при отображении данных в визуальных компонентах. В случае True данные будут фильтроваться в соответствии со свойством Rlter; иначе — фильтр игнорируется
FilterOptions
TFilterOptions
Содержит два подчиненных свойства, которые определяют, является ли фильтр чувствительным к регистру букв и разрешается ли в фильтре использование символа «*» в качестве указателя на любое количество любых символов. По умолчанию эти два свойства имеют значения False
IndexDefs
TTndexDefc
Содержит информацию об индексах таблицы
IndexFieldNames
String
Содержит список столбцов таблицы, которые выбраны в качестве индексных
IndexFiles
TStrings
Содержит название одного или нескольких индексных файлов для таблицы формата dBase
IndexName
String
Определяет альтернативные индексы для таблицы
Название свойства
Тип свойства
Описание
MasterFields
String
Определяет одно или несколько полей главной таблицы (master table) для установления связи с соответствующими полями подчиненной таблицы, то есть для установления связи «master—detail»
MasterSource
TDataSource
Задает имя компонента источника данных, свойство DataSet которого определяет набор данных, используемый в качестве главной (master) таблицы при установлении связи «master— detail»
Name
TComponentName
Определяет имя компонента набора данных. По умолчанию присваиваются имена Tablel, ПЬ1е2,..., TableN
Objectview
Boolean
Указывает, как хранятся объекты полей в свойстве Fields: иерархически или последовательно (дочерние поля размещены после родительских)
Readonly
Boolean
Фиксирует, можно ли изменять данные в таблице, или они доступны только для чтения. Если значение свойства — False (по умолчанию), то изменение данных разрешено, иначе — данные из таблицы доступны только для чтения
SessionName String
Определяет имя компонента Session, связанного с данной таблицей
StoreDefc
Boolean
Указывает, где сохраняются определения полей и индексов. Если значение данного свойства — True, то определения полей и индексов будут сохраняться в модуле данных или в форме. В случае False (по умолчанию), информация сохраняется в файлах базы данных
TableName
TFileName
Определяет имя файла таблицы базы данных, которую инкапсулирует объект. Условием установки этого свойства является присвоение значения False свойству Active
fablelype '
TTableType
Определяет структуру используемой таблицы базы данных и может принимать следующие значения: ttDefault ——тип таблицы определяется по ее расширению (*.db — Paradox, *・dbf — dBase, *.txt — ASCH); ttParadox — таблица Paradox; ttDBase — таблица dBase; ttFoxPro — таблица FoxPro; ttASCII — таблица в текстовом формате с данными, разделенными запятыми
Tag
Longlnt
Не имеет специального назначения. Применяется для хранения целого числа, связанного с компонентом. Может применяться по усмотрению программиста
UpdateMode
TUpdateMode
Определяет критерии поиежа обновляемой записи базы данных SQL в BDE (какие поля учитываются). Может принимать одно из трех значений: UpWheneAII — все поля; UpWhereChanged — только ключевые поля и поля, значения которых были изменены; UpWhereKeyOnly — только ключевые поля
UpdateObject TDataSetUpdateObject
Определяет объект типа TDataSetUpdateObject, который используется для обновления записи
Набор данных Query
Набор данных Query представлен в Delphi компонентом Query. Особенностью кеш- понента Query является то, что его записи формируются после выполнения SQL- запроса.
В отличие от набора данных Table, компонент Query может содержать записи сразу несколькнх таблиц.
Данный компонент удобно использовать npii работе с удаленными базами данных. Многие свойства компонента Query несут ту же нагрузку, что и соответствующие свойства компонента Table. В таблице 3.5 мы приведем лишь те из них, которые являются специфичными для компонента Query.
Таблица 3.5. Некоторые свойства компонента Query
Название свойства
Тип свойства
Описание
Constrained
Boolean
Задает совместимость ограничений в предложении SELECT с операциями редактирования и вставки записей в таблицах Paradox и dBASE
DataSource
TDataSource
Указывает имя компонента TDataSource, относящегося к главному набору данных, из которого берется значение ключа; этому значению должны соответствовать записи набора данных
ParamCheck
Boolean
Определяет, должно ли свойство Params автоматически обновляться при изменении запроса в свойстве SQL во время выполнения
Params
TParams
Содержит параметры запроса, находящегося в свойстве SQL
RequestLive
Boolean
Позволяет попытаться возвратить результат запроса как «живой» набор данных, вместо таблицы «только для чтения»
SQL
TStrings
Содержит текст SQL-запроса
UniDirectional
Boolean
Определяет доступность двунаправленного курсора Borland Database Engine (BDE)
Источник данных
Источник данных (data source) представляет собой промежуточный элемент, который применяется для связи набора данных с визуальными компонентами. Получается как бы цепочка: «набор данных — источник данных — визуальный компонент». Для этой цели в Delphi служит компонент DataSource. Указанный компонент имеет пять основных свойств, которые отображаются в окне инспектора объектов. Эти свойства и их краткое описание представлены в табл. 3.6.
Таблица 3.6. Свойства компонента DataSource
Название свойства
Тип свойства
Описание
AutoEdit
Boolean
Определяет, может ли набор данных автоматически переводиться в режим модификации при попытке изменения данных пользователем. По умолчанию значение свойства ——True, то есть такой перевод разрешен. В случае если вы не хотите допустить случайное изменение данных ——установите значение этого свойства в False
DataSet
TDataSet
Служит для указания набора данных, с которым связан источник данных. Отметим, что визуальные компоненты для связи с источником данных используют свое свойство DataSource
Enabled
Boolean
Определяет, будут ли визуальные компоненты, связанные с этим источником данных, отображать данные из набора данных (true — да, false — нет)
ОписаниеОписаниеНазвание Тип свойства свойства
Описание
Описание
NameNameTComponentNameTComponentNamelaglagLonglntLonglntЗадает имя источника данных. По умолчанию источники данных получают имена DataSourcel, DataSource2r..., DataSourceNНе имеет специального назначения. Применяется для хранения целого числа, связанного с компонентом, по усмотрению программистаЗадает имя источника данных. По умолчанию источники данных получают имена DataSourcel, DataSource2r..., DataSourceNНе имеет специального назначения. Применяется для хранения целого числа, связанного с компонентом, по усмотрению программиста
Name
Name
TComponentName
TComponentName
lag
lag
Longlnt
Longlnt
Задает имя источника данных. По умолчанию источники данных получают имена DataSourcel, DataSource2r..., DataSourceN
Не имеет специального назначения. Применяется для хранения целого числа, связанного с компонентом, по усмотрению программиста
Задает имя источника данных. По умолчанию источники данных получают имена DataSourcel, DataSource2r..., DataSourceN
Не имеет специального назначения. Применяется для хранения целого числа, связанного с компонентом, по усмотрению программиста
ВНИМАНИЕ
Вне зависимости от значения свойства AutoEdft есть возможность программно изменять данные в наборе данных. Кроме того, независимо от значения этого свойства пользователь может перевести набор данных в режим модификации с помощью нажатия кнопок визуального компонента DBNavigator. Таким образом, значение свойства AutoEdit влияет лишь на попытку изменения данных пользователем.
При изменении данных в наборе данных происходит генерация события OnData^ Change, которое имеет тип TDataChangeEvent Этот тип описан в Delphi следующим образом:
type TDataChangeEvent = procedure (Sender: TObject: Field: TField) of object:
Параметр Field определяет, значение какого поля было изменено. Если данные были обновлены в нескольких полях, то параметр будет содержать пустое значение (nil).
ВНИМАНИЕ:
Событие OnDataChange может произойти также и в случае, когда происходит переход на другую запись набора данных. Оно возникает, если значение текущего поля старой записи отличается от значения того же самого поля новой записи. Кроме того, это событие имеет место при первоначальном открытии набора данных.
Кроме события OnDataChange, при изменении значений полей текущей записи возникает событие OnUpdateData, которое имеет тип TNotifyEvent. Такое событие происходит перед записью данных в базу данных. Таким образом, его можно использовать, например, для подтверждения внесенных изменений или отказа от них.
Связь между набором данных и источником данных обычно устанавливается на этапе проектирования приложения с помощью инспектора объектов. Delphi допускает установку или разрыв этой связи и в процессе выполнения приложения. При установлении новой связи визуальные компоненты автоматически подключатся к новому набору данных и будут отображать его значения.
Приведем пример установки м разрыва связи (листинг 3.1).
Листинг 3.1. Установка и разрыв связи с наборами данных
DdtaSourcel.DataSet Tabi el: // установка связи с набором
// данных Tablel
DatdSourcel.DataSet := ml: // присвоение пустого
// значения свойству DataSet
// разрывает связь с набором
// данных
DataSourcei.DataSet := Queryl; // установка связи с набором // данных Queryl
В листинге 3.1 можно было опустить строку, в которой происходит присваивание пустого значения. Переключение между наборами данных можно осуществлять без предварительного разрыва связи со старым набором данных.
Что нового мы узнали?
На этом занятии мы узнали:
какие новые возможности по работе с данными предоставляет среда Delphi 7;
что такое наборы данных;
каковы свойства и методы основных наборов данных Able и Query.
Занятие 4
Средства для работы с базами данных
Borland Database Engine, архитектура BDE
Настройка BDE
Программа Database Desktop
Работа с псевдонимами баз данных
Программа Data Pump
Архитектура dbExpress
На этом уроке мы рассмотрим архитектуру BDE Delphi, а также новую архитектуру dbExpress, которая появилась еще в версии Delphi 6. Кроме того, вы познакомитесь с набором программ, входящих в комплект поставки Delphi 7 и предназначенных для работы с базами данных.
Borland Database Engine, архитектура BDE
Процессор баз данных фирмы Borland (Borland Database Engine, BD£) — это совокупность файлов динамически присоединяемых библиотек (*.dll) и набора драйверов, обеспечивающих доступ к данным.
BDE представляет собой механизм доступа к данным, который может использоваться одновременно несколькими приложениями. BDE содержит мощную библиотеку вызовов API Windows для создания, реструктуризации, обновления данных и других манипуляций с локальными и удаленными базами данных.
API, Application Programming Interface Windows — это интерфейс разработки приложений Windows.
Таким образом, BDE обеспечивает единство доступа к разнообразным серверам баз данных. В зависимости от используемой версии Delphi вы можете с помощью BDE обращаться к локальным базам данных типа Paradox, dBase, FoxPro и Microsoft
Access. Кроме того, с помощью драйверов SQL Links (только в версии Delphi 7 Enterprise) вы можете работать с удаленными серверами баз данных, такими как InterBase, Oracle, Sybase, Informix, Microsoft SQL Server и DB2.
ПРИМЕЧАНИЕ
Компания Borland отказывается от дальнейшего использования SQL Links. Вместо SQL Links предлагается использовать технологию dbExpress.
В DE разработан для использования нс только в среде Delphi. Его применяют также C++ Builder, IntraBuilder, Paradox for Windows n Visual dBASE for Windows.
Приведем список программных компонентов, когорте о6сс1)(1'швают работу BDE.
Ядро BDE — файлы, составляющие ядро механизма ВГ)Е (по умолчанию устанавливаются в папку Program Files\Common Files\Bodand Shared\BDE):
口 IDAPI32.DLL — главный файл BDE;
口 BLW32.DLL — драйвер поддержки национальных языков;
IDBAT32.DLL — осуществляет пакетные операции;
IDQBE32.DLL — механизм запросов QBE;
口 IDWQL32.DLL — механизм запросов SQL;
IDASCII32.DLL — драйвер ASCII для работы с текстовым форматом таблиц;
IDPDX32.DLL — драйвер Paradox;
口 IDDBAS32.DLL — драйвер dBase;
IDODBC32.DLL — драйвер сокетов ODBC (позволяет использовать ODBC 3.0);
口 IDR20009.DLL — файл ресурса сообщений об oiniiokax;
IDDAO32.DLL — драйвер для Microsoft Access 95 и Jet Engine 3.0;
口 IDDA3532.DLL - драйвер для Microsoft Access 97 и Jet Engine 3.5;
口 IDDR32.DLL — хранилище данных;
BDEADMIN.EXE — утилита BDE Administrator, предназначенная для управления информацией о настройках, находящейся в системном реестре Windows, и о псевдонимах, содержащейся в файле IDAPI.CFG;
口; BDEADMIN.HLP — файл помощи для утилиты BDE Achninistralor;
BDEADMIN.CNT — таблица содержания файла BDEADMIN.HLP;
口 BDE32.HLP — файл справки по BDE;
Q BDE32.CNT — таблица содержания файла BDE32.HLP;
Q IDAPI.CFG — файл содержит специфичную коп(])шурацш()BDE, а также сведения о первоначальных псевдонимах баз данных;
*.BTL — служебная информация;
口 CHARSET.CVB — информация о преобразопаииях наборов символов.
Функции BDE API — набор функций для управления средой, конфигурацией, обработкой ошибок, работы с индексами, таблицами, транзакциями и т. д.
BDE Administrator — удобное средство для конфигурирования BDE: для регистрации драйверов и псевдонимов, задания формата данных и настройки драйверов BDE. Входит в состав ядра BDE.
Database Desktop — утилита, используемая для просмотра, создания и изменения структуры таблиц, а также для запуска запросов с помощью графического интерфейса.
Механизм запросов — средство выполнения запросов ANSI SQL 92. Включает в себя механизм запросов QBE (Query By Example, запрос по примеру).
Драйверы баз данных — пять стандартных драйверов баз данных различных форматов: Paradox, dBase, FoxPro, Microsoft Access и ASCII. Входят в состав ядра BDE.
Дополнительные драйверы — драйверы для поддержки других баз данных, которые могут подключаться по мере необходимости, а именно для InterBase, DB2, Informix, Oracle, Sybase н Microsoft SQL Server.
Связи ODBC — обеспечивают доступ к любым наборам данных, для которых были установлены драйверы ODBC.
Ииструмент;и1ьные средства и примеры — коллекция утилит, облегчающих разработку приложений» а также набор программ, демонстрирующих применение функций BDE.
Если вы используете в своем приложении BDE, то при распространении готового продукта вам придется включить в комплект поставки и BDE, хотя это н увеличивает объем дистрибутива. С другой стороны, на одном компьютере достаточно присутствия всего одной копии BDE. Причем желательно, чтобы имеющаяся версия была как можно более поздней. Но если вы хотите использовать различные версии BDE для разных программ, то каждую из них нужно размещать в той папке, которая является рабочей для данного приложения. Вообще говоря, о том, как приложение ищет главный файл BDE (IDAPI32.DLL), можно сказать следующее: сначала проверяется папка, в которойг установлено приложение. Если там файл не найден, то происходит обращение к ключу реестра Windows НKEY_LOCAL_MACHINЕ/ SOFTWARE/Borland/Database Engine/DLLPATH/xxxxx. Если в реестре нет информации о местонахождении файла, производится дополнительный поиск в такой последовательности:
проверяется текущая папка;
если файл не найден, то сканируется папка System;
если снова файл не найден, проверяется папка Windows;
наконец, анализируются описания PATH в файле Autoexec.bat.
ВНИМАНИЕ;
Загрузка BDE из папки, в которой установлено приложение, может быть полезна в некоторых случаях. Однако необходимо предупредить о потенциальной проблеме при запуске других приложений, которые также используют собственный BDE (находящийся там же, где и само приложение). Это может вызвать ошибку инициализации. Будьте внимательны!
BDE резервирует определенные адреса памяти для загрузки своих файлов (табл. 4.1).
Таблица 4.1. Адреа загрузки файлов BDE
Файл BDE
Адреса
IDAPI32.DLL
0X4BDE0000
IDPDX32.DLL
0X4CDE0000
IDDBAS32.DLL
0X4DDE0000
IDASCI32.DLL
0X4EDE0000
В случае, когда невозможно загрузить файлы в указанное адресное пространство, они помещаются по другим адресам.
Как видно из представленных комментариев к файловому составу BDE, этот процессор баз данных использует архитектуру, основанную на драйверах (driver-based architecture).
Настройка BDE
Для настройки и конфигурирования BDE применяется специальная программа, которая называется BDE Administrator.
Программа BDE Administrator
Эта программа по умолчанию устанавливается в панку Program Files\Common Files\ Borland Shared\BDE и носит имя bdeadmin.exe. После ее запуска на экране вашего монитора появится окно такого вида, как показанно на рис. 4.1.
Рис. 4.1. Главное окно программы BDE Administrator
Главное окно программы BDE Administrator состоит из двух основных областей. В левой части при первоначальном запуске (активна закладка Databases) отображаются все зарегистрированные в системе псевдонимы баз данных. Справа выводится информация о выбранной в левой части базе данных, например, как на рис. 4.2.
Л BOE AcfamnWala C \Rw F^mWmmmm htet\B««Und %■,「FDEVDAPLOaЛ BOE AcfamnWala C \Rw F^mWmmmm htet\B««Und %■,「FDEVDAPLOa6a д*мж MS Аса EeMA»««>MViKMiFc T«(Vm4w Vicud FoAr: 中*V»(fiASE 9^V*i<£Me-Word 中《A/iEl Ф^ы Fc6o • Wa66a д*мж MS Аса EeMA»««>MViKMiFc T«(Vm4w Vicud FoAr: 中*V»(fiASE 9^V*i<£Me-Word 中《A/iEl Ф^ы Fc6o • Wa6M*i^|M*i^|DEFAULT DRIVEREKABL^理 RATH —DEFAULT DRIVEREKABL^理 RATH —(УЙЯ - 0 ^k*. Cfjeftom gdp E X •“■・W(УЙЯ - 0 ^k*. Cfjeftom gdp E X •“■・WQ *ф-шф-|£е-&甘曲Q *ф-шф-|£е-&甘曲MUbMMlo^M^IMUbMMlo^M^IDel«OD IBgiDel«OD IBgiSTANDARD j: PARADOXSTANDARD j: PARADOXFALSECAFragam FiwXCommon F4»t\Bortar>d SIwedSDaleFALSECAFragam FiwXCommon F4»t\Bortar>d SIwedSDale
Л BOE AcfamnWala C \Rw F^mWmmmm htet\B««Und %■,「FDEVDAPLOa
Л BOE AcfamnWala C \Rw F^mWmmmm htet\B««Und %■,「FDEVDAPLOa
6a д*мж MS Аса EeMA»««>MViKMiFc T«(Vm4w Vicud FoAr: 中*V»(fiASE 9^V*i<£Me-Word 中《A/iEl Ф^ы Fc6o • Wa6
6a д*мж MS Аса EeMA»««>MViKMiFc T«(Vm4w Vicud FoAr: 中*V»(fiASE 9^V*i<£Me-Word 中《A/iEl Ф^ы Fc6o • Wa6
M*i^|
M*i^|
DEFAULT DRIVER
EKABL^理 RATH —
DEFAULT DRIVER
EKABL^理 RATH —
(УЙЯ - 0 ^k*. Cfjeftom gdp E X •“■・W
(УЙЯ - 0 ^k*. Cfjeftom gdp E X •“■・W
Q *ф-шф-|£е-&甘曲
Q *ф-шф-|£е-&甘曲
MUbMMlo^M^I
MUbMMlo^M^I
Del«OD IBgi
Del«OD IBgi
STANDARD j: PARADOX
STANDARD j: PARADOX
FALSE
CAFragam FiwXCommon F4»t\Bortar>d SIwedSDale
FALSE
CAFragam FiwXCommon F4»t\Bortar>d SIwedSDale
Рис. 4.2. Информация о демонстрационных базах данных Delphi
Информацию как в одной, так м в другой части главного окна программы BDE Administrator можно редактировать. Все внесенные изменения будут сохранены в файле IDAPI32.CFG.
Кроме закладки Databases (Базы данных) в левой части главного окна имеется еще одна закладка — Configuration (Конфигурация). С ее помощью можно просматривать и редактировать сведения о драйверах (включая ODBC) и о системе (рис. 4.3). Изменение системной информации позволяет регулировать некоторые специфические настройки для работы приложений баз данных.
Давайте рассмотрим теперь все возможности программ* BDE Administrator более подробно.
Итак, с помощью данной программы можно настраивать:
псевдонимы баз данных (названия, типы, пути и т. д.);
драйверы баз данных (типы, языки и т. д.);
системные установки (форматы даты, времени, числовые и т. д.).
Рис. 4.3. Сведения об установленном драйвере Paradox
Для изменения текущего состояния параметра выберите в левой части BDE Administrator нужный объект. При этом в правой части окна появится соответствую- хций список параметров. Отменить сделанные изменения можно командой Cancel (Отменить) главного меню BDE Administrator Object ♦ Cancel (Объект ♦ Отменить) или с помощью такой же команды контекстного меню (вызываемого нажатием правой кнопки мыши на измененном параметре или объекте). Закрепить изменения можно с помощью команды Apply, которая также имеется как в главном, так и в контекстном меню.
Для создания нового объекта выберите в главном меню пункт New (Создать). Например, при добавлении нового драйвера ODBC нужно перейти в левой части окна BDE Administrator в раздел ODBC и выбрать Object ► New (Объект ♦ Создать) или щелкнуть правой кнопкой мыши н выбрать в контекстном меню пункт New. Еще один вариант — нажатие комбинации клавиш Ctrl+N. После этого на экране появится окно добавления нового объекта, в нашем случае — ОDВС-драйвера (рис. 4.4).
Для удаления выбранного обьекта выберите пункт главного меню Object ► Delete (Объект ♦ Удалить). Кроме того# можно воспользоваться соответствующим пунктом контекстного меню или знаком косого креста на панели инструментов BDE Administrator.
ПРИМЕЧАНИЕ
Не все объекты можно просто удалить из программы. Выбор объектов, заблокированных для удаления, не сделает доступными пункты Delete указанных меню.
Рис. 4.4. Добавление нового ODBC-драйвера
Для отображения текущего состояния объектов левой части окна BDE Administrator используются следующие обозначения:
зеленый квадрат — объект открыт для просмотра;
зеленыII треугольник — объект в режиме редактирования;
зеленый треугольник с красными лучами — только что созданный объект, находящийся в режиме редактирования и еще не сохраненный в файле конфигурации,
красный треугольник — нзмсненн只.сделанные в данном объекте, являются некорректными, и он не может быть сохранен;
красный треугольник с красным» лучами —)ювый объект, находящийся в режиме редактирования и еще не сохраненный в файле конфигураций, у которого некоторые параметры содержат некорректные значения.
Параметры драйверов и конфигураций
Для задания или изменения параметров используемых драйверов и системных установок в программе BDE Administrator перейдите на закладку Configuration ее главного окна. После чего навдитс нужный драйвер или системный параметр и измените значения параметров, отображаемых справа от выбранного объекта.
Рассмотрим основные параметры драйвера dBase (рис. 4.5).
VERSION — текущая версия установленного драйвера (в нашем случае — версия 4.0).
TYPE — тип использ; мого драйвера. Обычно может принимать два значения:
□ FILE — для локальных баз данных;
口 SERVER — для клиент-сервсриых баз данных.
LANGDRIVER — тип используемого драйвера для кодирования символов таблиц базы данных. Рекомендуем использовать кириллические шрифты, например,
для драйвера dBase — dBase RUS ср866. Это необходимо для правильного отображения символов русского алфавита в приложениях, а также для корректных сортировки и преобразования записей. •
LEVEL — тип используемого формата таблиц базы данных для создания временных таблиц dBase. Может принимать значения:
7 — для формата таблиц dBase 7.0 (по умолчанию);
口 5 — для формата таблиц dBase 5.0;
4 — для формата таблиц dBase 4.0;
3 — для формата таблиц dBase III и dBase III PLUS.
®尸 f 肥* 8吋 *^ [g 又"、—‘一®尸 f 肥* 8吋 *^ [g 又"、—‘一总总3叫6 о Ж FormM总总3叫6 о Ж FormM-fb 瀛,^源■F-fb 瀛,^源■FCM>Mlfen.|CM>Mlfen.|5£ 4;;, - " I,■'.[ ■■:•党一号 ";У5£ 4;;, - " I,■'.[ ■■:•党一号 ";У1 0..硬50^W«bwt ^*^1 0..硬50^W«bwt ^*^Рис. 4.5. Драйвер dBase и его параметрыРис. 4.5. Драйвер dBase и его параметры百 Q Dover*白6 2.-© WflADOX esa @ FOXPRO i I '-^ MSACCESS @ MSSQL ⑥ SYBASE':G tNFDRMK ,卜 @!MR8ASE G DB2 G ORAOE 外电ODBC G SQL Saw & Mcrowft Accet* Onvw Г tndbi & Mcmoft 2 Dwet ГМ" @ Mootoft Excel Dnvw Г**1 @ МегшоЙ <fim Dnvgt f jftiO ф МспмоП PeadOK Dnvet (* ft) ,& МкжжоЛ Vituai Fafto Oww @ McracoR ODBC fa Orecto 0 Microcoft <вме VFF Dn*e Г d G Miainoft FcM^oVFPDfww Г百 Q Dover*白6 2.-© WflADOX esa @ FOXPRO i I '-^ MSACCESS @ MSSQL ⑥ SYBASE':G tNFDRMK ,卜 @!MR8ASE G DB2 G ORAOE 外电ODBC G SQL Saw & Mcrowft Accet* Onvw Г tndbi & Mcmoft 2 Dwet ГМ" @ Mootoft Excel Dnvw Г**1 @ МегшоЙ <fim Dnvgt f jftiO ф МспмоП PeadOK Dnvet (* ft) ,& МкжжоЛ Vituai Fafto Oww @ McracoR ODBC fa Orecto 0 Microcoft <вме VFF Dn*e Г d G Miainoft FcM^oVFPDfww ГVERSION4 0TYPEFILELANGDRft^R ""-«с?ANSILEVEL…f”MDX8L0CKS2T二I二 1024曲而而上610氏金Ё 一 "- ;1024VERSION4 0TYPEFILELANGDRft^R ""-«с?ANSILEVEL…f”MDX8L0CKS2T二I二 1024曲而而上610氏金Ё 一 "- ;1024
®尸 f 肥* 8吋 *^ [g 又"、—‘一
®尸 f 肥* 8吋 *^ [g 又"、—‘一
总总3叫6 о Ж FormM
总总3叫6 о Ж FormM
-fb 瀛,^源■F
-fb 瀛,^源■F
CM>Mlfen.|
CM>Mlfen.|
5£ 4;;, - " I,■'.[ ■■:•党一号 ";У
5£ 4;;, - " I,■'.[ ■■:•党一号 ";У
1 0..硬50^
W«bwt ^*^
1 0..硬50^
W«bwt ^*^
Рис. 4.5. Драйвер dBase и его параметры
Рис. 4.5. Драйвер dBase и его параметры
百 Q Dover*
白6 2.
-© WflADOX esa @ FOXPRO i I '-^ MSACCESS @ MSSQL ⑥ SYBASE
':G tNFDRMK ,卜 @!MR8ASE G DB2 G ORAOE 外电ODBC G SQL Saw & Mcrowft Accet* Onvw Г tndbi & Mcmoft 2 Dwet ГМ" @ Mootoft Excel Dnvw Г**1 @ МегшоЙ <fim Dnvgt f jftiO ф МспмоП PeadOK Dnvet (* ft) ,& МкжжоЛ Vituai Fafto Oww @ McracoR ODBC fa Orecto 0 Microcoft <вме VFF Dn*e Г d G Miainoft FcM^oVFPDfww Г
百 Q Dover*
白6 2.
-© WflADOX esa @ FOXPRO i I '-^ MSACCESS @ MSSQL ⑥ SYBASE
':G tNFDRMK ,卜 @!MR8ASE G DB2 G ORAOE 外电ODBC G SQL Saw & Mcrowft Accet* Onvw Г tndbi & Mcmoft 2 Dwet ГМ" @ Mootoft Excel Dnvw Г**1 @ МегшоЙ <fim Dnvgt f jftiO ф МспмоП PeadOK Dnvet (* ft) ,& МкжжоЛ Vituai Fafto Oww @ McracoR ODBC fa Orecto 0 Microcoft <вме VFF Dn*e Г d G Miainoft FcM^oVFPDfww Г
VERSION4 0
TYPEFILE
LANGDRft^R ""-«с?ANSI
LEVEL…f”
MDX8L0CKS2T二I二 1024
曲而而上610氏金Ё 一 "- ;1024
VERSION4 0
TYPEFILE
LANGDRft^R ""-«с?ANSI
LEVEL…f”
MDX8L0CKS2T二I二 1024
曲而而上610氏金Ё 一 "- ;1024
■ MDX BLOCK SIZE — объем памяти на диске в байтах, зарезервированный для файлов *.mdx. Может принимать произвольное числовое значение, кратное 512. По умолчанию — 1024.
■ MEMO FILE BLOCK SIZE — объем памяти на диске в байтах, зарезервированный для файлов *.dbt Может принимать произвольное числовое значение, кратное 512. По умолчанию — 1024.
ПРИМЕЧАНИЕ
Параметры, выделенные полужирным начертанием, являются неизменяемыми.
空 BDE Да^мШЫш t:\HfO9MB FA^VComMan ₽йм\8ос^м< Sb …,# EMOAH CFG空 BDE Да^мШЫш t:\HfO9MB FA^VComMan ₽йм\8ос^м< Sb …,# EMOAH CFGVERSION:4.0TYPE 二—~^SERVER0LL32—二一迎6f^320tl……VERSION:4.0TYPE 二—~^SERVER0LL32—二一迎6f^320tl……VENDOR INIT 7 :丽47血r一" … ".DRrVER FLAGS :… …~TRACE MDDE …二“BATCH COUNT' ?血—VENDOR INIT 7 :丽47血r一" … ".DRrVER FLAGS :… …~TRACE MDDE …二“BATCH COUNT' ?血—i^od Ее У** Ой^* -吋届X9「If 亠一{^r^i^Si)^“* [iefr^a?^ ОЙ^ЙЕ:■Detobw» Си*в««сл|0«₽г4мж |i^od Ее У** Ой^* -吋届X9「If 亠一{^r^i^Si)^“* [iefr^a?^ ОЙ^ЙЕ:■Detobw» Си*в««сл|0«₽г4мж |Рис. 4.6. Драйвер Oracle и его параметрыРис. 4.6. Драйвер Oracle и его параметрыЕ >^ CorhjMMon白►Qj Dnvat« "@ NaM G РАЯАООХ I : 2 Г-G DBASE ©FOXPRO e i- © MSACCESS I ? 1 G MSSOL .j e SYBASE 0 INFORMS ◎ INTRBASE:r G DB2 Gui—м6 Q ODBC e SQL Serve 。MiaotoHAccew Drivat (* <ndb| О МюогоП Tejd Dfiv« [*M, @ Mctawft Excel Drive (*闺 j-❸ Меямой(бме Dww Г <V) ◎ Miaotoft Patedcat Ой*« Г.Л С Mcrocoft Vi>u4l РоЛо Dnver ◎ Mcioraft ODBC lot Sade ❸ MjatxcftcBMeVFP Driver (*.<! ❸ Mcfcwft F«f*roVFPDnve p. Й-Д SytonЕ >^ CorhjMMon白►Qj Dnvat« "@ NaM G РАЯАООХ I : 2 Г-G DBASE ©FOXPRO e i- © MSACCESS I ? 1 G MSSOL .j e SYBASE 0 INFORMS ◎ INTRBASE:r G DB2 Gui—м6 Q ODBC e SQL Serve 。MiaotoHAccew Drivat (* <ndb| О МюогоП Tejd Dfiv« [*M, @ Mctawft Excel Drive (*闺 j-❸ Меямой(бме Dww Г <V) ◎ Miaotoft Patedcat Ой*« Г.Л С Mcrocoft Vi>u4l РоЛо Dnver ◎ Mcioraft ODBC lot Sade ❸ MjatxcftcBMeVFP Driver (*.<! ❸ Mcfcwft F«f*roVFPDnve p. Й-Д SytonBLOB SIZE32BLOBS TO CACHE64 ' ~ ~ENABLE BCD 二二 -FALSE ~ ' ~ENABLE INTEGERS 二二 乳S?二 二"ENABLE SCHEMA CACHE: FALSE二面由函府CUST SYNONYMS 二 承端MAX ROWS1NET PflDTOCDLTNSOBJECT MODE:TRUEOPEN MODE!READAVRITERUWSET SIZE' — :2Й,…SCHEMA CACHE Dlfi"…二:""二'二:二"SCHEMA CACHE SEE 二.6 二SCHEMA CACHE TIMET-iSERVER NAME …ORA一SERVER SQLPASSTHRU MODE SHAPED AUTOCOMMIT SQLQRYMODE ?—USER NAME 二一二,ЙГ?ЙЙЕ 二一BLOB SIZE32BLOBS TO CACHE64 ' ~ ~ENABLE BCD 二二 -FALSE ~ ' ~ENABLE INTEGERS 二二 乳S?二 二"ENABLE SCHEMA CACHE: FALSE二面由函府CUST SYNONYMS 二 承端MAX ROWS1NET PflDTOCDLTNSOBJECT MODE:TRUEOPEN MODE!READAVRITERUWSET SIZE' — :2Й,…SCHEMA CACHE Dlfi"…二:""二'二:二"SCHEMA CACHE SEE 二.6 二SCHEMA CACHE TIMET-iSERVER NAME …ORA一SERVER SQLPASSTHRU MODE SHAPED AUTOCOMMIT SQLQRYMODE ?—USER NAME 二一二,ЙГ?ЙЙЕ 二一
空 BDE Да^мШЫш t:\HfO9MB FA^VComMan ₽йм\8ос^м< Sb …,# EMOAH CFG
空 BDE Да^мШЫш t:\HfO9MB FA^VComMan ₽йм\8ос^м< Sb …,# EMOAH CFG
VERSION:4.0
TYPE 二—~^SERVER
0LL32—二一迎6f^320tl……
VERSION:4.0
TYPE 二—~^SERVER
0LL32—二一迎6f^320tl……
VENDOR INIT 7 :丽47血r一" … ".
DRrVER FLAGS :… …~
TRACE MDDE …二“
BATCH COUNT' ?血—
VENDOR INIT 7 :丽47血r一" … ".
DRrVER FLAGS :… …~
TRACE MDDE …二“
BATCH COUNT' ?血—
i^od Ее У** Ой^* -吋
届X9「If 亠一
{^r^i^Si)^“* [iefr^a?^ ОЙ^ЙЕ:
■Detobw» Си*в««сл|0«₽г4мж |
i^od Ее У** Ой^* -吋
届X9「If 亠一
{^r^i^Si)^“* [iefr^a?^ ОЙ^ЙЕ:
■Detobw» Си*в««сл|0«₽г4мж |
Рис. 4.6. Драйвер Oracle и его параметры
Рис. 4.6. Драйвер Oracle и его параметры
Е >^ CorhjMMon
白►Qj Dnvat« "@ NaM G РАЯАООХ I : 2 Г-G DBASE ©FOXPRO e i- © MSACCESS I ? 1 G MSSOL .j e SYBASE 0 INFORMS ◎ INTRBASE
:r G DB2 Gui—м
6 Q ODBC e SQL Serve 。MiaotoHAccew Drivat (* <ndb| О МюогоП Tejd Dfiv« [*M, @ Mctawft Excel Drive (*闺 j-❸ Меямой(бме Dww Г <V) ◎ Miaotoft Patedcat Ой*« Г.Л С Mcrocoft Vi>u4l РоЛо Dnver ◎ Mcioraft ODBC lot Sade ❸ MjatxcftcBMeVFP Driver (*.<! ❸ Mcfcwft F«f*roVFPDnve p. Й-Д Syton
Е >^ CorhjMMon
白►Qj Dnvat« "@ NaM G РАЯАООХ I : 2 Г-G DBASE ©FOXPRO e i- © MSACCESS I ? 1 G MSSOL .j e SYBASE 0 INFORMS ◎ INTRBASE
:r G DB2 Gui—м
6 Q ODBC e SQL Serve 。MiaotoHAccew Drivat (* <ndb| О МюогоП Tejd Dfiv« [*M, @ Mctawft Excel Drive (*闺 j-❸ Меямой(бме Dww Г <V) ◎ Miaotoft Patedcat Ой*« Г.Л С Mcrocoft Vi>u4l РоЛо Dnver ◎ Mcioraft ODBC lot Sade ❸ MjatxcftcBMeVFP Driver (*.<! ❸ Mcfcwft F«f*roVFPDnve p. Й-Д Syton
BLOB SIZE32
BLOBS TO CACHE64 ' ~ ~
ENABLE BCD 二二 -FALSE ~ ' ~
ENABLE INTEGERS 二二 乳S?二 二"
ENABLE SCHEMA CACHE: FALSE二
面由函府C
UST SYNONYMS 二 承端
MAX ROWS1
NET PflDTOCDLTNS
OBJECT MODE:TRUE
OPEN MODE!READAVRITE
RUWSET SIZE' — :2Й,…
SCHEMA CACHE Dlfi"…二:""二'二:二"
SCHEMA CACHE SEE 二.6 二
SCHEMA CACHE TIMET-i
SERVER NAME …ORA一SERVER SQLPASSTHRU MODE SHAPED AUTOCOMMIT SQLQRYMODE ?—
USER NAME 二一二,ЙГ?ЙЙЕ 二一
BLOB SIZE32
BLOBS TO CACHE64 ' ~ ~
ENABLE BCD 二二 -FALSE ~ ' ~
ENABLE INTEGERS 二二 乳S?二 二"
ENABLE SCHEMA CACHE: FALSE二
面由函府C
UST SYNONYMS 二 承端
MAX ROWS1
NET PflDTOCDLTNS
OBJECT MODE:TRUE
OPEN MODE!READAVRITE
RUWSET SIZE' — :2Й,…
SCHEMA CACHE Dlfi"…二:""二'二:二"
SCHEMA CACHE SEE 二.6 二
SCHEMA CACHE TIMET-i
SERVER NAME …ORA一SERVER SQLPASSTHRU MODE SHAPED AUTOCOMMIT SQLQRYMODE ?—
USER NAME 二一二,ЙГ?ЙЙЕ 二一
Теперь рассмотрим параметры драйвера удаленных баз данных Oracle (рис. 4.6).
■ VERSION — текущая версия установленного драйвера (в нашем случае — версия 4,0).
■ TYPE — тип используемого драйвера. Обычно может принимать два значения: □ FILE — для локальных баз данных;
□ SERVER — для кл иент-серверных баз данных.
■ DLL32 — задает драйвер SQL Links для доступа к базе данных. В нашем случае 一 SQLORA32.DLL
■ VENDOR INIT — содержит название файла драйвера поставщика базы данных. Для Oracle 7 и 8 используются драйверы ORA73.DLL и OCI.DLL соответственно.
■ DRIVER FLAGS — внутренние, специфичные для драйвера флаги. Не изменяйте значение данного параметра самостоятельно! По умолчанию имеетзначение NULL
■ TRACE MODE — числовой параметр, представляющий собой битовую маску. Указывает» какие значения будут записываться в файл журнала в режиме трассировки. Возможные варианты (в шести адцатерггчной системе счисления): □ 1 — подготавливаемые выражения запросов (по умолчанию);
2 — выполняемые выражения запросов;
4 — ошибки;
8 — параметры операторов;
10 — соеди нение-разрыв связи;
20 — транзакции;
口 40 — операции ввода-вывода, связанные с BLQB-объектами;
80 — прочее;
100 — внутренние вызовы.
BATCH COUNT — число измененных записей, которые могут объединяться в пакет для отправки на сервер базы данных.
BLOB SIZE — определяет размер буфера (в килобайтах) для работы с BLOB-объектами. Может принима ть значения о г 32 до 1000.
BLOBS ТО CACHE — определяет, сколько записей, содержащих данные BLOB, может кэшировать приложение-клиент. Дипазо» принимаемых значений от 64 до 65 535.
ENABLE BCD — предписывает, будет ли использоваться формат BCD для Представления чисет в таблицах базы данных. По умолчанию имеет значение false, то есть формат BCD не используется. Если установить данный параметр в true, то операции с числами будут выполняться более точно, но скорость работы с таблицами замедлится.
ENABLE INTEGERS — уточняет, нужно ли преобразовывать поля типа NUMERIC в логические целые числа.
ENABLE SCHEMA CACHE 一 указывает, будет ли схема таблиц сервера базы данных кэшироваться на компьютерах клиента. По умолчанию установлен false — схема не кэшируется. Если вы работаете с Oracle 8, установите данный параметр в false.
LANGDRIVER — нужен для указания языкового драйвера. По умолчанию имеет пустое значение.
LIST SYNONYMS — регламентирует, нужно ли вк/ючать синонимы в схему таблиц при их отображении.
MAX ROWS — определяет максимальное число записей, которые могут быть получены от сервера базы данных при одном запросе к пому. По умолчанию установлено значение-1, что означает отсутствие ограничений на число записей.
NET PROTOCOL — используемый сетевой протокол для связи клиентов и сервера базы данных.
OBJECT MODE - логический параметр должен иметь значение true для работы с Oracle 8. Это обеспечит доступ к некоторым типам объектов. В случае использования более ранних версий Oracle можно установить этот параметр в false.
OPEN MODE — режим доступа к данным. По умолчанию имеет значение READ/ WRITE, что позволяет как чтение, так и изменение записей. Возможна установка в READ ONLY, если требуется только просматривать записи.
ROWSET SIZE 二 определяет число записей, которые считываются с сервера при одном запросе к нему. По умолчанию равен 20.
SCHEMA CACHE DIR — задает папку, в которой будет храниться кэшированная схема таблиц сервера базы данных. По умолчанию значение не определено.
SCHEMA CACHE SIZE — количество таблиц, схема которых может быть кэши^ювапа. Диапазон значений от 0 до 32, по умолчанию 一 8.
SCHEMA CACHE TIME — задает время хранения кэшированной схемы таблиц. Может принимать значения:
-1 — информация о таблицах хранится до тех пор, пока база данных открыта (по умолчанию);•
0 — информация нс кэшируется;
1—2 147 483 647 — информация кэшируется столько секунд, сколько указано.
SERVER NAME — имя удаленного сервера базы данных.
SQLPASSTHRU MODE — определяет способ взаимодействия BDE и сервера базы данных на уровне транзакций.
SQLQRYMODE — режим выполнения SQL-запросов. Может принимать следующие значения:
LOCAL — запрос выполняется локально на клиентском компьютере;
SERVER — запрос выполняется на сервере;
по умолчанию установлено пустое значение. Это означает» что сначала запрос отправляется на сервер, и если сервер не может обеспечить его выполнение, то запрос вьшолняется на компьютере клиента.
USER NAME — определяет имя пользователя, которое будет содержаться в поле имени пользователя при установке соединения с удаленной базой данных. По умолчанию имеет значение MYNAME.
Рассмотрим теперь системные установки. Они делятся на установки по умолчанию (INIT) и форматы (Formats).
Рис. 4.7. Параметры установок по умолчанию (1МГГ)
Параметры установок по умолчанию (рис. 4.7):
AUTO ODBC — указывает, нужно ли импортировать установленные ODBC-драйверы и источники данных всякий раз при инициализации BDE. По умолчанию имеет значение false;
DATA REPOSITORY — содержит имя активного словаря данных;
DEFAULT DRIVER — драйвер, который устанавливается по умолчанию для каждой новой локальной базы данных. До внесения изменений имеет значение PARADOX;
LANGDRIVER — системный драйвер языка. Рекомендуется поставить какой-либо из кириллических драйверов для корректной работы с русскими буквами;
LOCAL SHARE — определяет, могут ли несколько приложений одновременно получать доступ к записям из локальной базы данных. По умолчанию параметр установлен в false, то есть единовременный доступ к данным запрещен:
LOW MEMORY USAGE LIMIT — нижний предел задействуемой BDE нижней памяти в килобайтах. По умолчанию — 32;
MAXBUFSIZE — максима.чьный размер памяти в килобайтах для кэширования данных. Может принимать любое целое значение в пределах от MINBUFSIZE до 65535 и кратное 128. По умолчанию равен 2048;
MAXFILEHANDLES - предельно-допустимое число дескрипторов файлов, которые будут использоваться BDE. Может принимать любое целое значение в пределах от 5 до 4096. Большие значения увеличивают производительность программы, но занимают больше ресурсов Windows. Значение по умолчанию — 48;
MEMSIZE — максимальный объем оперативной памяти в мегабайтах, который может использовать BDE. Значение по умолчанию — 16. Граничная величина — 205. Если вы установите значение более 205, под нужды BDE все равно будет выделено 205 Мбайт;
MINBUFSIZE — минимальное значение оперативной памяти в килобайтах для кэширования данных. Может принимать любое целое значение в пределах от 32 до 65 535. Должно быть меньше, чем весь объем доступной в Windows оперативной памяти. По умолчанию равно 128;
MTS POOLING — определяет, применять ли MTS-пул для более быстрого начала соединения с базой данных при ее открытии. По умолчанию — false;
SHAREDMEMLOCATION — указывает местонахождение (в оперативной памяти) менеджера разделения памяти;
SHAREDMEMSIZE — максимальный объем памяти в килобайтах, которая будет использована BDE для хранения разделяемых ресурсов. Больше или равен минимальному значению — 2048;
SQLQRYMODE — задает метод выполнения SQL-запросов;
SYSFLAGS — внутренние флаги BDE. Не изменяйте находящееся в этом параметре значение;
VERSION — текущая версия данного BDE.
Системные установки форматов разделяются на форматы даты, форматы времени и числовые форматы.
Рис. 4.8. Параметры форматов даты
Параметры форматов даты (рис. 4.8):
FOURDIGITYEAR — определяет, будут ли для отображения года использоваться четыре цифры. Если значение true — будет использоваться расширенное представление, иначе — две цифры (по умолчанию);
LEADINGZEROD — указывает, будет ли добавляться к дню незначащий ноль. Например, 05 для пятого числа. Если true» то будет, иначе — нет;
LEADINGZEROM — то же, что и LEADINGZEROD, только для месяца;
MODE — уточняет расположение года (Г), дня (Д) и месяца (М) в числовом представлении даты. Может принимать следующие значения:
0 - МДГ;
1 - ДМ Г;
2 - ГМД;
SEPARATOR — символ, который будет использоваться для разделения дня, месяца и года. По умолчанию используются текущие настройки Windows;
YEARBIASED — объявляет способ преобразования номера года, заданного двумя цифрами. Если параметр установлен в true, то к двузначному числу прибавляется 1900, иначе — значение года не изменяется.
Параметры форматов времени (рис. 4.9):
AMSTRING — определяет символы, которые применяются для отображения времени до полудня. По умолчанию — АМ;
MILSECONDS — указывает, будут ли отображаться миллисекунды. По умолчанию имеет значение false» то есть миллисекунды не выводятся;
PMSTRING — определяет символы, которые применяются для отображения времени после полудня. По умолчанию — РМ;
SECONDS — указывает, будут ли отображаться секунды. По умолчанию установлено в true, то есть секунды отображаются;
TWELVEHOUR — определяет формат вывода времени. Если параметр равен true, то время будет представляться 24-часовым циклом, иначе — 12-часовым.
*С^1Ш*С^1ШРис. 4.9. Параметры форматов времениРис. 4.9. Параметры форматов времени* BDEA&riWhM「5реГав*М:«11Ю1»*еЛ80tbnd $2.「尽 EUDAR CF&* BDEA&riWhM「5реГав*М:«11Ю1»*еЛ80tbnd $2.「尽 EUDAR CF&
*С^1Ш
*С^1Ш
Рис. 4.9. Параметры форматов времени
Рис. 4.9. Параметры форматов времени
* BDEA&riWhM「5реГав*М:«11Ю1»*еЛ80tbnd $2.「尽 EUDAR CF&
* BDEA&riWhM「5реГав*М:«11Ю1»*еЛ80tbnd $2.「尽 EUDAR CF&
Параметры числовых форматов (рис. 4.10):
DECIMALDIGIT — число разрядов для дробной части чис-ча (после запятой). По умолчанию равно 2;
DECIMALSERARATOR — определяет символ (запятая), который будет разделять целую и дробную части числа при отображении. По умолчанию используется символ из системных настроек Windows;
LEADINGZERON — указывает, будет ли добавляться незначащий нуль к числам, меньшим единицы по модулю. По умолчанию установлен в false, то есть нуль не отображается;
THOUSANDSEPARATOR — определяет символ для разделения триад в целой части числа. По умолчанию используется символ из системных настроек Windows.
逸 BDEAduhator Г \Pw WKCowkw 心丛ВоЗУ §h*fSDZAECF&
曲ec*,上修.痴w Орйогч И<Ф ,,..亠■ . , 乂」■工.-^^
DECiMALDlGIIS.2DEOMALSEPAflATOR LEADmGZEHONTRUETHOUSANDSERARATOR J.DECiMALDlGIIS.2DEOMALSEPAflATOR LEADmGZEHONTRUETHOUSANDSERARATOR J.Chw м3 Sjm*M,■謚&a Й^^F*4m €i*母e] •d ,:「痴心叩Chw м3 Sjm*M,■謚&a Й^^F*4m €i*母e] •d ,:「痴心叩
DECiMALDlGIIS.2
DEOMALSEPAflATOR LEADmGZEHONTRUE
THOUSANDSERARATOR J.
DECiMALDlGIIS.2
DEOMALSEPAflATOR LEADmGZEHONTRUE
THOUSANDSERARATOR J.
Chw м3 Sjm*M,■謚&a Й^^
F*4m €i*母e] •d ,:「痴心叩
Chw м3 Sjm*M,■謚&a Й^^
F*4m €i*母e] •d ,:「痴心叩
Oi«n»r»Ha«»-
Рис 4.10. Параметры числовых форматов
ВНИМАНИЕ
Все параметры, которые вы устанавливаете в программе BDE Administratoq действуют только на те приложения, которые работают с BDE.
Программа Database Desktop
Программа Database Desktop, так же как и BDE Administrator, входит в поставку Delphi. Она предназначена для создания новых таблиц баз данных (структур) и редактирования уже существующих, а также для работы с визуальными и SQL- запросами н псевдонимами баз данных.
Программу можно запустить из папки Program Files\Borland\Database Desktop, если вы устанавливали Delphi в папку по умолчанию. Имя файла программы — dbd32.exe. Можно ее запустить и непосредственно из Delphi, выбрав в главном меню Delphi пункт Tools ► Database Desktop (Инструменты ► Database Desktop).
Рассмотрим процесс создания новой таблицы базы данных. Запустите программу Database Desktop. Теперь выберите в ее главном меню пункт File ► New ► Table (Файл ► Создать ► Таблицу). После этого появится диалоговое окно (рис. 4.11)» в котором вам 1гужно будет выбрать тип создаваемой таблицы.
По умолчанию программа предлагает тип Paradox 7. Давайте для примера выберем тип dBase IV л нажмем кнопку ОК. В результате откроется новое окно создания структуры таблицы (рис. 4.12).
3 Заг 956
Рис. 4.11. Окно создания новой таблицы
Рис. 4.12. Окно создания структуры таблицы
Это окно позволяет:
создавать и описывать поля;
задавать ключевые поля;
задавать индексы;
накладывать ограничения на значения полей;
задавать пароли (если они поддерживаются);
указывать используемый языковой драйвер;
задавать таблицу для выбора значений.
Как мы с вами помним из занятия 1, реляционная таблица должна иметь хотя бы одно поле. Таким образом, наиболее важной функцией данного окна для нас является первая — создание н описание полей.
Определим структуру таблицы, которая будет иметь следующие поля:
поле порядкового номера записи — числовое, 10 знакомест;
символьное поле имени, длина строки 25 символов:
символьное поле фамилии, длина строки 25 символов;
символьное поле адреса, длина строки 150 символов;
поле телефонного номера — числовое, 10 знакомест.
Для этого в текстовом поле Field Name (Имя поля) окна создания структуры таблицы мы вводим название поля таблицы, например NUMBER для порядкового номера записи. Затем в поле Туре (Тип) указываем тип данных, которые будет содержать данное поле (в нашем случае — N, сокращение от слова Numeric). И, наконец, в текстовое поле Size (Размер) заносим размер поля (в нашем случае — 10). Описав таким образом всю структуру, мы увидим то, что изображено на рис. 4.13.
Cieate cfflASE IV Т«Ые ( UnUHed )
£idtf radec
Field Naire
4
WMB8R NAMH SUKMAME ADDRESS
♦ TEL
Right <Ьск « prew зрас^ж to ^«wte a field ge
Record focH - ^—J
厂 jntose» [ ■' '▼] i
Рис. 4.13. Определение структуры таблицы
После задания структуры мы можем определить индексные поля. Для этого нужно, чтобы в правой части окна создания структуры таблиц в выпадающем списке Table properties (Свойства таблицы) был выбран пункт Indexes (Индексы), как на рис. 4.13. Теперь нажмем кнопку Define (Определить), расположенную под раскрывающимся списком. Откроется окно определения индекса (рис. 4.14).
Рис. 4.14. Окно определения индекса
Выберем в качестве индексного поля поле NUMBER При этом обеспечим уникальность значений в нем, установив флажок Unique (Уникальные). Нажмем ОК. Все, теперь можно сохранять созданную нами структуру таблицы, которая пока не содержит никаких данных. Для этого нажмем кнопку Save As... (Сохранить как). Пусть по традиции наша таблица получит имя МуТаЫе.
Теперь мы можем использовать таблицу в своих программах. Например, мы вправе ее открыть и посмотреть содержимое с помощью Database Desktop. Для этого выберем пункт главного меню программы Database Desktop File ► Open ► Table... (Файл ► Открыть > Таблица). Мы можем видеть результат свое]】 работы на рис. 4.15.
Рис. 4.15. Таблица Mylable.dbf
Кроме непосредственного создания новой структуры таблицы, можно воспользоваться уже имеющейся структурой другой таблииы н скопировать ее в новую. Для этого воспользуйтесь кнопкой Borrow... (Заимствовать) в окне задания структуры таблицы. Вследствие ваших действий откроется окно выбора таблицы (рис. 4.16).
Рис. 4.16. Окно выбора таблицы для заимствования ее структуры
Кроме копирования данных о структуре полей, вы можете продублировать и дополнительную информацию. Например, информацию о первичном индексе и т. д.. установив соответствуюший флажок в параметрах.
Мы не будем останав刀нватьсх на тонкостях работы с программой Database Desktop сейчас. Рассмотрим такие темы, как работа с SQL-запросами и визуальное конструирование запросов, на следующих уроках.
Работа с псевдонимами баз данных
Псевдонимом (alias) базы данных называется специальное имя базы данных, служащее для обозначения каталога, в котором хранятся таблицы базы данных.
Наличие псевдонимов позволяет программисту писать приложения, не задумываясь над тем, куда будут помещены файлы таблиц базы данных. На практике будет использоваться псевдоним базы данных, а не указание непосредственного пути к таблицам. Таким образом, псевдонимы облегчают перенос файлов таблиц в другие папки и на другие компьютеры без изменения кода приложения.
Работа с псевдонимами в BDE Administrator
Для того чтобы создать новый псевдоним базы данных, выполните указанные ниже шаги.
В окне BDE Administrator перейдите на закладку Database (База данных).
Выберите пункт Object ► New (Объект ► Создать) в главном меню BDE Administrator.
После этого вы увидите диалоговое окно создания нового псевдонима базы данных (рис. 4.17).
Рис. 4.17. Окно создания нового псевдонима базы данных
В открывшемся окне необходимо выбрать тип драйвера базы данных. Если вы хотите создать псевдоним для таблиц Paradox или dBase локальной базы “анннх, используйте предлагаемый по умолчанию тип STANDARD. Для всех остальных типов таблиц выбирайте необходимый. Все поддерживаемые типы драйверов перечислены в раскрывающемся списке.
Нажав кнопку ОК, можно создать новый псевдоним для таблиц типа Paradox или dBase. После этого в левой части окна BDE Administrator появится новый объект SIANDARD1 (рис. 4.18).
Имя, залаваемое по умолчанию (SIANDARD1), можно изменить с помощью команды Rename контекстного меню или аналогичной команды главного меню BDE Administrator.
Рис. 4.18. Новый объект и его параметры
Как вы можете видеть, новый псевдоним для работы с локальными базами данных имеет всего три параметра (отображенных в правой части окна).
■ DEFAULT DRIVER — указывает на тин используемых таблиц базы данных (по умолчанию установлено значение PARADOX):
□ PARADOX — таблицы Paradox;
口 DBASE — таблицы dBase;
口 FOXPRO — таблицы FoxPro;
口 ASCIIDRV — таблицы в виде текстовых файлов.
ENABLE BCD — показывает, будет ли использоваться формат BCD для представления чисел в таблицах базы данных. По умолчанию имеет значение false, то есть формат BCD не поддерживается. Если установить этот параметр в true, то операции с числами будут выполняться более точно, но скорость работы с таблицами замедлится.
PATH — параметр содержит путь к базе данных, то есть адресует каталог» в котором находятся таблицы базы данных. По умолчанию конкретный путь не указан (пустое значение), поэтому нужно задавать его самостоятельно.
Таким образом, если ваша база данных имеет тип Paradox, то можно оставить первые два параметра так, как они заданы по умолчанию, и прописать путь в третий параметр, например:
C:\MyDB.
ПРИМЕЧАНИЕ
При задании новых псевдонимов для удаленных баз данных в окне BDE Administrator может отображаться больше трех параметров (обычно от десяти до тридцати).
Работать с псевдонимами баз ланных позволяют н другие программы, например приложение Database Desktop.
Работа с псевдонимами в Database Desktop
Возможность использовать псевдонимы в программе Database Desktop предоставляет инструментальное средство, которое называется Alias Manager (рис. 4.19).
Рис. 4.19. Окно Alias Manager
Покажем, как с помощью Alias Manager можно создавать новые псевдонимы. Для этого нажмите кнопку New. Затем введите название нового псевдонима в окне Database alias (Псевдоним базы данных), выберите тип драйвера и путь к каталогу базы данных. Для сохранения изменений используйте кнопку Save As.... По умолчанию вам будет предложено сохраиить изменения в файле конфигурации idapixfg. Для удаления псевдонима служит кнопка Remove (Удалить).
Программа Data Pump
Программа Data Pump предназначена для копирования данных из одной базы данных в другую. В терминах Delphi первая база данных называется источником, а вторая — приемником. В результате копирования в приемнике автоматически будут созданы таблицы с такими же именами, структурой и содержимым, что и в источнике.
Начать работать с программой Data Pump можно, используя пункт меню Пуск среды Windows Программы ► Borland Delphi б ► DataPump или же запустив исполняемый файл datapump.exe, устанавливаемый по умолчанию в каталог Program Files\Common FHes\Borland Shared\BDE.
При запуске программы вы проследуете по цепочке окон, переход между которыми осуществляется с помощью кнопок Next (Далее) и Back (Назад), внешне напоминающих кнопки обычного Мастера (Wizard). Первое окно, которое открывается при запуске программы, — это окно выбора псевдонима источника (рис. 4.20).
Рис. 4.20. Окно выбора псевдонима источника
В этом окне вы можете указать псевдоним базы данных, которая будет использована в качестве источника (Select by alias пате. Выбрать нс псевдониму), или задать папку* в которой расположены таблицы базы данных источника (Select by directory. Выбрать по папке).
После выбора источника нажимаем кнопку Next и нс!эеходим к следующему окну, которое позволяет выбрать псевдоним приемника (рис. 4.21).
Рис. 4.21. Окно выбора псевдонима приемника
Работа с этим окном аналогична работе с предыдущим, за исключением того, что псевдоним папки приемника должен быть отличен от псевдонима папки приемника. После выбора получателя нажимаем Next и переходим в окно выбора таблиц для перемещения (рис. 4.22).
Рис. 4.22. Окно выбора таблиц для перемещения
В этом окне предлагается выбрать таблицы, которые 举。次но скопировать.
На последнем шаге открывается окно проверки или изменения элементов (рис. 4.23).
Рис. 4.23. Окно проверки или изменения элементов
Изменить структуру можно при нажатии кнопки Modify table Name or Field Mapping Information For Selected Item (Изменить имя таблицы или информацию о расположении полей для выбранных единиц).
ПРИМЕЧАНИЕ
Изменение структуры будет осуществлено только в таблицах приемника и не затронет исходные таблицы.
При нажатии данной кнопки будет вызвано окно изменения полей и имени таблицы (рис. 4.24).
Рис. 4.24. Окно изменения полей и имени таблицы
В столбце Source (Источник) указаны значения исходной таблицы, а в столбце Target (Цель) — значения таблицы-приемника.
После проведенных изменений нажмите кнопку Upsize (Перенести). Программа Data Pump отобразит индикатор выполнения процесса копирования данных, затем выдаст отчет о результатах.
Архитектура dbExpress
DbExpress представляет собой кросс-платформенный независимый от используемой базы данных механизм, обеспечивающий выполнение динамических SQL-запросов. При его посредстве организуется общий интерфейс для доступа к различным SQL-серверам. Для каждого из поддерживаемых серверов dbExpress имеет драйвер, который действует как независимая библиотека dbExpress для выполнения запросов и хранимых процедур. Драйверы dbExpress доступны как из среды Windows в виде файлов *.dll, так и в среде Linux (файлы *.so). dbExpress не задействует все возможности BDE, но является более простым и удобным при распространении собственного продукта.
Ядро dbExpress содержит четыре интерфейса:
ISQLDriver — иннцимизирует механизм и захватывает необходимые ресурсы;
ISQLConnection — устанавливает соединение с базой данных;
■ ISQLCommand — обеспечивает выполнение методов для SQL-запросов и хранимых процедур;
■ ISQLCursor — содержит данные и метаданные. возв!кицаемые запросом или при выполнении хранимой процедуры.
Все вышеперечисленные интерфс11сы содержатся в модуле DBXpress.pas.
Более подробно работу с dbExpress мы рассмотрим на занятии, посвященном изучению компонентов для работы с локальными базами данных.
Что нового мы узнали?
На этом занятии мы узнали:
■ что такое BDE и его архитектура;
■ для чего нужны программы BDE Administrator it Database Desktop;
■ как создать новую таблицу:
■ как создать новьн) псевдоним базы данных;
■ для чего применяется программа Data Pump:
а также кратко познакомились с механизмом dbExpress.
Занятие 5
Палитра компонентов и работа с базами данных
Компоненты для работы с локальными базами данных
Операции с таблицами
Сортировка набора данных
Перемещение по набору данных
Фильтры
Поиск
На этом занятии вы познакомитесь с той частью палитры компонентов Delphi 7. которая содержит компоненты для работы с локальными наборами данных. Также мы рассмотрим основные операции над данными, такие как перемещение по записям, сортировка данных, фильтрация, добавление и ула;1снпе записей. В конце занятия мы изучим тонкости работы со связанными таблицами.
Компоненты для работы с локальными базами данных
Среда Delphi предоставляет разработчику набор компонентов, предназначенных для работы с локальными базами данных. Доступ к этим компонентам осуществляется с закладок палитры компонентов: Data Access (Доступ кдапным), Data Controls (Управление данными), dbExpress и BDE. Рассмотрим их последовательно. Начнем с закладки Data Access (рис. 5.1).
На этой закладке расположены шесть компонентов, которые обеспечивают работу с информацией, хранящейся в базе данных. Следует отмстить, что эти компоненты не связаны с каким-либо конкретным механизмом доступа к данным, таким как ВОЕ или dbExpress. В любом случае в своих прп/юженпях вам придется использовать некоторые компоненты для работы с даiшым 11 (например, компонент DataSource).
]3yigdl AddfexHt] WQ] $vt»m ОЫЬАсси» ]口覇aCoids] dbEw] 口姦莅I 而E JJLL
:旨次喳餾為碾正.-'胃
Рис. 5.1. Закладка Data Access
Итак, рассмотрим все шесть компонентов закладкн Data Access по порядку (слева направо).
Компонент DataSource (источник данных) работает как промежуточное звено и предназначен для связывания компонента набора данных (TDataSet) и компонента, отображающего данные (например, TDBGrid). Может применяться также для установки связи ^главный—подчиненный» между двумя наборами данных.
Свойства компонента DataSource, которые отображаются в окне инспектора объектов, мы уже рассматривали на занятии 3. Пиэюму перейдем сразу к изучению методов н событий.
Таблица 5.1 содержит названия методов компонента DataSource и их краткое описание.
Таблица 5.1. Методы компонента DataSource
Название метода
Краткое описание
Create
Создает экземпляр компонента типа TDataSource во время выполнения приложения
Destroy
Удаляет экземпляр компонента типа TDataSource во время выполнения приложения. Внимание! Не вызывайте сами метод Destroy, так как он не проверяет состояние свойства DataSet компонента. Вместо вызова данного метода используйте более безопасный метод Free
Edit
Если возможно, устанавливает набор данных, на который ссылается источник данных, в режим редактирования
Free
Корректно удаляет экземпляр объекта типа TDataSource во время выполнения приложения
ELinkecHo
Применяется для проверки, связан ли источник данных с указанным набором данных. Возвращает true, если связан, и false — в противном случае
Теперь рассмотрим события компонента DataSource (табл. 5.2). Все эти события можно увидеть, перейдя на закладку Events (События) в окне инспектора объектов при выбранном компоненте DataSource.
Таблица 5.2. События компонента DataSource
Событие
Краткое описание
OnDataChange
Происходит, когда данные в записи изменяются или при перемещении курсора на новую запись
OnStateChange
Возникает, если состояние набора данных, на который ссылается DataSource, изменяется. Например, при п^)еходе из режима просмотра (dsBrowse) в режим редактирования (dsEdit)
OnUpdateData
Наступает, когда ожидается обновление текущей записи, то есть перед посылкой текущей записи в базу данных
Следующий компонент закладки DataAccess - это ClientDataSet Этот компонент представляет собой независимый от типа базы данных набор данных.
Рассмотрим свойства компонента ClientDataSet, которые отображаются в окне инспектора объектов (табл. 5.3).
Таблица 5.3. Свойства компонента ClientDataSet
Название свойства
Тип свойства
Краткое описание
Active
Boolean
Определяет, является ли набор данных открытым. Если свойство имеет значение False, то набор данных закрыт и с данными ничего не может сделать ни пользователь, ни программа. Если свойство имеет значение True, то с данными можно осуществлять произвольные действия (изменять, добавлять, удалять и т. д.)
Aggregates
TAggregates
Содержит список всех агрегатов, которые имеет набор данных. Вы можете использовать это свойство для хранения объектов типа TAggregate, каждый из которых описывает формулу, по которой вычисляется агрегированное значение из группы записей клиентского набора данных
AggregatesActive
Boolean
Определяет, будет ли клиентский набор данных вычислять и поддерживать агрегированные значения
AutoCalcRelds
Boolean
Определяет, как будет осуществляться работа с автоматически вычисляемыми полями. Если значение свойства — True, то значения таких полей будут автоматически вычисляться в случае открытия набора данных, перевода набора данных в режим редактирования (dsEdit) или передачи фокуса с одного визуального компонента на другой или из одной колонки визуального компонента в другую
CommandText
String
Содержит запрос на языке SQL, который должен быть выполнен сервером базы данных
ConnectioriBroker
TConnectionBroker
Определяет брокер связи, который будет применяться для осуществления связи с сервером приложения
Constraints
TCheckConstraints
Определяет накладываемые ограничения на редактирование записей набора данных
DataSetR^ld
TDataSetField
Применяется, если набор данных является подчиненным по отношению к другому ——главному набору данных (отношение «master—detail»). Свойство содержит назва* ние поля главного набора данных, по которому производится связь главного и подчиненного набора данных
DisableStringTrim
Boolean
Определяет, будут ли незначащие пробелы во вновь введенном значении поля сохраняться в таблице базы данных или они будут отсекаться. Если значение свойства —false (по умолчанию), то незначащие пробелы в начале и конце значения будут удалены перед помещением записи в таблицу. Иначе значение записывается «как есть»
FetchOnDemand
Boolean
Указывает, будут ли пакеты данных считываться только тогда, когда они необходимы. Если значение данного свойства ——true (по умолчанию), пакеты данных будут считываться только в случае их необходимости (например, при перемещении на новую запись или при поиске)
FieldDefc
TReldDefc
Содержит описание списка полей набора данных. Служит для задания полей и их типов для набора данных
FileName
String
Определяет имя файла, который хранит записи клиентского набора данных
Название свойства
Тип свойства
Краткое описание
Filter
String
Назначает текущий фильтр для набора данных. Фильтр применяется для отбора и отображения нужных записей (удовлетворяющих каким-либо требованиям)
Filtered
Boolean
Указывает, будет ли применяться фильтр, указанный в свойстве Filter; к записям набора данных. Если значение свойства ——true, то фильтр будет задействован. Если false (по умолчанию), фильтр не используется
FilterOptions
TRIterOptions
Определяет, будет ли фильтр чувствителен к регистру символов и можно ли проводить частичные сравнения (то есть сравнения по нескольким символам, входящим в слово)
IndexDefs
TIndexDefs
Содержит информацию об индексах клиентского набора данных
IndexFieldNames
String
Содержит список полей набора данных, которые используются в качестве индексных
IndexName
String
Задает альтернативный индекс для клиентского набора данных. Если значение свойства не пустое, то при сортировке набора данных будет использоваться индексное поле, указанное 8 нем. Иначе будет производиться сортировка по одному из индексных полей, указанных в свойстве IndexFieldNames
MasterFields
String
Содержит имя одного или нескольких полей главной таблицы для связи их с соответствующими полями набора данных и установки отношения «master—detail»
MasterSource
TDataSource
Определяет компонент — источник данных типа TDataSource, свойство DataSet которого указывает на главную таблицу и устанавливает взаимоотношение «master—detail»
Name
TComponentName
Устанавливает имя набора данных, которое будет использоваться в коде приложения. По умолчанию присваиваются имена ClientDataSetl, ClientDataSet?, ClientDataSetN
Objectview
Boolean
Определяет, как в свойстве Fields будут храниться названия полей. Если значение свойства ——true (по умолчанию), то поля будут храниться в иерархическом виде, иначе они будут представлены в так называемом «выровненном виде»
PacketRecords
Integer
Количество записей, которое может содержаться в одном пакете, передаваемом с сервера. По умолчанию содержит значение -1, что означает неограниченное число записей. Если значение равно 0, то данные с сервера не будут передаваться, будет посылаться лишь информация о структуре базы данных. Если значение свойства содержит любое целое число больше нуля, то оно будет определять количество записей в одном пакете
Params.
TParams
Определяет значения параметров, которые отсылаются провайдеру
ProviderName
String
Содержит имя компонента провайдера, который передает данные и производит изменения данных. Используется для указания внешнего провайдера, связанного с другим набором данных
продолжение 夕
Таблица 5.3 {продолжений
Название свойства
ТипКраткое описание
свойства
Readonly
BooleanОпределяет, будет ли набор данных поддерживать
редактирование, вставку и удаление записей. Если значение свойства — true, то набор данных будет доступен только для чтения. Если значение свойства ——false (по умолчанию), то набор данных доступен для любых операций
RemoteServer
TCustomRemoteServer Компонент, который будет использоваться набором данных для связи с сервером базы данных
StoreDefe
BooleanУказывает, будут ли сохраняться определения полей
и индексов в модуле данных или в форме. Если значение свойства — true (по умолчанию), то они будут сохраняться, иначе — не будут
ПРИМЕЧАНИЕ
Здесь и далее при рассмотрении свойств компонентов мы не будем описывать свойство Тад, которое присутствует у большинства компонентов Delphi. Скажем лишь, что данное свойство предназначено для использования его по усмотрению программиста.
Рассмотрим третий компонент закладки DataAccess, ксторьн; называется DataSetProvider. Этот компонент представляет собой провайдер данных, выполняющий задачу снабжения данными из других наборов данных.
Таблица 5.4 содержит описание свойств компонента DataSetProvider.
Таблица 5.4. Свойства компонента DataSetProvider
Название свойства
Тип свойства
Краткое описание
Constraints
Boolean
Указывает, будут ли отправляться ограничения целостности провайдером данных. Если значение свойства — true (по умолчанию), то ограничения целостности пересылаются, иначе — нет
DataSet
TDataSet
Задает набор данных, с которым работает провайдер
Exported
Boolean
Определяет, будет ли приложение-клиент передавать вызовы провайдеру данных, когда он находится в приложении-сервере, с привлечением интерфейса lAppServer Если значение — true (по умолчанию); то будет, иначе — нет
Name
TComponentName
Имя для данного компонента, которое будет использоваться в коде приложения. По умолчанию присваиваются /мена DataSetProviderl, DataSetProvider?, ..., DataSetProviderN
Options
TProviderOptions
Определяет набор опций, показывающих, как провайдер данных будет взаимодействовать с клиентским набором данных. Содержит 15 опций, каждая из которых может принимать одно из двух значений: true или false
ResolvelbDataSet
Boolean
Определяет, каким образом будут обновляться измененные данные. Если значение свойства — true, то изменения данных будут происходить на уровне набора данных.
Если значение свойства ——false (по умолчанию), тЪ изменения будут передаваться напрямую серверу базы данных
Название свойства
Тип свойства
Краткое описание
UpdateMode
TUpdateMode
Описывает, как провайдер данных будет искать записи
^ля применения обновлений данных. Может принимать одно из трех значений: upWhereAII (по умолчанию) — поиск по всем полям; upWhereChanged — по ключевым полям и полям, значения которых были изменены; upWheV@yOnly — только ключевым полям
Рассмотрим следующий компонент закладки Data Access, который называется XMLTransform. Этот компонент предназначен для преобразования ХМL-документа в пакет данных, а также для выполнения обратного преобразования.
Основные свойства компонента XMLTransform, которые отображаются в окне инспектора объектов, представлены в табл. 5.5.
Таблица 5.5. Свойства компонента XMLTransform
Название свойства
Тип свойства
Краткое описание
Name
TComponentName
Определяет имя компонента, которое затем будет использовано в коде приложения. По умолчанию присваиваются значения XMLTransforml, XMLTransfbrm2, XMLTransformN
SourceXmlFite
String
Имя XML-документа или пакета данных, который будет преобразован
TransformationFile
String
Определяет имя файла, содержащего инструкции по преобразованию данных
Компонент XMLTransform имеет единственный собственный (не унаследованный от родителей) метод, который носит имя TransformXML Описывается следующим образом:
function TransformXMLCconst SourceXML. string; const ATransformationFi1e: string - ""): string;
Этот метод непосредствен но выполняет преобразование данных.
В таблице 5.6 перечислены события компонента XMUransfbrm и приведено их краткое описание.
Таблица 5.6. События компонента XMLTransform
Событие
Краткое описание
AfterEachRow
Наступает после преобразования каждой записи пакета данных
AfterEachRowSet
Происходит после преобразования всего пакета данных либо после преобразования вложенного набора данных
BeforeEachRow
Происходит перед преобразованием каждой записи пакета данных
BefbreEachRowSet
Возникает перед преобразованием всего пакета данных либо перед преобразованием вложенного набора данных
OnTranslate
Происходит, если компонент должен преобразовать кусок данных, определенный пользователем
Следующий компонент, расположенный на рассматриваемой нами закладке палитры компонентов, называется XMUransformProvider. Этот компонент предназначен
для передач» данных из XML-документа в клиентский набор данных и передачи измененных данных обратно.
Рассмотрим свойства компонента XMLTransformProvider, которые отображаются в окне инспектора объектов (табл. 5.7).
Таблица 5.7. Свойства компонента XMLTransformProvider
Название свойства
Тип свойства
Краткое описание
CacbeData
Boolean
Указывает, будет ли провайдер кэшировать в памяти пакеты данных после их загрузки из исходного XML-документа. Если значение свойства — false (по умолчанию), то всякий раз при необходимости отображения записей или при применении сделанных изменений в записях будет производиться чтение данных из исходного XML-документа. Иначе данные будут кэшироваться в памяти, что улучшает быстродействие, но требует больше системных ресурсов
Name
TcomponentName
Имя компонента, идентифицирующее его в коде программы. По умолчанию присваиваются имена XMLTransfbrmProviderl, XMLTransfbrmProvider2, ..., XMLTransformProviderN
TransformRead
TXMLTransform
Определяет компонент типа TXMLTransform, который будет преобразовывать данные из исходного XML-документа в пакеты данных
Transform Write
TXMLTransform
Определяет компонент типа TXMLTransform, который будет преобразовывать пакеты данных в формат исходного XML-документа
XMLDataFile
String
Указывает имя файла исходного XML-документа, с которым будет работать провайдер
Перечислим основные события компонента XMLTransformProvider (табл. 5.8).
Таблица 5.8. События компонента XMLTransformProvider
Событие
Краткое описание
AfterApplyUpdates
Происходит после того, как провайдер утверждает сделанные изменения
AfterGetRecords
Возникает после того, как провайдер создал пакет данных для пересылки его клиентскому набору данных
AfterRowRequest
Происходит после получения провайдером новой информации о текущей записи
BeforeApplyUpdates
Возникает перед тем, как провайдер применит изменения, передаваемые клиентским набором данных
BefbreGetRecords
Происходит перед тем, как провайдер создаст пакет данных и отправит его клиентскому набору данных
BefbreRowRequest
Возникает перед созданием провайдером пакета данных с информацией о текущей записи
OnDataRequest
Имеет место в момент вызова метода Data Request
Нам осталось разобрать последний компонент закладки Data Access, перед тем как перейти к рассмотрению компонентов следующей закладки. Итак, последний компонент называется XMLlransformClient. Он применяется для осуществления преобразования данных, поступающих от провайдера в XML-документ.
Свойства этого компонента описываются в табл. 5.9.
Таблица 5.9. Свойства компонента XMLTransformClient
Название свойства
ТипКраткое описание
свойства
Name
TComponentName Определяет имя компонента, которое будет идентифицировать его в коде программы. По умолчанию присваиваются имена XMCTransformGientl, XMLTransformCient2, ..., XMLTransformClientN
ProvIderName
StringОпределяет имя компонента провайдера, с которым связан
данный компонент
RemoteServer
TCustomRemoteServer Имя компонента удаленного сервера, обеспечивающего соединение с приложением-сервером
IransformApply- Updates
TXMLTransformКомпонент типа TXMLRansform, который будет преобра
зовывать XML-данные в пакеты, которые затем будут передаваться провайдеру для применения сделанных изменений
TransformGetData
TXMLTransformОпределяет компонент типа TXMLTransform, требуемый
для преобразования пакетов данных в формат XML
■RansformSet- Params
TXMLTransformОпределяет компонент типа TXMLTransform, который
будет преобразовывать параметры XML в формат пакета данных
Следующая закладка, которую мы рассмотрим на текущем занятнн, носит название Data Controls (рис. 5.2).
НШ^«ви^^и*тГ5в^А№^5^^^
Рис. 5.2. Закладка Data Controls
Эта закладка содержит 15 компонентов, предназначенных для отображения записей из наборов данных в форме вашего приложения.
Давайте изучим эти компоненты слева направо. При этом мы не будем подробно описывать свойства, события и методы этих компонентов так, как было сделано для компонентов предыдущей закладки, чтобы не увеличивать объем книги. Основные свойства, события и методы, характерные для компонентов закладки Data Controls, мы рассмотрим в процессе работы с ними.
Первый по порядку компонент на закладке Data Controls носит название DBGrid. Он предназначен для отображения и редактирования данных в табличном виде, похожем на лист электронной таблицы.
Посредством этого компонента можно вставлять новые записи, удалять или редактировать уже существующие или просто просматривать записи. Во время выполнения приложения пользователи могут работать с данными, отображаемыми в компоненте DBGrid, так же, как в электронных таблицах, либо с помощью специального компонента DBNavigator, расположенного на закладке Data Controls сразу после компонента DBGrid.
DBNavigator применяется для перемещения по записям активного набора данных, а также вставки, удаления, модификации н помещения данных в таблицу базы данных. Визуально этот компонент представляет собой панель, состоящую из кнопок (рис. 5.3), каждую из которых можно отключить или включить с помощью свойства VisibleButtons.
^Р—1Т + ;.——,|х|с|
Рис. 5.3. Компонент DBNavigator
Следующий компонент закладки Data Controls носит имя DBIext и служит для отображения значения какого-либо поля текущей записи.
Данный компонент не может применяться для изменения значения поля или ввода нового значения пользователем. Для этого можно использовать компонент DBEdit, который мы и рассмотрим далее.
Компонент DBEdit следует за компонентом DBIext и предназначен как для отображения значения какого-либо поля текущей записи, так и для внесения изменений в это значение.
Следующий компонент называется DBMemo и используется для отображения или редактирования содержимого BLOB-поля текущей записи.
Компонент DBImage расположен после DBMemo н предназначен для отображения и копирования графического изображения, находящегося в BLOB-поле текущей записи. Компонент DBListBox служит для отображения списка значений из поля (столбца) таблицы н выбора одного из них. Применяется, когда нужно, чтобы пользователь ввел одно из фиксированных значений.
Компонент DBComboBox используется для отображения списка значений из столбца таблицы с возможностью одиночного выбора, а также поддерживает ручной ввод произвольного значения данного поля текущей записи.
Компонент DBCheckBox предназначен для отображения или редактирования значений полей текущей записи, содержащих данные булевского типа.
Компонент DBRadioGroup отображает иереключатель, то есть группу кнопок, которые соответствуют значениям набора полей булевого типа.
Следующий компонент закладки Data Controls называется DBLookupListBox. Этот компонент предназначен для вывода списка значений, который формируется по полю другого набора данных. Пользователь может с помощью данного списка выбрать значение поля текущей заднем.
Компонент DBLookupComboBox применяется для отображения списка значений из поля другого набора данных с возможностью одиночного выбора, а также поддерживает ручной ввод произвольного значения данного поля текущей записи.
Компонент DBRichEdit задействуется для вывода или изменения значения поля текущей записи, которое может содержать форматированный текст. Таким образом, этот компонент представляет собой полнофункциональный текстовый редактор. Компонент DBCtrIGrid предназначен для отображения множества значений полей множеством записей в табличной форме. Каждая ячейка такой таблицы связана с множеством полей одной записи, то есть каждая запись таблицы отображается на своей собственной панели (нлн в персонально выделенной ячейке таблицы).
Последний компонент закладки Data Controls называется DBChart и служит для построения и визуализации диаграмм по значениям полей набора данных.
Переходим к рассмотрению закладки dbExpress (рис. 5.4), которая появилась в Delphi 6 и предназначена для работы с наборами данных с помощью нового механизма доступа к данным, который называется dbExpress.
I 卜SUndanH Mdtonai] Vib3?] S»<8ml ©ftUA^md BakCarfcak 痴w#R
Рис. 5.4. Закладка dbExpress
Эта закладка содержит семь компонентов, которыми мы сейчас н займемся. Рассматривать кнопки будем как обычно — слева направо.
Компонент SQLConnection предназначен для обеспечения связи с сервером базы дан-
ных dbExpress. Аналогом этого компонента в BDE является компонент Database. Некоторые свойства компонента SQLConnection описаны в табл. 5.10.
Таблица 5.10. Свойства компонента SQLConnection
Свойство
Описание
Connected
Фиксирует, установлена ли связь с базой данных (тип Boolean). Если связь установлена, свойство имеет значение true, иначе — false
ConnectionName
Содержит имя конфигурации. Имеет тип String. Является аналогом свойства AJiasName в Delphi
DriverName
Содержит имя драйвера, необходимого для соединения с базой данных (DB2, Interbase, Oracle или MySQL). Имеет тип String. Данное свойство устанавливается автоматически после задания значения свойства ConnectionName
KeepConnection
Определяет, нужно ли поддерживать соединение с сервером базы данных, если в приложении нет активных наборов данных. Имеет тип Boolean. Если связь необходимо поддерживать, установите это свойство в true, иначе —创se
LibraryName
Содержит имя библиотеки, в которой находится необходимый драйвер для связи с базой данных. Свойство имеет тип String
LoadParamsOnConnect
Определяет, нужно ли загружать параметры соединения перед его установлением во время работы приложения. Имеет тип Boolean
Loginprompt
Указывает, нужно ли при установке соединения запрашивать имя пользователя и пароль. Имеет тип Boolean. Если — true, то нужно, иначе — не нужно
Name
В этом свойстве вы можете указать имя компонента SQLConnection. Имеет тип TComponentName
params
Устанавливает параметры соединения, имеет тип TStrings /
TableScope
Устанавливает параметры видимости таблиц базы данных. Имеет тип TTableScopes и может принимать следующие значения: TsSynonym — видимые синонимы; TsSysf&ble — видимые системные таблицы; Tslable — видимые таблицы пользователей; TsView — видимые представления
VendorLib
Указывает имя библиотеки клиентской части базы данных. Имеет тип String
Компонент SQLDataSet представляет собой однонаправленный набор данных, который работает с базами данных с помощью механизма dbExpress. В таблице 5.11 перечислены его основные свойства.
Таблица 5.11. Свойства компонента SQLDataSet
Свойство
Описание
Active
Определяет, является ли набор данных активным. Только активный набор данных может работать с записями таблиц. Свойство имеет тип Boolean. Если значение — true, набор данных активен, иначе — неактивен
Таблица 5.11 {продолжений
Свойство
Описание
Commandlext
Содержит текст запроса SQL на выполнение каких-либо действий с данными. Имеет тип String
Commandlype
Определяет тип набора данных. Значение свойства имеет тип TSQLCommandlype. Свойство может принимать следующие значения: CtQuery — обычный SQL-запрос; Ctlable — таблица целиком, при этом автоматически будет сгенерирован запрос на выборку всех записей таблицы по всем полям; CtStoredProc — процедура, хранимая на сервере базы данных
Datasource
Указывает источник данных для этого набора данных. Имеет тип TDataSource
MaxBIobSize
Определяет максимальный размер BLOB-полей. Имеет тип Integer
Objectview
Включает или выключает иерархическое представление для вложенных полей. Имеет тип Boolean
ParamCheck
Указывает, нужно ли обновлять список параметров при изменении текста запроса (свойство Commancffext). Имеет тип Boolean
Params
Определяет список параметров запроса. Имеет тип Tparams
SortFieldNames
.Содержит список наименований полей таблицы, по которым будет
' производиться сортировка набора данных. Имена полей разделяются точкой с запятой. Имеет тип String. Свойство активно только при установленном типе набора данных Ctlable в свойстве Commandlype
SQLConnection
Содержит имя компонента SQLConnection, с помощью которого будет осуществляться соединение с базой данных. Имеет тип TSQLConnection
Компонент SQLQuery представляет собой компонент, позволяющий создавать и выполнять однонаправленные SQL-запросы для работы с таблицами баз данных, использующих механизм dbExpress. Таблица 5.12содержитописание основных свойств этого компонента.
Таблица 5.12 Свойства компонента SQLQuery
Свойство
Описание
Active
Определяет, является ли запрос активным. Только активный запрос может работать с записями таблиц. Свойство имеет тип Boolean. Если
DataSource MaxBIobSize Objectview
значение — true, запрос активен, иначе — неактивен
Указывает источник данных для набора данных. Имеет тип TDataSource
Определяет максимальный размер BLOB-полей. Имеет тип Integer Включает или выключает иерархическое представление для вложенных полей. Имеет тип Boolean
ParamCheck
Указывает, нужно ли обновлять список параметров при изменении текста запроса (свойство Gimmandlext). Имеет тип Boolean
Params
SQL
SQLConnection
Определяет список параметров запроса. Имеет тип TParams
В этом свойстве содержится текст SQL-запроса. Имеет тип TStrlngs Содержит имя компонента SQLConnection, обеспечивающего соединение с базой данных. Имеет тип TSQLConnection
Компонент SQLStoredProc предназначен для работы с хранимой на сервере базы данных процедурой. Выполнение этой процедуры будет осуществляться с помощью механизма dbExpress. При получении данных ведет себя однонаправлено. Основные свойства этого компонента и их краткое описание представлены в табл. 5.13.
Таблица 5・13・ Свойства компонента SQLSto「edProc
Свойство
ОпиоммЙ
Active
Определяет, является ли процедура, хранимая на сервере, активной. Имеет тип Boolean
MaxBIobSize
Objectview
Определяет максимальный размер BLOB-полей. Имеет тип Integer
Включает или выключает иерархическое представление для вложенных полей. Имеет тип Boolean
ParamCheck
Указывает, нужно ли обновлять список параметров при изменении процедуры. Имеет тип Boolean
Params
SQLConnection
Определяет список параметров процедуры. Имеет тип TParams Содержит имя компонента SQLConnection, с помощью которого будет осуществляться соединение с базой данных. Имеет тип TSQLConnection
StoredProcName
Содержит название хранимой на сервере процедуры, с которой связан данный компонент и которая будет вызываться на сервере. Имеет тип String
Компонент SQUable задает таблицу базы данных dbExpress и представляет собой однонаправленный набор данных. Таблица 5.14 содержит описание основных свойств указанного компонента.
Таблица 5.14. Свойства компонента SQ6№
Свойство
Описаиие
Active
Определяет, является ли таблица активной. Только активная таблица может работать с записями. Свойство имеет тип Boolean
IndexHeldNames
Содержит список наименований полей таблицы, по которым будет производиться сортировка набора данных. Имена полей разделяются точкой с запятой. Имеет тип String
IndexName
Имя индекса, по которому будет произведена сортировка набора данных. Имеет тип String
MasterSource
Содержит имя главного источника данных при организации связи таблиц «главная—подчиненная» («master—detail»). Имеет тип TDataSource
MasterRelds
Содержит имена полей, по которым осуществляется связь между главной и подчиненной таблицами. Имеет тип String
MaxBIobSize
Определяет максимальный размер BLOB-полей. Имеет тип Integer
Objectview
Включает или выключает иерархическое представление для вложенных полей. Имеет тип Boolean
SQLConnection
Содержит имя компонента SQLConnection, с помощью которого будет осуществляться соединение с базой данных. Имеет тип TSQLConnection
GMeName
Имя таблицы базы данных, с которой будет производиться работа. Имеет тип String
Компонент SQLMonitor предназначен для перехвата сообщений, проходящих между компонентом SQLConnection и сервером базы данных, и сохранения их в списке. Таким образом, с помощью этого компонента можно организовать наблюдение за работой компонентов доступа к данным. В таблице 5.15 перечислены основные свойства компонента SQLMonitor.
Таблица 5・15・ Свойства компонента SQLMonito「 Свойство Описание
ActiveОпределяет, является ли монитор активным. Свойство имеет тип Boolean
AutoSaveОпределяет, будет ли производиться автоматическое сохранение событий в файле,
указанном в свойстве FHeName данного компонента. Имеет тип Boolean продолжение^
Таблица 5.15 {продолжений
Свойство
Описание
FileName
Имя файла, в который будет производиться запись событий. Имеет тип String
SQLConnection
Содержит имя компонента SQLConnection, с помощью которого будет осуществляться соединение с базой данных. Имеет тип TSQLConnection
TraceList
Имя файла журнала событий. Имеет тип TString
Компонент SQLCIientDataSet служит для кэширования информации в памяти и сохранения любых изменений данных, сделанных приложением. В таблице 5.16 приведены основные свойства этого компонента.
Таблица 5.16. Свойства компонента SQLCIientDataSet
Свойство
Описание
Active
Определяет, является ли набор данных активным. Свойство имеет тип Boolean
Aggregates
AggregatesActive
Содержит список доступных агрегатов. Имеет тип TAggregates Определяет, нужно ли производить вычисления агрегатов. Имеет тип Boolean
AutoCalcFields
Определяет, нужно ли генерировать событие OnCalcHelds и обновлять содержимое полей. Имеет тип Boolean. Принимает значение true при открытии набора данных, при переключении набора данных в состояние DsEdit или при передаче фокуса другому компоненту формы
CommandText
Содержит текст SQL-запроса. Имеет тип String. При установленном значении свойства AleName это свойство игнорируется. Стойсгво игнорируется также и в случае, когда в свойстве Options сброшен флажок poAliowCommancTrext
CommandType
Определяет тип набора данных. Значение свойства имеет тип TSQLCommancrfype. Свойство может принимать следующие значения: CtQuery — обычный SQL-запрос; Cfftble — таблица целиком, при этом автоматически будет сгенерирован запрос на выборку всех записей таблицы по всем полям; CtaoredProc — процедура, хранимая на сервере базы данных
ConnectionName
Содержит имя конфигурации. Имеет тип String. Является аналогом свойства AliasName в BDE
Constraints
Накладывает ограничения на значение на уровне одной записи. Имеет тип TConstraints
DBConnection
Определяет имя компонента SQLConnection, с помощью которого будет производиться работа с базой данных. Имеет тип TSQLConnection
DisableStringTrim
Предписывает, нужно ли удалять лишние пробелы в конце строки при вставке ее в таблицу базы данных. Имеет тип Boolean
FetchOnDemand
Определяет, должно ли приложение получать данные по мере необходимости. Имеет тип Boolean
FieldDefc
Содержит список полей, определяющих набор данных. Имеет тип TneldDefe
FileName
Filter
Имя файла, в котором хранятся кэшируемые данные. Имеет тип String Задает фильтр, по которому будут выбираться данные из таблицы. Имеет тип String
Filtered Filteroptions IndexDefe IndexFieldNames
Определяет, включено или выключено свойство Hlten Имеет тип Boolean Параметры фильтрации записей таблицы. Имеет тип TRtterOptions Содержит определения индексов. Имеет тип TIndexDefc
Список наименований полей таблицы, по которым будет производиться сортировка набора данных. Имена полей разделяются точкой с запятой. Имеет тип String
СвойствоОписание
IndexName
Содержит имя индекса, по которому будет произведена сортировка набора данных. Имеет тип String
Mastersource
Имя главного источника данных при организации связи таблиц «главная— подчиненная» («master—detail»). Имеет тип TDataSource
MasterHelds
Содержит имена полей, по которым осуществляется связь между главной и подчиненной таблицей. Имеет тип String
Objectview
Включает или выключает иерархическое представление для вложенных полей. Имеет тип Boolean
Options
Содержит параметры работы с данными. Име^т тип TProviderOptions
PacketRecord
Определяет количество записей в одном пакете данных. Имеет тип Integer. Возможные значения: -1 — все записи; >0 — конкретное число записей; 0 — в пакет будут включаться только мета-данные
Params
Список параметров набора данных. Имеет тип TParams
Readonly
Определяет способ доступа к записям. Имеет тип Boolean. Если значение свойства — true, то данные доступны только для чтения. Если значение — false, то можно изменять существующие данные и записывать новые
UpdateMode
Указывает способ поиска записи, которую необходимо обновить. Имеет тип TUpdateMode. Может принимать значения: UpWhereAII — искать по всем полям; UpWhereChanged — искать по ключевым и измененным полям; UpWhereKeyOnly ——искать только по ключевым полям
Операции с таблицами
Рассмотрим основные операции, кото|)ые можно выполнять с таблицами базы данных. Изучать эти операции мы будем на примерах работы с компонентами Table и Query. Над таблицами можно производить всего четыре основных действия:
создание таблицы;
удаление таблицы;
переименование таблицы;
установка режима доступа.
Мы уже умеем конструировать таблицы с помощью инструменпыьных средств, которые рассматривались на занятии 4. Здесь мы будем рассматривать динамический, то есть в ходе выполнения приложения, процесс создания таблиц.
Процесс динамического создания таблицы начинается с вызова метода набора данных, который называется Createlable. Этот метод создает пустую таблицу и помещает ее на диск. Перед вызовом метода нужно позаботиться о подготовке данных, на основе которых будет создаваться таблица. Эти данные нужно присвоить значениям соответствующих свойств набора данных. Естественно, перед вызовом метода CresteTable набор данных должен быть закрыт (свойство Active 二 false). Кроме того, должны быть установл лы значения следующих свойств: DatabaseName,TableName, Iab\€fype, F\eWDefs, IndexDefs, то есть должны быть определены путь к базе данных или ее псевдоним, название новой таблицы, тип создаваемой таблицы, описание всех полей таблицы и описание индексных полей таблицы. Большинство из вышеперечисленных свойств мы уже обсуждали на занятии 3, поэтому не будем на них останавливаться. Рассмотрим процесс добавления no.neii.
Итак, в свойстве FieldDefc обязательно должно быть определено хотя бы одно поле. Перед тем как задавать новое значение этого свойства, необходимо очистить предыдущее значение, поскольку в нем может находиться информация о полях другой таблицы. Для этого можно воспользоваться методом Clear:
Tablel.FieldOefs Clear:
Для того чтобы добавить информацию о полях таблицы, можно вызвать метод Add. Метод в документации описан следующим образом:
procedure Add (const Name: String: DataType: TFieldType; Size: Word: Required: Boolean);
В параметре Name должно быть указано имя поля, а в параметре Datatype 一 его тип. Этот параметр может принимать значения, перечисленные в табл. 3.2. Параметр Size определяет размер поля. Если размер поля не может быть задан (например, в случае поля даты/времени), то значение этого параметра должно быть равным нулю. Последний параметр Required указывает, должно ли поле содержать значение или оно может быть пустым (true или false соответственно).
С помощью свойства IndexDefc в создаваемой таблице можно определить индексы. Добавление индекса осуществляется вызовом метода Add. Заметим, что в уже созданной таблице можно удалить или создать индексы посредством методов Addindex и Deleteindex.
ВНИМАНИЕ
После определения новых индеквв перед открытием набора данных обязательно задайте необходимые значения свойствам IndexName и IndexReldName, чтобы избежать ситуации, когда в этих свойствах сохранится информация об индексах предыдущей таблицы.
Рассмотрим пример создания таблицы на основе набора данных Table (листинг 5.1).
Листинг 5.1. Создание таблицы на основе набора данных Able
procedure TForml.ButtonlChck(Sender: TObject):
begin
Tablel.Active.-false; // Закрываем набор данных {можно использовать команду Tablel.Close}
Tabi el.DatabaseName:*'C:\MyDatabase': // Путь к базе данных
// //// //Имя создаваемой таблицы Тип таблицы - ParadoxИмя создаваемой таблицы Тип таблицы - Paradox// Теперь переходим к описанию полей таблицы// Очищаем 叩едндущую информацию// Создаем три поля: Number. Name. Tel// Теперь переходим к описанию полей таблицы// Очищаем 叩едндущую информацию// Создаем три поля: Number. Name. TelTablel.FieldDefs.Clear;Tablel.FieldDefs.Clear;Tablel.TableName:='MyTable': Tabi el.Tabi eType:«ttParadox:
// //
// //
Имя создаваемой таблицы Тип таблицы - Paradox
Имя создаваемой таблицы Тип таблицы - Paradox
// Теперь переходим к описанию полей таблицы
// Очищаем 叩едндущую информацию
// Создаем три поля: Number. Name. Tel
// Теперь переходим к описанию полей таблицы
// Очищаем 叩едндущую информацию
// Создаем три поля: Number. Name. Tel
Tablel.FieldDefs.Clear;
Tablel.FieldDefs.Clear;
Tablel.FieldDefs.Add('Number'. ftAutoInc. 0. true):
Tablel.FieldOefs.Add( 'Name'. ftStnng. 35. true);
Tablel.FieldDefs.Addf'Tel'. ftlnteger. 10. false);
// Описываем индексы таблицы
Tablel.IndexDefs.Clear; // Очищаем предыдущую информацию // Создаем два индекса
Tablel.IndexDefs.Add(" . 'Number'. [ixPrimary. ixUnique]);
Tablel.IndexDefs.Add('indName'. 'Name'. [ixCaselnsensitive]); // Теперь создаем таблицу
Tablel.CreateTable;
// Устанавливаем текущий индекс
Tablel.IndexNamer^'indName';
Tablel.Active:tttrue; end;Tablel.Active:tttrue; end;// Открываем набор данных
Tablel.Active:tttrue; end;
Tablel.Active:tttrue; end;
// или Tabi el.Open;
После выполнения программы, представленной на листинге 5.1, в каталоге C:\MyDatabase будет создана новая пустая таблица с именем Mylable, имеющая тип Paradox. Таблица состоит из трех полей: порядкового номера записи, имени и теле- (|)она. По автоинкрементному полю Number построен главный ключ — для него имя не определено. По полю названия построен вторичный ключ, который становится текущим после создания таблицы.
Мы не будем здесь разбирать процесс создания таблицы с помощью набора данных Query, так как это будет рассмотрено достаточно подробно на занятии, посвященном работе с запросами SQL.
Удаление таблицы можно осуществить с помощью вызова метода Deletelable, в результате которого происходит физическое удаление всех файлов таблицы. Перед вызовом данного метода нужно установить необходимые значения свойств DatabaseName и TableName набора данных. Кроме того, необходимо закрыть набор данных. Пример удаления таблицы приведем в листинге 5.2.
Листинг 5.2. Удаление таблицы
"ocedure TForml ButtonlClick(Sender. TObject),
rablel.Active:=false:// Закрываем набор данных
Tablel.DatabaseName-='C\MyDatabase,:// Путь к базе данных
lablel.TableName:='MyTable'.// /мя удаляемой таблицы
// Теперь удаляем таблицу lablel.DeleteTable:
end.
Процесс переименования таблицы (Paradox или dBase) можно осуществить с помощью метода RenameTable, который имеет один параметр NewfableName типа String. Этот параметр должен содержать повое имя таблицы. При вызове метода будут переил!енованы все файлы, относящиеся к таблице.
Рассмотрим теперь процесс установки уровня доступа. Уровень доступа к базе данных задается в случае, когда к не" могут обращаться несколько приложений одновременно. Уровень доступа определяет возможность записи и чтения данных в таблицу.
С помощью метода Lockfable можно заблокировать таблицу от вмешательства других приложений. Этот метод имеет один параметр Locklype типа TLocklype, задающий тип блокировки:
ItReadLock — запрещает другим приложениям записывать или считывать данные из таблицы; то есть переводит таблицу в режим монопольного доступа;
ItWriteLock — другим приложениям запрещено записывать дан11ые в таблицу, но они могут считывать имеющиеся данные.
Для снятия блокировки таблицы предназначен метод UnLockTable. Этот метод имеет такой же параметр Locklype типа TLocklype.
Итак, методы Lockfable и UnLocklable применяются для блокирования и разблокирования таблицы и чаще всего требуются для внесения каких-либо глобальных изменений в данные таблицы.
Сортировка набора данных
Одной из наиболее часто выполняемых задач является задача сортировки данных таблицы по одному из ноле的(или по нескольким полям). Дело в том, что обычно записи в таблицу заносятся в порядке их добавления (таблицы Paradox сортируются по ключевым полям). Давайте рассмотрим приемы сортировки таблицы на примере набора данных Table. На сортировке данных для компонента Query мы задержим внимание, когда будем изучать язык SQL.
Сразу отметим, что сортировка наборов данных Table выполняется автоматически по текущему индексному полю. Если вы переопределите индекс, произойдет автоматическая сортировка данных по новому индексу. Если нужно, чтобы сортировка шла по нескольким полям сразу, создайте индекс, включающи!! эти поля. Таким образом, сортировка набора данных Table возможна только по полям,для которых задан индекс. Из рассмотренных па этом занятии свойств компонента Table вы уже знаете, что для задания текущего индекса, по которому будет выполняться сортировка данных. можно использовать свойства IndexName и IndexFieldNames. При этом следует помнить, что установка значения одного из упомянутых свойств автоматически удаляет значение в другом свойстве. Если вы хотите осуществить сортировку по одному полю, используйте свойство IndexName. Если же сортировка должна производиться по нескольким нолям, перечислите их в cBoiicTBe IndexFieldNames.
Иногда необходимо изменить направление сортировки данных. По умолчанию всегда выполняется сортировка по возрастанию значений.工〃只 задания направления сортировки служит параметр ixDescending, который определяется для текущего индекса. По умолчанию он выключен. Если параметр включить, го сортировка будет осуществлена в порядке убывания.
Приведем простои пример сортировки значений таблицы по полю Name (листинг 5.3).
Листинг 5.3. Сортировка по имени
procedure TForml. ButtonlCbcK Sender: TObject): begin
Tablel. IndexName:-'Name': end;
На рисунке 5.5 показаны данные таблицы до сортировки, а на рис. 5.6 — данные после сор 门屮овк”.
Рис. 5.5. Данные таблицы до сортировки
Рис. 5.6. Данные таблицы после сортировки
Перемещение по набору данных
Процесс перемещения по набору данных осуществляется передвижением указателя текущей записи (курсора). Курсор определяет текущую запись, с которой можно выполнять различные действия.
Рассмотрим два способа перемещения по набору данных:
перемещение по записям;
перемещение по закладкам.
Для перемещения по записям используются следующие методы:
First — устанавливает курсор на первую запись набора данных;
Last — устанавливает курсор на последнюю запись набора данных;
Next — перемещает курсор на следующую запись набора данных;
Prior — перемещает курсор на предыдущую запись набора данных;
MoveBy — перемещает курсор на число записей, задаваемое параметром Distance.
ПРИМЕЧАНИЕ
В случае вызова метода Next, когда курсор находится на последней записи, перемещения курсора не происходит. Для метода Prior; если курсор находится на первой записи, также перемещение курсора не происходит. Если значение параметра Distance метода MoveBy больше нуля, то перемещение будет производиться к концу таблицы, при отрицательном значении — назад. Функция MoveBy возвращает число записей, на которое фактически переместился курсор.
Перемещение осуществляется только по тем записям, которые содержатся в текущее время в наборе данных. В случае применения фильтра (о нем мы расскажем далее) количество записей в наборе данных может :яшчитсл ьио уменьшиться. Для определения текущего числа записей в наборе данных можно использовать свойство RecordCount.
Рассмотрим пример перемещения позапися\! набора данных (листинг 5.4).
Листинг 5.4. Перемещение по записям набора данных
procedure TForml.ButtonlClick(Sender: TObject).
var 1 integer: // Переменная для цикла
begin-
Tablel.First: // Перемещаем курсор на первую запись
for Q:r to Tabi el. RecordCount do
begin
// Здесь можно вставить какие-либо действия
// Например, суммирование какого-либо поля таблицы
Tablel.Next; // Перемещаемся на следующую запись
end:•
end:
В рассматриваемом примере производится перебор всех записей набора данных Tablel, и после выполнения программы курсор будет указывать на последнюю запись набора данных.
Для того чтобы выяснить, какая запись является в настоящий момент времени текущей, можно использовать свойство RecNo набора данных. Это свойство содержит номер текущей записи. Запись в это свойство значений не допускается.
ПРИМЕЧАНИЕ
Таблицы типа Paradox поддерживают переход к нужной записи с помощью установки необходимого значения свойства RecNo.
Определение, находится ли курсор на первой или последней записи набора данных, производится считыванием значений свойств BOF и EOF. Эти свойства имеют тип Boolean.
Свойство BOF показывает, находится ли курсор на первой записи набора данных. Если данное свойство имеет значение true, то указатель находится на первой записи.
Свойство EOF показывает, находится ли курсор на последней записи набора данных. Если свойство имеет значение true, то указатель находится на последней записи. .
ПРИМЕЧАНИЕ
Свойства BOF и EOF одновременно имеют значение true, когда набор данных пуст.
Рассмотрим простой пример использования вышеприведенных методов и свойств. Для начала создадим таблицу типа dBase IV с помощью программы Database Desktop. Определим четыре поля Name, Adres, Tel и Oklad, как показано на рис. 5.7. Кроме того, добавим два индексных поля Ad res и Name с помощью кнопки Define... (Определить).
Создадим новую папку C:\MyDatabase и сохраним в ней таблицу под именем Mylable.dbf с помощью кнопки Save As... (Сохранить как) (рис. 5.8).
Теперь разместим в форме Forml в среде Delphi следующие компоненты (рис. 5.9):
DataSourcel с закладки Data Access;
Tablel с закладки BDE;
DBGridl с закладки Data Controls.
Рис. 5.7. Задание структуры новой таблицы
Рис. 5.8. Сохранение таблицы в файле
Установим следующие свойства для компонентов в окне инспектора объектов:
для компонента Tablel: свойству DatabaseName присвоим значение 4C:\MyDatabase», свойству TableName присвоим значение <Mylable.dbf>, свойство Active установим в true;
для компонента DataSourcel: свойству DataSet присвоим значение nblel;
для компонента DBGridl: свойству DataSource присвоим значение DataSourcel.
Рис. 5.9. Заготовка формы приложения
Таким образом, мы связали все три компонента между собой. Теперь можно запускать приложение с помощью клавиши F9 и заполнять наш пустой набор данных примерно так, как показано на рис. 5.10. Для заполнения пустых но- леН достаточно просто щелкнуть на нужном поле кнопкой мыши п набрать значение.
Рис. 5.10. Заполнение таблицы
Теперь добавим кнопки Button 1 и Button2 с закладки Standard (Стандартные), которые позволят переходить по записям вперед и назад на одну запись. Свойству Caption первой кнопки присвоим значение ♦ Вперед», а этому же свойству второй кнопки — значение *Назад». Теперь осталось включить в обработчики событий нажатия кнопок код, производящий переход на следующую или предыдущую запись набора данных. При этом будем учитывать достижение курсором начальной или конечной записи набора данных и отключать соответствующую кнопку.
В листинге 5.5 приведен код обработки нажатия кнопок Button 1 и Button2 с комментариями. *
Листинг 5.5. Обработчики нажатия кнопок Button 1 и Button2
procedure TForml.Button1С1ick(Sender: TObject): begin
// Если кнопка «Назад» отключена. то ее нужно включить
If Button2.Enabled-False then Button?.Enabled:-True:
// Если не достигнута последняя запись, перейти к следующей
If not Tablel.EOF then Tabiel.Next:
〃 Если достигнута последняя запись.
// отключить кнопку «Вперед»
If Tablel.EOF then Buttonl.Enabled:-False:
end:
procedure TForml.Button2Click(Sender: TObject);
begin
// Если кнопка «Вперед» отключена, то ее нужно включить
If Buttonl.Enabled-False then Buttonl.Enabled:-True:
// Если не достигнута первая запись. перейти к предыдущей If not TableLBOF then Tabi el. Prior;
// Если достигнута первая запись.
// отключить кнопку «Назад»
If Tablel.BOF then Button2.Enabled:-False:
end:
Таким образом, при выполнении кода листинга 5.5 при попытке перехода к записи, которая ^находится» после последней или перед первой, будут отключаться соответствующие кнопки. На рис. 5.11 представлен вид формы с отключенной кнопкой ♦ Вперед» после попытки перейти на запись, следующую после последней.
抬拉* 日抬拉* 日25465:25465:Ней"Ней"24156214522415621452〔NAME〔NAME延■$.;Металлургов 12.23延■$.;Металлургов 12.23I Сидоров КМ Пепгров П.ИI Сидоров КМ Пепгров П.ИРис. 5.11. Окно приложения после попытки перехода к несуществующей записиРис. 5.11. Окно приложения после попытки перехода к несуществующей записи
抬拉* 日
抬拉* 日
25465:
25465:
Ней"
Ней"
24156
21452
24156
21452
〔NAME
〔NAME
延■$.
;Металлургов 12.23
延■$.
;Металлургов 12.23
I Сидоров КМ Пепгров П.И
I Сидоров КМ Пепгров П.И
Рис. 5.11. Окно приложения после попытки перехода к несуществующей записи
Рис. 5.11. Окно приложения после попытки перехода к несуществующей записи
ПРИМЕЧАНИЕ
Того же самого эффекта можно достичь, поместив в форму вместо кнопок «Вперед» и «Назад» компонент DBNavigator
Добавим теперь в форму еще одну кнопку Button3 и текстовое поле Editl. Присвоим свойству Caption кнопки Button3 значение «Сумма». Очистим значение свойства Text поля Editl. Теперь напишем код обработчика нажатая кнопки Button3, при выполнении которого будут суммироваться значения всех записей поля OKLAD и итоговая сумма будет выведена в компоненте Editl (листинг 5.6).
Листинг S.6. Обработчик нажатия кнопки Button3
procedure TForml Button3Click(Sender: TObject);
var i:Integer: 〃 Переменная для цикла
sum:real:// В этой переменной будет подсчитываться сунна
begin
sum:-0:// Обнуляем значение сунны
Tabiel.First; // Перенещаен курсор на первую запись
〃 Цикл от первой записи до последней
for 1:-1 to Tab!el.RecordCount do begin
// Складываем значение поля 0KLAD текущей записи
И с переменной sum
sum:-sum+Tablel.FieldByNameC"OKLAD") AsFloat;
Tablel.Next: // Переходим на следующую запись end:
// Выводим значение суммы в поле Editl
Editl.Text:-FloatToStr(sum);
Tabiel.First: // Перемещаем курсор на первую запись
end:
Результат нажатия кнопки «Сумма» представлен на рис. 5.12.Результат нажатия кнопки «Сумма» представлен на рис. 5.12.Металлургов 12.29Металлургов 12.29'Иванов И.П. СцаороекМ.I Петров П.И.Конствнгиное Е.П.'Иванов И.П. СцаороекМ.I Петров П.И.Конствнгиное Е.П.♦Г Fwrnl♦Г FwrnlРиа 5.1Х Результат суммирования значений поля OKLADРиа 5.1Х Результат суммирования значений поля OKLAD
Результат нажатия кнопки «Сумма» представлен на рис. 5.12.
Результат нажатия кнопки «Сумма» представлен на рис. 5.12.
Металлургов 12.29
Металлургов 12.29
'Иванов И.П. СцаороекМ.
I Петров П.И.
Конствнгиное Е.П.
'Иванов И.П. СцаороекМ.
I Петров П.И.
Конствнгиное Е.П.
♦Г Fwrnl
♦Г Fwrnl
Риа 5.1Х Результат суммирования значений поля OKLAD
Риа 5.1Х Результат суммирования значений поля OKLAD
Перемещение по закладкам используется для перехода на определенную запись набора данных.
Закладки представляют собой маркеры записей. Они похожи на закладки, которыми вы закладываете кш【гу. чтобы продолжить чтение с нужной страницы. Закладки имеют тип TBookmaric который является не чем иным, как указателем (Pointer), с помощью которого можно ссылаться на определенные объекты. В нашем случае в качестве этих объектов высп пают записи набора данных.
ПРИМЕЧАНИЕ
Указателем в обиден с»у^е -взывается переменная, в которой хранится адрес другой переменной в олерат*»сй зан₽-у компьютера.
Естественно, перед ген как * пользовать закладку, ее нужно создать. Процесс создания закладвси жстгг-^=« прост. Для этого в Delphi имеется специальный
метод — GetBookmark, типа TBookmark. Вызов данного метода приводит к созданию закладки на текущей записи набора данных.
ВНИМАНИЕ
Закладка не всегда точно идентифицирует запись — иногда она может неправильно позиционировать курсор. В таком случае говорят о нестабильности закладки. Закладка может быть нестабильной в случае, когда в наборе данных нет признака, позволяющего однозначно определять записи. Такое возможно при отсутствии ключевых полей. Заметим, что для таблиц типа dBase закладка всегда является стабильной.
Так как метод GetBookmark представляет собой функцию, возвращающую значение типа TBookmark, перед его вызовом нужно определить переменную типа TBookmark и установить закладку в этой переменной (листинг 5.7).
Листинг 5.7. Пример создания закладки
procedure TForml.ButtonlClick(Sender: TObject): var z:TBookmark; // Переменная для закладки begin
Tablel.First;// Переходим на первую запись набора данных
Tablel Next;// Переходин на вторую запись набора данных
z:=Tablel.GetBookmark; // Устанавливаем закладку
end:
Для перехода на существующую закладку применяется метод GotoBookmark. В качестве параметра данного метода используется переменная типа TBookmark. Если закладка не была ранее создана и значение параметра равно nil, то курсор не будет перемещаться.
Удаление закладки осуществляется с помощью вызова метода Free Bookmark. Параметром метода является переменная типа TBookmark, содержащая указатель на закладку. Вызов сбрасывает значение переменной в nil и освобождает занимаемые ею ресурсы. Если после удаления закладки вы попробуете перейти на нее или повторно ее удалить, сгенерируется исгслючительная ситуация.
Для того чтобы узнать, существует закладка или нет, можно вызвать метод Bookmark- Valid. Этот метод представляет собой функцию, в качестве параметра которой выступает переменная типа TBookmark. Функция возвращает значение true, если закладка найдена, и false — в противном случае.
Фильтры
В процессе работы с данными часто возникает необходимость отбора записей, удовлетворяющих каким-либо критериям. Для этого к наборам данных применяют фильтры.
Фильтр — это набор ограничений для записей, которые будут выделены в наборе данных.
Процесс задания фильтра называется фильтрацией записей. Среда Delphi позволяет фильтровать записи либо по выражению, либо по диапазону.
По умолчанию отображаются все записи набора данных, то есть фильтр не используется.
Фильтрация по выражению ограничивает набор данных записями, которые удовлетворяют выражениям, записанным в фильтре. Этот вид фильтрации применим к любым полям, в том числе и неиндексированным.
ПРИМЕЧАНИЕ
Фильтрация по выражению эффективна в случае, когда набор данных содержит небольшое число записей, так как при фильтрации последовательно просматриваются все записи набора данных.
Для задания выражения фильтра используется свойство Filter набора данных. В состав этого выражения могут входить:
арифметические операции, такие как сложение, вычитание, умножение и деление, обозначаемые символами +,工 * и /;
знаки логических операций: AND, OR, NOT и т. д.;
имена полей таблиц. Если внутри имени поля содержатся пробелы, его заключают в квадратные скобки, например [Tel Number];
круглые скобки для определения порядка выполнения арифметических и логических операций;
литералы, то есть явно заданные значения, например строка, символ или число;
операции сравнения, то есть обычные операции >, <, =>, <= и о.
Приведем примеры задания фильтра:
Number > 100 AND Number < 1000
Name ° Иван"
0klad * 0.87 v 1000
Первый фильтр отбирает записи, находящиеся между сотой и тысячной записями (Number) набора данных. Второй оставляет в наборе данных записи для людей, носящих имя (Name) Иван. В третьем случае мы увидим записи только для тех сотрудников, у которых заработная плата (Oklad) при вычитании 13 % составляет сумму меньше 1000 рублей.
После установки фильтра в свойстве Filter он не будет активным до тех пор, пока свойству Filtered не будет присвоено значение true. Для отключения фильтрации достаточно сбросить значение свойства Rltered в false.
СОВЕТ
Во время разработки приложения по возможности проверяйте выражения, записываемые в свойство Rlter; с помощью установки свойства Filtered в окне инспектора объектов, так как пока фильтр не станет активным, он не проверяется на корректность, что может привести к исключительной ситуации.
Свойство FilterOptions набора данных позволяет задавать параметры фильтрации. Значение комбинируется из двух параметров:
foCaselnsensitive — при задании фильтра не учитывать регистр букв. То есть, например, для фильтра Name = 'Иван* будут выбраны записи《Иван», «ИВАН», «иван» и другие;
foNoPartialCompare — проверять на полное соответствие значения поля фильтру. Применяется для строгого поиска. Если вы хотите осуществлять фильтрацию
записей по частичному совпадению фильтра, отключите этот параметр. В таком случае можно заменить незначащие символы символом звездочки *. В результате при заданном фильтре Name =、И*‘ будут выбраны все записи, имена людей в которых начинаются с буквы И.
По умолчанию оба параметра отключены.
Фильтрация по диапазону отбирает записи, значение полей которых попадают в заданный диапазон. Такой вид фильтрации проходит только по индексированным полям, что значительно ускоряет процесс. Индекс поля, по которому будет производиться фильтрация, должен быть установлен как текущий в свойстве IndexName или IndexFieldNames. В случае, если текущий индекс не установлен, по умолчанию будет использоваться главный индекс.
Для указания верхней и нижней границ диапазона применяются методы SetRangeStart ii SetRangeEnd. Эти методы не имеют параметров.
ПРИМЕЧАНИЕ
Вызов методов SetRangeStart и SetRangeEnd переводит набор данных в режим dsSetKey.
Для изменения ранее установленных границ диапазона можно воспользоваться методами EditRangeStart и EditRangeEnd.
Чтобы включить фильтрацию по диапазону, необходимо вызвать метод ApplyRange. Для отключения фильтрации применяется метод CancelRange.
Граничные значения диапазона могут быть как включенными в диапазон, так и исключенными из него. Для определения этого используется свойство KeyExclusive. Если свойство установлено в true, то граничные записи в набор данных не попадают, иначе — включаются. Свойство должно устанавливаться отдельно для верхней н нижней границ диапазона сразу после вызова метода установки или редактирования границы.
Приведем пример задания диапазона (листинг 5.8).
Листинг 5.8. Задание диапазона фильтрации
Tablel.SetRangeStart;
Tabi el.KeyExclusive:«true:
Tablel.FieldByNafneCName^.AsStringr-'n';
Tabi el.SetRangeEnd;
Tablel.FieldByName("Name").AsString:-'Я':
Tabiel.ApplyRange;
После выполнения программы из листинга 5.8 набор данных будет содержать записи с фамилиями, начинающимися с букв от П до Я. Индекс по полю Name должен быть текущим. В этом примере заданы обе границы диапазона. Если одна из границ не будет учтена, то диапазон будет открытым. Например, если задана нижняя граница (SetRangeStart), а верхняя — нет, то будут выделены записи от нижней границы до максимально возможного значения. Таким образом, из листинга 5.8 можно убрать две «лишние» строки, устанавливающие верхнюю границу. Тогда получится такой код:
Tablel.SetRangeStart;
Tabi el.KeyExclusive:=true;
Tablel. FieldByNameCNafne"). AsString: ='П':
Tablel.ApplyRange;
Допустимо фильтровать записи сразу по нескольким полям. Для этого после вызова метода, устанавливающего границу диапазона, указываются значения нужных полей, как, например, в листинге 5.9.
Листинг 5.9. Фильтрация записей по двум полям
Tablel.SetRangeStart;
Tabi el.KeyExclusive:*true:
Tablel.FleldByName("Name").AsString:-'n':
Tablel.FieldByNameC'Oklad').AsFloat:-1000;
Tablel.ApplyRange:
В этом случае будут отфильтрованы записи, в которых фамилии сотрудников, чей оклад более 1000 рублей, начинаются с букв от П до Я. Естественно, в качестве текущего индекса должен быть указан индекс, построенный по двум полям: Name и Oklad. Если текущий индекс, по которому осуществлялась фильтрация набора данных, был изменен, то фильтрация перестает действовать.
Поиск
Кроме отбора записей, соответствующих некоторому критерию, иногда нужно найти какую-либо конкретную запись. Поиск записи очень похож на фильтрацию, но отличается тем, что состав набора данных при поиске остается неизменным, просто осуществляется переход на запись, удовлетворяющую критериям поиска.
При поиске записей (особенно в больших таблицах) очень важно наличие индекса у полей, по которым будет производиться поиск. Во-первых, это ускоряет обработку данных. Во-вторых, некоторые методы поиска работают только с индексированными полями.
При поиске записей по значению полей используются методы Locate н Lookup. Для данных методов можно задействовать неиндексированные ноля.
Метод Locate описывается следующим образом:
function Locate (const KeyFields: String; const KeyValues: Variant. Oonons
TlocateOptions): Boolean:
Метод ищет запись, которая соответствует заданным значениям полей. Параметр KeyRelds определяет названия полей, по которым будет производиться поиск. Поля разделяются точкой с запятой. В параметре KeyValues указываются значения этих полей. Параметр Options позволяет устанавливать дополнитечьные критерии поиска:
loCaselnsensitive — не учитывать регистр букв;
loPartialKey — учитывать частичное совпадение значений.
ВНИМАНИЕ
Если вы установили значение loPartialKey в параметре Options, то Delphi автоматически прибавит к нему значение loCaselnsensitive.
Приведем пример поиска по значению поля:
Tablel.LocateCOklad". 3512. []);
В этом примере будет производиться поиск записи, значение поля Oklad у которой равно 3512.
Следует заметить, что в рассмотренном примере мы никак не анализируем результат поиска. Следовательно, если удовлетворяющая нас запись была найдена, будет произведен переход на нее. В ином случае никаких действий производиться не будет. Функция Locate возвращает значение true, если запись найдена, и false - в противном случае. Приведем пример, показывающий использование возвращаемого функцией Locate значения:
if Tablel.LocateCOklad", 351. [J) - false then MessageDlgC"Запись не найдена", mtlnfonnatlon. [mbOk], 0);
Если запись не будет найдена, появится окно с информацией о том, что запись не найдена. При успехе поиска курсор переместится на найденную запись.
Пример поиска записей по нескольким полям:
Tablel.locateC'Name; Adres', VarArrayOfCE'M'. 'M']). (loCaselnsensitive. loPartialKey];
В этом случае поиск ведется по полям, содержащим имя и адрес. Будет найдена первая запись, значение поля Name в которой начинается с букв И или и, а значение поля Adres — с букв М или м.
Обратите внимание на тот факт, что здесь параметр KeyValues является массивом, в котором содержатся оба значения. Значения должны быть разделены запятыми и заключены в квадратные скобки. Для приведения к типу массива используйте функцию VarArrayOf.
Кроме метода Locate, для поиска записей применим также метод Lookup. Описание метода Lookup выглядит так:
function Lookup(const KeyFields: String: const KeyValues: Variant: const ResultFlelds: String): Variant;
Параметры KeyFields и KeyValues инициируются так же, как и в методе Locate.
Метод Lookup в целом похож на метод Locate, но есть два основных отличия:
метод Lookup осуществляет поиск на точное соответствие значений, указанных в параметрах;
метод Lookup не переводит курсор на найденную запись, а считывает значения полей найденной записи.
Для получения значений полей найденной записи нужно указать требуемые названия полей в параметре ResultFlelds. Значения только этих полей и будут считаны из найденной записи. Порядок следования полей в параметре не имеет значения. В случае успешного поиска метод Lookup возвращает в качестве результата значение типа Variant. Если в списке ResultFields всего один элемент, то будет возвращено значение типа Variant. Если же список содержит несколько полей, на выходе получим массив типа Variant, содержащий столько элементов, сколько перечислено в параметре ResultFlelds.
Метод Lookup возвращает значение Null при неудачном поиске.
Кроме двух представленных выше методов для поиска записей, в Delphi имеется еще несколько средств, позволяющих осуществлять поиск по индексным полям. Все эти методы можно условно разделить на две группы:
методы поиска записи на точное соответствие значений (RndKey, SetKey, EditKey и GotoKey);
методы поиска, допускающие частичное соответствие значений (FindNearest, setNearest, EditNearest и GotoNearest).
Метод FindKey описан следующим образом:
function FindKey(const KeyValues: array of const): Boolean:
Этот метод осуществляет поиск записи в наборе данных, у которой значения полей полностью совпадают со значениями, указанными в параметре KeyValues. Список полей не задается, так как берутся поля, заданные текущим индексом. В случае удачного поиска метод возвращает значение true и перемещает курсор на найденную запись. Иначе возвращается значение false.
Вместо метода FindKey можно вызывать одновременно три метода: SetKey, EditKey и Goto- Key. Этот способ похож на ранее рассмотренные методы SetRangeStart, EditRangeStart и ApplyRange для фильтрации набора данных.
Приведем пример использования данных методов:
Tablel. IndexFieldNafnes: = ,Nafne': // Устанавлиааен текущий // индекс
Tablel.SetKey:
Tablel ,F1eldByName( 'Name').AsStringi-^eip';
Tablel.GotoKey;
Здесь осуществляется поиск записи по полю Name, значение которого равно Петр. Метод FindNearest напоминает метод FindKey, с тем отличием, что поиск производится по частичному совпадению значений индексных полей. Поиск с привлечением метода FindNearest всегда является успешным и перемещает курсор на запись, которая в большей степени отвечает критериям поиска.
Вместо метода FindNearest можно воспользоваться комбинацией методов SetNearest, EditNearest и GotoNearest. Работа с этими методами ничем не отличается от уже рассмотренного сочетания SetKey, EditKey и GotoKey.
Вот простои пример поиска записи с помощью метода FindNearest:
Tablel.IndexFieldNames:='Name';
Tablel.FindNearest:=(['B']):
В этом случае курсор будет перемещен на запись, поле Name которой содержит значение, начинающееся с буквы В. Если такой записи нет, будет найдена запись, значение ноля Name которой начинается с ближайшей к В буквы.
Что нового мы узнали?
На этом занятии мы рассмотрели:
основные компоненты для работы с наборами данных и для визуального отображения н редактирования данных;
основные операции с таблицами;
способы сортировки наборов данных;
способы перемещения по записям и использования закладок;
фильтры и как с ними работать;
поиск записей, удовлетворяющих определенным критериям.
Занятие б
Модификация данных и связанные таблицы
Редактирование, добавление и удаление данных
Работа со связанными таблицами
На этом занятии мы отдельно рассмотрим способы редактирования, добавления и удаления записей наборов данных. Кроме того, дадим краткую методику работы со связанными таблицами. Первая и вторая части занятия для пояснения материала будут сопровождаться примерами в виде небольших программ.
Редактирование, добавление и удаление данных
Понятия редактирования, добавления и удаления данных можно объединить в едином понятии модификации набора данных. Модифицируемость, то есть возможность изменения набораданных, зависит от различных условий. Delphi предоставляет программисту широкие возможности ограничения модифицируемости набора данных с помощью соответствующих свойств.
Ярким примером наложения ограничений на модифицируемость набора данных является переключениеего в режим «только для чтения». Например, если mi>i хотим, чтобы возможности пользователя оп)аничивались исключительно просмотром записей из набора данных без возможности их редактирования или занесения в них новых записей, можно использовать свойство Readonly. Данное свойство имеет по умолчанию значение false, то есть набор данных можно модифицировать. Приведенная ниже строка кода позволяет перевести набор данных lablel в режим «только для чтения»:
Tablel.Readonly :■ true:
ВНИМАНИЕ
Значение свойства Readonly можно изменять только в том случае, когда набор данных закрыт, то есть свойство Active набора данных установлено в false.
Заметим, что установка свойства Readonly в true ограничивает как полномочия пользователя по изменению данных, так и программные возможности, то есть в данном случае программа тоже не сможет сделать никакие изменения в наборе данных.
Практически аналогичное средство для ограннчення модифицируемости набора данных имеет и набор данных Query. Для этого применяется свойство RequestLive. По умолчанию свойство Query имеет значение false, что означает доступ к набору данных в режиме «только для чтения». Для обеспечения модифицируемости набора данных нужно установить значение свойства в true.
Чтобы проверить, можно ли модифицировать набор данных, предусмотрено свойство CanModify. Это свойство имеет значение true, если набор данных можно модифицировать, и false, если нельзя.
Редактирование набора данных
Для редактирования текущей записи набора данных необходимо сначала перевести его в режим редактирования. Перевод набора данных в состояние редактирования можно осуществлять двумя методами:
программно, с помощью метода Edit;
визуально, посредством компонентов, отображающих данные, например DBGrid.
ПРИМЕЧАНИЕ
Набор данных может автоматически переключаться в режим редактирования. Для этого нужно, чтобы значение свойства DataEdit компонента DataSource было установлено в true. Иначе с помощью визуальных компонентов изменить данные будет нельзя.
Если набор данных является нсмодифицируемым (CanModify равно false), при попытке редактирования сгенерируется исключительная ситуация. Если набор данных не содержит ни одной записи, то он будет переведен в режим вставки записи. Если набор данных является модифицируемым, то будут произведены следующие действия:
сгенерируется событие BeforeEdit, которое можно обработать;
из набора данных повторно считывается текущая запись и блокируется доступ к ней других пользователей (временно устанавливается доступ только для чтения);
ПРИМЕЧАНИЕ
Если блокирование записи невозможно (запись уже редактируется другим пользователем), генерируется исключительная ситуация. Выполнение метода Edit в данном случае прекращается.
если запись содержит вычисляемые поля, они пересчитываются;
набор данных переводится в режим редактирования;
генерируется событие OnDataChange для связанного с набором данных источника данных;
последним генерируется событие AfterEdit.
Редактирование, добавление к удаленке данных 107
Для того чтобы сделанные изменения были сохранены в наборе данных, нужно вызвать метод Rost, который вьтолняет следующие действия: ■ записывает новые данные в физическую таблицу;
снимает блокировку записи;
переводит набор данных в режим просмотра.
ВНИМАНИЕ
Если при вызове метода Rost набор данных не находился в режиме редактирования, то будет сгенерирована исключительная ситуация.
После модификации набора данных может возникнуть ситуация, когда изменения не отображаются в визуальных компонентах, связанных с ним. В таких случаях нужно вызывать метод Refresh. Этот метод заново считывает информацию из набора данных и обновляет содержимое компонентов.
Приведем простой пример изменения данных в одном из полей набора данных (листингб.1).
Листинг 6.1. Изменение данных в поле Name
if Tab]el.CanModify-true then begin
// Если модификация данных возможна. выполняем эти действия
Tablel.Edit; // Переводим таблицу в режим редактирования
// Присваиваем значению поля Name текст из поля Editl
Tablel,FieldByName('Name').AsStr1ng:*Editl.Text:
Tablel.Post; // Записываем данные в физическую таблицу
Tablel.Refresh; // Обновляем содержимое визуальных // компонентов
end else MessageDlgt'Редактирование невозможно'.
mtlnformation, [mbOKJ. 0):
// Если редактирование невозможно, выводим сообщение end;
Если вы решили отказаться от изменений, сделанных в текущей записи, и возвратить набор данных в режим просмотра, можно воспользоваться методом Cancel. При вызове данного метода будут сгенерированы события BeforeCancel и AfterCancel.
Рассмотрим простой пример отмены сделанных изменений в текущей записи. Предположим, что для записи изменений на форме присутствует кнопка Post. Тогда обработчик нажатия этой кнопки может выглядеть так, как показано в листинге 6.2.
Листинг 6.2. Запись или отмена сделанных изменений в наборе данных
procedure TForml.PostCiick(Sender: TObject): begin
// Выводим диалог «Записать изменения?»
if MessageDlg("Записать изменения?".
mtConfinnation. [mbOK. mbCancel]. 0)-n)rOK then begin
// Если нажата кнопка OK
Tablel.Post;// Записываем данные
Tablel.Refresh:// Обновляем визуальные компоненты
продолжение^продолжение^end
продолжение^
продолжение^
Листинг 6.2 {продолжений
else begin
7/ Если нажата кнопка Cancel
Tablel.Cancel: // Отмена сделанных изменений end; end:
Для редактирования текущей записи можно заменить последовательность присваивания значений полей и вызовов метода Post методом SetFields.
Метод SetFields имеет один параметр Values, содержащий массив значений, которые присваиваются полям набора данных. При этом порядок перечисления значений должен соответствовать порядку следования iioneii в наборе данных. Если параметр Values содержит количество значений меньшее, чем число полей набора данных, то эти значения присваиваются первым полям, а остальные не будут изменены. Если вы хотите оставить значение какого-либо поля без изменений, в качестве соответствующего значения Values следует задать nil.
ВНИМАНИЕ
Ключевые слова nil и null имеют разный смысл: nil означает отсутствие значения, null подразумевает нулевое значение.
После выполнения метода SetRelds метод Post выполнять не нужно. Набор данных будет автоматически обновлен и переведен в режим просмотра.
В следующем примере изменяются значения сразу нескольких полей набора данных:
Tablel.Edit; // Переводим таблицу в режим редактирования
Tablel .SetFields ([ml. 'Сидоров А.Е.1. nil. 3400]);
Первое и третье поля текущей записи набора данных Tablel остаются без изменений, а второе и четвертое поля изменяются назначения «Сидоров А.Е.» и 3400.
Добавление записей
Сразу следует заметить, что добавлять новые записи можно только к модифицируемому набору данных. Для добавления записи следует:
перевести набор данных в режим вставки;
задать значения для полей новой записи;
подтвердить добавление новой записи или отказаться от нее.
Добавление новых записей возможно с помощью одного из четырех методов:
Insert;
InsertRecord;
Append;
AppendRecord.
Рассмотрим эти методы более подробно.
Метод Insert выполняет следующие действия:
переводит набор данных в режим вставки записи;
сдвигает записи на одну вперед, начиная от текущей;
вставляет на место текущей записи новую пустую запись.
После перевода данных в режим вставки для задания значений полон можно использовать такие же методы, которые мы применяли при редактировании записи. Можно присваивать новые значения отдельным полям н вызывать метод Post л ибо использовать метод SetFields.
ПРИМЕЧАНИЕ
Если при переходе в режим вставки запись добавляется к подчиненному набору данных^ связанному с главным набором данных связью master—detail, то индексные поля автоматически получат нужные корректные значения. Программист может не заботиться об их заполнении.
Рассмотрим простой пример вставки новой записи:
Tablel.Insert; // Перевод набора данных в режим вставки
Tablel.F1eldByName( 'Nanie') ,AsString:«Editl.Text:
Tablel.F1eldByNanie( 'Oklad').AsFloat:-StrToInt(Edit2.Text):
Tabi el.Post: // Записываем сделанные изменения
Здесь мы заполняем два поля Name и Oklad значениями из нолей редактирования Editl и Edit2.
Метод InsertRecord позволяет объединить возможности методов Insert и SetFields. Данный метод имеет параметр Values, аналошчный такому же параметру метода SetFields. Таким образом, метод InsertRecord вставляет в текущую позицию курсора новую запись, задавая значения ее полей. Например:
Tablel.InsertRecord ([nil. 'Сидоров А.Е.1. ml. 3400]);
Метод Append аналогичен методу Insert за тем исключением, что вставляет новую запись в конец набора данных, то есть новая запись будет последне" записью.
Метод AppendRecord аналогичен методу InsertRecord, но добавляет новую запись в конец набора данных, так же, как и метод Append.
Удаление записей
Удалять записи можно только из модифицируемого набора данных. Текущая запись, то есть та, на которую указывает курсор, удаляется с помощью метода Delete. Если удаление произведено успешно, то текущей становится следующая запись. Если была удалена последняя запись, курсор переместится на предыдущую зап ись.
ВНИМАНИЕ
При попытке удаления записи из пустого набора данных будет сгенерирована исключительная ситуация.
При удалении записи последовательно генерируются события BefbreDelete и AfterDelete.
Для удаления всех данных из таблицы можно применять метод Emptylable.
ВНИМАНИЕ
Метод Emptylable разрешен только в режиме исключительного доступа к таблице.
Работа со связанными таблицами
Различные таблицы базы данных могут быть связаны между собой с помощью полей связи. Поля связи обязательно должны быть индексированными.
Таблицы связываются по принципу «главный—подчиненный*. При перемещении по записям главной таблицы будут автоматически становиться доступными те записи подчиненных таблиц, у которых значения поля связи равно значению поля связи текущей записи главной таблицы. Таким образом, это очень похоже на фильтрацию записей в подчиненных таблицах.
Для установления связи между главной и подчиненной таблицами используются следующие свойства подчиненной таблицы:
MasterSource — источник данных главной таблицы;
IndexNames — текущее индексное поле подчиненной таблицы;
IndexFieldNames — поле или поля связи текущего индекса подчиненной таблицы;
■ MasterFields — поле или поля связи индекса главной таблицы.
Перечислим основные особенности при работе со связанными таблицами:
■ если вы редактируете значение поля связи, нужно изменять и соответствующие значения поля связи у всех подчиненных таблиц во избежание нарушения связи между таблицами;
■ при удалении записи в главной таблице необходимо удалять соответствующие ей записи во всех подчиненных таблицах. Такое удаление называется каскадным.
Мы не будем на этом занятии рассматривать пример работы со связанными таблицами. Отложим его до занятия, посвященного созданию вашей первой локальной базы данных.
Что нового мы узнали?
На этом занятии мы выяснили:
что такое модифицируемость набора данных;
как редактировать записи набора данных;
как добавлять записи в набор данных;
как удалять отдельные записи из набора данных, а также очистить всю таблицу;
каковы особенности работы со связанными таблицами.
Занятие 7
Отчеты в Delphi 7
Конструктор отчетов Rave Reports
На этом занятии мы рассмотрим возможности, которые предоставляет Delphi для вывода текстовой и графической информации, содержащейся в таблицах базы данных, на печать. Мы изучим основные компоненты для создания отчетов и попробуем сами создать отчеты на их основе. Мы рассмотрим механизм и средства создания отчетов, появившиеся в последней версии среды разработки и доставшиеся в наследство от предыдущей.
Конструктор отчетов Rave Reports
В среде Delphi 6 отчеты создавались с помощью набора компонентов, расположенных на вкладке QReport и имеющих общее название Quick Report. Эти компоненты поставлялись и в более ранних версиях Delphi. Ближе к концу главы мы обзорно рассмотрим и их, поскольку Quick Report поддержаны на уровне дополнительных компонентов также и в Delphi 7.
Quick Report не входит в интегрированную среду разработки Delphi 7 по умолчанию. Чтобы получить возможность с ним работать, вы должны сначала установить модуль dclqrt70.bpL Для этого требуется выбрать в главном меню пункт Component ► Install Packages (Компонент ► Пакеты установки). В открывшемся диалоговом окне нужно нажать кнопку Add и затем просмотреть установочные каталоги Delphi для выявления расположения модуля dc(qrt70.bpL (заданное по умолчанию расположение — C:\Program Files\Borland\Delphi7\bin). По завершении установки в панель компонентов будет добавлен новый — QReport, и вы сможете выполнять примеры программ и создавать собственные отчеты с помощью э того средства. (Вообще 1'оворя, различные средства установки поступают по-разному. InstallShield автоматически подключает дополнительные модули, если может их найти. Другие инструментальные средства могут просто сообщать о наличии таких модулей или же генерировать отказ компоновки, если нужные средства не включены в проект.)
Отчетом называется документ, предназначенный для печати на принтере, который содержит выборочные данные из таблиц базы данных.
Согласно классификации, принятой в Delphi 6, все отчеты, создаваемые Quick Report, можно разделить на следующие:
простые;
с группированием данных;
для связанных наборов данных;
составные.
Простым отчетом называется отчет, составленный из записей одного набора данных, которые выводятся в табличном виде без дополнительных условий (таких как группирование данных).
Отчеты с группированием данных нужны для того, чтобы данные отчета были сгруппированы по какому-либо признаку. Например, если таблица содержит записи о проданных товарах, при выводе сведений об имеющихся на складе остатках удобно группировать записи по видам товара. Для группирования записей отчета по определенному полю набора данных необходимо установить текущий индекс по данному полю.
Отчет для связанных наборов данных позволяет группировать данные по принципу, несколько отличающемуся от простого объединения данных. Основными полосами отчета для связанных наборов данных являются:
полоса данных;
полосы детал изаци и.
Для полосы данных указывается главный набор данных, а для полосы детализации —подчиненный набор данных.
Составной отчет объединяет в себе несколько отчетов. Этот компонент является визуальным и при помещении на форму не содержит ни одного отчета. Добавление нового отчета в составной отчет происходит по событию. Естественно, внедряемый отчет должен быть предварительно подготовлен.
Средства Quick Report достаточно жестко привязываются к перечисленным выше типам отчетов и обладают меньшей гибкостью по сравнению с теми, которые появились в последней реализации Delphi.
Среда Delphi 7 предлагает отказаться от механизма Quick Report и перейти к использованию компонентов Rave Reports. Эти компоненты были разработаны компанией Nevrona (www.nevrona.com/rave) и позволяют создавать кроссплатформенные отчеты, поддерживающие такие механизмы доступа к данным, как BDE, dbExpress и ADO. В отчеты Rave Reports можно включать графические элементы, кроме того, отчет может быть сохранен в различных форматах (в число которых входят PDF, HTML и RTF-форматы).
Инструменты Rave позволяют проектировать отчеты для различных сочетаний полос отчета и наборов данных. Например, группирование данных может быть обеспечено размещением на форме отчета одного компонента Data Cycle. Из представленной выше классификации, пожалуй, только простые отчеты в силу своей простоты продолжают выделяться особым образом.
Визуальный дизайнер Rave Reports
Rave Reports может использоваться и в более ранних версиях Delphi (начиная с четвертой). Визуальный дизайнер отчетов, входящий в состав Rave Reports (кстати,
не переводите Rave буквально во избежание стресса, это просто аббревиатура, образованная от Report Authoring Visual Environment), работает на компонентой основе и позволяет визуально создавать разнообразные отчеты. Этот дизайнер отчетов может работать независимо от того, установлена на компьютере среда Delphi или нет. Таким образом, конечный пользователь получает возможность редактировать отчеты, поставляемые с вашими программами, с помощью такого же дизайнера отчетов.
Различным пользователям Rave можно задать свой уровень сложности работы с визуальным дизайнером (Beginner, Intermediate и Advanced) согласно их квалификации. Но если вы считаете, что даже начального уровня в иных случаях больше чем нужно, задействуйте мастер — Simple Table и Master-Detail. Мастера используются для запроса соединения с данными и позволяют пользователю выбрать поля, нужные для данного отчета. Обязательным условием является предварительная активизация Direct DataView. Simple Table Wizard генерирует простые отчеты списочного типа, Master-Detail Wizard позволяет создавать составные отчеты. Количество мастеров в Rave невелико, но это приложение имеет открытую архитектуру, благодаря чему вы можете создавать собственные мастера, адаптированные под нужды конечного потребителя.
Для запуска дизайнера отчетов Rave Reports вы можете запустить приложение Rave.exe, находящееся в папке, в которую вы установили Delphi 7, последующему пути:
\Rave5
То есть, по умолчанию, C:\Program Files\Borland\Delphi7\Rave5.
Вы также можете запустить это приложение с помощью пункта главного меню Delphi 7: Tools ► Rave Designer (Инструменты ► Дизайнер отчетов).
После запуска дизайнера отчетов появится окно, показанное на рис. 7.1.
Окно дизайнера отчетов состоит из следующих элементов:
область навигации (Navigation Area) — верхняя часть окна. Содержит главное меню, а также панели инструментов н панель компонентов;
страница отчета (Раде) — основа для вашего отчета. Находится в центре окна и разбита на ячейки с помощью сетки;
панель дерева проекта (Project Tree Panel) находится в правой части окна. Позволяет быстро просматривать структуру проекта, а также быстро переходить к нужному объекту проекта;
панель свойств (Property Panel) расположена в левой част» окна. Служит для отображения значений свойств выбранного компонента, а также для задания значении свойств компонентов отчета.
Панель инструментов проекта обеспечивает его базовую функциональность. Эти функции будут «кирпичиками» для всех ваших отчетов. Наибольшее значение из них имеют первая кнопка (RaveProject) и вторая секция панели инструментов (New Report, New Global Page, New DataObject и New Report Page). Эти функции используются для изменения существующей структуры проекта.
В структуре проекта дизайнера отчетов выделяются следующие элементы:
Rave Project — компонент, который является контейнером для всех прочих компонентов, все они помещаются в дереве проектов под узлом этого компонента. Компонент Rave Project создается одновременно с созданием нового файла проекта
н всегда имеется только один компонент RavePrqject для одного такого файла, что отличает его от прочих компонентов. Но как и любой другой компонент, он имеет свои свойства, с которыми можно ознакомиться на панели свойств. AdminPassword позволяет администратору Rave Server ограничить доступ пользова* телей к создаваемым отчетам и данным. Parameters позволяет создавать элементы, в которые Delphi может помещать результаты вычислений для использования их другими компонентами. Свойство PIVars предназначено для описания специфических данных, требующих динамического обновления во время генерации отчета (нетипичные вычисления или операции над компонентами защиты);
Рис. 7.1. Окно дизайнера отчетов
Компонент Report (Отчет) содержит страницы отчета. Поддерживается множество отчетов для одного проекта, и каждый отчет может иметь свое множество страннп. Каждый отчет имеет собственные свойства. Мы не будем их описывать ввиду достаточной прозрачное™. Познакомиться с ними вы можете на панели свойств, предварительно выделив компонент Report в дереве проекта;
Раде (Страница) — базовый визуальный компонент» на котором помещаются все стандартные компоненты, компоненты отчета, рисования и другие, в целом представляющие собой законченный шаблон для вывода. Страница также имеет свои свойства, увидеть которые можно, щелкнув в пустом месте страницы;
Global Page. Глобальные страницы размещаются в под узлом Каталога глобальных страниц (Global Page Catalog) в дереве проекта. Каждая глобальная страница по определению считается master-страницей. Все глобальные страницы могут быть《зеркалированы*. Они могут содержать шаблоны, предназначенные для
различных целей, и использоваться различными отчетами проекта. «Зеркалированием глобальной страницы может потребоваться, например, если вы ходите получить на выходе то же содержимое, но с другим заголовком;
■ Data Objects (Объекты данных) — это компоненты Data Connection для соединения с данными, или компоненты, используемые для контроля, кому разрешено просматривать отчеты на стороне сервера отчетов. Диалоговое окно Data Connection, появляющееся при нажатии кнопки New Data Object» предлагает пять вариантов выбора: Data Looku pSecu rity Controller, Database Connection, Direct Data View, Simple Security Controller и Driver Data View. Выбранный здесь объект помещается в дерево проекта в словарь видов данных (Data View Dictionary). Мы не будем подробно рассказывать обо всех, но задержим внимание на Di rect DataView, поскольку именно этот компонент был разработан специально для Borland-pe- дакции Rave Reports и обеспечивает соединение с данными из приложений на Delphi. При его использовании вы должны иметь запущенное приложение и форму с созданным компонентом Data Connection. Соединение осуществляется через свойства Name компонента Data Connection вкладки Rave и свойство ConnectionName для созданного Direct DataView.
Рассмотрим основные элементы области навигации более подробно.
Область навигации. Панели инструментов
Панели инструментов представляют собой наборы пиктограмм, связанных с той илн иной функцией (рис. 7.2).
麗日ю -密-延rИ■■gf 鰭№ Н
Рис. 7. 2. Панели инструментов Rave Designer
Перечислим пиктограммы панелей инструментов, показанных на рис. 7.2, слева направо и сверху вниз:
New Project — открывает новый проект;
Open Project — отображает диалоговое окно открытия заданного проекта;
Save Project ——служит для сохранения текущего проекта;
New Report —создает новый отчет;
New Global Page — служит для создания новой глобальной страницы отчета;
New Data Object ——позволяет задать новую связь с данными (таблицей базы данных);
New Report Page ——предназначена для создания новой страницы отчета;
Execute Report ——позволяет просмотреть или распечатать отчет;
Activate Grid ——включает или выключает сетку;
Snap То Grid ——включает или выключает привязку элементов отчета к сетке;
Grid On Тор — включает или выключает отображение сетки поверх всех элементов отчета;
Always Show Band Headers — включает или выключает показ заголовков полос отчета;
Show Rulers — включает или выключает показ линеек;
Show Waste Area ——включает или выключает отображение области печати;
Edit Preferences ——открывает диалоговое окно настроек среды дизайнера отчета.
Область навигации. Панель компонентов
Панель компонентов состоит из нескольких вкладок, на каждой из которых расположены компоненты, сгруппированные по категориям (рис. 7.3).
Gr^ng I 8а Code | StexW j Repo< j Z6wn j Сокм« ] Lre? | Ftii ) F疝* 痴^rit j
百臂目副睜胃фЛ#,而射醒®;r财口看I由臼国m
Рис. 7.3. Панель компонентов. Вкладка Alignment
Давайте кратко рассмотрим вкладки панели компонентов» а также компоненты, находящиеся на этих вкладках.
Вкладка Alignment (Выравнивание) (рис. 7.3) содержит компоненты» предназначенные для выравнивания элементов отчета на форме. Данная вкладка условно поделена разделителями на четыре секции. Компоненты, расположенные на этой вкладке (слева направо):
Align Left Edges — выравнивание выбранных элементов отчета по левому краю;
Align Horizontal Centers ——выравнивание по горизонтальной линии, делящей каждый элемент на две равные части;
口 Align Right Edges — выравнивание выбранных элементов отчета по правому краю;
Center Horizontally — выравнивание по левому и правому краю элементов отчета;
口 Space Equally Horizontally — установка равных горизонтальных промежутков между выбра!{ными элeмeFIтaми отчета;
□ Equate Widths ——установка одинаковой ширины для всех выбранных элементов отчета;
口 Align Top Edges — выравнивание выбранных элементов отчета по положению верхней части;
口 Align Vertical Centers ——выравнивание по вертикальным линиям, делящим каждый элемент на две равные части;
Align Bottom Edges — выравнивание выбранных элементов отчета по положению нижней части;
Center Vertically ——выравнивание по верхней и нижней части элементов отчета;
Space Equally Vertically — установка равных вертикальных промежутков между выбранными элементами отчета;
□ Equate Heights — установка одинаковой высоты для всех выбранных элементов отчета;
口 Move Forward ——перемещение элемента отчета на передний план;
口 Move Behind ——перемещение элемента отчета на задний план;
Bring To Front ——перемещение элемента «на самый верх» (то есть поверх всех элементов);
Send То Back ——перемещение элемента на самый задний план (под все другие элементы отчета);
口 Тар Left — перемещение элемента на шаг влево;
Тар Right — перемещение элемента на шаг вправо;
Тар Up — перемещение элемента на таг вверх;
口 Тар Down — перемещение элемента на шаг вниз.
Вкладка Fonts (Шрифты) содержит компоненты, с помощью которых можно установить необходимое шрифтовое оформление для любого текстового элемента отчета (рис. 7.4).
Рис. 7.4. Вкладка FontsРис. 7.4. Вкладка Fonts
Рис. 7.4. Вкладка Fonts
Рис. 7.4. Вкладка Fonts
Вкладка Fills (Заполнение) содержит компоненты» посредством которых мож-но заполнять различными узорами графические элементы отчета (рис. 7.5).
Рис. 7.5. Вкладка FillsРис. 7.5. Вкладка Fills
Рис. 7.5. Вкладка Fills
Рис. 7.5. Вкладка Fills
Вкладка Lines (Лтши) включает в себя компоненты, предназначенные для установки толщины и стиля начертания лии>!Й у графических элементов отчета (рис. 7.6).
Oimmg I В. Code | Starxfad | Rt^xxl | Zoom | Cofor. Lne« ] Afa | Fort» | Aignmenl |
I—-^ AA^ir^ ■ j I-—3
Рис. 7.6. Вкладка Lines
Вкладка Colors (Цвета) содержит компоненты, предназначенные для задания необходимого цвета для элементов отчета (рис. 7.7).
' DtwnhQ I Вег Code | Standard } Raort | 2dom Cciatt | 5e« | Hk ] Fortt j Afignment |
ПИПМГ ・M IT 2 —■■
Рис. 7-7. Вкладка Colors
Вкладка Zoom (Масштабирование) состоит из компонентов, предназначенных для просмотра страницы отчета с различной степенью детализации (рис. 7.8).
Drawing | B.Code | Sundani ] Report Zoom | Cobs | Lnet ( Fi# | Fonu [ Afignment ]
国三風風。R殴瞰
Рис. 7.8. Вклгщка Zoom
Вкладка Report (Отчет) содержит пиктограммы, помеченные в правом верхнем углу красной точкой (рис. 7.9). Это означает, что данные компоненты предназначены для связи с табличными данными и отображения табличной информации. Пока только кратко опишем каждый из компонентов (слева направо), но закончив перечисление предоставляемых инструментов, вернемся к более детальному их рассмотрению:
DataText предназначен для отображения строки текста из поля таблицы;
DataMemo используется для отображения многострочного текста из поля таблицы типа Мето;
CalcText служит для отображения результата арифметических действий, указанных в свойстве CalcType, с полем таблицы;
DataMirrorSection предназначен для задания так называемой «зеркальной» области, которая будет использоваться в отчете для создания вариаций отчетов;
Region предназначен для объединения нескольких полос отчета и является для них контейнером. Применяется при создании отчетов вида master—detail;
Band применяется для создания новой полосы отчета, в которой можно размещать элементы отчета;
Data Band предназначен для создания полосы отчета, в которой будут расположены элементы отчета, связанные с таблицей базы данных;
Data Cycle представляет собой невидимую полосу отчета, связанную с таблицей базы данных, и ориентированную для работы с изменяющейся в таблице информацией;
u CalcOp — невизуальный компонент, предназначенный для выполнения one- раним (указанной в свойстве Operator) над операндами, являющимися значениями из двух различных источников данных;
CalcTotal ——певизуальнын компонент, предназначенный для вычисления арифметического выражения, указанного в свойстве CaJcType, над полем таблицы, с дальнейшей передачей полученного значения в параметр проекта, указанный в свойстве DestParam;
CalcController ——невизуальный компонент, служит контроллером для всех вычисляемых компонентов типа Calc. Когда данный компонент выводится на печать, во всех вычисляемых компонентах производятся необходимые арифметические вычисления.
Dfawrtg I ба Code | Sterxiard Report | Zoom j Coiws | lbw ] F<* | Fortt | Aignmeni |
Рис. 7.9. Вкладка Report
Вкладка Standard (Стандартные) содержит компоненты, предназначенные для размещения на странице отчета надписей, рисунков ” других данных, не связанных с таблицей базы данных (рис. 7.10). Рассмотрим эти компоненты (слева направо):
Text предназначен для вставки в отчет строки текста;
Мето служит для вставки в отчет многострочного текста;
Section позволяет объединять компоненты в группы;
Bitmap и MetaFile предназначены для вставки в отчет графических элементов;
FontMaster позволяет задать фиксированный шрифт для различных частей отчета;
PageNumlnit задает номер начальной страницы отчета.
dee^np I В* Code Standard | Report | Zoom ] Cobra | brw# [ Fit | F^U j A$0nment |
Рис. 7.10. Вкладка Standard
Вкладка Bar Code (Кодировка) содержит компоненты, предназначенные для определения перекодировочной таблицы отчета (рис. 7.11).
D«»wig В® Code ] Stendatd | Report | Zoom | Сокмз | Lrej | Fii | Forts ] Alignment |
Рис. 7-11. Вкладка Bar Code
Вкладка Drawing (Рисование) содержит компоненты, предназначенные для размещения на странице отчета графических фигур и линий (рис. 7.12).
* Ьничй$ I Sat Cod» I $t*nd*d :] Repcxl | Zoom | Coiort ] Une# ] Fit ] Fort# | AJpimert |
版■-。户口PT
.—^R—i—M»—mw*« i*■■”,一”■£♦―,■,*■■,MH4<MW*,*iTWd"* "к ♦ •," 7,♦“・—,”,W—,,•”,,,“m,“,-SM”“・”,“'”,,“/>"—”,*,i2,,.T,.”,"
Рис. 7.12. Вкладка Drawing
Структура приложения, использующего Rave Reports
Rave представляет собой два продукта в одном: объектно-ориентированные средства печати данных (13 компонентов Delphi и около 500 методов, свойств и событий) и визуальный интерфейс проектйрования, в комплексе позволяющие создавать отчеты без утомительного программирования принтера (TPrinter) напрямую или с использованием Windows API. Визуальный дизайнер Rave — независимое от Delphi приложение, за счет чего для конечных пользователей отпадает необходимость в случае внесения изменений в отчет задействовать Инспектор объектов Delphi или другие средства разработки. При этом разным пользователям можно задать свой уровень сложности работы с визуальным дизайнером (Beginner, Intermediate и Advanced) согласно их квалификации.
В структуру приложения, использующего Rave Report, в обязательном порядке входят следующие составляющие.
Стандартные компоненты Data Connection. А именно, RvCustomConnection, RvDataSetConnection и RvTableConnection — обеспечивают связь между даннмм” в вашем приложении и визуальными компонентами Rave. RvCustomConnection также может быть использован для доступа к данным, отличным от табличных, таким как массивы в памяти или файлы с двоичным типом записей.
Компонент RvProject содержит множество свойств и методов и обеспечивает доступ к отчетам и их компонентам — позволяет вам создавать, изменять, отображать и печатать их. Как правило, приложение содержит только один компонент RvProject, что не сказывается на его функциональности.
Файл проекта отчета с расширением RAV. В нем сохраняются все определения и настройки, подготовленные при работе с визуальным дизайнером. По структуре RAV-файл напоминает DFM-файлы Delphi. Все отчеты, глобальные страницы и виды данных при этом сохраняются в одном файле, элементы которого можно импортировать в другой проект. Используя методы компонента RvProject, вы можете также сохранить файл проекта отчета в BLOB-поле базы данных или в другом месте.
Непосредственно отчеты сохраняются в Библиотеке отчетов (Report Library) проекта. При работе с проектом Rave вы подготавливаете страницы отчета, на которых размещаются визуальные компоненты. Вы можете создать множество таких страниц и сочетать их при помощи большого разнообразия методов.
Глобальные страницы сохраняются в Каталоге глобальных страниц (Global Page Catalog) проекта. Компоненты, содержащие глобальные страницы, используются для хранения шаблонов, которые «зеркалируют» другие страницы отчета.
Виды данных сохраняются в Словаре видов данных проекта (Data View Dictionary). Они являются интерфейсом для компонентов Data Connection. Когда вы создаете новые виды данных, вы должны иметь активный компонент Data Connection в приложении или загруженную форму Delphi. Виды данных становятся нужны тогда, когда запрос к компонентам Data Connection возвращает мета-данные, такие как имена полей, типы данных и т. д. Поля компонентов, которые содержатся в каждом виде данных, позволяют управлять отображением соответствующих колонок данных.
Компоненты страницы отчета
Компоненты вкладки Report наиболее часто используются при проектировании отчетов, ориентированных на работу с базами данных. О них мы упоминали выше, но перечислим еще раз: Band, CalcText, Data Band, DataMemo, DataText, Region, CalcController, CalcOp, Calclbtal DataCycle, DataMirrorSection. Большинство из них, включая невизуальные, могут быть размещены непосредственно на странице отчета. Но есть два исключения — Band и Data Band. Они должны обязательно помещаться в компонент Region. Отчет может быть размечен как типичный шаблон, использующий строго определенные полосы, например, как в QuickReport. Но отличительной особенностью Rave Reports является то, что отчет может быть видоизменен в соответствии с другими требованиями. Полосы отчета могут быть передвинуты или изменен их размер. Управлять видимостью полос при работе с визуальным дизайнером можно двумя способами. В первом случае можно указать явно, что заголовки всех полос должны быть видимы, установив флажок Always Show Band Headers в окне, открываемом командой меню Edit 卜 Preferences (или воспользуйтесь кнопкой панели инструментов). Другой путь — использовать свойство DesignerHide для каждой полосы по отдельности. Установка в true скрывает полосу. Это может быть полезно при большом количестве полос или когда полоса занимает много места на странице. При этом свойство DesignerHide не оказывает влияния на вид отчета при печати, оно эффективно только в режиме визуального проектирования.
Region
Перед тем как использовать регионы, нужно четко понимать, что они из себя представляют. Region (Регион) — контейнер для полос. В простейшем случае регион может занимать целую страницу. Это типично для отчетов списочного типа (list type). Вместе с тем в свойствах региона имеется возможность указывать его размер и точное положение на странице. Преимущества гибкости использования регионов проявляются при разработке составных отчетов, с группированием данных, для связанных наборов данных. На одной странице может быть размещено несколько регионов в произвольном сочетании: сторона к стороне, один над другим или в шахматном порядке. Не путайте регион с секцией. Регион всегда содержит полосы и только полосы. Секция же может включать в себя любые группы компонентов, включая регионы. Заметьте, что количество регионов на странице не ограничивает число полос внутри регионов. Если вы испытываете трудности в процессе чисто визуального редактирования, вы должны понимать, что в вам доступны самые различные сочетания регионов п полос, нужно только суметь спроецировать их в свое сознание для мысленной «визуа-чизации».
DataBand
Компонент DataBand предназначен для отображения динамической информации из видов данных. Как правило, DataBand содержит несколько компонентов DataText. Сущность DataBand легко понять на типичном примере — счете-фактуре. Обычно накладная содержит заголовочную информацию, такую как дата, номер счета, имя и адрес клиента и одну или более строк с элементами фактической информации. В этом примере пользовательская таблнца будет master-таблицей, а элементы — detalil-таблицей. Информация об элементах может быть размещена в DataBand и управляться с помощью master-таблицы. Свойство BandStyle компонента DataBand задает местоположение полосы при печати и описывает случаи, как полоса будет использоваться при выводе. Для каждой полосы можно установить флажки в любом сочетании, то есть возможно задание верхнего или нижнего колонтитула (страницы, группы, строки), которые будут выводиться на первой странице отчета, на всех последующих и для отдельных колонок. Выбор производится в окне Band Style Editor, открываемом при установке значения в свойстве BandStyle (рис. 7.13). Каждый стиль (флажок) имеет сокращенное обозначение (буква в скобках), которое будет показываться в правой части заголовка полосы в случае его установки. Следует помнить, что при печати полосы региона упорядочиваются в соответствии с их определением во время проектирования. Возможные действия с полосами в окне регламентируются именно этим порядком. Верхние колонтитулы (прописные буквы, BGR) будут напечатаны первыми для всей полосы, тогда как нижние колонтитулы (строчные буквы, bgr) — на каждом уровне. Тем не менее, если есть более чем один верхний колонтитул для какого-либо особенного уровня, тогда каждый верхний колонтитул полосы будет распространен в порядке их определения в регионе. Да, технически возможно разместить все верхние кололтитулы сверху, все компоненты DataBand по центру и все нижние колонтитулы внизу региона для всех уровней master—detail. Или каждый уровень будет сгруппирован со всеми присвоенными ему колонтитулами н данными. Но Rave подразумевает, что описание региона — путь, обеспечивающий легкость восприятия конструкции потока. Просто помните, что последовательность подобных полос на одном уровне определяется порядком их определения в регионе.
Рис. 7.13. Окно редактора Band Style Editor
Band
Компонент Band служит для размещения фиксированных компонентов, не изме- няющтася на странице. В общем» компонент Band может содержать компоненты Text и CalcText Типичный пример — верхние и нижние колонтитулы. Тем не менее, компонент Band может также содержать и компоненты для отображения информации из полей таблиц баз данных.
Наиболее важным свойством компонента Band является ControllerBand. Это свойство определяет, будет л и полоса DataBand, имя которой устанавливается в значении этого свойства, подчинена компоненту Band (управляться им). Когда принадлежность полосы установлена, заголовок контролируемок полосы будут отображаться так же (включая символы н цвет), как в управляющей. Удобство этой возможности станет очевидным тогда, когда вы измените состояние флажка Always Show Band Headers. В заголовках полос присутствуют также специальные значки, которые показывают отношения вида master—detail (родительский—доиернн访)между различными полосами. Вытянутый треугольник говорит о том, что полоса контролируется master-полосой того же цвета (уровня), которая расположена по направлению острого угла. Ромб свидетельствует о том, что это — master- или управляемая полоса. Помните, что вьт можете иметь отношения вида master-detail-detail, где обе detail- полосы управляются одним master-компонентом или же одна из detail-полос подчинена другой. *
Заголовок каждой полосы кроме ее имени также содержит в правой часта несколько символов, соответствующих ее стилю и уровню. Так, на master-полосе вы увидите MASTER1PC, а на контролируемой — BGRDrgblPC. Если стиль не поддерживается, соответствующая буква погашена (серая).
Имена компонентов Region, Band и Data Band Moiyr включать буквы английского алфавита, цифры и символ подчеркивания, но должны быть уникальны.
DataText
Компонент Datafext служит для работы с данными, то есть может быть использован для отображения значений из полей наборадаиных в любом месте страницы. Например, вы можете выводить с его помощью пользовательскую информацию из компонента DataBand, но также можете печатать параметры и переменные проекта. Эти возможности предоставляет Data Text Editor. Вам разрешено использовать подстановки для полей с аналоппным содержанием» используя свойства LookupDataView, LookupDisplay, LookupField и Lookupinvalid.
Связать компонент DataText с данными вы можете двумя способами. Первый — выбор одиночного имени поля из выпадающего списка. Это хорошо для отчетов, требующих однозначного соответствия между полем и элементом DataText. Но вам также позволено комбинировать между собой много различных полей лаиных, привязывая их к одному компоненту DataText с помощью окна DataTextEditor (рис. 7.14). Этот редактор, внзнваемый щелчком на кнопке с многотоинсм при изменении значения в свойстве, позволяет конкатенировать поля, параметры и пере- меиные, строя соответствующие выражения. В окне редактора имеются 4 группы элементов управления: Data Fields, Report Variables, Project Parameters» Post Initialize Variables и Data Text Data Text — это результирующее окно. Перед вставкой какого-либо элемента в него вам следует нажать одну из двух кнопок в правой части этого окна.
Рис. 7.14. Окно редактора Data Text Editor
Кнопка + соединяет два значения между собс访 без пробелов» а кнопка & конкатенирует их через одиночный пробел. Нужное поле из таблицы базы данных выбирается в списке, после чего требуется нажать кнопку Insert Field. Содержание списка
определяется выбранным видом данных в левой части группы Data Fields. К результирующему выражению можно присоединить различные переменные отчета, такие как номер текущей страницы или дата п время выбором из списка Report Variables. Вы также можете добавить свои собственные параметры, например имя пользователя, заголовок отчета или настройки пользователя. (Для того, чтобы создать параметр, необходимо выбрать в дереве проекта корневой узел проекта и в панели свойств открыть редактор строк, нажав на многоточие при изменении свойства Parameters.) В результирующее выражение DataText можно добавлять строковые константы, ограниченные апострофами или кавычками. В принципе, выражение можно ввести и как просто строку в поле, но в таком случае к вам предъявляются повышенные требования к контролю его корректности.
DataMemo
Компонент DataMemo позволяет добавлять в отчет мемо-поля базы данных, то есть содержащие многострочные тексты. Например, помещать комментарий в углу страницы. Для выбора мемо-поля нужно установить значения свойств DataView и Data Field. Rave Reports п релоставл яет фу нкци io mail merge, которая дает возможность динамически делать замещения в мемо-полях. Окно Mail Merge Editor открывается (рис. 7.15) при щелчке на кнопке с многоточием при задании значения свойства MailMergeltems. В окне редактора можно определить искомые замещаемые фрагменты (используете кнопку Add и поле Search Token) и значение замещения, которое может представлять собой выражение, ан<ыогпчпое получаемому при использовании DataTextEditor (этот редактор вызывается при нажатии кнопки Edit).
Рис. 7.15. Окно редактора Mail Merge Editor
CalcText
Различие между компонентами DataText и CalcText заключается в том, что рассматриваемый компонент специально предусмотрен для вычислений и отображения их результатов. Свойство CalcType определяет тип вычисления, соответствующий
стандартным агрегатным функциям: ctAverage, ctCount, ctMaximum, ctMinimum и ctSum. Свойство CountBlanks указывает, будут ли пустые (нулевые) значения учитываться при подсчете суммы или среднего. Свойство RunningTotalзадает, будет ли в момент запуска генерации отчета обнуляться вычисляемое значение.
CalcOp
Невизуальный компонент, с помощью которого можно производить всевозможные вычисления с данными, включающими в себя значения из полей таблиц (свойство SrclDataField, Src2DataField), константами (SrclValue, Src2Value) и других вычисляемых параметров (ScrlCalcVar, Src2CalcVar). Свойство Operator задает тип операции. Каждый операнд может быть дополнительно обработан с использованием стандартных функций, например тригонометрических (SrclFunction, Src2Fuction). Задействуя параметры проекта для хранения промежуточных результатов вычислений, можно строить сколь угодно сложные выражения.
CalcController
Невизуальный компонент, связывающий между собой компоненты DataBand, CalcText и CalcTotal через их свойства Controller. В процессе печати отчета обрабатывает сигналы от этих компонентов, вырабатывая результат операции в зависимости от полосы, на которой данный компонент расположен. Другая функция — инициализация компонентов CalcText и CalcTotal указанном значением (свойства InitCalcVar, InitData Field и InitValue).
CalcTotal
Невизуальная версия компонента CalcText, во время ^печати» которой отображаются значения, сохраненные в параметре проекта (свойство DestParam) и форматируются в соответствии со значением свойства Display Format Используется для выполнения вычислений, результаты которых будут нужны для проведения других вычислений посредством компонентов CalcOp.
Data Cycle
Невизуальная полоса отчета, связанная с таблицей базы данных, и ориентированная для работы с изменяющейся в DataView информацией. По сути, представляет собой цикл (петлю) через все detail-записи данных для одного уровня master-записи.
Типичный случай: счет, генерируемый для таблицы со множеством пользователей, в которой каждый пользователь имеет различные статьи расхода» связанные с этим счетом. Для каждого такого пользователя вы должны представить список его собственных расходов. В таком случае вы можете организовать master-Tafijuiuy, в которой каждому пользователю будет присвоен уникальный идентификатор. В результате перед выводом на печать информации по каждому следующему пользователю будет осуществляться цикл ио таблице, содержащей сведения по всем статьяNf расхода, с ним связанным.
Имя такой master-таблицы определяется свойством MasterDataView. Две таблицы связываются между собой посредством свойства Detai 1Кеу. В нашем примере это идентификатор пользователя.
Данные компонента DataCycle могут быть во время формирования отчета отсортированы или отфильтрованы. Эту возможность предоставляет свойство MasterKey. Если нажать на кнопку с многоточием при задании значении свойства, откроется
окно Data Text Editor (рис. 7.14). Например, если вы хотите исключить из отчета всех пользователей, проживающих за пределами вашего города, введите в поле Data Text этого окна соответствующее значение.
DataMirror Section
Компонент DataMirrorSection предназначен для задания так называемой оеркаль- ной» области, которая будет использоваться в отчете для создания вариаций отчетов и представляет собой секцию, которая копирует с незначительными расхождениями оригинальную секцию, основываясь на содержании свойства Data Field. «Зеркалирование» секций — мощный метод, поскольку секция (TRaveSection, похожа на ТPanel в Delphi) может содержать любые другие компоненты, включая п)афические, регионы, текстовые и т. д. При этом все дочерние ее элементы зеркалируются. При изменении оригинального компонента все зеркалируемые соответственно изменяются. В качестве примера рассмотрим компонент DataMirrorSection, включенный в демонстрационный файл Rave (найдите его в каталоге Rave н откройте). Этот пример демонстрирует, как зеркалируется блок адресных данных в международный или американский формат (в формате США отсутствует строка государства и сам блок смещен к краю). На странице 2 имеются три секции. Секция 3 включает в себя общие строки, которые присутствуют в обоих шаблонах. Секции 1 и 2 содержат зеркала секции 3. В «международной» секции дополнительно находится строка государства. Заметьте, что комментарий («remarks»), который будет добавлен на страницу 2 проекта — не есть часть какой-либо секции. «US Template» и <International Template» это обычный текстовый комментарий, помогающий понять назначение каждой секции. Свойства DataView и DataField компонента DataMirrorSection на странице 1 используются для выбора шаблона форматирования для зеркала. Чтобы понять логику взаимодействия, щелкните на кнопке с многоточием при задании значения свойства Data Mirrors для открытия окна Data Mirror Editor. Выберите пункт DataMirror и ознакомьтесь с установками в нижней группе элементов этого диалогового окна. Обратите внимание, что одна из установок должна быть помечена флажком Default Если вы этого не сделаете, то при форматировании будет использовано родное содержание компонента.
Компоненты управления отчетом
Рассмотрим компоненты для создания отчетов, которые поставляются вместе со средой Delphi 7 н располагаются на вкладке Rave палитры компонентов Delphi. Общий вид вкладки Rave показан на рис. 7.16.
W^wvi^I Ь#шг^#^^«Йг^й>( ОвсмЙ«ОЛе| ОийхюГ^ЛпЭнТ AcfeveX R** |k^G*itti IrK^Servmi ^
U电丽/%,学尊e J曜隣喘,憫
/工 . + 一」: - -一: 一二..二 二 一一一 _— - __~Д^L - : _ •…,h -_ _ - „ - ? .. &^: :iS一W匕 丽醒忘
Рис. 7.16. Вкладка Rave палитры компонентов Delphi 7
В Rave Reports имеются 2 различных типа объектов: компоненты вывода (Output Components) и классы отчета (Report Classes). Первые отвечают за отправку отчета по различным назначениям, вторые представляют собой управляющие классы. Вкладка содержит тринадцать объектов, часть из которых относятся к первомутипу (на пиктограммах с наличием голубого цвета), а остальные соответственно, — ко второму. Все эта объекты мы опишем ниже в порядке их размещения на вкладке слева направо.
Компонент RvProject
Компонент RvProject — предназначен для установки связи с файлом отчета, который был создан с помощью дизайнера Rave Reports. Используйте этот класс для получения доступа к листингам любых отчетов и их выполнения. Обычно в приложении используется всего один компонент RvProject, но вы можете определить их и больше, если это необходимо. Свойство ProjectFile задает файл проекта отчета. Этот файл с расширением RAV может содержать множество различных требуемых вам вариантов отчета. При вызове метода Open файл проекта отчета загружается в оперативную память для подготовки печати отчета или настройки конечным пользователем. Вы можете использовать метод Close, если больше не собираетесь работать с проектом или перед завершением работы приложения. Любые изменения, внесенные в проект отчета, вы можете зафиксировать методом Save. RvProject также содержит несколько свойств и методов, таких как SelectReport, GetReportList, ReportDesdbMemo, ReportDesc, ReportName и ReportFullName, позволяющих создать эффективный интерфейс для пользователей проекта (рис. 7.17).
Рис. 7.17. Свойства компонента RvProject
Свойство Engine позволяет назначить альтернативное средство для вывода отчета. Для этого соответствующим образом настраивается компонент RvSystem и генерируются NDR-потоки или файлы посредством компонента RvNDRWriter.
При включении компонента RvProject в свое приложение вы должны обеспечить следующую базовую последовательность операций и реагирование на действия пользователя:
Вызвать метод RvProject.Open, то есть открыть файл проекта, указанный в свойстве ProjectFile.
Вызвать метод RvProject.GetReportList(ListBoxl.Items, true) для загрузки имен отчетов в список ListBoxl.
Задать обработку события OnClick (щелчков пользователем кнопкой мыши на элементах списка). Для этого вызовите RvProject.SelectReport(ListBoxl.Items- [ListBoxl.ItemlndexJ^rue); и затем RvProject.ReportDescToМеmo(Memo 1); для выбора текущего элемента списка и копирования описания отчета в поле Memol.
Вызвать RvProject.Execute для печати выбранного отчета.
Вызвать RvProject.Design, чтобы открыть визуальный дизайнер для работы с текущим отчетом для конечного пользователя (поддерживается только при наличии лицензии EUDL (End User Designer License).
Включить в проект метод RvProject.Close для закрытия отчета и освобождения выделенной памяти.
Ради зкономш1 ресурсов, выделяемых приложению, Rave Reports в обязательном порядке загружает только стандартные и графические компоненты, а также присутствующие на вкладке Report. Компоненты Bar Code и другие должны быть зарегистрированы и подключены для компиляции явно, если они используются приложением. Напрнмер, компонент Bar Code можно включить в приложение следующим образом. Сначала на форме с компонентом RvProject нужно добавить объект RvBarCodel для возможности использования его в программном коде, а после чего определить обработку события RvProject.OnCreate н вызвать метод RaveRegister для RvCsBars, как это показано ниже.
procedure TFonnl. RvProjectCreate( Sender : TObject): begin
RvBarCcxjel. RaveRegister:
end:
Эти действия обязательны для любых дополнительных компонентов. В противном случае вы при запуске проекта получите сообщение об ошибке вида ♦ Класс TRavePostNetBarcode не найден».
Компонент RvSystem
Хотя в использовании компонент RvSysteM самый легкий, следует обратить на него внимание, потому что интеграция компонентов RvRenderPreview, RvRenderPrinter и RvNDRWriter обеспечивается именно с его помощью. RvSystem может посылать отгшт на принтер или экран предпросмотра, а также отображать настройки и статус экрана. Рассмотрим более подробно свойства этого компонента (рис. 7.18).
ЕЗЕЗObiecl Inspectoi
ЕЗ
ЕЗ
1 Bv^y«ern1 Bv^y«ernjRvSySeml
1 Bv^y«ern
1 Bv^y«ern
:每0e>« I EvenU [
■0占姦b卤:囲师声踪)二一"[「";二 ,一£二^й:…….' ,彳:收瓜дя
犯蜜隠喊.:JT$y*k©mFtlwl .
抬碗 авк :改将眦困用堺 奉施мf酸廊атр,ё屈№SoRevi卅MMsj Й§3^впйе«е^ [j§?Ml«^e^evi6^
Й$уйет^^«; i(T.Sy?tet^.
滴 $jfrfe^<^^'\[»iAl^Se^,s^te^pp(e«^iAfowCo<^e.ssAflwOupfe>
『子鼠:… @.;二:-
!
JiKPf纱削 Report Preview
■■fttup Output Opttom 工&鄧ah忌Report St^uk
:我标J奏确熙尊:
М^й^
Рис. 7.18. Свойства компонента RvSystem
Default Dest определяет место назначения отчета, предлагаемое ио умолчанию;
System Filer позволяют настроить обработчик файла отчета для RvNDRWriter, RvRenderPreview и RvRenderPrinter. Все опции System Filer не работают в режиме потока (если установлено значение smMemory для свойства StreamMode);
System Options управляют конфигурацией компонента RvSystem:
значение soUseFiler будет всегда направлять отчет в файл отчета. Это может быть полезно при использовании метода Macro;
soWaitForOK указывает, будет ли отчет посылаться для вывода при нажатии кнопки ОК;
soShowStatus определяет, будет пли нет отображаться экран статуса во время генерации отчета;
soALlowPrintFromPreview определяет, может ли пользователь направить отчет с экрана предпросмотра на принтер;
soPreviewModal устанавливает модальный режим окна предпросмотра;
soNoGenerate указывает, пропускать ли этап генерации отчета, то есть выводить отчет непосредственно на экран. Эти настройки могут быть применены только в режиме StreamMode;
в свойстве System Preview отображаются вес настройки предпросмотра, соответствующие RvRenderPreview;
в свойстве SystemPrinter отображаются все настройки принтера, соответствующие RvNDRWriter;
SystemSetups содержит логические свойства, отвечающие за конфигурацию экрана для RvSystem.
Компонент RvNDRWriter•
Используется в сочетании с RvRenderPrinter н RvRenderPreview для сохранения отчета в файле специального бинарного формата (NDR) для последующей распечатки на принтере или предпросмотра. Полный список свойств и методов компонента представ刀ей па рис. 7.19. Метод AccuracyMethod определяет способ вывода строк. FileName — фаСл. которьп! будет создан, если Stream Mode установлено в значение, отличное от smUser. Используйте smFi【en”* больших отчетов (>10 страниц пли при наличии серии изображений) и smMemory для маленьких отчетов (<10 страниц). Отчет направляется в файл вызовом метода Execute.
Рис. 7.19. Свойства компонента RvNDRWriter
5 Зак 956
Компоненты Data Connection >
Используя события классов Data Connection, вы можете управлять посылкой данных в отчет Rave Reports. Всего имеются четыре таких компонента:
RvCustomConnection предназначен для связи DirectDataView, созданного дизайнером Rave Reports, с обычными данными (массивами в памяти, бинарными файлами, данными, генерируемыми во время событий);
RvDataSetConnection предназначен для связи DirectDataView с набором данных (например, компонентом DataSet);
RvTableConnection предназначен для связи DirectDataView с таблицей (например, компонентом Table);
RvQueryConnection класс предназначен для связи Di rect Data View с запросом (например, компонентом Query).
Компонент RvCustomConnection работает с индексированными данными и соответственно задействует свойства Datalndex и DataRows, в силу чего обработка событий при его использовании неактуальна. Наиболее эффективным для него является реагирование на OnNext.
Если отчет предназначен для вывода информации из базы данных посредством компонентов Data Connection, вам не обойтись без обработки событий, и особенно —OnValidateRow. Имеются следующие виды событий:
On EOF происходит при достижении конца данных. Значение true говорит о том, что строк для вывода больше не осталось или сгенерировано событие OnNext при попытке перехода за последнюю строку таблицы;
OnFirst происходит в момент перемещения указателя текущей записи в первую строку данных;
OnGetCoIs возникает, когда Rave Reports получает метаданные: имя поля, тип, размер символов, полные имя и описание;
OnGetRow происходит при получении данных из текущс)! строки;
OnGetSorts происходит при потребности Rave в информации о поддерживаемых методах сортировки;
OnNext возникает тогда, когда Rave хочет переместить указатель текущей записи на следующую строку данных;
ОпОреп генерируется при иници^пизации сессли. Текущее состояние может быть впоследствии восстановлено генерацией события OnRestore;
OnRestore происходит, когда Rave хочет восстановить состояние данных, запомненное перед открытием сессии;
OnSetFilter возникает при потребности фильтрации данных, например в отчетах master-detail;
OnSetSort возникает при потребности сортировки данных;
OnValidateRow генерируется для каждой строки данных для их фильтрации.
В следующем примере показано, как можно исключить лз отчета строки, неудовлетворяющие заданному условию, используя событие OnValidateRow.
procedure Tforml CustonCXNVa1idateRow(Connection: TRvCustomConnection;
var VaiidRow: Boolean):
begin
VaiidRowDataRecord.ПoatFie1d0.0:
end:
Примеры обработки всех событий вы найдете в справочной системе и электронной документации к Rave Reports, но есть смысл внимание на одно из них, позволяющее проводить дополнительную обработку направляемых в отчет данных — OnGetRow. Есть несколько способов записи данных в специальный буфер. Порядок и типы сохраняемых полей (dtString, dtlnteger, dtBoolean, dtFloat, dtCurrency, dtBCD, dtDate, dtTime, dtDateTime, dtBlob, dtMemo и dtGraphic) могут быть получены непосредственно из описаний полей, предоставляемых событием OnGetCoIs. Данные в буфер можно поместить согласно следующему списку методов:
procedure WriteStrData(FormatData: string;
NativeData: string); { dtStrmg }
procedure WritelntDataCFormatData: string;
NativeData: integer). { dtInteger }
procedure WriteBoolData(FormaWata: string:
NativeData: boolean); { dtBoolean }
procedure WriteFloatData(FormatOata: string:
NativeData: extended); { dtFloat }
procedure WriteCurrData(FormatData: string;
NativeData: currency); { dtCurrency }
procedure WriteBCDDatafFormatData: string:
NativeData: currency): { dtBCD }
procedure WriteDateTimeData(FormatData: string;
NativeData: TDateTime); { dtDate. dtTime and dtDdteTme )
procedure WriteBlobData(var Buffer; Len: longmt). { crBlob. dtMemo and dtGraphic }
Также имеется специальный метод WriteNullData (без параметров), который может быть вызван для любых инициализированных нолей или содержащих нулевые данные. Параметр FormatData используется для передачи форматированной строки данных в поле. Параметр NativeData предназначен для передачи неформатированных или «сырых» данных в поле. Если спещиъчьное форматирование определено в отчете, то оно будет осуществляться для NativeData, иначе для печати будут использоваться данные FormatData.
Например:
procedure Tforml.CustomCXNGetRowCConnection: TRvCustCJnConnection): begin
With Connection do begin
WritelntDatat" .DataRecord.IntField):
WriteStrOatat''.DataRecord.StrField);
WrlteFloatDatat''.DataRecord.FloatField):
end: { with } end:
Свойство Name компонента Data Connection (рис. 7.20) используется для именования самого соединения с данными. Очень важно, чтобы ваши компоненты Data Connection имели уникальные имена во избежание возникновения пересечений внутри вашего приложения. Также xopoineii практикой считается использовать уникальные для приложения идентификаторы для соединений, которые видны из других программ, например используя в качестве префикса сокращение-анаграмму от названия приложения.
Свойство Visible компонента Data Connection определяет, будут ли доступны ваши соединения в других приложениях или версии Rave Reports для конечного пользователя. Соответственно, значение false блокирует видимость соединения извне, a true — открывает его для внешнего доступа. Пока соединение открытого типа доступно конечным пользователям, для него не будут отображаться попытки пользователей
создать новый вид данных, если они производятся не изнутри приложения, которое запустило визуальный дизайнер. Если вы хотите сделать соединение с данными доступным из других приложений для ваших конечных пользователей, лучше будет создать проект отчета с версией визуального дизайнера для программистов, в которой все виды данных уже определены для таких внешних соединений с данными.
О' J InTpactOf府
[RvDalaSetConnecbonl TFM)6峭必brc 七■]
Pfopehw {E¥9hu|
■и^ш :(tsej
LocaFie True
Name RvDaiaSetCwinecbonl
RunirteVKbbb HDevelopef
Тэд 0■
Уев 803 №03
同兩own '.
Рис. 7.20. Свойства компонента RvDataSetConnection
Компоненты отображения
Компонент RvRenderPreview подготавливает фаЛ'], генерируемый RvNDRWriter, и по» сылает его на экран для предпросмотра. Этот компонент по;1лерживает множество методов и событий, которыми разработчик может пользоваться для создания законченного пользовательского интерфейса. Не будем останавливаться на возмож^ ностях, определяемых свойствами этого компонента. — их описание доступно в справочной системе и вынудит нас частично повториться.
Компонент RvRenderPrinter формирует(|)айл, генерир\емый RvNDRWriter, и посылает его на текущий принтер. RvRenderPrinter часто псполкп ется для печати с экрана предпросмотра. Это несложный компонент, не iiMeiomnii мс годов и свойств, позволяющих управлять принтерами и их настройками. Отчет посылается >ta печать вызовом методов Execute или Executecustom.
Компонент RvRenderPDF создает документы Adobe Acrobat из рабочего отчета. Если шрифты должны быть встроены в PDF-фапл, свойство EmbedFonts устанавлмается в значение true. Желаемое качество встраиваемых пзображешя! устанавливается в процентном представлении в свойстве ImageQuality. Сжатие PDF-документов поддерживается свойством логического типа UseCompression, для которого должна быть предусмотрена обработка события OnCompress. например: With TCompressionStream.Create(clMax. OutStream) do try CopyFrom(InStream. InStream.Size): finally Free; end; { with }
Самый простой путь использования компонентов отображения состоит в перетаскивании требуемого значка па форму, при котором автоматически регистрируется формат и стандартные настройки и диалоговые окна предпросмотра. Для получения отличного от стандартного представления вызывается метод Render с передачей в виде параметра объекта NDR TStreain или имени файла NDR.
RvRenderHTML преобразует NDR-поток или файл в HTML-страницы с поддержкой 1рафическ«х объектов. Результат представляется согласно спецификации HTML 4.0, но с ориентацией для вывода на печать, насколько это возможно.
RvRenderRTF преобразует NDR-поток или с[)айл в RTF-формат. Результ»iрующий RTF-документ по возможности приближен к оригинальному отчету, направляемому на принтер. Положение элементов документа на странице указывается с помощью разделителя frames.
RvRenderText преобразует NDR-поток или фа(!Л в текстовый формат, при этом все нетекстовые объекты игнорируются. Свойства CPI и LPI задают количество символов и точек па дюйм соответственно при выводе на конечное устройство вывода.
Пример создания отчета средствами Rave Reports
В общем и целом, возможности разработки отчетов средствами Rave Report сводятся к настройке и организаиии связи двух независимых инструментов: средств вывода данных на печать (code-based printing engine) п визуального интерфейса (visual reporting interface). Рассмотрим порядок создания простого отчета с помощью мастера Simple Table, чтобы проследить взаимодействие ме;клу этими инструментам» на примере. При этом последовательность jeiicTBiiii после запуска Delphi и создания нового приложения включает в себя несколько эгапов.
Сначала мы создадим компонент типа Table. Query и/in DataSet и инициализируем таблицу — установим свойство Active компонента в значение true для гарантии, что все другие свойства установлены корректно. Для простоты возьмем готовый пример из дистрибутивного набора Delphi — Customer.db.
После чего создадим компонент RvDataSetConnection и установим в значении его свойства DataSet компонент базы данных, созданный на первом шаге. Назначим имя этому компоненту, отличное от значения по умолчанию (например FirstReport).
Создадим компонент RvProject Двойным щелчком кнопки мыши на этом компоненте вызовем визуальный диза»!нер
В окне дизайнера Rave Reports выберем н главном меню пункт File » New Data Object. Откроется диалоговое окно Data Connections (рис. 7.21). Выберем Direct Data View и нажмем кнопку Next. Убедимся, что имя FirstReport стало выделенным в списке Active Data Connections, и нажмем кнопку Finish (рис. 7.22).
Рис. 7.22. Выбор активного соединения
Переместимся в панель Project Tree и откроем Data View Dictionary. Выберем новый вид — DataViewl Используя панель свойств (Property Panel), расположенную ниже дерева проекта, изменим имя созданного вида DataViewl на First ReportDV.
С этого момента приступаем непосредственно к созданию отчета. Выберем Tools ► Report Wizards ► Simple Table в главном меню для открытия мастера простой таблицы (Simple Table wizard). Удостоверимся, что имя FirstReportDV выделено, и нажмем кнопку Next для продолжения (рис. 7.23). Выберем 2 и 3 поле в списке н еще раз нажмем Next (рис. 7.24). По желанию изменим порядок полей и опять нажмем Next (рис. 7.25). По желанию зададим отчету осмысленное имя в заголовке н изменим размеры полей п снова нажимаем Next (рис. 7.26). Если нужно, изменим размеры шрифта и нажмем кнопку Generate для создания отчета.
Рис. 7.23. Выбор Direct DataView
Рис. 7.24. Выбор полей таблицы
Рис. 7.25. Перестановка полей
Для предпросмотра результатов выберем File ♦ Execute Report, чтобы открыть диалоговое окно Report Setup. Убедимся, что Preview выделено как место от- ггравки отчета и нажмем ОК (рис. 7.27).
Рис. 7.27. Настройка печати отчетаРис. 7.27. Настройка печати отчета
Рис. 7.27. Настройка печати отчета
Рис. 7.27. Настройка печати отчета
*図1*図1■J 目 盆 У < A »l Ра?е |j~~ "■ 導 4 吗 Bl Zwm 卜仇。% .於■J 目 盆 У < A »l Ра?е |j~~ "■ 導 4 吗 Bl Zwm 卜仇。% .於Simple Table ReportSimple Table Report
*図1
*図1
■J 目 盆 У < A »l Ра?е |j~~ "■ 導 4 吗 Bl Zwm 卜仇。% .於
■J 目 盆 У < A »l Ра?е |j~~ "■ 導 4 吗 Bl Zwm 卜仇。% .於
Simple Table Report
Simple Table Report
Вот теперь мы воочию наблюдаем плоды csoeii работы (рис. 7.28) и получили представление о новейших принципах «отчетостроj<тельства». Наш первый отчет с помощью Rave создан за минимальное число шагов.
F Repoit Pievww
Addri4-976 Sugarloaf Hwy~ PO BoxZ-5471 Neptune LanePO Box 541632J Third Frydenhoj2&738 Paddington Lane32 Marn StPO Box 8745Z32 999 #12A-77A A872 Queen St15243 Underwater Fwy.203 12th Ave. Box 746 PO Box 8534Addri4-976 Sugarloaf Hwy~ PO BoxZ-5471 Neptune LanePO Box 541632J Third Frydenhoj2&738 Paddington Lane32 Marn StPO Box 8745Z32 999 #12A-77A A872 Queen St15243 Underwater Fwy.203 12th Ave. Box 746 PO Box 8534
Addri
4-976 Sugarloaf Hwy~ PO BoxZ-547
1 Neptune Lane
PO Box 541
632J Third Frydenhoj
2&738 Paddington Lane
32 Marn St
PO Box 8745
Z32 999 #12A-77A A
872 Queen St
15243 Underwater Fwy.
203 12th Ave. Box 746 PO Box 8534
Addri
4-976 Sugarloaf Hwy~ PO BoxZ-547
1 Neptune Lane
PO Box 541
632J Third Frydenhoj
2&738 Paddington Lane
32 Marn St
PO Box 8745
Z32 999 #12A-77A A
872 Queen St
15243 Underwater Fwy.
203 12th Ave. Box 746 PO Box 8534
Company
Kauai Dive Shoppe
Unisco
Sight Diver
Cayman Divers World Unlimited Tom Savvyer Drving Centre Blue Jack Aqua Center
VIP Divers Club Ocean Paradise Fantastique Aquatica Marmot Divers Club The Depth Charge Blue Sports Makai SCUBA Club
J :
Конструктор отчетов Quick Report
Среда Delphi 6 имеет специальную вкладку палитры компонентов, иа которой располагаются компоненты для построения отчетов. Эта вкладка носит название QReport и содержит 23 компонента (рис. 7.29).
:『W&£viber I 1г»^пй1ЕйхмН 1修川価 | М認荷I Е齡血縫 I Dec^Eie 曲ЙМ j g^oiii jk^LLt;?叵二要艷墨型畳異里楚虹盟隐型岁用军共型埋
Рис. 7.29. Вкладка QReport
Рассмотрим эти компоненты по порядку (слева направо) и познакомимся с их основными свойствами.
Первый компонент — QuickRep — является базовым компонентом отчета. Данный компонент представляет собой форму для создания внешнего вида отчета, с его помощью можно размещать полосы, которые являются основными элементами отчета (рис. 7.30).
Page Header
Верхний колонтитул
Time
Заголовок отчета
Column Header
Заголовки столбцов
Detail
Область данных
Summary
Итог отчета
Page Footer
Нижний колонтитул
Рис. 7.30. Элементы отчета
В форме QuickRep можно настраивать шрифт, размеры отчета н другие параметры с помощью соответствующих свойств. Отчет связывается с набором данных Table млн Query, для которого он создается, с помощью компонента DataSet Таблица 7.1 содержит перечень основных свойств данного компонента, отображаемых в окис инспектора объектов, и их описание.
Таблица 7.1. Основные свойства компонента QuickRep
Название свойства
Краткое описание
Bands
Свойство типа TQuickRepBands служит для выбора полос, которые будут отображаться в отчете. Содержит шесть подчиненных свойств, отвечающих за отображение: HasColumnHeader — заголовков столбцов; HasDetail — области данных; HasPageFooter — нижнего колонтитула; HasPageHeader — верхнего колонтитула; HasSumma- гу ——итоговых данных; HasTitle ——названия отчета. Все эти свойства имеют булевский тип. Если значение подчиненного свойства равно true, то полоса будет отображаться в отчете
Cursor
Данное свойство указывает, какой вид будет принимать указатель мыши, когда он окажется над компонентом QuickRep. По умолчанию курсор имеет вид обычной стрелки. Программист может выбрать нужный вид курсора в выпадающем списке, который отображается при нажатии на стрелку справа от значения свойства в окне инспектора объектов
продолжение^
Таблица 7.1 {продолжений}
Название свойства
Краткое описаиие
DataSet
Указывает имя набора данных, с которым связан отчет и данные из которого будут включаться в отчет
Description
Свойство может содержать описание вашего отчета или какие-либо комментарии, касающиеся отчета. Это свойство не задействуется самим компонентом QuickRep, но может использоваться вашим приложением, например, для отображения дополнительной информации
Font
Устанавливает параметры шрифта, выбранного для отображения текстовой информации внутри отчета. Содержит несколько вложенных свойств, которые отвечают за тип шрифта, начертание, цвет и т. д.
Frame
Указывает, будет ли вокруг данных отчета выводиться рамка. Содержит в свою очередь несколько свойств: Color — определяет цвет рамки; DrawBottom — определяет, нужно ли рисовать нижнюю линию (по умолчанию имеет значение false, то есть линия не рисуется); DrawLeft ——определяет, нужно ли рисовать линию слева; DrawRight — определяет, нужно ли рисовать линию справа; DrawTbp — определяет, нужно ли рисовать линию сверху; Style — задает стиль линий (сплошная, пунктирная и т. д.); Width — устанавливает толщину линий в пикселах
Functions
Это свойство позволяет программисту добавлять собственные функции, благодаря которым отчет будет рассчитывать какие-либо значения и отображать их
Height
Left Name
Высота компонента QuickRep в форме
Положение компонента QuickRep в форме по горизонтали
Название компонента, по которому он будет идентифицироваться в коде приложения.
По умолчанию присваиваются имена QuickRepl, QuickRep2 и т. д.
Options
Используется для установки дополнительных опций отчета. Содержит три подчиненных свойства булевского типа: HrstPageHeader — указывает, будет ли печататься колонтитул первой страницы отчета (по умолчанию true — то есть будет); LastPageFooter — указывает, будет ли печататься колонтитул последней страницы отчета (по умолчанию — true — будет); Compression — определяет, нужно ли делать сжатие отчета в памяти перед его генерацией (по умолчанию false — сжатие не производится)
Page
Применяется для хранения информации о свойствах страниц отчета. Содержит в свою очередь одиннадцать свойств: BottomMargin — минимальное чистое пространство, которое должно присутствовать внизу каждой страницы отчета; Columns ——используется для печати отчетов, содержащих большое количество колонок с данными и определяет число этих колонок; ColumnSpace — определяет расстояние между колонками многоколоночного отчета; LeftMargin — указывает минимальное чистое пространство, которое должно присутствовать слева у каждой страницы отчета; Length — высота каждой страницы; Orientation — ориентация страниц: poPortrait — книжная, принята по умолчанию; poLandScape ——альбомная. PaperSize — формат страницы. По умолчанию принято стандартное значение А4; RightMargin — минимальное чистое пространство, которое должно присутствовать справа у каждой страницы отчета; Ruler — указывает, будет ли отображаться разметочная сетка в процессе разработки отчета. По умолчанию имеет значение true, то есть сетка будет отображаться; TbpMargin — минимальное чистое пространство, которое должно присутствовать вверху каждой страницы отчета; Width — ширина страницы
Printersettings Определяет некоторые настройки принтера. Содержит пять свойств: Copies —
количество копий каждой страницы отчета, которые должны быть напечатаны. По умолчанию имеет значение 1; Duplex — признак двусторонней печати. По умолчанию имеет значение false, то есть печать будет производиться только с одной стороны бумаги; HrstPage — номер первой печатаемой страницы отчета; LastPage — номер последней печатаемой страницы; OutputBin — способ подачи бума™ в принтер. По умолчанию имеет значение Auto — автоматическая подача бумаги
Название свойства
Краткое описание
PrintlfEmpty
Свойство регламентирует способ, каким будет генерироваться отчет, если набор данных пуст. Если значение данного свойства true (по умолчанию), то отчет будет сгенерирован и отпечатан. Если значение свойства false, то отчет не будет генерироваться
ReportTitle
ShowProgress
Заголовок отчета. Данное свойство имеет тип String
Указывает, будет ли отображаться индикатор выполнения процесса при выводе отчета на печать. По умолчанию имеет значение true, то есть шкала выполнения отображаться будет
Top
Units
Положение компонента QuickRep на форме по вертикали
Определяет единицы измерения размеров страниц, полос, полей и других элементов отчета. Может принимать следующие значения: Inches — дюймы; ММ — миллиметры (по умолчанию); Pixels — пикселы; Native — десятые доли миллиметра; Characters —единицы, настраиваемые в соответстзии с размерами символов, установленными свойством FontSize
Width Zoom
Ширина компонента QuickRep на форме
Степень увеличения или уменьшения размеров отчета в процессе его просмотра. По умолчанию имеет значение 100 (процентов). При установке значения свойства, например, в 200 размеры элементов отчета увеличатся в 2 раза. При установке свойства в 50 размеры элементов отчета уменьшатся также в 2 раза
Второй компонент вкладки QReport палитры компонентов Delphi 6 называется QRSubDetail Названный компонент предназначен для создания связанных отчетов данных. Рассмотрим его основные свойства, коюрые перечислены в табл. 7.2.
Таблица 7.2. Основные свойства компонента QRSubDetail
Название свойства
Краткое описание
Bands
Определяет, будут ли у групп данных подчиненного набора отображаться нижний и верхний колонтитулы. Имеет два дочерних саойсгва булевского типа: HasHeader —— верхний колонтитул; HasFooter — нижний колонтитул;
DataSet
Указывает имя набора данных, с которым связан данный компонент
Master
Используется для установки связи «главный—подчиненный». Может принимать значения, соответствующие имени отчета
Следующий компонент называется QRStringsBand. Этот компонент служит для вставки в отчет дополнительных текстов. При добавлении данного компонента в отчет появляется новая полоса. Мы не будем рассматривать его свойства. Скажем лишь, что одно из них 一 Items — может содержать строки текста, выводимые на печать. Следующий в рассматриваемой поеледовательности компонент вкладки QReport называется QRBand. Он представляет coooii простую полосу отчета, на которой мо- {'ут размещаться другие компоненты. С помошью свойства BandType можно определить назначение добавляемой полосы в отчете. Рассмотрим возможные значения этого свойства:
rbTitle — полоса будет напечатана на первой странице отчета, сразу после верх-. него колонтитула;
rbPageHeader — полоса будет печататься на каждой странице отчета вверху (на месте верхнего колонтитула);
rbDetail — печатается для каждой записи или колонки из связанного с полосой набора данных;
rbPageFooter — будет печататься на каждой странице отчета внизу (па месте нижнего колонтитула);
rbSummary — печатается в конце отчета после всех полос перед нижним колонтитулом;
RbSubDetail — зарезервировано для использования компонентом QRSubDetail;
rbColumnHeader — печатается вверху каждой колонки на каждой страшщс мпо- гоколоночного отчета. В одноколоночном отчете выводится один раз после полосы типа rbPageHeader;
rbGroupFooter ~ полоса нижнего колонтитула для компонентов QRGroup нли QRSubDetaiL Печатается после завершения вывода группы данных;
rbGroupHeader — полоса верхнего колонтит>;ла для компонентов QRGroup или QRSubDetaiL Печатается перед полосой типа rbDetaiL4.'i>i каждой группы данных;
rbOverlay — используется для обеспечения обратпо11 совместимости с QuickReport версии 1. Не используйте это значение в др\ч их случаях;
rbChild — зарезервировано для компонента QRChildBand.
Следующий компонент имеет название QRChildBand. Он позволяет вам создавать дочерние полосы, которые могут содержать внутри себя д))угпс полосы или компоненты вкладки QReport. У этого компонента два интерес пых свойства:
свойство LinkBand служит для того, чтобы связать ;iк)614<';1в(* полосы отчета для их совместной печати на одной странице отчета:
свойство ParentBand позволяетуказать poatrreji ьск>чо п().'нм\д.1я пожкы QRChildBand.
ПРИМЕЧАНИЕ
Одним из самых простых способов определения дочерних полос отчета является установка соответствующего значения в свойстве HasChild любой полосы отчета.
Мы нс будем детально рассматривать каждый компонент, ра( положенный на Владке Qreport, — это потребует слишком много бумаги и tiiiioi jkk|)ck()h краски. Да н не так актуа^1ьно, поскольку болынипство из этих компонентов не требуются для создания простых отчетов. Расскажем лишь о назначешш нссх компонентов этой вкладкн и рассмотрим наиболее важные из пих «крупным планом».
Компонент QRGroup используется для группировки данных о ггста. С ei o помощью можно разбивать компоненты отчета на логические группы.
Компонент QRLabel предназначен для размещения в отчете произвольного текста. Этот компонент является полным аналогом компонента Label, только применяется внутри отчета. Для определения текста, который будет выводиться в отчет, используется свойство Caption.
Компонент QRDBText позволяет отображать текстовые данные, связанные с содержимым одного из ноле" набора данных, в отчете. Свойство DataSet даст возможность связать компонент с набором данных. После выбора значения этого свойства можно выбрать название поля набора данных, делается это с помощью свойства Data Field.
Следующий компонент называется QRExpr. Он позволяет строить математические выражения и отображать результаты вычислении над полями данных и системными величинами (временем, датой и т. п.). С помощью свойства Expression можно вызвать окно построителя выражений (Expression Builder), которое служит для визуального построения математических выражений.
Компонент QRSysData отвечает за отображение в отчете системных данных. С помощью его свойства Data можно выбрать» какая системная информация будет включена в отчет. Возможны следующие значения свойства Data:
qrsColumnNo — номер текущей колонки (для одноколоиочного отчета всегда равен 1);
qrsDate — текущая системная дата;
qrsDateTime — текущие спстемшяе дата и время;
qrsDetaHCount 一 число записей в наборе данных;
qrsDetaRNo — номер текущей записи (пли TCKymoif записи главной таблицы);
qrsPageNumber — номер текущей страницы отчета;
qrsPageCount — количество странпц в отчете;
qrsTime — текущее системное время (:>то значеiнiе установлсiк> в ciioiicTBe Data по умолчанию).
СОВЕТ
Будьте внимательны при установке значения qrsPageCount, так как это требует при формировании отчета двойного прохода по набору данных, что может занять много времени при подготовке отчета в случае большого количества записей.
Следующий компонент называется QRMemo. Он исполк^уется для радменюния внутри отчета многострочного текста н является аналогом компонента Мето. Текст, которьп! должен быть напечатан, необходимо занести в свойство Lines.
Компонент QRExprMemo применяется для размещения в отчете текстов, содержащих математические выражения.
Компонент QRRichText служит для отображения в отчете текста с возможностью форматирования. Таким образом, этот компонент является близким ан^чогом компонента RichEdit.
Компонент QRDBRichText применяется для отображения форматцроваипого текста, хранящегося в одном из полей набора данных.
Компонент QRShape используется для добавления в отчет графических фигур. Является аналогом компонента Shape,
Компонент QRimage служит для вставки в отчет гр;и|)пче(:1<пх изображенпн. Является аналогом компонента Image.
Компонент QRDBImage позволяет вставлять в отчет значемия графических поле(1 набора данных.
Компонент QRCompositeReport нужен для построения составных отчетов.
Компонент QRPreview предназначен для предварительного просмотра на экране подготовленного к печати отчета.
Компонент QRTextFilter используется для установки фильтра текста. Если вы поместите этот компонент на форму, то отчет будет преобразован в ASCII-текст и сохранен в файле на диске. Данный компонент — не визуальный.
Компонент QRCSVFilter используется для установки символа разделителя в текстовом файле. По умолчанию в качестве разделителя фигурирует символ запятой. Данный компонент не визуальный.
Компонент QRHTMLFilter применяется для установки фильтра преобразования данных отчета в формат HTML. Если вы поместите рассматриваемый компонент на форму, то отчет будет преобразован в HTML-формат и сохранен в файле на диске. Этот компонент также не визуальный.
Последний компонент, QRChart применяется для печати в отчете диаграмм, составленных на основе записей набора данных.
Итак, мы более или менее подробно рассказали о средствах и их компонентах, из которых строятся отчеты в среде Delphi 7. Выбор — за вами.
Что нового мы узнали?
На этом занятии мы рассмотрели следующие темы:
что такое отчеты и зачем они нужны;
основные виды отчетов;
компоненты для работы с отчетами;
создание отчетов разных видов.
Занятие 8
Создание простых баз данных
Ваша первая локальная база данных
На этом занятии мы создадим первую базу данных, которая будет полностью функциональна. Мы постараемся использовать все уже изученное в теории на практике. В процессе создания программы мы рассмотрим основные принципы организации удобного интерфейса пользователя.
Ваша первая локальная база данных
Давайте попробуем применить все полз^чснные на ранее пройденных занятиях знания и построить локальную базу данных — напишем программу для приема объявлений в «бегущую строку», которую мы нередко наблюдаем в эфире местных ie;ie~ компаний.
Сначала создадим две таблицы для нашей базы данных. Первая будет хранить сведения о заказчике, текст объявления и другую информацию. Вторая предназначена для настроек и будет содержать цены за одно слово объявления для физических н юридических лиц.
Итак, структура первой таблицы изображена на рис. 8.1.
Таблица OBJAV.DBF состоит из семи полей:
ЯО — поле символьного типа (Char), которое может содержать максимум 40 символов. Предназначено для хранения фамилий заказчиков или названий организаций. Это поле является индексным;
TEXT — поле произвольного размера (Memo-поле). Необходимо для хранения текста объявления;
SOBST — тип собственника (Boolean). Принимает значение True для физических лиц или False для юридических;
SUMMA — числовое поле (Numeric), Содержит значение суммы, выплаченной заказчиком за объявление;
価囿d NarM価囿d NarM10102 TEXT2 TEXT3 SOQST4 SOMMA3 SOQST4 SOMMA5 OAg6 DAIASTA^T5 OAg6 DAIASTA^T7 ОЛГАЕХР7 ОЛГАЕХРSUuclute Information dBASE lot Window* ТаЫе* OBJAV DBFSUuclute Information dBASE lot Window* ТаЫе* OBJAV DBFРис. 8.1. Структура таблицы OBJAMDBFРис. 8.1. Структура таблицы OBJAMDBFRecord lock ■—『L/g F"3Record lock ■—『L/g F"3
価囿d NarM
価囿d NarM
10
10
2 TEXT
2 TEXT
3 SOQST
4 SOMMA
3 SOQST
4 SOMMA
5 OAg
6 DAIASTA^T
5 OAg
6 DAIASTA^T
7 ОЛГАЕХР
7 ОЛГАЕХР
SUuclute Information dBASE lot Window* ТаЫе* OBJAV DBF
SUuclute Information dBASE lot Window* ТаЫе* OBJAV DBF
Рис. 8.1. Структура таблицы OBJAMDBF
Рис. 8.1. Структура таблицы OBJAMDBF
Record lock ■—
『L/g F"3
Record lock ■—
『L/g F"3
DATAP — поле типа дата (Date). Фиксирует дату приема об ьявления;
DA7ASTART — поле типа дата (Date). Содержит дату выхода объявления в эфир;
DALAEXP — поле типа дата (Date). Отражает срок окончания и^юлпкации объявления в эфире.
Структура второй таблицы показана на рис. 8,2.
Structure Inforaabon dBASE IV ТаЫ*; Oca.dnfStructure Inforaabon dBASE IV ТаЫ*; Oca.dnf■ Ei^Jf^ef■ Ei^Jf^ef"CENA"CENAfcfcField NameField NameSave At.Save At.
Structure Inforaabon dBASE IV ТаЫ*; Oca.dnf
Structure Inforaabon dBASE IV ТаЫ*; Oca.dnf
■ Ei^Jf^ef
■ Ei^Jf^ef
"CENA
"CENA
fc
fc
Field Name
Field Name
Save At.
Save At.
Рис. 8.2. Структура таблицы Cena.dbf
Таблица OBJAV.DBF состоит из двух полей:
FCENA — числовое поле со значением стоимости одного слова объявления для физических лиц;
UCENA — числовое поле. Содержит значение цены за одно слово объявления для юридических лиц.
Пусть таблицы созданы и сохранены в одном каталоге. Теперь проектируем формы. Их будет три:
главная форма — для приема объявленнП;
форма настройки — для задания цены одного слова текста для физических и юридических лиц;
форма поиска — для поиска (с помощью фильтрации) записей по фамилии или по наименованию организации;
Главная форма выглядит так, как показано на рис. 8.3.
Риа 8.3. Главная форма
Мы „сбудем подроби» останавливаться на описании каждого компонента, расположенного в форме. Отметим только, что поля для ввода фамилии и суммы — это поля DBEdit. Опи привязаны к таблице Tablel через компонент DataSourcel с помощью свойства DataSource. Поле для ввода текста объявления — компонент DBMemo Он также привязан к таблице Tablel. Таблица Tablel изначально активна (для этого установите ес свойство Active в True). Также свойству TableName таблицы Tablel нужно присвоить значение, указывающее на путь к таблице OBJAV.DBF.
Кроме того, для отображения отчета добавим в форму два компонента:
■ RvDataSetConnectionl — для установки связи будущего отчета, который мы с вами создадим далее, с таблице访 Tablel. Для этого установите свойство DataSet компонента RvDataSetConnection 1 в Tablel;
■ RvProjectl — для указания файла отчета, который мы создадим с помощью дизайнера отчетов Rave Designer позже. Пока отметим, что файл отчета будет называться MyReport.rav и именно его нужно будет указать в свойстве ProjectFile компонента RvProjectl.
Приведем текст программы модуля Unitl, который сопоставлен с главной формой Forml (листинг 8.1). В него включены подробные комментарии, и он не должен вызвать затруднений при изучении.
Листинг 8.1. Модуль Unitl
unit Umtl:
interface
uses
Windows. Messages. SysUtils. Classes. Graphics. Controls. Forms. Dialogs.
ComCtrls. Db. DBTables. Menus. StdCtrls. Grids. DBGrids, ExtCtrls.
Buttons. DBCtrls. Mask:
type
TForml - class(TForm)
MawMenul: TMawMenu;
Nl: TMenuItem;
N2: TMenuItem:
DataSourcel: TDataSource:
Tablel: ПаЫе:
N5: TMenuItem;
PageControl1■ TPageControl :
TabSheetl: TTabSheet:
Label 1: TLabel;
Labe12: TLabel.
Label3: TLabel;
LabeM: TLabel.
Label5: TLabel:
Bevel 1: TBevel.
Bevel3: TBevel.
Bevel4: TBevel:
DateTimePickerl: TDateTimePicker:
Label6. TLabel;
Label7: TLabel;
DateTimePicker2: TDateTimePicker:
Bevel 5: TBevel:
Labels: TLabel:
Bevel6: TBevel;
BitBtnl: TBitBtn:
BitBtn2: TBitBtn:
BitBtn3: TBitBtn:
N7: TMenuItem;
N8: TMenuItem;..
N10: TMenuItem:
DBEditl: TDBEdit:
DBRadioGroupl: TDBRadloGroup:
Bevel2: TBevel;
DBMenwl. ТОВМепю;
DBEd】t2: TDBEd?t:'
N4: TMenuItem;
procedure BltBtn3Cl1ck(Sender: TObject):
procedure N2Click(Sender: TObject):
procedure FormCreate(Sender: TObject):、
procedure BitBtnlClick(Sender: TObject):'
procedure BitBtn2Chck(Sender: TObject):
procedure N4Chck(Sender: TObject):
procedure N8Click(Sender: TObject):
procedure N10C1ick(Sender: TObject); private
(Private declarations } public
(Public declarations } end:
var
Forml: TForml;
implementation'
uses Unit2. Unit3. Umt4:
($R *.DFM}
procedure TForml.BitBtn3Click(Sender: TObject): var s:string;
1.summ:integer:
// Определяем переменную для текущей даты
SystemT: TSystemTime;
// Определяем две строковые и одну целую переменную
S.S1:String;
i:Integer; begin
// Считаем сумму за объявление
s:-DBMemol.Lines.Text: summ:=l;
for i:=l to length(s) do
begin
if s[i]-' - then summ:-summ+l: end:
// Для физических и юридических лиц - разные цены
if DBRadloGroupl.Itemlndex-O then
// Физическое лицо
DBEdit2.text:-IntToStr(Fonn2.Tablel.FieldByNameCFCena") .Aslnteger*swmi):
if DBRadloGroupl.Itemlndex-l then
// Юридическое лицо
DBEdit2.text :eIntToStr(Fonn2.Tablel .FieldByNameCUCena") .Aslnteger*swmi): end:
procedure TForml.N2Click(Sender: TObject):
begin
// Показываем форму настройки в монопольном режиме
Fonn2.ShowModal :'
end;
procedure TForml.FormCreate(Sender: TObject):
begin
Листинг 8.1 {продолжений
// При запуске 叩нпоження добавляем новую пустую
// запись в конец таблицы
Tablel Append; end:
procedure TForml.BitBtnlClick(Sender: TObject):
// Определяем переменную для хранения системной лзты
SystemTirne: TSysteniTime.
begin
// Записываем измененные данные в таблицу
// Заносим дату выхода оОьявления в эфир
Tabiel.FieldByNameCDataStarf) AsDateTime:₽DateT?meP1ckerl.Date;
// Заносим дату прекращения выхода обьявления
Tablel FieldByNarneCDataExp").AsDateTirne:-DateTimePicker2.Date:
// Попучаем текущую дату
GetLocalTirne(SystemTime).
// Заносим текущую дату■
Tablel.FieldByName("DataP") .AsDateTime.-SysteniTimeToDateTinie(SysteniTime);
// Записываем измененные данные в таблицу
Tablel.Post:
// Добавляем новую запись в конец таблицы
Tablel.Append: end.
procedure IForml.BitBtn2Chck(Sender: TObject): begin
// Отмена сделанных изменений
Tablel.Cancel.
// Добавляем новую запись в конец табпицы
Tablel Append: end:
procedure TFoml.N4Click(Sender: TObject): begin
// Завершение работы приложения
Forml.Close:
end.
procedure TForml.N8C1ick(Sender- TObject); begin
// Вывод формы поиска в монопольном режиме
Forin3.ShowModal:
end;
procedure TForml.N10C1ick(Sender: TObject): begin
// Предварительный 叩осмотр или печать отчета
// Получаем текущую дату
GetLocalTime(SystemT):
SI =DateTimeToStr(SystemTimeToDateTirne(SysteniT)):
// Вырезаем первые 8 символов из запрошенного значения
// и получаем только дату без времени for 1:-1 to 8 do
begin
S:=S+Sl[i]:
end:
// Теперь переменная S содержит текущую дату
// Устанавливаем фильтр
rablel.Filter. = 'DATAP=' + 一一 +S + 一….
〃 Активизируем фильтр Tabiel.F i1teredi-true: RvProjectl.Execute: end.
end.
BHeuiHiiii вид BTopoii формы показан на рис. 8.4.
Рис. 8.4. Форма настройки
Эта форма называется Form2 и содержит небольшое количество компонентов. Отметим» что таблица lablel должна в свойстве TableName содержать путь к таблице CENA.DBF. Компоненты DBEditl и DBEdit2 привязаны к полям FCENA и UCENA таблицы lablel соответственно. Текст программы модуля Unit2 приведен в листинге 8.2. Он тоже достаточно понятен.
Листинг 8.2. Модуль Unit2
unit Unit?;
interface
uses
Windows. Messages. Syslltils. Variants. Classes. Graphics. Controls. Forms.
Dialogs. StdCtrls. ExtCtrls. Buttons Mask. DBCtrls. D8. DBTables:
type
TForm2 - class(TFonn)
Bevel1: TBevel:
label 1: TLabel:
Bevel2: TBevel:
Label2: TLabel:
Label3: TLabel:
BitBtnl: TBitBtn;
DatsSourcel: TDstaSource:
Tablel: TTable:
DBEditl TDBEdit:
DBEdit2 TDB£dit:
Label4 TLabel:
procedure FormCreateCSender: TObject):
private
{ Private declarations } public
{ Public declarations } end.
Листинг 8.2 {продолжений var
Forni2: TFoe2;
Implementation
{SR *.dfm}
procedure TForm2.Forn)Credte(Sender: TObject): begin
// Активизируем таблицу
Tablel.Active:"true:
// Переходим нд первую запись
Tablel.First: end;
end.
Форма поиска представлена на рис. 8.5.
Рис. 8.5. Форма поиска
Форма поиска носит имя Form3 и содержит компоненты DBGridl и DBNavigatorl. Они предназначены для отображения результатов поиска и редактирования данных. Поиск осуществляется с помощью установки фильтра и ведется по полю FIO. Текст программы модуля Unit3 приведен в листинге 8.3. Все необходимые для понимания программы комментарии в листинг включены.
Листинг 8.3. Модуль Unit3
unit Un1t3;
interface
uses
Windows. Messages. SysUtils, Variants. Classes. Graphics. Controls. Forms.
Dialogs. ExtCtrls. DBCtrls. D8. Grids. DBGrids. DBTables. StdCtrls.
Buttons:
type
TFoe3 = clsssCTForm)
8evell: TBevel:
Label 1: TLabel:
Editl: TEdit:
BitBtnl: TBitBtn:
Bevel 2: TBevel;
Tablel: TTable;
DBGrldl: TDBGrid:
DataSourcel: TDataSource:
B1tBtn2: TBitBtn:
DBNavigatorl: TDBNavigator;
procedure BitBtnlClickCSender: TObject): private
(Private declarations }
public
(Public declarations }
end:
var Form3: TForm3:
implementation
($R *.dfm}
procedure TForm3.BitBtnlClick(Sender: TObject): begin
// Активизируем набор данных
Tablel.Actlve:-true:
// Устанавливаем фильтр в соответствии с введенным
// текстом в текстовое поле Editl
Tablel.Filter-^FIO-' ++ Editi.Text +
// Включаем фильтр
Tabi el.Filtered:-true;
end:
end.
Теперь осталось создать файл отчета, который будет выводить информацию о поступивших за день объявлениях.
Запустите дизайнер отчетов Tbols ► Rave Designer (Инструменты ► Дизайнер отчетов). Затем выберите пункт меню File ► New Report (Файл ► Новый отчет) (рис. 8.6). Теперь выбираем File ► New Data Object (Файл ► Новый объект данных) и в открывшемся окне — Direct Data View (Непосредственный просмотр данных) (рис. 8.7).
Нажимаем Next (Далее) и в следующем окне — Finish (Готово) (рис. 8.8).
Если вы обратите внимание на дерево проекта, то, раскрыв в нем блок Data View Dictionary (Словарь просмотра данных), а затем DataViewl, вы увидите перечень всех полей, содержащихся в таблице Tablel (рис. 8.9).
Теперь с помощью Мастера простого отчета создаем отчет. Выбираем пункт меню Tools ► Report Wizards ► Simple Table (Инструменты ► Мастер отчетов ► Простой отчет). В первом шаге Мастера простого отчета выбираем единственное представление данных DataViewl (рис. 8.10) и нажимаем кнопку Next
Рис. 8.6. Окно дизайнера отчетов
Рис. 8.7. Окно установки связи с данными
Рис. 8.8. Окно установки связи с набором данных
国 令 Report Lixay
。GfoM Page Catalog
E] ♦ D&a View Dtcbonaiy
曰圆(M^fiwwl 一电而^ewIFIO '63 DehMewlTEXT
:fiSD&oViewiS 口 BST
^-SlOdUVtewlSUMMA .励 Dat6View1DATAP ■阮 OMeMewlDATASTART L В DetaViewWATAEXP
й DaiaViewlFJVEPROC
-в DaiaViewlUFIVEPROC
Рис. 8.9. Панель дерева проекта с полями таблицы
Рис 8.10. Первый шаг Мастера простого отчета
На втором шаге мастера выбираем поля, которые необходимо поместить в наш отчет. В нашем случае это FIO, SUMMA и DATASTART (рис. 8.11). После выбора нажимаем Next
Рис 8.11. Второй шаг Мастера
На третьем шаге выстраиваем порядок следования (слева направо) полей, то есть порядок их расположения в отчете (рнс. 8.12).
Рис. 8.12. Третий шаг Мастера
Следующий шаг мастера позволит нам задать имя для отчета, которое будет отображаться в начале отчета (рис. 8.13).
Рис. 8.13. Четвертый шаг Мастера
Последний шаг мастера позволяет установить шрифты для разных элементов от* чета (рис. 8.14).
Рис. 8.14. Последний шаг Мастера
Все, теперь нажимаем кнопку Generate (Создать) и получаем готовый отчет (рис. 8.15). Осталось исправить подписи к полям на панели DataViewlBand. Для этого выбираем нужную подпись, например FIO, и сперва щелкаем на ней мышью, а затем в окне свойств исправляем свойство Text на нужный текст, например Фамилия/Организация (рис. 8.16).
Рис. 8.15. Готовый отчет
Рис. 8.16. Исправленные подписи к полям
Теперь сохраняем файл отчета под именем MyReport.rav с помощью пункта меню File ► Save As (Файл ► Сохранить как).
Итак, мы создали полноценную программу, которая работает с локально/! базой данных. Теперь пришло время для разговора об особенностях создания клиент- серверных приложений, работающих с базами данных.
Что нового мы узнали?
На этом занятии вы:
закрепили полученные ранее знания;
создали приложение для работы с локально!! базо(1 данных.
Занятие 9
Построение клиент-серверных баз данных
Основы технологии «клиент-сервер»
Использование хранимых процедур
Язык хранимых процедур и триггеров
Использование триггеров
Генераторы
Работа с транзакциями
На этом занятии мы дадим определение, технологии «клиент-сервер», выясним, где и для чего она применяется. Вы узнаете, что такое транзакции, триггеры и хранимые процедуры.
Основы технологии «клиент-сервер»
До настоящего момента мы рассматривали только локальные базы данных, не затрагивая многопользовательского доступа. Целью данного занятия является обсуждение особенностей, присущих удаленным базам данных.
Напомним, что при использовании технологии «клиент-сервер» база данных располагается на удаленном компьютере (сервере) и называется 2/Эале?^ной базой данных.
ПРИМЕЧАНИЕ :
Сервером называется не только компьютер (сервер сети), но и специализированная программа, которая в нашем случае управляет базой данных.
Приложение, обеспечивающее доступ к базе данных с компьютера пользователя, называется приложением^клиентом.
Взаимодействие клиента и сервера можно описать двумя фразами (рис. 9.1):
клиент формирует SQL-запрос серверу, на котором расположена база данных, и отправляет его по сети;
сервер выполняет запрос и возвращает клиенту запрашиваемые данные.
ЗапросЗапрос(^Обработка запр^^)(^Обработка запр^^)
Запрос
Запрос
(^Обработка запр^^)
(^Обработка запр^^)
Сервер базы данныхСервер базы данныхПриложение-клиентРезультат
Сервер базы данных
Сервер базы данных
выполнения запроса
Рис. 9.1. Схема взаимодействия клиента и сервера
Преимущества такого метода работы очевидны:
обработка запроса происходит на сервере, клиент же получает только необходимые данные;
поскольку посылаются только необходимые данные, снижается сетевой трафик;
приложение-клиент не может напрямую обратиться к файлам, расположенным на сервере, — таким образом обеспечивается высокая степень защиты данных;
управление базой данных производит сервер, поэтому код приложения-клиента значительно уменьшается и упрощается.
В основе взаимодействия клиента и сервера лежит язык SQL. Именно поэтому сервер базы данных называют еще и SQL-сервером, а базу данных — базой данных SQL К SQL-серверам относятся:
InterBase;
Oracle;
Sybase;
DB2;
Microsoft SQL Server.
Есть еще множество программ SQL-серверов. Каждая из них имеет свои особенности, которые необходимо учитывать при разработке приложения-клиента. Некоторые из них мы рассмотрим на следующем, десятом занятии.
Далее в книге сервер будет называться программой SQL-сервера. Установленную на компьютере-сервере базу данных будем именовать удаленной базой данных.
В изложенной простой схеме взаимодействия приложения-клиента и сервера мы еще не упомянули несколько важных функций, которые должно выполнять приложение-клиент. Вот эти функции (включая и упомянутые ранее):
осуществление соединения с сервером и отключения от него;
формулировка запроса и посылка его серверу;
прием результата выполнения запроса от сервера;
обработка полученных данных.
Удаленная база данных представляет собой совокупность взаимосвязанных таблиц. Отличие ее от локальной заключается в том, что данные связанных таблиц содержатся в одном общем файле. В остальном структуры практически идентичны.
Для управления базой данных сервер может задействовать следующие механизмы:
триггеры;
генераторы;
хранимые процедуры;
функции, определяемые пользователем;
транзакции;
кэшированные изменения;
события.
Многие из этих механизмов зависят от установленного SQL-c(ipBepa “ его языка. Далее на этом занятии мы рассмотрим некоторые из перечисленных средств на примере их использования в InterBase.
Использование хранимых процедур
Хранимая процедура — это небольшая программа, которая расположена на сервере базы данных и которую можно вызвать из приложепия-клиента.
Хранимые процедуры позволяют ускорить работу сданными на сервере базы данных благодаря следующим преимуществам:
при использовании хранимых процедур вместо длинного текста SQL-запроса серверу отправляется короткое обращение к xpainiMoji процедуре. Таким образом уменьшается сетевой трафик;
хранимая процедура выполняется непосредственно па сервере. В результате скорость доступа к данным не зависит от произ волптельносги машины-клиента;
хранимая процедура, в отличие от SQL-запроса, ш* (рсбуст предварительной проверки синтаксиса;・
хранимые процедуры являются общими для всех 11р||.1(»ке1ШЙ-клиентов “ реализуют единые правила работы с базой данных.
Для выполнения хранимой процедуры в Delphi бы.| ивсдси компонент TStoredProc. Рассмотрим его основные свойства.
Свойство Data baseName типа String указывает на компонент TDatabase, используемый для установления соединения с базой данных. Это свойство аналогично одноименному свойству компонентов Tlable и TQuery.
Свойство StoredProcName типа String определяет хранимую нропедуру, которая должна вызываться. Имя хранимой процедурь? выбирается н выпядяюп^ епнеке с помощью инспектора объектов.
ПРИМЕЧАНИЕ
Если при попытке выбора хранимой процедуры соединение с базой данных отсутствует, будет выдан запрос на его установление.
После выбора хранимой процедуры можно устанавливать два других свойства.
Свинство Params типа TParams определяет массив параметров компонента TStoredProc.
Свойство ParamBindMode типа TParamBindMode определяет, как будет установлено соответствие между параметрами компонента TStoredProc и параметрами процедуры, и может принимать одно из следующих значений:
pbByName — соответствие будет установлено по именам, то есть имена параметров компонента TStoredProc и соответствующих параметров процедуры должны совпадать. Данное значение принимается но умолчанию;
pbByNumber — соответствие будет установлено в порядке перечисления, то есть первый параметр компонента TStoredProc сопоставлен первому параметру процедуры и т. д.
Выполнение выбранной хранимой процедуры осуществляется с помощью вызовов методов Prepare и ЕхесРгос:
метод Prepare осуществляет подготовку хранимой ироцедурьь которая заключается в связывании параметров процедуры п компонента TStoredProc в соответствии с установленным значением свойства ParamBindMode;
метол ЕхесРгос непосредственно выполняет хранимую процедуру.
Листинг 9.1 иллюстрирует вызов хранимой процедуры из приложения при нажатии кнопки Button!.
Листинг 9.1. Вызов хранимой процедуры
procedure IForml ButtonlClick(Sender: TObject): begin
// Определение хранимой процедуры
StoredProcl.StoredProcName ='pMyProc'.
// Подготовка хранимой процедуры к выполнению
StoredP^ocl.Prepare.
// Выполнение хранимой проиоауры StoredProcl ЕхесРгос.
end.
Язык хранимых процедур и триггеров
Для написания хранимых процедур н трип еров используется специальный язык хранимых процедур. Разнме серверы используют разиыс диалекты. Мы не будем изучать их вес, а кратко рассмотрим язык хранимых процедур, исиолы^ующийся сервером InterBiise, который имеет много общего с языком Pascal. Язык хранимых процедур включает в себя операторы для управления ходом вычислительного процесса (ветвления, цикла), а также некоторые (функциональные возможности языка SQL.
Хранимая процедура создается оператором
CREATE PROCEDURE
<Имн проиедуры> [(Список входных паоаметров>)]
[RETURNS (<Список выхоаных пдрамегоов>)]
AS <Тегю процедурь1>
После имени процедуры следует необязательный список входных параметров, с помощью которых из приложения в процедуру могут передаваться исходные даины(\ Список выходных параметров, посредством которых в приложение возвращаются результаты выпол нения процедуры, указывается после слова RETURNS. Каждьи! параметр описывается своим именем и типом, разделенными пробелом. Между различными параметрами должны стоять занятые.
При использовании параметра в теле процедуры перед его именем необходимо ставить двоеточие.
В текст хранимой процедуры допускается вставлять комментарии. Для вставки комментариев используются комбинации символов /* и */•
Вновь созданную процедуру можно уда/ппъ или изменить. Для удаления процедуры служит оператор
DROP PROCEDURE <Имя процедурь»
Для изменения существующей процедуры используется оператор
ALTER PROCEDURE
Его список параметров идентичен списку параметров оператора
CREATE PROCEDURE
Рассмотрим некоторые из основных элементов языка хранимых процедур. Заметим, что все операторы обязательно должны заканчиваться точкой с занятой (кроме составного оператора).
Оператор объявления переменных имеет следующий нид:
DECLARE VARIABLE <Имя переменной> <Тип переменно口〉.
Переменные могут быть только того типа, которым допускается в InterBase.
Объявленные переменные являются локальными, то есть видимы исключительно внутри процедуры, в которой они были объявлены. Приведем пример объявления переменных:
DECLARE VARIABLE First INTEGER.
DECLARE VARIABLE Second DATE;
Оператор присваивания on псы вас гея следующим образом:
<Имя леременной> = <9ыражение>:
Перед знаком равенства двоеточие не ставится! Переменив! и выражение должны иметь одинаковый или совместимый тип, иначе возможна ошибка.
ВНИМАНИЕ
Ошибка возникает не при создании хранимой процедуры, а во время ее выполнения.
Проиллюстрируем сказанное несколькими примерами:
DECLARE VARIABLE First INTEGER:
DECLARE VARIABLE Second VARCHAR(lO).
First.=233,
Second:e"3TO пример":
Оператор ветвления имеет вид:
IF (<Условие>) THEN <0nepawpl> [ELSE <0пера:оз2>].
Этот оператор ана.чогичен оператору ветвления, использующемуся в Delphi.
Оператор цикла оформляется аналогично такому же оператору в Delphi:
WHILE (<Усповие>) DO <0ператор>:
Оператор выбора записи похож на инструкцию SELECT языка SQL, ио дополнен следующим операндом:
INTO :<Имя1>. „.[:<ИмяМ>]
Каждое имя после двоеточия указывает переменную или выходной параметр, которому должно быть присвоено значение столбцов строки, полученной в результате выполнения команды SELECT. Например:
CREATE PROCEDURE pSelect
RETURNS (opSum FLOAT, opSred FLOAT)
AS
BEGIN
SELECT SUM(Zarplata). AVG(Zarplata) FROM MyTdble
INTO :opSum. :opSred;
END
Здесь создается хранимая процедура pSelect, в которой для сотрудников из таблицы Mylable подсчитываются общая сумма заработной платы (по полю Zarplata) и среднее значение по организации. Полученные в результате выполнения процедуры значения будут присвоены выходным параметрам opSum и opSred. Входных параметров процедура не имеет.
Оператор выхода из процедуры служит для досрочного выхода из процедуры и передачи управления вызывающей программе пли процедуре. Оператор выхода представляет собой ключевое слово
EXIT
Оператор вызова процедуры применяется для вызова из одной хранимой процедуры другой хранимой процедуры и записывается в обиюм виде так:
EXECUTE PROCEDURE <Имя процедуры>
[С<Список входных параметров>)]
[RETURNING_VALUES (<Список выходных параметров>)]
Оператор вызывает хранимую процедуру с указанным именем и параметрами. Приведем пример вызова хранимой процедуры:
CREATE PROCEDURE pCall
RETURNS (opSum FLOAT)
AS
BEGIN
EXECUTE PROCEDURE pSelect RETURNiNG/ALUES (opSum); END
Оператор посылки сообщения предназначен для уведомления о событии всех приложений-клиентов, связанных с сервером. Данный оператор имеет следующий вид: POST^EVENT -<Имя события>";
Использование триггеров
Триггер представляет собой процедуру, которая постоянно размещена на сервере базы данных (как и хранимая процедура) и вызывается автоматически при изменении записей базы данных.
В отличие от хранимых процедур, триггеры нельзя вызывать из приложений-клиентов, а также передавать им параметры и получать от них результаты.
По определению триггер похож на обработчик событий BeforeEdit, AfterEdit, BeforeDelete» AfterDelete, Beforeinsert и AfterInsert.
Триггеры в основном используются для программной реализации бизнес-правил. С помощью триггеров накладываются различные ограничения (например, на значения столбцов).
Для создания триггера применяется оператор CREATE TRIGGER, который имеет следующий вид:
CREATE TRIGGER <Имя триггерд> FOR <Имя таблицы>
[ACTIVE I INACTIVE]
{BEFORE I AFTER}
{UPDATE I INSERT | DELETE}
[POSITION <Число>]
AS <Teno тригrepa>
Операнды ACTIVE и INACTIVE определяют, будет ли триггер активен сразу после его создания. По умолчанию он будет активен (ACTIVE), то есть при наступлении определенного события триггер будет выполняться. Неактивный триггер (INACTIVE) при наступлении определенного события выполняться не будет. Таким образом, созданный триггер можно включать или выключать.
Операнды BEFORE и AFTER указывают, когда будет выполняться триггер: до наступления определенного события (BEFORE) или после (AFTER).
Операнды UPDATE, INSERT и DELETE определяют тип события, при возникновении которого будет выполняться триггер. Это такие типы событий, как изменение (UPDATE), добавление (INSERT) и удаление (DELETE) записей.
Для каждого события можно создать несколько триггеров, которые будут выпол^ няться (если они активны). Порядок их выполнения определяется операндом POSITION. Триггеры будут срабатывать в порядке возрастания чисел, указанных в данном операнде.
Созданный триггер можно изменить пли удалить. Удаление триггера осуществляется оператором
DROP TRIGGER <Имя триггера>
Изменить уже существующий трттер можно с помошью оператора ALTER TRIGGER, который имеет такой же формат, что и оператор CREATE TRIGGER.
Тело триггера программируется так же, как и тело хранимом процедуры.
Генераторы
В таблицах InterBase отсутствует автоинкрементш)111 пш. Для обеспечения уникальности значений ключевых столбцов совместно с трштерами используются генераторы.
Генератор применяется для создания уникальных целочисленных значений.
Генератор можно создать с помощью приведенного ниже оператора:
CREATE GENERATOR <Имя 「енератор»
Кроме непосредственного создания генератора, необходимо присвоить ему начальное значение. Для этого исполы1уется следующий оператор:
SET GENERATOR <Имя генератора> ТО ^Начальное значение>
Начальное значение — это число, начиная с которого будут генерироваться уникальные значения.
К созданному генератору можно обращаться с помощью функции
GEN_ID (<Имя генератора>, <Шаг>)
Данная (функция возвращает значение, увеличенное на целочисленный таг отно- ентельно последнего сгенерированного значения.
ВНИМАНИЕ
После определения начального значения и шага их изменять нельзя. В противном случае уникальность генерируемых значений может быть нарушена.
Приведем пример создания генератора:
CREATE GENERATOR MyGen: SET GENERATOR MyGen TO 2:
3;(ecij создастся генератор с именем MyGen, начальное знлчепие которого равно 2. Пример обращения к этому генератору может быть таким:
GEN_IB(MyGpn. 1):
Работа с транзакциями
Все операции, выполняемые приложением-клиеиюм с данными на SQL-сервере, происходят в виде транзакций.
Транзакцией называется грунна нз нескольких операций над данным и нз таблиц удаленно»! базы данных.
Основным принципом транзакций является《力〃6。все, либо ничего^. Если во время выполнения набора действий (транзакции) на каком-то этапе невозможно произвести очередное действие, то нужно выполнить возврат базы данных к начальному состоянию (произвести откат транзакции). Таким образом (при правильном планировании транзакций) обеспечивается целостность базы данных. Далее мы расскажем, как начинать, завершать транзакции п управлять ими с помощью SQL- выражени!!. Л также рассмотрим вопрос об использовании транзакций в приложениях, разработанных в Delphi. Вся приведенная информация относится к InterBase. Для управления транзакциями в Delphi имеются три осповные команды:
SET TRANSACTION — начинает транзакцию и определяет се поведение;
COMMIT — сохраняет изменения, внесенные транзакцией, в базе данных и завершает транзакцию;
ROLLBACK — отменяет изменения, виесенпые транзакцией, и завершает транзакцию. Рассмотрим эти команды более подробно.
Команда для запуска транзакции в общем виде выглядит следуюищм образом:
SET TRANSACTION [Access mode] [Lock Resolution] [Isolation Level] [Table Reservation]
Команда содержит четыре необязательных параметра (перечисленные в квадратных скобках). Если эти параметры опустить, то получившаяся инструкция
SET TRANSACTION
166 Глава 9・ Построение клиент-сервернь1Х баз данннх
равносильна выражению
SET TRANSACTION READ WRITE WAIT ISOLATION LEVEL SNAPSHOT
Перечислпм параметры команды п пх возможные значения.
Параметр Access mode (тип доступа) определяет тип доступа к данным. Он может принимать одно из двух значений:
READ ONLY — транзакция может только читать данные и не в состоянии модифицировать их;
READ WRITE — ^тазывает, что транзакция может читать и модифицировать данные. Это значение устанавливается по умолчанию.
Параметр Isolation Level (уровень изоляции) определяет порядок взаимодействия данной транзакции с другими в рабочей базе данных. Может принимать значения: ■ SNAPSHOT — значение похтмолчанию. Внутр” транзакции будут доступны данные в том состоянии, в каком они находились на момент пача.ча транзакции. Если по ходу дела в базе данпыхиоявилисьизменения, внесенные другими завершенными транзакциями, то начатая транзакция нх не увидит. При попытке модифицировать такие записи будет выдано сообщение о кон<|);1икте;
SNAPSHOT TABLE STABILTTY — предоставляет транзакции исключительный доступ к таблицам, которые она использует. Другие транзакции смогут только читать данные из этих таблиц;
READ COMMITTED — позволяет транзакции видеть чекутее состояние базы данных.
ВНИМАНИЕ
Обратите особое внимание на уровень изоляции транзакции. При неправильно установленном уровне могут возникать проблемы. Эти проблемы имеют место в одном из двух случаев: транзакция пытается модифицировать запись, которая была изменена или удалена уже после ее старта; транзакция пытается модифицировать таблицу, заблокированную другой транзакцией с уровнем изоляции SNAPSHOT TABLE STABILITY.
Параметр Lock Resolution (paapcuieune блокировки) управ. 1яст интерпретацией событий при обнаружении конфликта блокировки. Может принимать одно из двух значений:
WAIT — значение по умолчанию. Ожидает разблокирования требуемой записи. После этого пытается продолжить работу;
NO WATT — немедленно возвращает ошибку блокировки записи н прекращает выполнение транзакции.
Параметр Table Reservation (уровень доступа к таблице) позволяет транзакции получить гарантированный доступ необходимого уровня к указанным таблицам. Существует четы ре уровня доступа:
PROTECTED READ — запрещает обновление таблицы другими транзакциями, но позволяет им выбирать данные из таблицы;
PROTECTED WRITE — блокир}7стобновление таблицы другими транзакциями, читать данные из таблицы могут только транзакции типа SNAPSHOT или READ COMMITTED;
SHARED READ — самый либеральны!! уровень. Читать могут все, модифицировать —транзакции типа READ WRITE:
Что нового мы узнали? 167
SHARED WRITE — транзакции типа SNAPSHOT или READ COMMITTED и READ WRITE могут модифицировать таблицу, остальные способны только выбирать данные.
Если все действия, составляющие транзакцию, успешно выполнены или возникла ошибка, транзакция должна быть завершена, для того чтобы база данных оказалась в непротиворечивом состоянии. Для этого в Delphi есть две SQL-команды: ■ COMMIT — сохраняет внесенные транзакцией изменения в базу данных. Это означает, что транзакция завершена успению;
ROLLBACK — откат транзакции. Транзакция завершается и никаких изменений в базу данных не вносится. Операция выполняется в случае возникновения ошибки при выполнении операции (например, при невозможности обновить запись).
Все транзакции в Delphi можно условно разделить на явные и неявные.
Явная транзакция — это транзакция, начатая и завершенная с помощью методов компонента TDataBase: StartTransaction, Commit и RollBack. После начала явной транзакции все изменения, вносимые в данные, относятся к этой транзакции.
Другого способа начать явную транзакцию, кроме использования компонента TDataBase, нет. Следовательно, в рамках одного соединения нельзя начать две транзакции.
ПРИМЕЧАНИЕ
На самом деле такая возможность есть, но это потребует обращения к функциям API InterBase. В данной книге мы не будем останавливаться на вопросах программирования на низком уровне с использованием API.
Неявная транзакция стартует при модификации данных, если в текущий момент нет явной транзакции. Неявная транзакция возникает, например, при выполнении метода Post для компонентов наборов данных Tlable и TQuery. Например, если вы отредактировали запись в TDBGrid и переходите на другую запись, то это влечет за собой выполнение метода Post, что, в свою очередь, приводит к началу неявной транзакции, обновлению данных внутри транзакции и ее завершению. Важно отметить, что неявная транзакция, начатая с помощью методов Post, Delete, Insert, Append и т. д., заканчивается автоматически.
Что нового мы узнали?
На этом занятии мы разобрались, что такое:
основные понятия технологии клиент-сервер;
хранимые процедуры и зачем они нужны;
язык хранимых процедур и триггеров;
триггеры и генераторы и в каких случаях они применяются;
работа с транзакциями.
Занятие 10
Сервер InterBase
Что нового в InterBase 6.5
Организация данных
Настройка InterBase-сервера
Графический интерфейс программы IBConsole
Регистрация локального сервера InterBase
Соединение с базой данных из приложения
На этом занятии мы кратко рассмотрим особенности сервера InterBase 6.5, который поставляется вместе с Delphi 7 и был создан специально для этой среды разработки. Вы узнаете, как организована информация в базах данных сервера InterBase. Кроме того, мы проанализируем особенности соединения с сервером InterBase из различных программ и из вашего приложения.
Что нового в InterBase 6.5
В новую версию InterBase были внесены значительные изменения по сравнению с предыдущими версиями программы:
заменена графическая среда конфигурирования н поддержки InterBase-сервера IBConsole. Опа заменила Server Manager и InterBase Windows ISQL GUI, которые присутствовали в ранних версиях InterBase;
появилась возможность указания диалекта языка SQL, используемого при работе с базами данных;
добавлена возможность перевода баз данных в режим только для чтения. Используется для обеспечения большей безопасности и для работы с устройствами типа CD-R, где данные могут только считываться, но нс записываться;
предложены новые элементы языка, включающие новые оючевые слова, типы данных н многое другое;
расширена функциональность средств, работающих из командной строки;
расширен API InterBase;
введены дополнительные средства для обеспечения соединения с сервером. В частности, драйверы ODBC, поставляемые с более ранними версиями InterBase, замелены на EasySoft — специализированный сервер InterBase, который позволяет получить доступ к нескольким серверам баз данных, использующим различные операционные cиcтe^fы и сетевые инфраструктуры;
сделаны изменения в арифметических операциях и SQL-функциях;
внесены обновления в системные таблицы сервера (RDBSFIELDS и RDB$FUNC- TION_ARGUMENTS);
в состав InterBase 6.5 включен IBReplicator, позволяющий копировать и синхронизировать данные в различных базах данных InterBase, имеющих схожую структуру.
Организация данных
Информация всей базы данных сервера InterBase содержится в одном файле, имеющем расширение GDB. Размер этого файла может быть очень большим (несколько десятков гигабайтов).
Удаленная база данных кроме таблиц включает в себя множество других элементов. Такие элементы получили название метаданных.
ПРИМЕЧАНИЕ
Приставка мел? в данном случае обозначает над. Таким образом, метаданные — это надстройка, описывающая структуру базы данных.
К метаданным относятся:
таблицы;
индексы;
ограничения;
домены;
представления;■
генераторы;
триггеры;
функции пользователей;
хранимые процедуры;
исключения;
BLOB-фильтры;
привилегии.
В InterBase существуют ограничения на число таблиц в одной базе данных, а также на количество столбцов в одной таблице. Максима/!иное значение для столбцов в таблице равно 1000, а число таблиц в базе данных пе должно быть больше 65 536.
ПРИМЕЧАНИЕ
Количество допустимых столбцов в таблицах InterBase имеет меньшее значение, чем, например, в таблицах Paradox.
В таблице 10.1 приведены типы данных, поддерживаемые InterBase.
Таблица 10・1・ Типы данных, поддерживаемые в таблицах InterBase
Тип данных
Краткое описание
SMALLINT "INTEGER
Целое число. Диапазон допустимых значений: от -32 768 до 32 767
Целое число. Диапазон допустимых значений: от -2 147 483 648 до 2 147 483 647
FLOAT
Число с плавающей запятой. Диапазон допустимых значений: от З^хЮ 38 до З^хЮ38* Точность — 7 знаков после запятой
DOUBLE PRECISION Число с плавающей запятой. Диапазон допустимых значений: от IJxlO308
CHARACTER(N)
VARCHAR(N) DATE
BLOB
до 1,7х10308. Точность — 15 цифр после запятой
Строка символов длиной N. Число N не должно превышать 32767
Строка символов длиной до N. Число N не должно превышать 32767 Дата. Диапазон допустимых значений: от 01.01.0100 до 11.12.5941 Двоичные данные любого типа
ПРИМЕЧАНИЕ
В таблицах InterBase нет логического и автоинкрементного типов. Вместо автоинкрементного типа применяются генераторы и триггеры, а взамен логического типа используется CHARACTER ⑴.
Настройка InterBase-сервера
Сервер InterBase требует отдельной установки. После инсталляции Delphi 7 будет выдан запрос на установку InterBase. Основные файлы сервера по умолчанию помещаются в папку C:\Program FiIes\Borland\Interbase.
После установки сервер InterBase будет автоматически запущен, о чем свидетельствует значок 血 в системном лотке. По умолчанию сервер теперь будет стартовать одновременно с Windows. Завершить работу сервера можно, щелкнув правой кнопкой мыши на пиктограмме и выбрав в появившемся контекстном меню пун кт Shutdown (Завершение работы). Повторный запуск сервера осуществляет исполняемый файл ibservenexe, который находится в папке C:\Program Files\Borland\Interbase\BIN.
Остальные команды контекстного меню предназначены для просмотра текущих свойств сервера (пункт Properties) и конфигурирования некоторых параметров сервера (пункт InterBase Properties). При выборе пункта InterBase Properties открывается окно свойств InterBase-сервера (рис. 10,1).
Это окно позволяет изменить значения параметров:
Database Cache (pages) — количество страниц памяти, используемых сервером для кэширования данных;
Client map size (bytes) — количество памяти в байтах, которое резервируется для каждого отдельного соединения с клиентом.
Рис. 10.1. Окно свойств InterBase-сервера
Изменения зтих параметров может производить только системны!! администратор сервера. Имя пользователя системного администратора — SYSDBA. Пароль администратора —masterkey.
Графический интерфейс программы IBConsole
В InterBase 6.5 введен новый интегрированный графический пользовательский интерфейс пол названием IBConsole. С помощью данной программы вы можете:
управлять локальными н удаленными серверами баз данных;
управлять безопасностью сервера, в том чис/ie:
口 авторизацией новых пользователей:
口 назначением и сменой паролей пользователей;
удаленной авторизацией пользователей:
управлять сертификатами сервера;
управлять файлами баз данных, в том числе создавать новые базы данных и устанавливать свойства баз данных;
сохранять н восстанавливать базы данных;
обеспечивать поддержку баз данных:
口 проверять целостность информации;
口 восстанавливать поврежденные таблицы;
развертывать базы данных;
завершать работу баз данных и перезагружать их;
выполнять SQL-запросы в интерактивном режиме;
просматривать метаданные базы данных в формате SQL scnpt.
Рис. 10.2. Главное окно программы IBConsole при первом запуске
Главное окно программы IBConsole (рис. 10.2) состоит из следующих элементов:
строка меню;
панель инструментов, расположенная под строкой меню;
строка состояния, расположенная внизу окна и показывающая имена текущих выбранного сервера и базы данных, а также пользователей, подключенных к серверу;
область, отображающая зарегистрированные серверы п базы данных (слева), а также их подкатегории в стиле Проводника Windows;
область, отображающая данные различного характера (справа).
Регистрация локального сервера InterBase
Для регистрации локального сервера InterBase можно воспользоваться программой IBConsole. Запустите ее и выберите в меню программы пункт Server ► Register (Сервер ► Зарегистрировать). После этого появится диалоговое окно регистрации сервера. Заполните его, как показано на рис. 10.3.
Таким образом, мы выбрали локальный сервер, назвали его Му Server п соединились с сервером под именем и с паролем администратора. Напомним, что пароль администратора — masterkey.
После регистрации сервера в левой области окна отобразится информация о составе вновь созданного сервера. Теперь можно реп тстрнровать базу данных сервера. Для этого нужно выбрать пункт меню Database ► Register (База данных ► Зарегистрировать). При этом откроется диалоговое окно регистрации базы данных (рис. 10.4).
Рис. 10.3. Окно регистрации сервера
・;Regidef Database 痴⑥ Ci”y<;t
Риа 10.4. Окно регистрации базы данных
Мы уже заполнили в этом окне некоторые поля. Поле File (Файл) должно содержать путь к файлу базы данных (имеющей расширение GDB). Поле Alias Name (Псевдоним) заполнится автоматически после заполнения поля File. В поля User Name (Имя пользователя) и Password (Пароль) мы ввели имя пользователя и пароль администратора сервера соответственно. После нажатия кнопки ОК мы подключимся к демонстрационной базе данных isc4.gdb, поставляемой вместе с InterBase (рис. 10.5).
Рис. 10.5. Окно IBConsole после подключения к базе данных
Соединение с базой данных из приложения
Перед соединением с базой данных из собственного приложения необходимо создать псевдоним базы данных. Воспользуемся для этого программой BDE Administrator, которую мы рассматривали ранее. Запустим BDE Administrator и создадим новый объект с помощью команды Object ► New (Объект ► Создать). Назовем его PROBA и установим тип базы данных INTERBASE. После этого зададим путь к серверу базы данных в свойстве SERVER NAME и имя пользователя в свойстве USER NAME, как показано на рис. 10.6.
Теперь можно приступать к созданию приложения, работающего с базой данных с помощью сервера InterBase. Для этого в форме приложения расположим ком по* ненты Databasel, Queryl, DataSourcel и DBGridl (рис. 10.7).
Соединение с базо" даннЕХ из прнпоження 工75
INTHBASEINTHBASEР^^Г^"!^ Пвкик Й* а X,,А1&#з・,*шР^^Г^"!^ Пвкик Й* а X,,А1&#з・,*ш劣疇 DBDEMOSЖ * СМмЮО劣疇 DBDEMOSЖ * СМмЮОМ^.РЯОММ^.РЯОМ^вМИ»>.|^вМИ»>.|Рис. 10.6. Параметры псевдонима базы данныхРис. 10.6. Параметры псевдонима базы данных?W唠愛产*?W唠愛产*书 ТУ Б«м “《«я MS Асе. 享 7 Бам «а«м1^«м1 Fc №7 TSiaVaFWr出 7 ”.®SE• F Ф^и*<Ек«1书 ТУ Б«м “《«я MS Асе. 享 7 Бам «а«м1^«м1 Fc №7 TSiaVaFWr出 7 ”.®SE• F Ф^и*<Ек«1enable schema сасме LAHGDRfVER MAX ROWSPtaANS! O«cOPEK MODEfdZRHEROL£ NAME SCHEMA CACHE DIRSCHEMA CACHE TIMESERVER KAME SQLPASSTHRU MODECVPirva nt(\eorf«mMi<iiS«M\ao4 g SHAflEDAUTQCOMMiTSQLQRYMODE USER NAME WA1I ON LOCKS5YSDBA FALSEenable schema сасме LAHGDRfVER MAX ROWSPtaANS! O«cOPEK MODEfdZRHEROL£ NAME SCHEMA CACHE DIRSCHEMA CACHE TIMESERVER KAME SQLPASSTHRU MODECVPirva nt(\eorf«mMi<iiS«M\ao4 g SHAflEDAUTQCOMMiTSQLQRYMODE USER NAME WA1I ON LOCKS5YSDBA FALSEBATCH COUNT BLOB SIZE BLOBS IO CACHE COMMIT RETAINBATCH COUNT BLOB SIZE BLOBS IO CACHE COMMIT RETAINРис. 10.7. Заготовка формы приложенияРис. 10.7. Заготовка формы приложенияF<n・1F<n・1
INTHBASE
INTHBASE
Р^^Г^"!^ Пвкик Й* а X,,
А1&#з・,*ш
Р^^Г^"!^ Пвкик Й* а X,,
А1&#з・,*ш
劣疇 DBDEMOS
Ж * СМмЮО
劣疇 DBDEMOS
Ж * СМмЮО
М^.РЯОМ
М^.РЯОМ
^вМИ»>.|
^вМИ»>.|
Рис. 10.6. Параметры псевдонима базы данных
Рис. 10.6. Параметры псевдонима базы данных
?W唠愛产*
?W唠愛产*
书 ТУ Б«м “《«я MS Асе. 享 7 Бам «а«м1^«м1 Fc №7 TSiaVaFWr
出 7 ”.®SE
• F Ф^и*<Ек«1
书 ТУ Б«м “《«я MS Асе. 享 7 Бам «а«м1^«м1 Fc №7 TSiaVaFWr
出 7 ”.®SE
• F Ф^и*<Ек«1
enable schema сасме LAHGDRfVER MAX ROWS
PtaANS! O«c
OPEK MODE
fdZRHE
ROL£ NAME SCHEMA CACHE DIR
SCHEMA CACHE TIME
SERVER KAME SQLPASSTHRU MODE
CVPirva nt(\eorf«mMi<iiS«M\ao4 g SHAflEDAUTQCOMMiT
SQLQRYMODE USER NAME WA1I ON LOCKS
5YSDBA FALSE
enable schema сасме LAHGDRfVER MAX ROWS
PtaANS! O«c
OPEK MODE
fdZRHE
ROL£ NAME SCHEMA CACHE DIR
SCHEMA CACHE TIME
SERVER KAME SQLPASSTHRU MODE
CVPirva nt(\eorf«mMi<iiS«M\ao4 g SHAflEDAUTQCOMMiT
SQLQRYMODE USER NAME WA1I ON LOCKS
5YSDBA FALSE
BATCH COUNT BLOB SIZE BLOBS IO CACHE COMMIT RETAIN
BATCH COUNT BLOB SIZE BLOBS IO CACHE COMMIT RETAIN
Рис. 10.7. Заготовка формы приложения
Рис. 10.7. Заготовка формы приложения
F<n・1
F<n・1
ВНИМАНИЕ
В качестве набора данных может использоваться только компонент Query или подобный ему. Использование компонента типа Table в клиент-серверных приложениях не допускается.
Осталось установить свойства перечисленных компонентов. Эти свойства представлены в табл. 10.2.
Таблица 10.2. Свойства компонентов формы приложения
Компонент
Свойство
Значение
Databasel
AliasName
PROBA
Databasel
DatabaseName
isc4.gdb
Queryl
DatabaseName
isc4.gdb
Queryl
SQL
SELECT * FROM USERS
DataSourcel
DataSet
Queryl
DBGridl
DataSource
DataSourcel
Итак, мы указали в компоненте Data base 1 псевдоним w название базы лепных. В компоненте Queryl мы определяем имя базы данных и формируем запрос на выборку всех данных из всех полей таблицы USERS (эта таблица храпит информацию о каждом из пользователей, зарегистрированных на сервере). Далее обычным способом устанавливаем связь между компонентами Queryl и DBGridl с помощью компонента DataSourcel.
Осталось активировать запрос в компоненте Queryl. Для этого установим его свойство Active в true, после чего будет выдан запрос на ввод имени пользователя и пароля (рис. 10.8).
Рис 10.8. Ввод имени пользователя и пароля
Указываем пароль администратора н можем запускать приложение. Результат наших трудов показан на рис. 10.9.
Рис. 10.9. Результат выполнения программы
Что нового мы узнали?工77
Что нового мы узнали?
На этом занятии вы узнали:
какие новшества введены в версию InterBase 6.5;
как организованы базы данных сервера InterBase;
как осуществлять простейшую настройку сервера InterBase;
как работать с программой IBConsole;
как осуществлять соединение с локальной базой данных сервера InterBase с помощью программы IBConsole и из вашего собственного приложения.
Занятие 11
Основы языка SQL
Основные сведения о языке SQL
Функции языка SQL
Операторы определения данных
Операторы манипулирования данными
Навигатор SQL Explorer
Отладчик SQL Monitor
Конструктор запросов SQL Builder
На этом занятии вам предстоит знакомство с языком SQL Вы узнаете основные операторы и функци и языка, а в конце занятия прочитаете обзорную характеристику программ SQL Explorer, SQL Builder и SQL Monitor, входя mux в стандартную поставку Delphi.
Основные сведения о языке SQL
Язык структурированных запросов SQL (Structured Query Language) существует в нескольких стандартах. Наиболее распространенными яв-чяются стандарты SQL-89 и SQL-92. Последний также называют стандартом ANSI. Из-за частичной несовместимости стандартов языка существует множество его диалектов. Мы рассмотрим только основные команды SQL для простых операций с таблицами баз данных.
В языке SQL нет многих типов команд, которые присущи большинству языков программирования. Так, в нем отсутствуют операторы цикла, перехода и т. л. SQL-запрос — это команда на языке SQL.
Язык SQL по своей сути ориентирован на доступ к данным, п его обычно включают в состав различных средств разработки. Безусловно, разработчики Delphi не могли остаться в стороне. Многие компоненты Delphi для работы с базами данных поддерживают язык SQL.
Все SQL-запросы можно условно разделить на два вида:
статический SQL-запрос — включается в код приложения во время его разработки и не изменяется во время выполнения. Единственным способом поправить что-либо в запросе такого типа является включение в SQL-запрос параметров и их дальнейшая модификация в ходе работы приложения;
динамический SQL-запрос — создается и изменяется в процессе выполнения приложения. Такие запросы являются самыми гибкими и могут более адекватно отвечать конкретным желаниям пользователя.
Все операторы и команды языка SQL можно разделить на три группы. Рассмотрим эти группы, а также операторы, входящие в каждую из групп.
Операторы определения данных предназначены для создания, удаления и изменения структуры данных. Основные из них перечислены в табл. 11.1.
Таблица 11.1. Ооювные операторы определения данных
Оператор
Описание
CREATE TABLE
Предназначен для создания таблицы базы данных
ALTER TABLE
Изменяет структуру таблицы
DROP TABLE
Удаляет таблицу
CREATE INDEX
Создает индекс
DROP INDEX
Удаляет индекс
CREATE VIEW
Создает представление
DROP VIEW
Удаляет представление
Операторы управления данными служат для управления привилегиями доступа к данным. Основные операторы этой группы представлены в табл. 11.2.
Таблица 11.2. Основные операторы управления данными
ОператорОписание
GRANDНазначает привилегии пользователям
REVOKEОтменяет привилегии пользователе诊
Операторы манипулирования данными осуществляют работу с записями таблиц.
Наиболее часто используемые операторы кратко описаны в табл. 11.3.
Таблица 11.3. Основные операторы манипулирования данными
Оператор
Описание
SELECT
Производит выборку записей по определенному формату
UPDATE
Предназначен для изменения и обновления записей
INSERT
Вставляет новые записи в таблицу
DELETE
Удаляет записи из таблицы
Применение приведенных в табл. 11.1-11.3 операторов мы рассмотрим далее на этом занятии.
ВНИМАНИЕ
Обратите внимание на тот факт, что проверка синтаксиса запроса происходит только во время работы программы. Компилятор Delphi не обрабатывает SQL-запросы на этапе разработки приложения.
Результатом выполнения запроса обычно является набор данных, который называется результирующем набором данных.
Осталось отметить, что регистр букв команд SQL-запросов не влияет на их выполнение. Мы воспользуемся dtiiy удобством м для наглядности будем применять прописные буквы для операторов языка SQL. По соглашениям, принятым в SQL, *1очка с занятой также не требуется в конце каждой команды. Элементы списков, такие как имена таблиц и полей, обязательно разделяются запятыми. Имена таблиц и полей заключаются в апострофы пли кавычки, например, 'Number*, ''Table 1". В случае, если имя не содержит гц^обелов и других специальных символов, его можно не заключать в кавычки.
Функции языка SQL
В языке SQL, кроме операторов, имеется несколько функций, основные из которых будут рассмотрены далее.
Статистические функции — функции, предназначенные для статистической обработки данных. Наиболее часто псполюусмые статистические функции перечислены в табл. 11.4.
Таблица 11.4. Основные статистические функции
Функция
Описание
AVG()
Получение среднего значения
COUNT()
Определяет количество значении
COUNT(*)
Определяет количество ненулевых значений
МАХ()
Максимальное значение
MIN()
Минимальное значение
SUM()
Сумма значений
Строковые функщш — функции, прелост^влепныедля работы со строковыми значениями. Наиболее части задс1(ствуемые из них представлены в табл. 11.5.
Таблица 11.5. Основные строковые функции
Функция
Описание
II
Слияние (конкатенация) двух строк
СА5Т(<Выражение> AS <Тип>)
Приводит выражение <Выражение> к типу <Тип>
LOWER(S)
Преобразует символы строки S в символы нижнего регистра
SUBSTRING(S FROM N1 TO N2)
Выделяет из строки S подстроку, начиная с символа N1 и заканчивая символом N2
TRIM(S)
Удаляет в начале и конце строки S лишние пробелы
UPPER(S)
Преобразует символы строки S в символы верхнего регистра
Операторы определения данных
Оператор CREATE TABLE служит для создания повой таблицы базы данных и имеет следующий(|)ормат:
CREATE TABLE <Имя таблицы> (<Имя поля> <Тип данных>.
<Имя поля> <Тип данных>):
Обязательное условие — указание хотя бы одного имени поля и его типа данных.
Приведем пример объявления простой таблицы:
CREATE TABLE MyTable
《Number INTEGER.
Name CHAR(20).
Surname CHAR(20)):
Здесь в каталоге текущей базы данных будет создана новая таблица МуТёЫе, состоящая из полей Number, Name и Surname. Первое поле имеет целочисленный тип (INTEGER), остальные поля — символьного типа и ограничены 20 символами.
Если при выполнении этого запроса выяснится, что таблица с таким именем уже существует, будет сгенерирована исключительная ситуация.
Оператор DROP TABLE <Имя таблицы> служит для удаления имеющейся таблицы. Если таблицы с указанным именем не существует, будет сгенерирована исключительная ситуация.
Пример:
DROP TABLE MyTable:
При выполнении этой операции будут удалены все файлы, относящиеся к таблице Mylable.
Оператор ALTER TABLE предназначен для добавления или удаления полей существующей таблицы базы данных. Во время выполнения этого оператора никакие другие приложения не должны обращаться к таблице. Оператор записывается следующим образом:
ALTER TABLE <Имя таблицы>
ADD <Имя поля> <Тип данных>.
DROP <Имя поля>.
ADD <Имя поля> <Тил данных>.
DROP <Имя поля>;
При этом операнд ADD добавляет к таблице новое поле, а операнд DROP удаляет из таблицы существующее поле. Операнды могут располагаться внутри оператора ALTER TABLE произвольно.'
Пример:
ALTER TABLE MyTable ADD Telefon'INTEGER. ADD Address CHAR(50). DROP Number;
При выполнении кода примера в таблицу MyTable добавятся два поля: Telefon м Address, целочисленного и символьного типа соответственно. Кроме того, будет удалено поле Number.
Операторы манипулирования данными
«Краеугольным» оператором манипулирования данными является оператор SELECT. Этот оператор используется для отбора данных, удовлетворяющих сложным условиям. Оператор SELECT имеет вид:
SELECT [DISTINCT]'
<Список полей> или *
FROM <Сяисок таблиц>
[WHERE <Услоаия выбора записей>]
[ORDER BY <Список полей для сортировки>]
[GROUP BY <Список полей для груплировки>]
[HAVING <Услозия группировки лолей>]
[UNION <Вложенный оператор SELECT〉]
Параметр DISTINCT определяет, будут ли включаться в результирующий набор данных повторяющиеся записи. Если он присутствует в операторе SELECT, то повторяющиеся записи будут исключены из набора данных.
Если в список полей входят поля нескольких таблиц, для указания принадлежности поля к той или иной таблице используют составной оператор, включающий имя таблицы н, через точку, имя поля:
<Имя габлицы>.<Имя поля>
Операнд WHERE определяет критерии, которым должны удовлетворять записи в результирующем наборе данных.
Операнд GROUP BY позволяет 1руппиривать записи. Иногда 6j)iBaei неибхидими выполнить какие-либо действия над группой записей.
Операнд HAVING используется вместе с GROUP BY н позволяет выбирать записи внутри групп.
Операнд ORDER BY содержит список полей, определяющих порядок сортировки записей результирующего набора данных. По умолчанию сортировка выполняется в порядке возрастания значений. Для сортировки в порядке убывания значений необходимо после имени поля поставить параметр DESC.
Приведем несколько примеров выбора записей с использованием оператора SELECT.
Пример 1. Выбор всех полей таблицы
SELECT * FROM MyTable
В результате выполнения этого запроса будут выбраны все ноля и записи из таблицы MyTable. Символ * как раз и означает, что нас интересует таблица в целом. Вместо него можно просто перечислить через запятую все имена полей таблицы.
Пример 2. Выбор данных из трех полей таблицы
SELECY Number. Surname. Telefon
FROM MyTable
Будут возвращены все значения из полей Number, Surname и Telefon таблицы MyTable.
Пример 3. Выбор уникальных значений
SELECT DISTINCT Surname
FROM MyTable
В ответ на запрос мы получим набор данных, который содержит все фамилии (Surname), входящие в таблицу МуТаЫе. В этом наборе данных одна и та же фамилия не появится дважды (по умолчанию), то есть будут исключены все однофамильцы.
Пример 4. Выбор данных из двух таблиц
SELECT * FROM MyTablel, MyTable2
Выбирает все данные из таблиц МуТёЫе! и МуТйЫе2. Первыми будут располагаться поля таблицы MyTablel, а затем — поля второй таблицы.
Пример 5. Выбор записей по значениям числового поля
SELECT Name. Surname
FROM MyTable
WHERE (Number>l) and (Number<100):
В результиpyющий набор данных войдут имена и фамилии первых ста человек, занесенных в таблицу МуТаЫе.
Пример 6. Выбор записей по значению символьного поля
SELECT Name
FROM МуТаЫе .
WHERE Surname-'Иванов':
Результатом будет столбец имен, учтенных нами, с фамилией Иванов.
Пример 7. Проверка частичного совпадения по символьному полю
SELECT Name, Surname
FROM МуТаЫе
WHERE Surname LIKE 'И';
Будут выбраны имена и фамилии людей, занесенных в таблицу МуТаЫе, фамилии которых начинаются с буквы И.
В выражениях операции LIKE можно использовать подстановочные символы, а именно: % — замещает любое количество символов, в том числе и нулевое;
_ — замещает один символ.
Пример 8. Проверка частичного совпадения по шаблону
SELECT Name. Surname
FROM МуТаЫе
WHERE Surname LIKE 'X' || 'os' || 'Ж':
Будут выбраны имена и фамилии людей, в фамилиях которых найдутся символьные сочетания ов.
Операнд ORDER BY служит для упорядочения (сортировки) значений полей.
Пример 9. Сортировка записей по полю
SELECT * FROM МуТаЫе
ORDER 8Y Name
Набор данных будет упорядочен в порядке возрастания значений по полю Name.
Пример 10. Сортировка по двум полям
SELECT * FROM МуТаЫе
ORDER BY Name, Surname DESC
Будет произведена сортировка данных сначала по полю Name в порядке возрастания, затем — по полю Surname в порядке убывания.
Оператор UPDATE служит для изменения значений полей в группе записей и имеет следующий формат:
UPDATE <Икя таблицы> SET <Икя поля> - <Выражение>.
SET <Имя поля> - <Выражение>
[WHERE «Условия выбора>]:
Во всех записях, которые удовлетворяют условию отбора, будут изменяться зна- иен“я полей.
Пример 11. Изменение значений поля
UPDATE Fl/TaBe
SET Oklad - Oki ad + 1000: WHERE Oki ad < 1000;
Изменит сумму оклада (Oklad) сотрудника, если оклад составляет менее 1000 рублей. Заработная плата такого сотрудника в результате удвоится.
Оператор INSERT служит для вставки записей в таблицу и записывается следующим образом:
'INSERT INTO <Имя таблицы»
(<Список полей>).
VALUES (<Список значений>);
Это означает, что к таблице <Имя таблицы> будет добавлена одна запись.
Пример 12. Добавление записи в таблицу
INSERT INTO MyTable
(Name. Surname. Telefon) VALUES СИван*. 'Иванов'. 2341234).
В таблицу Mylable будет вставлена новая запись, содержащая имя и фамилию нового сотрудника, а также номер его телефона.
Оператор DELETE служит для удаления записей из таблицы и имеет следующий формат:
DELETE FROM <Ммя таблицы>
[WHERE «Условия выбора>]:
В результате его действия из таблицы будут удалены все записи, удовлетворяющие критерию отсева.*
Пример 13. Удаление записей из таблицы
DELETE FROM 曲ПЬТе
WHERE Surname - 'Иванов*.
Удлиняет из таблицы Mylable все записи, содержащие фамилию Иванов.
На этом мы закончим обзор основных операторов и функций языка SQL. Дополнительную информацию вы можете почерпнуть из специальной литературы, посвященной данному языку.一
Навигатор SQL Explorer
SQL Explorer похож на Проводник (Explorer) среды Windows. Средствами SQL Explorer можно просматривать или редактировать реляционные базы данных. Ранние версии дайной программы носили такие названия, как Explorer и Dalal)as(4 Explorer. Новая среда разработки Delphi 7 поставляется с SQL Explorer версии 4.00. Запустить эту программу можно либо из главного меню Delphi: Database > Explore (База данных > Проводник), либо с помощью главного меню Windows: Пуск ► Программы > Borland Delphi 7 > SQL Explorer. Но можно это сделать и напрямую. Для этого нужно запустить файл dbexplor.exe, который находится в подкаталоге BIN главного каталога Delphi 7.
Интерфейс SQL Explorer похож на интерфейс BDE Administrator (рис 11.1).
ее野:50L F xploter野:50L F xploterALPHA ALPHA ALPHA NUMBERNUMBERALPHA ALPHA ALPHA NUMBERNUMBER242424242424QDName面 QpAal 面 Continent MA傳a面 PopulatfonQDName面 QpAal 面 Continent MA傳a面 Populatfon& 通 DBDEMOS ■■曰•创 Tables® 皿 animah dU 岳 Ш ЬоИасЬ S-® dents dU 白 ЙП cowby efc& 通 DBDEMOS ■■曰•创 Tables® 皿 animah dU 岳 Ш ЬоИасЬ S-® dents dU 白 ЙП cowby efcS 載 Indcet® •會J VaMty Checks;S 載 Referential Constraints 1 田*€3 Security Specs® 包 Famiy MembersS 載 Indcet® •會J VaMty Checks;S 載 Referential Constraints 1 田*€3 Security Specs® 包 Famiy Members®-fflU cmtamof.cfc ® Ш emptoyee cfc 由-面 events.d) 回疝 hokfings dbf 由 OQ industry dbf®-fflU cmtamof.cfc ® Ш emptoyee cfc 由-面 events.d) 回疝 hokfings dbf 由 OQ industry dbf困疝 金SO困疝 金SOitems ct> master, dblitems ct> master, dbl
е
е
野:50L F xploter
野:50L F xploter
ALPHA ALPHA ALPHA NUMBER
NUMBER
ALPHA ALPHA ALPHA NUMBER
NUMBER
24
24
24
24
24
24
QDName
面 QpAal 面 Continent MA傳a
面 Populatfon
QDName
面 QpAal 面 Continent MA傳a
面 Populatfon
& 通 DBDEMOS ■■曰•创 Tables
® 皿 animah dU 岳 Ш ЬоИасЬ S-® dents dU 白 ЙП cowby efc
& 通 DBDEMOS ■■曰•创 Tables
® 皿 animah dU 岳 Ш ЬоИасЬ S-® dents dU 白 ЙП cowby efc
S 載 Indcet
® •會J VaMty Checks
;S 載 Referential Constraints 1 田*€3 Security Specs
® 包 Famiy Members
S 載 Indcet
® •會J VaMty Checks
;S 載 Referential Constraints 1 田*€3 Security Specs
® 包 Famiy Members
®-fflU cmtamof.cfc ® Ш emptoyee cfc 由-面 events.d) 回疝 hokfings dbf 由 OQ industry dbf
®-fflU cmtamof.cfc ® Ш emptoyee cfc 由-面 events.d) 回疝 hokfings dbf 由 OQ industry dbf
困疝 金SO
困疝 金SO
items ct> master, dbl
items ct> master, dbl
Рис. 11.1. Главное окно SQL Explorer
Если в левой части окна программы выбрать требуем wii объект (например, таблицу), то в правой части окна можно будет просмотреть или отредактировать свойства этого объекта. На рисунке 11.1 показаны свойства uo,eii таблицы country.db, выбранной в качестве дел нстраиноннсг» примера.
С помощью SQL Explorer вы можете:
работать с псевдонимами;
просматривать структуру баз данных или таблиц;
просматривать и редактировать записи, содержащиеся в таблши^х;
создавать, редактировать м вмполнлть SQL-запросы;
оперировать со словарями данных.
Работа с псевдонимами ничем не отличается от таковой в программе BDE Administrator, которую мы рассмотрели ранее.
Для просмотра структуры базы данных или таблицы нужно в левой части окна SQL Explorer выбрать интересующую базу данных или таблицу. После выбора таблицы имеется возможность просматривать ее объекты. К объектам таблицы относятся:
поля (Fields);
индексы (Indices);
ограничения значений полей (Validity Checks);
ограничения ссылочной целостности (Referential Constraints);
права доступа (Security Specs);
файлы, входящие в состав таблицы (Family Members).
Если для базы данных или таблицы установлен режим ограничения доступа, при попытке открыть ее будет запрошено имя пользователя и его пароль.
Для просмотра и редактирования содержимого таблицы следует выделить название таблицы и в правой области окна SQL Explorer выбрать вкладку Data (Данные), как показано на рис. 11.2.
Рис 11.2. Просмотр и редактирование записей таблицы
Записи таблицы отображаются в сетке, аналогичной компоненту DBGrid. Для перемещения по записям и внесения в них изменений можно воспользоваться аналогом компонента DBNavigator, расположенным в верхней правой области окна SQL Explorer.
Кнопка Explore BLOBs (Просмотр полей BLOB), находящаяся на панели инструментов и имеющая вид конверта с картинкой, позволяет просматривать BLOB-поля. При этом содержимое каждого BLOB-поля будет выводиться в отдельном окне.
Для редактирования и запуска SQL-запросов применяется текстовый редактор, расположенный на вкладке Enter SQL (Ввод SQL-запроса). Выполнение запроса происходит при нажатии кнопки Execute Query (Выполнение запроса), обозначенной желтой молнией. Результат будет отображен в области окна непосредственно под текстовым редактором. В программе допускается работать одновременно с несколькими запросами. Переключение между запросами осуществляется с помощью кнопок с изображением синих треугольников — Next Query (Следующий запрос) и Previous Query (Предыдущий запрос). Результат выполнения демонстрационного запроса показан на рис. 11.3.
Рис, 11.3. Результат выполнения запроса
Для работы со словарями данных нужно перейти на вкладку Dictionary (Словарь) в левой части окна SQL Explorer. При этом структура выбранного словаря данных будет отображена в виде иерархического дерева. Если словарей данных нет, то программа выдаст соответствующее сообщение. Со словарем данных можно выполнять следующие операции (рис. 11.4):
выбор нового словаря (Select);
регистрация словаря в хранилище объектов (Register);
исключение словаря из хранилища объектов (Unregister);
создание нового словаря (New);
удаление выбранного словаря (Delete);
вставка в словарь данных из базы данных (Import from Database);
вставка в словарь данных из файла (Import from File);
экспортирование даппых из словаря в файл (Export to File).
Рис. 11.4. Допустимые операции над словарями данных
Отладчик SQL Monitor
Программа SQL Monitor позволяет отслеживать выполнение SQL-запросов к удаленным базам данных. Запуск программы осуществляется с помощью команды главного меню Delphi Database ► SQL Monitor (Базадаиных > SQL Monitor). Кроме того, программу можно запустить из главного меню Windows: Пуск ► Программы ► Borland Delphi 7 ► SQL Monitor. Ну и, конечно, с помощью простого запуска файла sqlmon.exe, который расположен в папке BIN главного каталога Delphi 7.
Для локальных баз данных эта программа не применима, так как она отслеживает операции доступа к удаленным базам данных с помощью драйверов SQL Links, а в локальных базах данных работают другие» локальные драйверы.
Кроме того, SQL Monitor не может быть использован, если в вашем приложении имеются компоненты с закладки InterBase, так как в этом случае драйверы SQL Links не задействованы и осуществляется прямой доступ к базе данных через BDE.
После запуска программа автоматически следит за порядком выполнения SQL- запросов и ведет журнал работы с удаленной базой данных. Запросы отслеживаются для указанного клиента. При отладке Delphi-приложёпия клиентом становится Delphi 7. Строки журнала выводятся в верхней части окна программы. В нижней области окна отображается строка состояния (рис. 11.5).
Рис. 11.5. Окно SQL Monitor
Если вы хотите сохранить журнал работы с удаленно!! базой данных в текстовом с|)айле, можно воспользоваться командой File ► Save Log (Файл ► Сохранить журнал) и указать имя файла. Очистка журнала выполняется с помощью команды Edit ► Clear Log (Файл ► Очистить журнал).
Параметры программы SQL Monitor устанавливаются в окне Trace Options (Параметры трассировки), как показано на рис 11.6.
Рис. 11.6. Окно Trace Options
Это окно вызывается через пункт меню Options > Trace Options (Параметры > Параметры трассировки) или комбинацией клавиш Ctri+O.
Параметры, доступные в окне через элементы управления (табл. 11.6), задают степень детализации информации, сохраняемой в журнале.
Таблица 11.6. Параметры программы SQL Monitor
Параметр
Русское название
Описание
Prepared Query Statements
Готовые запросы
Подготовленные запросы, передаваемые на сервер
Executed Query Statements
Выполненные запросы
Выполненные на сервере запросы
Input Parameters
Входные параметры
Данные, передаваемые на сервер в качестве параметров запросов
Fetched Data
Возвращенные данные
Данные, возвращенные сервером
Statement Operations
Утверждение операций
Операции ALLOCATE, PREPARE, EXECUTE и FETCH
Connect/Disconnect
Соединение-отсоединение
Операции соединения с сервером и от* ключения от него
Transactions
Транзакции
Операции управления транзакциями
BLOB I/O
Ввод-вывод BLOB
Операции с BLOB-данными
Miscellaneous
Другие
Другие операции
Vendor Errors
Ошибки сервера
Сообщения об ошибках, возвращаемые сервером
Vendor CdHs
Вызовы сервера
Вызовы API-функций сервера
По умолчанию все перечисленные параметры включены. Для облегчения чтения журнала рекомендуется отключать некоторые из них. Например, достаточно оставить только первый, второй и седьмой параметры (готовые и выполненные запросы, а также транзакции).
Конструктор запросов SQL Builder
Программа SQL Builder предназначена для упрощения процесса создания SQL- запросов. С помощью этого средства вы сможете достаточно легко конструировать запросы и сохранять их в виде текстового файла с расширением SQL.
SQL Builder вызывается с помощью контекстного меню компонента Query. Расположите в форме компонент Query с закладки BDE палитры компонентов. Щелкните на компоненте правой кнопкой мыши и выберите пункт SQL Builder. Перед вами появится главное окно SQL Builder (рис. 11.7).
Окно программы разделено на две части: в верхней находятся таблицы, необходимые для построения запроса, внизу расположена область с настройками.
На рисунке 11.7 показан пример отбора записей из таблицы Animals базы данных DBDEMOS. По нему будут отобраны записи, значения поля WEIGHT у которых больше десяти. Для отработки запроса нажмите клавишу F9 или выполните команду меню Query > Run Query (Запрос ► Выполнить запрос). Результат выполнения запроса можно увидеть на рис. 11.8.
Рис. 11.7. Окно программы SQL BuilderРис. 11.7. Окно программы SQL BuilderGitteaGitteaCnttsCnttMlCnttsCnttMli?w」Mi?w」M1帽— (BLO6J (BLOB) (BLOB) (BLOB1 (BLoei (BLoei1帽— (BLO6J (BLOB) (BLOB) (BLOB1 (BLoei (BLoei20 Sceen Seven 20. S ueen Sever, 20; Screen Seven 20 Sawn Save*» 20;,имп5вч«а 35;A/ncaandAne20 Sceen Seven 20. S ueen Sever, 20; Screen Seven 20 Sawn Save*» 20;,имп5вч«а 35;A/ncaandAne■H№.■H№.G Q о о о о оG Q о о о о оWKeWKe「丄 “ 35 AJreaandАяа 35:AfncaerxiA«a「丄 “ 35 AJreaandАяа 35:AfncaerxiA«a35 A/ncaerdAna 35.Ah)caandAm35 A/ncaerdAna 35.Ah)caandAm(BLOBfJone,(BLOB]Po*e[BLOB]Saw/u(BlOfi】Wbie(BLOBfJone,(BLOB]Po*e[BLOB]Saw/u(BlOfi】WbieA/thufA/thufArthur Deb<AArthur Deb<ACm^Cm^iAgT_№A[10 23 4 95. 2094056 1209395 30940951024034102349520940561209396 3094095 〔024034iAgT_№A[10 23 4 95. 2094056 1209395 30940951024034102349520940561209396 3094095 〔024034
Рис. 11.7. Окно программы SQL Builder
Рис. 11.7. Окно программы SQL Builder
Gittea
Gittea
Cntts
CnttMl
Cntts
CnttMl
i?w」M
i?w」M
1帽— (BLO6J (BLOB) (BLOB) (BLOB1 (BLoei (BLoei
1帽— (BLO6J (BLOB) (BLOB) (BLOB1 (BLoei (BLoei
20 Sceen Seven 20. S ueen Sever, 20; Screen Seven 20 Sawn Save*» 20;,имп5вч«а 35;A/ncaandAne
20 Sceen Seven 20. S ueen Sever, 20; Screen Seven 20 Sawn Save*» 20;,имп5вч«а 35;A/ncaandAne
■H№.
■H№.
G Q о о о о о
G Q о о о о о
WKe
WKe
「丄 “ 35 AJreaandАяа 35:AfncaerxiA«a
「丄 “ 35 AJreaandАяа 35:AfncaerxiA«a
35 A/ncaerdAna 35.Ah)caandAm
35 A/ncaerdAna 35.Ah)caandAm
(BLOBfJone,
(BLOB]Po*e
[BLOB]Saw/u
(BlOfi】Wbie
(BLOBfJone,
(BLOB]Po*e
[BLOB]Saw/u
(BlOfi】Wbie
A/thuf
A/thuf
Arthur Deb<A
Arthur Deb<A
Cm^
Cm^
iAgT_№A[
10 23 4 95. 2094056 1209395 3094095
1024034
1023495
2094056
1209396 3094095 〔024034
iAgT_№A[
10 23 4 95. 2094056 1209395 3094095
1024034
1023495
2094056
1209396 3094095 〔024034
Рис. 11.8. Результат выполнения запроса
Кратко опишем закладки в последовательности их расположения в нижней части окна SQL Builder:
закладка Criteria (Условия) предназначена для задания условий отбора записей. Каждое условие вводится в отдельной строке и состоит из двух названий полей или значений, между которыми находится знак сравнения. Имена полей можно выбирать из выпадающего списка либо перетаскивать из таблиц в верхней части окна. Если условие содержит ошибку, то будет выдано соответствующее сообщение. Удалить строку условия можно с помощью пункта Delete Row (Удалить ряд) контекстного меню;
закладка Selection (Выбор) позволяет изменять названия заголовков столбцов при отображении результирующего набора данных. Кроме того, она предоставляет возможность включения в запрос статистических функций;
закладка Grouping (Группирование) предназначена для группирования записей;
закладка Group Criteria (Критерии группирования) содержит условия, на которых будет основано группирование записей;
закладка Sorting (Сортировка) определяет порядок упорядочения записей (по полям и по убыванию-возрастанию);
закладка Output Reids (Выходные поля) содержит поля, которые можно использовать для сортировки записей;
закладка Joins (Связи) предназначена для установки отношений между таблицами.
Что нового мы узнали?
На этом занятии вы узнали:
что такое язык SQL и где он применяется;
каковы основные операторы и функции языка SQL;
как работать с SQL-запросами;
как применять программы SQL Explorer, SQL Builder и SQL Monitor.
Занятие 12
Технология ADO
Обзор ADO
Компоненты ADO в Delphi 7
События в ADO
Асинхронная работа с сервером
Создание простейшего приложения, использующего ADO
На последнем занятии вы познакомитесь с технологией ADO и узнаете, как с помощью данной технологии работать с удаленными базами данных. Мы рассмотрим технологию доступа к данным, работу с транзакциями н асинхронное взаимодействие с сервером. В конце занятия мы создадим простое приложение, использующее технологию ADO.
Обзор ADO
Компоненты для работы с Microsoft ActiveX Data Objects (ADO) впервые появились в среде Delphi версии 5.
ADO — это технология стандартного обращения к реляционным структурам данных от Microsoft. Она аналогична BDE по назначению и сродни ему по возможностям. В основе архитектуры ADO лежит объектная модель компонентов COM (Component Object Model). Все объекты и интерфейсы ADO представляют собой интерфейсы и объекты СОМ.
Модель СОМ является базовой для технологий ActiveX и OLE. Проиллюстрировать это отношение можно на примере объекта TObject, как базового объекта для VCL Delphi.
Технология СОМ работает с так называемыми COM-объектами. Во многом СОМ- объекты похожи на обычные объекты визуальной библиотеки компонентов Delphi.
7 Зак. 95
Но, в отличие от последних, COM-объекты не содержат поля, в них находятся лишь свойства и методы, а также интерфейсы.
Интерфейсы — это группы логически или семантически связанных процедур, которые обеспечивают связь между поставщиком услуги (сервером) и его клиентом. Названия интерфейсов начинаются с буквы I.
Обычный COM-объект включает в себя один или несколько интерфейсов. Кроме того, С ОМ-объект содержит методы, которые позволяют приложению пользоваться им.
Технология СОМ имеет два явных плюса:
создание COM-объектов не зависит от языка программирования. Таким образом, COM-объекты могут быть написаны на различных языках;
COM-объекты пригодны для использования в любой среде программирования под Windows. В число этих сред входят Delphi, Visual C++, C++ Builder, Visual Basic и многие другие.
ПРИМЕЧАНИЕ
Хотя технология СОМ имеет очевидные достоинства, ей свойственны также и минусы, среди которых можно выделить зависимость от платформы. Эта технология применима только в операционной системе Windows и на платформе Intel.
Технология СОМ реализуется с помощью СОМ-библиотек (такие файлы операционной системы, как OLE32.DLL и OLEAUT32.DLL). COM-библ иотеки содержат набор стандартных интерфейсов, которые отвечают за функциональность СОМ-объекта, а также небольшой набор функций API, обеспечивающих создание СОМ-объектов и управление ими.
В Delphi воплощение и поддержка технологии СОМ называется Delphi ActiveX framework, DAX. Реализация DAX описана в модуле AxCtrfs.
Рассмотрим особенности архитектуры ADO (рис. 12.1).
Браузер приложения(Applicatbn Browder)
ADO
Механизм OLE DB
ODBC
Перечислим основные интерфейсы ADO и кратко поясним их назначение:
■ интерфейс IConnection выполняет следующие функции:
口 осуществляет связь с сервером;
口 управляет транзакциями;
получает информацию о произошедших ошибках (свойство Errors);
получает информацию о схеме данных (таблицы, поля и т. д.);
интерфейс I Recordset (на нижнем уровне ADO это IRowset) является аналогом TDataSet в Delphi и поддерживает текущее положение и перемещение курсора, закладки (Bookmarks), чтение, изменение и удаление записей и т. п.;
интерфейс IField позволяет получать значение поля, его тип, длину и другие сведения о поле данных;
интерфейсы ICommand и IParameter обеспечивают работу с командами источника данных. Синтаксис команд для каждого из источников свой собственный;
интерфейс IProperty позволяет получать и устанавливать параметры, специфические для провайдера данных.
Компоненты ADO в Delphi 7
Для работы с механизмом ADO в Delphi 7 предназначены семь стандартных компонентов, расположенных на закладке ADO палитры компонентов (рнс. 12.2).
::€囂备「DrfijZ気Цм$(^ЬЬЬш[岷♦»%j &%&].欣「绅@ 彳編R齢j:M^/jfJX
信量@强回制蹦壊,「•,
Рис. 12.2. Закладка ADO
Первый компонент называется ADOConnection. Функционально он аналогичен компоненту Database закладки BDE. С помощью компонента ADOConnection можно указывать местоположение базы данных и работать с транзакциями. Рассмотрим основные свойства компонента ADOConnection, отображаемые в окне инспектора объектов (табл. 12.1).
Таблица 12.1. Основные свойства компонента ADOConnection
Название свойства
ТипКраткое описание
свойства
Attributes
TXactAttnbutesУстановка данного свойства позволяет определить, как
ведет себя соединение с базой данных, то есть будет ли открываться новая транзакция автоматически. Содержит два подчиненных свойства булевого типа (по умолчанию имеют значение false): xaCommitRetaining ——определяет, будет ли новая транзакция открываться автоматически при подтверждении транзакции, и прекращает выполнение других транзакций; xaAbortRetaining — определяет, будет ли новая транзакция открываться автоматически при подтверждении транзакции, и отменяет с откатом (RollBack) выполнение других транзакций
продолжение^
Таблица 12.1 {продолжений
НазваниеТип
свойствасвойства
Краткое описание
CommandTimeout Integer
Определяет время (в секундах) на выполнение команды. По истечении заданного интервала команда будет считаться невыпопнившейся. По умолчанию длительность выполнения команды равна 30
ConnectedBoolean
Применяется для установления соединения с набором данных. По умолчанию имеет значение false, то есть связь с набором данных не установлена
Connectionstring WideString
Содержит строку с информацией о месте хранения данных (о сервере базы данных)
ConnectionTimeout Integer
Определяет время в секундах, необходимое на попытку соединения с базой данных. По истечении этого времени будет выдано сообщение о невозможности соединения с сервером. По умолчанию имеет значение 15
ConnectOptions TConnertOption
Указывает тип соединения — синхронное или асинхронное: coConnectUnspecified — синхронный тип соединения (по умолчанию); coAsyncConnect — асинхронный тип соединения. Полезен, когда сервер базы данных очень медленны% но необходимо помнить, что не все данные будут доступны сразу после установки соединения
CursorLocation TCursorLocation
Определяет тип курсора ——клиентский или серверный. Может принимать два значения: clUseClient — наиболее затребуемый (по умолчанию). Все записи из набора данных копируются на компьютер-клиент; dUseServer — используемый намного реже, но удобный для работы с наборами данных, содержащими большое число записей
DefaultDatabase WideString
Определяет базу данных, которая используется для соединения по умолчанию. В случае, когда соединение с базой данных, указанной в свойстве Connectionstring, невозможно установить, будет произведено подключение к базе данных, указанной в данном свойстве
IsotationLevelTIsolationLevel
Уровень изоляции транзакций. Может принимать одно из следующих значений: ilUnspecified — неопределенный уровень изоляции; ilChaos — изменения, произведенные транзакциями с более высоким уровнем изоляции, не могут быть отменены с помощью транзакций данного уровня; ilReadUncommitted — незавершенные изменения других транзакций видимы в заданной; ilBrowse ——то же, что и ilReadUncommitted; ilCursorStability — изменения, созданные другими транзакциями видны только после их завершения (по умолчанию); ilReadCommitted — то же, что и ilCursorStability; ilRepeatabieRead ——изменения, внесенные иными транзакциями, не видны, но их можно просмотреть с помощью повторного запроса данных; ilSerializable ——транзакции проводятся в полной изоляции от других транзакций; illsolated ——то же, что и ilSerializable
KeepG)nnection Boolean
Определяет, будет ли сохраняться подключение к базе данных, даже если ни один набор данных не открыт. По умолчанию имеет значение true, то есть подключение будет сохраняться
LoginPromptBoolean
Указывает, будет ли диалог ввода имени пользователя и пароля отображаться непосредственно перед соединением с базой данных. По умолчанию имеет значение true, то есть диалог появляться будет
НазваниеТип
свойствасвойства
Краткое описание
ModeTConnectMode
Назначает уровень доступа к данным в текущем соединении. Может принимать одно из перечисленных значений: cmUnknown — права доступа не установлены или не могут быть определены (по умолчанию); cm Read — доступ только для чтения данных; cmWrite — доступ только для записи данных; cmReadWrite — определены права для чтения и записи данных; cmShareDenyRead — запрет чтения данных для других пользователей, у которых имеется право на чтение данных; cmShareDen^Write — запрет доступа к данным другим пользователям, обладающим правом записи данных; cmShareExctusive — режим, запрещающий всем другим пользователям получение доступа к данным; cmShareDenyNone — блокирует доступ к данным для всех пользователей с любыми правами
NameTComponentName
Определяет имя компонента ADOConnection, которое будет использоваться в тексте программы
ProviderWideString
Определяет провайдера соединения
Следующий компонент закладки ADO называется ADOCommand. Он предназначен для выполнения SQL-команды без возврата результирующего набора данных. Основные свойства этого компонента представлены в табл. 12.2.
Таблица 12.2. Основные свойства компонента ADOCommand
Название свойства
Тип свойства
Краткое описание
Commandlext
WideString
Сюда непосредственно записывается SQL-команда, которую необходимо выполнить
CommandTimeout Integer
Определяет допустимую задержку выполнения команды в секундах. По умолчанию имеет значение 30
Commandlype
TCommandiype
Тил SQL-команды. Может принимать одно из перечисленных значений: cmdUnknown — неизвестный тип команды; andText—текстовая команда или вьоов хранимой процедуры; оптЫе — имя таблицы; cmdStonedProc — имя хранимой процедуры; ortdFlle — имя файла набора данных; сгткПаЫе- Direct — имя таблицы, все столбцы будут возвращены
Connection
TADOConnection
Имя компонента типа ADOGinnection для соединения с базой данных
Connectionstring
WideString
Определяет строку с информацией о месте хранения данных (о сервере базы данных). Может применяться вместо свойства Connection
ExecuteOptions
TExecuteOptions
Включает в себя четыре лодсвойства булевского типа. Значения по умолчанию (все — false): eoAsyncExecute — команда будет выполнена асинхронно; eoAsyncFetch — команда будет выполняться асинхронно после указания значения в свойстве Cache; eoAsyncFetchNonBlocking — потоки при отработке
команды не блокируются; eoExecuteNoRecords — команда будет выполнена без возврата какого-либо значения
Name
TComponentName
Определяет имя компонента ADOCommand, которое будет использоваться в тексте программы
Prepared
Word Bool
Определяет, будет ли SQL-команда подготовлена перед вызовом метода Execute, непосредственно выполняющего команду
Третий компонент закладки ADO носит имя ADODataSet Его назначение — получение набора данных из одной или нескольких таблиц базы данных. Кроме того, он также позволяет работать с возвращенным набором данных визуальным компонентам, предназначенным для отображения данных. Это наиболее общий компонент для работы с набором данных, который может использоваться вместо компонентов ADOTable, ADOQuery или ADOStoredProc. В таблице 12,3 приведены основные свойства указанного компонента.
Таблица 12.3. Основные свойства компонента ADODataSet
Название свойства
Тип свойства
Краткое описание
Active
Boolean
Определяет, является ли набор данных открытым. По умолчанию имеет значение false, то есть набор данных закрыт
AutoCalcFlelds
Boolean
Регламентирует, как будет осуществляться работа с автоматически вычисляемыми полями. Если значение свойства true, то значения таких полей будут автоматически вычисляться в случае открытия набора данных, перевода набора данных в режим редактирования (dsEdft) или переключения фокуса с одного визуального компонента на другой, или из одной колонки визуального компонента в другую
CacheSize
Integer
Определяет размер кэша, выделенного для набора данных. По умолчанию имеет значение 1 (минимальное). То есть будет кэшироваться одна запись набора данных
CommandText
WldeString
8 свойство записывается текст SQL-запроса, который будет выполнен
CommandTimeout Integer
Определяет допустимую задержку выполнения SQL-запроса в секундах. По умолчанию разрешенная задержка равна 30
СоттапсЛУре
ТСотталсЛУре
Определяет тип SQL-запроса. Может принимать одно из следующих значений: ondUnknown — неизвестный тип команды; ancflext 一 текстовая команда или вызов хранимой процедуры; стсП^Ые — имя таблицы; andStonedProc—имя хранимой процедуры; cmdRIe — имя файла набора данных; andiabteDirect— имя таблицы, все столбцы будут возвращены
Connection
TADOConnecUon
Здесь указывается имя компонента типа ADOConnection для соединения с базой данных
Connectionstring
WideString
Строка, содержащая информацию о месте хранения данных (о сервере базы данных). Может применяться вместо свойства Connection
CursorLocation
TCursorLocation
Определяет тип курсора — клиентский или серверный, то есть указывает, где будет выполняться работа с данными: cJUseGient — наиболее используемый (по умолчанию). Все записи из набора данных копируются на компьютер-клиент; dUseServer—наименее используемый, но удобный для работы с наборами данных, содержащими большое количество
записей. Работа с данными осуществляется на сервере
Cursoriype
TCursoriype
Тип курсора набора данных. Может принимать одно из перечисленных значений: ctUnspecified — тип курсора не был определен; dOpenForwardOnly — однонаправленный курсор, с помощью которого можно переходить только на запись вперед. Имеет большое быстродействие; ctKeyset — курсор не позволяет видеть записи, добавленные другими пользователями. Запиос, удаленные другими пользователями, становятся недоступными. Данный тип курсора устанавливается
Название свойства
Тип свойства
Краткое описание
no умолчанию; ctDynamic ——динамический курсор. Изменение, удаление и вставка записей, произведенные другими пользователями, видимы. Возможно перемещение по записям вперед и назад; ctStatic — статический курсор. Доступна простая статическая копия данных. Изменения данных другими пользователями не видны. Применяется в основном для создания отчетов
DataSetField
TDataSetField
Используется для организации вложенных наборов данных и содержит название поля из главного набора данных
ExecuteOptions
TExecuteOptions
Определяет параметры выполнения SQL-команды. Содержит, в свою очередь, четыре свойства булевого типа — по умолчанию все они имеют значение false: eoAsyncExecute — команда будет выполнена асинхронно; eoAsyncFetch — команда будет выполняться асинхронно после указания значения в свойстве Cache; eoAsyncFetchNonBiocking — команда будет выполнена без блокировки потоков; eoExecuteNoRecords — команда будет выполнена без возврата какого-либо значения
Filter
String
Содержит текст текущего фильтра для набора данных.
В визуальных компонентах отображаются только те данные, которые соответствуют условиям фильтра
Filtered
Boolean
Определяет, будет ли учитываться значение свойства Filter при отображении данных в визуальных компонентах. Если значение данного свойства установлено в true — данные будут фильтроваться, иначе — фильтр игнорируется
IndexReldNames String
Содержит список столбцов таблицы, используемых в качестве индексных
IndexName
String
Определяет альтернативные индексы для таблицы
Locklype
TADOLockT/pe
Тил защиты (блокировки) набора данных. Может принимать одно из перечисленных значений: ItUnspecified — защита данных не истюльзуется; ItReadOnly — данные доступны только для чтения; ItPessimistic ——«пессимистическая» блокировка. Запись блокируется сразу после начала редактирования и до сохранения; ItOptimistic — «оптимистическая» блокировка. Запись недоступна только во время сохранения изменений. Этот тип блокировки установлен по умолчанию; ItBatchOpti- mistic — то же самое, что и ItOptimistic, но используется отложенное сохранение изменений записей
MarshaiOptions
TMarshalOption
Определяет, будут ли отправлены на сервер те поля, которые не были обновлены. Может принимать следующие значения: moMarshalAII — неизмененные поля будут отправлены; тоМаг- shalModifiedOnly — неизмененные поля отправке не подлежат
MasterFields
String
Указывает одно или несколько полей главной таблицы (master table) для установления связи с соответствующими полями подчиненной таблицы, то есть типа master—detail
MaxRecords
Integer
Определяет количество записей, которые могут быть возвращены в результирующем наборе данных. Ло умолчанию равно 0, что означает неограниченное число записей
Name
TComponentName
Имя компонента набора данных
Store Deft
Boolean
Указывает, сохраняются ли определения полей и индексов в модуле данных или в форме. Если значение данного свой- сгва ——true, то определения полей и индексов будут сохраняться в модуле данных или в форме. Если значение свойства 后Ise (по умолчанию), то информация размещается в соответствующих файлах базы данных
Следующий компонент закладки ADO называется ADOTable. Он является аналогом компонента Table, расположенного на закладке BDE, и предназнамен для доступа к таблице с помощью механизма ADO. Компонент ADOTable имеет свойства, которые мы уже рассматривали ранее в компонентах Т^Ые и ADODataSet поэтому мы не будем возвращаться к ним еще раз.
Компонент ADOQuery представляет собой запрос к базе данных. Это может быть как запрос, в результате которого возвращаются данные из базы (например, SELECT), так и запрос, не формирующий результирующего набора данных (например, INSERT). Компонент аналогичен компоненту Query из BDE. Все основные его свойства мы уже рассматривали в описании свойств компонентов Query и ADODataSet Компонент ADOStoredProc предназначен для вызова процедуры, хранимой на сервере базы данных. В отличие от BDE и InterBase хранимые процедуры в ADO могут возвращать набор данных, поэтому компонент такого типа является потомком DataSet и может выступать источником данных в компонентах типа DataSource.
Последний компонент закладки ADO называется RDSConnection. Этот компонент управляет маршалингом данных, когда набор записей переносится из одного компьютера на другой.
ПРИМЕЧАНИЕ
Маршалингом данных называется механизм, который позволяет клиенту получать доступ к объектам, расположенным в другом адресном пространстве или на другом компьютере.
События в ADO
На события в ADO возлагаются те же задачи, что и на события в VCL. Многие из событий ADO имеют аналоги в VCL и соответствующие компоненты вызывают из событий ADO события VCL
Все события в ADO условно разделим на несколько групп: события соединения, события транзакции, события выполнения команд.
События соединения:
OnWillConnect — вызывается перед установкой соединения;
OnConnectCOmplete — вызывается после установки соединения;
OnDisconnect — активируется при разрыве соединения.
Эти события инкапсулированы в компоненте ADOConnection.
События транзакции:
OnBeginlransComplete — происходят при выполнении BeginTrans;
OnCommitTransComplete — происходят при выполнении Commitlrans;
OnRoJIbacklransComplete — вызываются при выполнении RollbackTrans.
События данной группы инкапсулированы в компоненте ADOConnection.
События выполнения команд OnWillExecute и OnExecuteComplete вызываются перед выполнением команды и после него соответственно.
Эти события <зашиты> в компоненте ADOConnection, а не в ADOCommand, как можно было бы предположить. Указанная «странность» связана с тем, что в ADO объекта команды как такового нет, и по этой причине он не может получать сообщения.
В компонент ADOConnection также встроено событие OnInfoMessage которое вызывается по факту прихода с сервера дополнительной информации. Формат и назначение зависят от сервера, с которым вы работаете.
В ADO есть и события, связанные с набором данных, а нес соединением, как вышеописанные. Они инкапсулированы в компоненты, представляющие наборы данных: ADODataSet ADOTable, ADOQuery и ADOStoredProc.
Эти события можно условно разбить на три группы.
События выборки данных.
OnFetchProgress — многократно вызывается в процессе выборки данных;
OnFetchComplete — завершение выборки.
Уведомления об изменении положения текущей записи в наборе'.
口 OnWillMove — вызывается до изменения положения текущей записи. Позволяет отменить действие;
口 OnMoveComplete — вызывается после изменения положения текущей записи;
口 OnEndOfRecordset — генерируется при достижении конца набора данных. Позволяет добавить новую запись.
Уведомления об изменении набора данных.
口 OnWillChangeField. OnFieldChangeComplete — вызываются до и после изменения текущей записи набора;
OnWillChangeRecord, OnRecordChangeComplete — вызываются до и после изменения, добавления, удаления строки набора и при отмене этих действий;
口 OnWillChangeRecordset, OnRecordsetChangeComplete — вызываются до и после открытия, закрытия, повторного запроса и синхронизации набора данных.
Многие события допускают прерывание действия. Эта возможность полезна при асинхронной работе с сервером, например, для прерывания слишком длинного запроса.
Асинхронная работа с сервером
В ADO есть возможность, не имеющая аналогов ни в BDE, ни в InterBase. Это асинхронное выполнение операций с сервером. Асинхронно могут выполняться: ■ установка соединения с сервером (Connection);
выполнение команды (Execute);
выборка данных (Fetch).
Асинхронное соединение
Для включения этого режима необходимо присвоить свойству ConnectOptions компонента ADOConnection значение coAsyncConnect.
При установлении соединения происходит следующее:
вызывается обработчик события OnWillConnect;
управление передается программе.
После завершения соединения, как успешного, так и ошибочного, вызывается обработчик события OnConnectComplete.
Асинхронное выполнение команды
Надо заметить, что мноше компоненты ADO при активизации или выполнении отрабатывают команду на языке SQL. Это такие компоненты, как ADOCommand, ADODataSet, ADOTable, ADOQuery и ADOStoredProc. Для асинхронного выполнения команды установите в свойстве ExecuteOptions значение coAsyncExecute.
При выполнении команды будет происходить следующее:
вызовется обработчик события OnWillExecute;
управление передастся программе.
После окончания выполнения команды, как успешного, так и ошибочного, вызывается обработчик события OnExecuteComplete.
Асинхронная выборка данных
Асинхронная выборка данных поддерживается в компонентах ADODataSet, ADOTable, ADOQuery н ADOStoredProc. Для ее включения установите в свойстве ExecuteOptions значение coAsyncFetch.
После исполнения команды происходит передача данных. В процессе передачи многократно вызывается обработчик сообщения OnFetchProgress. В его параметрах указывается как количество уже переданных записей, так и общее количество предназначенных для передачи записей. Это очень удобно для создания индикаторов типа ProgressBar. После того как выборка с сервера закончена, вызывается обработчик события OnFetchCompiete.
Создание простейшего приложения, использующего ADO
В заключение создадим простое приложение, которое будет содержать только одну таблицу. Итак, в форме разместим три компонента с палитры компонентов:
ADOIable закладки ADO;
DataSource закладки Data Access;
DBGrid закладк» Data Controls.
Свяжем эти компоненты между собой. Для этого установим значение свойства DataSource компонента DBGridl в DataSourcel. Вторым шагом значение свойства DataSet компонента DataSourcel установим в ADOTablel. Все три компонента теперь ' связаны. Осталось указать базу данных — в свойстве Connectionstring компонента ADOTablel нажмем кнопку с многоточием. Появится диалоговое окно редактора параметров соединения (рис. 12.3).
Данное окно предоставляет вам право решать, каким образом будет указана строка связи с базой данных, расположенной на сервере. Один из вариантов — интерактивный ввод строки в поле Use Connection String. Кроме того, можно использовать
заранее подготовленный файл, содержащий такую строку связи (Use Data Link File). Установим переключатель в положение Use Data Link File и нажмем кнопку Browse. В открывшемся окне выбора файлов связи с данными выберем файл DBDEMOS.UDL (рис. 12.4).
Рис 12.3. Окно редактора параметров соединения
Рис. 12.4. Окно выбора файлов связи с данными
Этот файл входит в дистрибутив Delphi н указывает на базу данных формата Microsoft Access, которая также поставляется вместе с Delphi. Нажмем кнопку Открыть, и в поле Use Data Link File появится строка C:\Program Files\Common Files\SYSTEM\ole db\Data Links\DBDEMOS.udl. Нажимаем OK — база данных выбрана. Теперь осталось определить таблицу базы данных. Для этого в свойстве TableName компонента АСЮТаЫе! указываем, например, таблицу COUNTRY. Наконец, мы можем активировать набор данных — присвоим свойству Active компонента ADOlablel значение true. Все, приложение готово, и его можно запускать (рис. 12.5).
Что нового мы узнали?
Вот мы и подошли к концу этой книги, в которой рассмотрели различные возможности работы с базами данных. Дать вам представление о технологии ADO было последней моей задачей. На этом моя просветительская миссия заканчивается, вы готовы к самостоятельному более углубленному изучению предмета. А я еще раз напомню, что вы должны были извлечь для себя из материалов занятия:
что такое механизм ADO;
основные интерфейсы ADO;
компоненты ADO в Delphi 7 и их основные свойства;
основные события в ADO;
что такое асинхронная работа с сервером;
и, наконец, как создать простейшее приложение, использующее в своей работе механизм ADO.
Удачи в дальнейших разработках!
Приложение
Коды ошибок Borland Database Engine
При работе с BDE может появиться диалоговое окно с сообщением об ошибке. Как правило, такое окно содержит шестнадцатеричный код ошибки и ее описание. Описание выводится на английском языке. Чтобы вы не тратил и время на перевод, здесь приводится таблица, которая содержит коды ошибок и их описание на английском и русском языках. В таблицу включены сведения далеко не обо всех ошибках BDE, но мы постарались выделить из них наиболее часто встречающиеся.
Таблица П. Коды ошибок BDE
Код ошибки
Оригинальное сообщение
Перевод
0
Successful completion
Успешное завершение
21
System error
Системная ошибка
22
Object of interest not found
Интересующий объект не найден
23
Physical data corruption
Физическое повреждение данных
24
I/O related error
Ошибка ввода-вывода
25
Resource or limit error
Ошибка ресурса или ограничений
26
Data integrity violation
Нарушение целостности данных
27
Invalid request
Некорректный запрос
28
Lock violation
Нарушение блокировки
29
Access/security violation
Нарушение системы доступа/безопасности
2А
Invalid context
Неверный контекст
2В
OS error
Ошибка операционной системы
2С
Network error
Сетевая ошибка
2D
Optional parameter
Необязательный параметр
2Е
Query processor
Процессор запросов
2F
Version mismatch
Несоответствие версии
30
Capability not supported
Совместимость не поддерживается
31
System configuration error
Ошибка конфигурации системы
32
Warning
Предупреждение
33
Miscellaneous
Разное
34
Compatibility error
Ошибка совместимости
Таблица П (продолжений
Код ошибки
ОригинальноеПеревод
сообщение
ЗЕ 3F 100 101 102 200
Driver specific errorОшибка драйвера
Internal symbolВнутренний символ
KEYVIOLНеверный ключ
PROBLEMSВнутренние неполадки
CHANGEDКритические изменения
Production index file missing.Индексный файл отсутствует или поврежден, либо
corrupt or cannot interpret index ошибка интерпретации индекса key
201
202
203
204
Open read onlyОткрыто только для чтения
Open the table in read only mode Открытие таблицы в режиме только для чтения
Open and detachОткрытие и отсоединение
Open the table and detach the Открытие таблицы и отсоединение индексного production index fileфайла
205
206
207
208
Fail openОшибка открытия
Do not open the tableТаблица не открыта
Convert поп-dBASE indexПопытка преобразования не dBASE-индекса
Convert production indexПреобразование индекса в формат dBASE
to dBASE format
209
20А
20В
BLOB file not foundBLOB-файл не найден
Open without BLOB fileОткрытие без BLOB-файла.
Open the table withoutОткрытие таблицы без BLOB-файла
the BLOB П1е
20С
20D
Empty all BLOB fieldsBee BLOB-поля пусты
Reinitialize BLOB file and LOSE Повторная инициализация BLOB-файла с потерей all BLOBSвсех объектов
20Е 20F 210 211 212 213
Fail openОшибка открытия
Do not open the tableНевозможно открыть таблицу
Import поп-dBASE BLOB fileИмпортируемый BLOB-файл не dBASE формата
Import BLOB file to dBASE format Импортирование ВЮВ*файла в формат dBASE Open as поп-dBASE tableОткрытие таблицы как не dBASE-формата
Open table and BLOB file in its Открытие таблицы и BLOB-файла в их «родном» native formatформате
214
Production index language driver Драйвер языка не соответствует индексу mismatch
215
216
217
400
401
402
403
Production index damagedИндекс поврежден
Rebuild production indexПерестройка индекса
Rebuild all the production indexes Перестройка всех индексов
Lookup table not found or corrupt Искомая таблица не найдена или повреждена
Blob file not found or corrupt BLOB-файл не найден или поврежден
Open read onlyОткрытие в режиме только для чтения
Open the table in read only mode Открытие таблицы возможно только в режиме для чтения
404
Fail openОшибка открь(тия
Код ошибки
Оригинальное сообщение
Перевод
405
Do not open the table
Невозможно открыть таблицу
406
Remove lookup
Искомый файл был удален
407
Remove link to lookup table
Связь с искомой таблицей была удалена
500
Docttonary object exist
Объект словаря уже существует
501
Skip this object
Данный объект будет пропущен
502
Skip importing this object and Its associated relationship
Импортирование данного объекта и ассоциированных с ним связей будет пропущено
503
Use existing object
Использование существующего объекта
504
Use existing dictionary object for relationship
Использование существующего объекта словаря для установки связей
505
Abort
Действие прервано
506
Abort the operation
Операция прервана
507
Dictionary object import billed
Ошибка импорта объекта словаря
]34Е
Unmapped SQL error code
Неожиданная ошибка SQL
2101
Cannot open a system file
Невозможно открыть системный файл
2102
I/O error on a system file
Ошибка ввода-вывода при работе с системным файлом
2103
Data structure corruption
Структура данных повреждена
2104
Cannot find engine configuration file
Невозможно найти конфигурационный файл BDE
2105
Cannot write to engine configuration file
Невозможно произвести запись в конфигурационный файл BDE
2106
Cannot Initialize with different configuration Ole
Невозможно инициализировать приложение с другим конфигурационным файлом
2107
System has been Illegally reentered
Произведен некорректный поеторный вход в систему
2108
Cannot locate IDAPI32.DLL
Невозможно найти файл IDAPI32.DLL
2109
Cannot load IDAPI32.DLL
Невозможно загрузить файл IDAPI32.DLL
210А
Cannot load an IDAPI service library
Невозможно загрузить библиотеку IDAPI
210В
Cannot create or open temporary file,
Невозможно 8здать или открыть временный файл
2203
Record moved because key value changed
Запись была перемещена из-за смены значения ключа
2204
Record/key deleted
Запись/ключ удалены
2205
No current record
Текущая запись отсутствует
2206
Could not Rnd record
Невозможно найти запись
2207
End of BLOB
Конец BLOB-объекта
2208
Could not find object
Невозможно найти объект
2209
Could not Hnd 由仙卜 member
Невозможно найти члена семейства
220А
BLOB П1е Is missing
В(О&файл отсутствует
220В
Could not find language driver
Невозможно найти драйвер языка
2301
Corrupt table/index header
Заголовок таблицы/индекса поврежден
Таблица П {прсщалжениё}
KW ошибки
Оригинальное сообщение
Перевод
2302
Corrupt П1е - other than header
Поврежденный файл не соответствует заголовку
2303
Corrupt memo/BLOB file
Файл Memo/BLOB поврежден
2305
Corrupt index
Индекс поврежден
2306
Corrupt lock file
Блокированный файл поврежден
2307
Corrupt family file.
Файл семейства поврежден
2308
Corrupt or missing .VAL file
Файл с расширением VAL поврежден или отсутствует
2309
Foreign index file format
Неверный формат файла внешнего индекса
2401
Read failure
Ошибка чтения
2402
Write failure
Ошибка записи
2403
Cannot access directory
Оижбка доступа к каталогу
2404
File delete operation 侑iled
Ошибка удаления файла
2405
Cannot access file
Доступ к файлу невозможен
2406
Access to table disabled because of previous error
Доступ к таблице закрыт из-за предыдущей ошибки
2501
Insufficient memory for this operation
Недостаточно памяти для выполнения операции
2502
Not enough file handles
Недостаточно дескрипторов файлов
2503
Insufficient disk space
Недостаточно дискового пространства
2504
Temporary table resource limit
Достигнут предел ресурса временной таблицы
2505
Record size Is too big for table
Размер записи слишком велик для таблицы
2506
loo many open cursors
Слишком много открытых курсоров
2507
Tbble is full
Таблица заполнена
250В
Too many sessions from this workstation
Слишком много сессий для данной рабочей станции
2509
Serial number hmit
Достигнут предел серийного номера (для Paradox)
250А
Some internal limit
Внутреннее ограничение
250В
Too many open tables
Слишком много открьпых таблиц
250С
Too many cursors per table
Слишком много курсоров для одной таблицы
250D
Too many records locks on table
Слишком много блокированных записей в таблице
250Е
Too many Clients
Слишком много клиентов
250F
Tbo many indexes on table
Слишком много индексов в таблице
2510
Tbo many sessions
Слишком много сессий
2511
loo many open databases
Слишком много открытых баз данных
2512
Too many passwords
Слишком много паролей
2513
Too many active drivers
Слишком много активных драйверов
2514
Too many fields in table aeate
Слишком много полей в создаваемой таблице
2515
Too many table locks
Слишком много блокировок таблицы
2516
loo many open BLOBs
Слишком много открытых ВЮВ-объектов
2517
Lock file has grown too large
Блокированный файл слишком быстро растет
2518
Too many open queries
Слишком много открьпых запросов
251А
Too many BLOBs
Слишком много ВЮВ-объектов
251В
Filename is too long, for a Paradox version 5.0 table
Имя файла слишком велико для таблицы Paradox версии 5.0
Код ошибки
ОригинальноеПеревод
сообщение
251С
251D
Row fetch limit exceededПревышен предел двойников в строке
Long name not allowed for this Длинные имена не разрешены на данном уровне table levelтаблицы
2601
2602
2603
2604
2605
2606
Key violationНарушение ключа
Minimum validity check 由iledОшибка минимальной проверки корректности
Maximum validity check failedОшибка максимальной проверки корректности
Field value requiredТребуется задать значение поля
Master record missingОтсутствует ооювная запись
Master has detail records. Cannot Удаление или изменение ооювной записи невоз- delete or modifyможно, так как она имеет подчиненные записи
2607
2608
Master table level is incorrectУровень главной таблицы некорректен
Field value out of lookup table Значение поля вне области поиска внутри таблицы range
2609 260А
260В 260С 260D
Lookup table open operation failed Ошибка открытия таблицы поиска
Detail table open operation 由Hed Ошибка открытия подчиненной таблицы Master table open operation 由iled Ошибка открытия главной таблицы
Field is blankПоле пусто
Unk to master table alreadyСвязь с главной таблицей уже определена
defined
260Е
260F
2610
Master table is openГлавная таблица открыта
Detail table(s) existПодчиненные таблицы существуют
Master has detail records. Cannot Удалить главную запись невозможно, так как она empty itимеет подчиненные записи
2611
Self referencing referentialСсылка на себя должна быть введена без других
integrity must be entered one at изменений в таблице a time with no other changes to the table
2612
2613
Detal table is open Подчиненная таблица открыта
Cannot make this master a detail Главную таблицу невозможно сделать подчиненной of another table if its detail are для другой таблицы, так как ее собственная подчи- not empty ненная таблица не пуста
2614
Referential integrity fields must Поля ссылочной целостности должны быть индекси- be indexedрованы
2615
A table linked by referentialТаблица, связанная при помощи ссылочной целост-
integrity requires passwordности, требует пароль для открытия
to open
2616
Feld(s) linked to more thanПоля связаны более чем с одной главной таблицей
one master
2701
2702
2703
2704
2705
2706
Number is out of rangeЧисло за пределами диапазона
Invalid parameterНеверный параметр
Invalid file nameНеправильное имя файла
File does not existФайл не существует
Invalid optionНеверная опция
Invalid handle to the function Неверный дескриптор функции
Таблица П (продолжений
Код ошибки
Оригинальное сообщение
Перевод
2707
Unknown table type
Неизвестный тип таблицы
270В
Cannot open file
Невозможно открыть файл
2709
Cannot redefine primary key
Невозможно переопределить первичный ключ
270С
Invalid modify request
Неправильный запрос на изменение
270D
Index does not exist
Индекс не существует
270Е
Invalid offset into the BLOB
Неправильное смещение внутри BLOB-объекта
270F
Invalid descriptor number
Неправильный номер дескриптора
2710
Invalid field type
Неправильный тип поля
2711
Invalid field descriptor
Неверный дескриптор поля
2712
Invalid field transformation
Неправильное преобразование поля
2713
Invalid record structure
Неверная структура записи
2714
Invalid descriptor
Неправильный дескриптор
2715
Invalid array of index descriptors
Некорректный массив дескрипторов индексов
2716
Invalid array of validity check descriptors
Некорректный массив дескрипторов проверки
2717
Invalid array of referential integrity descriptors
Некорректный массив дескрипторов ссылочной целостности
2718
Invalid ordering of tables during restructure
Неправильный порядок таблиц во время реструктуризации
2719
Name not unique in this context
Имя не уникально в данном контексте
271А
Index name required
Требуется имя индекса
271В
Invalid session handle .
Некорректный дескриптор сессии
271С
Invalid restructure operation
Некорректная операция реструктуризации
271D
Driver not known to system
Драйвер не известен системе
271Е
Unknown database
Неизвестная база данных
271F
Invalid password given
Некорректный пароль
2720
No callback function
Нет функции обратного вызова
2721
Invalid callback buffer length
Некорректная длина буфера обратного вызова
2722
Invalid directory
Неверный каталог
2723
Value out of bounds
Значение вышло за пределы допустимого
2724
Cannot set cursor of one table to another
Невозможно установить курсор одной таблицы в другой
2725
Bookmarks do not match table
Закладка не соответствует таблице
2726
Invalid Index/tag name
Неверное имя индекса или тега
2727
Invalid index descriptor
Некорректный дескриптор индекса
2728
Table does not exist
Таблица не существует
2729
Table has too many users
У таблицы слишком много пользователей
272А
Cannot evaluate key or key does not pass filter condition
Вычислить ключ невозможно или ключ не удовлетворяет условиям фильтра
272В
Index already exists
Индекс уже существует
272С
Index Is open
Индекс открыт
272D
Invalid BLOB length
Некорректная длина ВЮВ-поля
272Е
Invalid BLOB handle in record buffer
Некорректный дескриптор BLOB в буфере записи
Код ошибки
ОригинальноеПеревод
сообщение
272F
2730
2731
2732
2733
2734
2735
Table is openТаблица открыта
Need to do restructureТребуется реструктуризация
Invalid modeНеверный режим
Cannot dose indexНевозможно закрытьиндекс
Index is being used to order table Индекс используется таблицей
Unknown user name or password Неизвестное имя пользователя или пароль
Multi-level cascade is notМногоуровневое каскадирование не поддерживается
supported
2736 2737
2738 2739 273А
273В 273С 273D
273Е 273F
2740
2741
Invalid field nameНеверное имя поля
Invalid table nameНеверное имя таблицы
Invalid linked cursor expression Неверное выражение для связанного курсора
Name is reservedИмя зарезервировано
Invalid file extensionНеверное расширение файла
Invalid language driverНеверный драйвер языка
Alias Is not currently openedПсевдоним в настоящее время не открыт
Incompatible record structures Несовместимая структура записи
Name is reserved by DOSИмя зарезервировано для использования DOS
Destination must be indexedПриемник должен быть индексирован
Invalid Index typeНеверный тип индекса
Language drivers of table and Драйверы языка таблицы и индекса не совпадают index do not match
2742 2743
2744 2745
2746 2747
2748 274А
274В 274С 274D
274Е
Filter handle is invalidНекорректный дескриптор фильтра
Invalid fiiterНекорректный фипьтр
Invalid table create requestНеверный запрос создания таблицы
Invalid table delete requestНеверный запрос удаления таблицы
Invalid Index create requestНеверный запрос создания индекса
Invalid index delete requestНеверный запрос удаления индекса
Invalid table specifiedОпределена некорректная таблица
Invalid timeНеверное время
Invalid dateНеверная дата
Invalid datetimeНеверные дата ивремя
Tables in different directoriesТаблицы находятся в разных каталогах
Mismatch in the number ofНесойтветствие по количеству аргументов
arguments
274F
Function not found in serviceФункция не найдена в библиотеке
library
2750
Must use base order for thisДля данной операции должен использоваться
operationбазовый порядок
2751
2752
2801
2802
2803
Invalid procedure nameНеверное имя процедуры
The Held map is InvalidКарта поля неверна
Record locked by another user Запись блокирована другим пользователем
Unlock failedПопытка деблокирования неудачна
Table is busyТаблица занята
Таблица П {продолжений
Код ошибки
Оригинальное сообщение
Перевод
2804
Directory Is busy
Каталог занят
2805
Rie is locked
Файл заблокирован
2806
Directory is locked
Каталог заблокирован
2807
Record already locked by this session
Запись уже заблокирована в этой сессии
2808
Object not locked
Объект не заблокирован
2809
Lock time out
Время блокировки истекло
280А
Key group is locked
Группа ключей заблокирована,
280В
Tbble lock was lost
блокировка таблицы снята
280С
Exclusive acc^s was lost
Исключительный доступ к данным был деактивирован
2800
1^Ые cannot be opened for exclusive use
Таблица не может быть открыта в режиме исключительного пользования
280Е
ConHkling record lock In this session
Конфликтная запись была заблокирована в данной сессии
280F
A deadlock was detected
Взаимоблокировка
2810
A user transaction is already In progress
Пользовательская транзакция уже в процессе выполнения
2811
No user t^insaction is currently In progress
В настоящее время пользовательские транзакции не выполняются
2812
Record lock 回 led
Ошибка блокировки поля
2813
Couldnt perform the edit because another user changed the record
Невозможно выполнить редактирование, так как запись была изменена другим пользователем
2814
Gxjldnt perform the edit because another user deleted or moved the record
Невозможно выполнить редактирование, так как запись была удалена или перемещена другим пользователем
2901
Insufficient field rights for operation
Недостаточно прав поля для выполнения операции
2902
Insufficient table rights for operation. Password required
Недостаточно прав таблицы для выполнения операции. Требуется пароль
2903
Insuffident 侑mlly rights for operation
Недостаточно прав семейства для выполнения операции
2904
This directory is read-only
Используемый каталог только для чтения
2905
Database is read-only
База данных только для чтения
2906
"Hying to modify read-only Held
Попытка изменения поля только для чтения
2907
Encrypted dBASE tables not supported
Зашифрованные таблицы dBASE не поддерживаются
2908
Insufficient SQL rights for operation
Недостаточно прав SQL для выполнения операции
2А01
Reid isnota BLOB
Не BLOB-поле
2А02
BLOB already opened
BLOB-поле уже открыто
2А03
BLOB not opened
BLOB-поле не открыто
2А04
Operation not applicable
Операция не применима
2А05
ПЫе is not indexed
Таблица не индексирована
2А06
Engine not Initialized
BDE не инициализирован
2А07
Attempt to re-inMaiize engine
Попытка повторной инициализации BDE
Код ошибки
Оригинальное сообщение
Перевод
2А08
Attempt to mix objects from different sessions
Попытка смешивания объектов разных сессий
2А09
Paradox driver not active
Драйвер Paradox не активирован
2А0А
Driver not loaded
Драйвер не загружен
2А0С
No associated index
Нет сопоставленного индекса
2A0D
Table open. Cannot perform this operation
Таблица открыта. Выполнение данной операции невозможно
2А0Е
Table does not support this operation
Таблица не поддерживает данную операцию
2А10
Table does not support this operation because it is not uniquely indexed
Таблица не поддерживает операцию, так как не имеет уникального индекса
2А11
Operation must be performed on the current session
Операция должна быть выполнена в текущей сессии
2А12
Invalid use of keyword
Неправильное использование ключевого слова
2А13
Connection is in use by another statement
Соединение используется другим оператором
2А14
Pass-through SQL connection must be shared
Проходящее SQL-соединение должно быть разделяемым
2В01
Invalid function number
Неверный номер функции
2В02
File or directory does not exist
Файл или каталог не существует
2В03
Path not found
Путь не найден
2В04
Too many open files. You may Слишком много открытых файлов. Вам следует need to increase MAXFILEHANDLE увеличить значение MAXFILEHANDLE в настройках limit In IDAPI configurationIDAPI
2В05
Permission denied
Доступ закрыт
2В06
Bad file number
Неверный номер файла
2В07
Memory blocks destroyed
Уничтожены блоки памяти
2В08
Not enough memory
Недостаточно памяти
2В09
Invalid memory block address
Неверно указан адрес блока памяти
2В0А
Invalid environment
Некорректное окружение
2ВОВ
Invalid format
Неверный формат
2ВОС
Invalid access code
Неверный код доступа
2B0D
Invalid data
Неверные данные
2B0F
Device does not exist
Устройство не существует
2В10
Attempt to remove current directory
Попытка удаления текущего каталога
2811
Not same device
Попытка использовать различные устройства
2812
No more files
Файлов больше нет
2В13
Invalid argument
Неверный аргумент
2В14
Argument list is too long
Список аргументов слишком велик
2В15
Execution format error
Ошибка исполняемого формата
2В16
Cross-device link
Использование связи с пересечением устройств
2В22
Result is too large
Результат слишком велик
Таблица П. {продолжений
Код ошибки
Оригинальное сообщение
Перевод
2В27
Unknown internal operation system епог
Неизвестная внутренняя ошибка операционной системы
2В32
Share violation
Ошибка совместного использования
2ВЗЗ
Lock violation
Нарушение блокировки
2В35
Drive not ready
Накопитель не готов
2В64
Not exact read/write
Неточное чтение-запись
2865
Operation system network error
Сетевая ошибка операционной системы
2868.
Record already locked by this workstation
Запись уже заблокирована с данной рабочей станции
2В69
Record not locked
Запись не заблокирована
2С01
Network initialization failed
Ошибка инициализации сети
2С02
Network user limit exceeded
Превышен предел количества пользователей сети
2С03
Wrong .NET file version
Некорректная версия файла .NET
2С04
Cannot lock network file
Невозможно заблокировать сетевой файл
2С07
Unknown network error
Неизвестная сетевая ошибка
2С08
Not initialized for accessing network files
Сетевые файлы не были инициализированы для доступа
2С09
SHARE not loaded. It is required to share local files
Программа SHARE не загружена. Она необходима для разделения локальных файлов
2С0В
Lost communication with SQL server
Потеря соединения с SQL-сервером
2C0D
Cannot locate or connect to SQL server
SQL-сервер не обнаружен или с ним невозможно соединиться
2D01
Optional parameter is required
Требуется указать необязательный параметр
2D02
Invalid optional parameter
Некорректный необязательный параметр
2Е07
Only numeric and date/time fields Усреднены могут быть только числовые поля и поля can be averagedдаты/времени
2Е08
Invalid expression
Некорректное выражение
2Е09
Invalid OR expression
Некорректное выражение OR
2ЕОС
CALC expression cannot be used in INSERT; DELETE, CHANGETO and SET rows
Выражение CALC не может быть использовано операторами INSERT DELETE, CHANGETO и SET
2E0D
Type error in CALC expression
Ошибка типа в выражении CALC
2ЕОЕ
CHANGETO can be used In only one query form at a time
CHANGETO может быть использован только в одной форме запроса одновременно
2Е11
A field cannot contain more than one expression to be Inserted
Поле не может содержать более одного выражения для вставки
2Е1Е
Expression in this field has the wrong type
Выражение в поле имеет неверный тип
2E1F
Extra comma found
Найдена лишняя запятая
2Е20
Extra OR found
Найдено лишнее слово OR
2Е21
One or more query nows do not contribute to tfie ANSWER
Одна или более строк запроса не входят в ANSWER
2Е27
Use only one INSERT; DELETE, SET or FIND per line
В строке может находиться только один оператор: INSERT; DELETE, SET или FIND
Код ошибки
Оригинальное сообщение
Перевод
2Е28
Syntax error in expression
Синтаксическая ошибка в выражении
2Е30
Rows of example elements in CALC expression must be linked
Строки образцов в выражении CALC должны быть связаны'
2Е31
Variable name Is too long
Имя переменной слишком велико
2Е32
Query may take a long time to process
Запрос может потребовать много времени для выполнения
2ЕЗЗ
Reserved word or one that can't be used as a variable name
Зарезервированное споро не может быть использовано в качестве имени переменной
2Е34
Missing comma
Пропущена запятая
2Е35
Missing)
Пропущена закрывающая скобка
2Е36
Missing right quote
Пропущена правая кавычка
2Е37
Cannot specify duplicate column names
Недопустимо наличие столбцов с одинаковыми именами
2Е38
Query has no checked fields
Запрос не проверяет поля
2Е39
Example element has no defining occurrence
Образец не имеет определения
2ЕЗВ
Query makes no sense
Запрос не понятен
2ЕЗС
Cannot use patterns in this context
В данном контексте нельзя использовать шаблоны
2E3D
Date does not exist
Дата не существует
2ЕЗЕ
Variable has not been assigned a value
Переменной не присвоено значение
2E3F
Invalid use of example element in summary expression
Некорректное использование примера в итоговом выражении
2Е43
Row cannot contain expression
Строка не может содержать выражение
2Е46
No permission to insert or delete record
Недостаточно прав для вставки или удаления записи
2Е47
No permission to modify field
Недостаточно прав на изменение полей
2Е48
Field not found In table
Поле в таблице не найдено
2Е49
Expecting a column separator in table header
В заголовке таблицы ожидается разделитель столбцов
2Е4В
Expecting column name In table
Ожидается имя столбца таблицы
2Е4С
Expecting table name
Ожидается имя таблицы
2Е4Е
Cannot opeq table
Невозможно открыть таблицу
2Е50
This DELETE, CHANGE or INSERT query has no answer
Запрос DELETE, CHANGE или INSERT не имеет ответа
2Е51
Query Is not prepared. Properties unknown
Запрос не подготовлен. Свойства неизвестны
2Е52
DELETE rows cannot contain quantifier expression
Строки DELETE не могут содержать числовых выражений
2Е53
Invalid expression In INSERT row
Некорректное выражение в сроке INSERT
2Е55
Invalid expression in SET definition Некорректное выражение в определении SET
2Е56
Row use
Строка уже используется
2Е57
SET keyword expected
Ожидается ключевое слово SET
Таблица П〈продолжен岭
Код ошибки
Оригинальное сообщение
Перевод
2Е58
Ambiguous use of exampie element
Неоднозначное использование примера
2Е5В
Only numeric fields can be summed
Суммироваться могут только числовые поля
2Е5С
Table is write protected
Таблица защищена от записи
2E5F
Type mismatch in expression
Неправильный тип в выражении
2Е60
Query appears to ask two unrelated questions
Запрос включает два несвязанных вопроса
2Е61
Unused SET row
Неиспользуемая строка SET
2Е65
Lock Allure
Ошибка блокировки
2Е66
Expression is too long
Выражение слишком длинное
2Е67
Refresh exception during query
Исключительная ситуация обновления во время исполнения запроса
2Е68
Query canceled
Запрос отменен
2Е69
Unexpected Database Engine error Неожиданная ошибка BDE
2Е6А
Not enough memory to finish operation
Недостаточно памяти для завершения операции
2Е6В
Unexpected exception
Неожиданное исключение
2E6D
Query format is not supported
Формат запроса не поддерживается
2Е6Е
Query string Is empty
Строха запроса пуста
2E6F
Attempted to prepare an empty query
Попытка подготовки пустого запроса
2Е70
Buffer too small to contain query string
Буфер слишком мал для размещения строки запроса
2Е71
Query was not previously parsed or prepared
Запрос не был предварительно разобран или подготовлен
2Е72
Function called with bad query handle
Функция вызвана с неправильным дескриптором запроса
2Е75
Reid name In sort or Held dause not found
В выражении сортировки или поиска не найдено имя поля
2Е76
ПЫе name in sort or field dause not found
В выражении сортировки или поиска не найдено имя таблицы
2Е77
Operation is not supported on BLOB fields
Данная операция не применима к BLOB-полям
2Е78
(General BLOB error
Общая ошибка BLOB
2Е79
Query must be restarted
Запрос должен быть перезапущен
2Е9С
Unique index required to delete records
Для удаления записей требуется наличие уникального индекса
2E9D
Update of table on the server Called
Ошибка обновления таблицы на сервере
2Е9Е
Cant process this query remotely
Удаленная обработка запроса невозможна
2E9F
Unexpected end of command
Неожиданный конец команды
2ЁАО
Parameter not set In query string
Не установлены параметры в строке запроса
2ЕА1
Query string is too long
Строка запроса слишком велика
Код ошибки
Оригинальное сообщение
Перевод
2ЕАА
No such table or correlation name
Таблицы с таким именем не существует
2ЕАВ
Expression has ambiguous data type
Выражение содержит неоднозначные типы данных
2ЕАС
Field in order by must be in result set
В результирующем наборе данных поля должны быть отсортированы
2ЕАЕ
Record or field constraint failed
Ошибка ограничения записи или поля
2ЕВ0
User defined function is not defined
Пользовательская функция не определена
2ЕВ1
Unknown error from user defined function
Неизвестная ошибка в пользовательской функции
2ЕВ2
Single row subquery produced more than one row
Однострочный подзапрос выдает более одной строки
2ЕВЗ
Expression In group by are not supported
Выражения при группировании не поддерживаются
2F01
Interface mismatch. Engine version different
Несоответствие интерфейсов из-за различий в версиях BDE
2F02
Index is out of date
Индекс за пределами данных
2F05
BLOB file version Is too old
Слишком старая версия BLOB-файла
2F06
Query and engine DLLs are mismatched
Запрос и DLL не схютветсгвуют друг другу
2F07
Server is incompatible version
Несовместимая версия сервера
2F08
Higher table level required
Требуется более высокий уровень таблицы
3001
Capability not supported
Совместимость не поддерживается
3002
Not implemented yet
Данная функция пока не реализована
3005
Multiple connections not supported
Множественные соединения не поддерживаются
3006
Full dBASE expressions not supported
Нет полной поддержки выражений dBASE
3101
Invalid database alias specification Неверная спецификация псевдонима базы данных
3102
Unknown database type
Неизвестный тип базы данных
3103
Corrupt system configuration file
Поврежден системный файл конфигурации
3104
Network type unknown
Неизвестный тип сети
3106
Invalid configuration parameter
Неверный параметр конфигурации
320А
Validity check will not be enforced
Проверка корректности не выполнена
320В
Multiple records found, but only one was expected
Найдены множественные записи, в то время как ожидается только одна
3302
BLOB has been modified
BLOB-объект был изменен
3303
General SQL error
Общая ошибка SQL
3304
Table already exists
Таблица уже существует
3305
Paradox 1.0 table: чге not supported
Таблицы Paradox 1.0 не поддерживаются
3306
Update aborted
Обновление прекращено
3401
Different sort order
Неверный порядок сортировки
3402
Directory in use by earlier version of Paradox
Каталог используется более ранней версией Paradox
ngElEf^ 冷
Таблица П (продолжений
Код ошибки
ОригинальноеПеревод
сообщение
3403
Needs Paradox 3.5-compatible Требуется драйвер языка, совместимый с Paradox 3、5 language driver
3501 3505
3506
3507
3508
3509
350В 350С 350D
Data dictionary is corruptСловарь данных поврежден
Invalid object typeНеверный тип объекта
Invalid relation typeНеверный тип отношения
View already existsПредставление уже существует
No such view existsПредставление не существует
Invalid record constraintСодержится неверная запись
Dictionary already existsСловарь уже существует
Dictionary does not existsСловарь не существует
Dictionary database does not База данных словаря не существует exists
350Е
Dictionary info Is out of date - Информация словаря за пределами данных, needs refreshТребуется обновление
3510
3511
3512
Invalid dictionary nameНеверное имя словаря
Dependent objects existsНайдены зависимые объеюы
Too many relationship for this Слишком много связей для данного типа объекта object type
3518 3519 351А ЗЕ01 ЗЕ02 ЗЕОЗ ЗЕ04
ЗЕ05 ЗЕ06 ЗЕ08
Cannot access data dictionary Доступ к словарю данных невозможен
Cannot create data dictionary Невозможно создать словарь данных
Cannot open databaseНевозможно открыть базу данных
Wrong driver nameНеверное имя драйвера
Wrong system versionНеверная версия системы
Wrong driver versionНеверная версия драйвера
Wrong driver typeНеверный тип драйвера
Cannot load driverНевозможно загрузить драйвер
Cannot load language driverЗагрузить драйвер языка невозможно
Your application is not enabled Ваше приложение не может использоваться с этим for use with this driverдрайвером
Литература
Бобровский С Delphi 5: Учебный курс. — СПб.: Питер, 2000.
Елманова Н., Трепалин G, Тенцер A. Delphi 6 и технология СОМ. — СПб.: Питер, 2002.
Жуков А. Изучаем Delphi. — СПб.: Питер, 2000.
Карпов Б. Delphi 5: Учебный курс. — СПб.: Питер, 2001.
Карпова Г Базы данных: модели, разработка, реализация. — СПб.: Питер, 2001.
Кэнпу М. Delphi 6 для профессионалов. — СПб.: Питер, 2002.
Свиридов Ю., ТюкачевН. Delphi 5. Создание мультимедийных приложений: Учебный курс. — СПб.: Питер, 2001.
Фаронов В. Delphi 6. Учебный курс. — СПб.: Питер, 2002.
Фаронов В. Программирование баз данных в Delphi 6. Учебный курс. — СПб.: Питер, 2002.
Фаронов А Профессиональная работа в Delphi 6. Библиотека программиста. —СПб.: Питер, 2002.,
ННИГА~ГЮЧТОЙ]ННИГА~ГЮЧТОЙ]Вы можете заказать бесплатный журнал «Клуб Профессионал».Вы можете заказать бесплатный журнал «Клуб Профессионал».
ННИГА~ГЮЧТОЙ]
ННИГА~ГЮЧТОЙ]
Вы можете заказать бесплатный журнал «Клуб Профессионал».
Вы можете заказать бесплатный журнал «Клуб Профессионал».
ЗАКАЗАТЬ КНИГИ ИЗДАТЕЛЬСКОГО ДОМА «ПИТЕР»
МОЖНО ЛЮБЫМ УДОБНЫМ ДЛЯ ВАС СПОСОБОМ:
по телефону: (812) 103-73-74;
по электронному адресу: postbook@piter. com;
на нашем сервере: www.piter.com;
по почте: 197198, Санкт-Петербург, а/я 619 ЗАО «Питер Пост».
ВЫ МОЖЕТЕ ВЫБРАТЬ ОДИН ИЗ ДВУХ СПОСОБОВ ДОСТАВКИ И ОПЛАТЫ ИЗДАНИЙ:
會 Наложенным платежом с оплатой заказа при получении посылки на ближайшем почтовом отделении. Цены на издания приведены ориентировочно и включают в себя стоимость пересылки по почте (но без учета авиатарифа). Книги будут высланы нашей службой «Книга-почтой» … в течение двух недель после получения заказа или выхода книги из печати. 會 Оплата наличными при курьерской доставке (для жителей Москвы и Санкт-Петербурга). Курьер бесплатно доставит заказ по указанному адресу в удобное для вас время в течение трех дней. Такой заказ лучше оформлять по телефону.
ПРИ ОФОРМЛЕНИИ ЗАКАЗА УКАЖИТЕ:
фамилию, имя, отчество, телефон, факс, e-mail;
почтовый индекс, регион, район, населенный пункт, улицу, дом, корпус, квартиру;
название книги, автора, код, количество заказываемых экземпляров.
пзалтвпьскпл ао“^ППТЕР^
v^ WWW.PITER.COM
勿пптер*
Нет времени
ходить по магазинам?
наберите:
www.piter.com
Здесь вы найдете:
Все книги издательства сразуНовые книги — в момент выхода из типографииИнформацию о книге — отзывы, рецензии, отрывкиСтарые книги — в библиотеке и на CD
И, наконец, вы нигде не купитенаши книги дешевле!
пзоатепьскпл помпзоатепьскпл помСПЕЦИАЛИСТАМКНИЖНОГО БИЗНЕСА!
пзоатепьскпл пом
пзоатепьскпл пом
ПРЕДСТАВИТЕЛЬСТВА ИЗДАТЕЛЬСКОГО ДОМА «ПИТЕР»предлагают эксклюзивный ассортимент компьютерной, медицинской,психологической, экономической и популярной литературы
РОССИЯ
Москва м. «Калужская», ул. Бутлерова, д. 176, офис 207,240; тел./факс (095) 777-54-67;e-mail: sales@piter.msk.ru
Санкт-Петербург м. «Выборгская», Б. Сампсониевский 叩.,д. 29а;тел. (812) 103-73-73, факс (812) 103-73-82; e-mail: sales@piter.com
Воронеж ул. Ленинградская, д. 138; тел. (0732) 49 68 86; e-mail: piter-vm@vmail.ru
Екатеринбург ул. 8 Марта, д. 2676; телефакс (3432) 25-39-94; e-mail: piter-ural@r66.ru
Нижний Новгород ул. Премудрова^ д. 31а; тел. (8312) 58-50-15, 58-50-25;e-mail: piter@infonet.nnov.ru
Ростов-на-Дону ул. Калитвинская, д. 17в; тел. (8632) 95-36-31, (8632) 95-36-32;e-mail: jupiter@rost.ru
Самара ул. Новосадрвая, д. 4; тел. (8462)37-06-07; e-mail: piter-volga@sama.ru
УКРАИНА
Харьков ул. Энгельса, д. 29а, офис 610; тел. (0572) 23-75-63, (0572) 28-20-04, (0572) 28-20-05,факс (0572) 14-96-09; e-mail: piter@tender.kharkov.ua
Киев пр. Красных Казаков, д. 6, корп. 1; тел./факс (044) 490-35-68,490-35-69;
e-mail: office@piter-press.kiev.ua
БЕЛАРУСЬ
Минск ул. Бобруйская д” 21, офис 3; тел./факс (37517) 226-19-53; e-mail: piter@mail.by
МОЛДОВА
Кишинев «Ауратип-Питер»; ул. Митрополит Варлаам, 65, офис 345; тел. (3732) 22-69-52,факс (3732) 27-24-82; e-mail: lili@auratip.mldnet.com
Ищем зарубежных партнеров или посредников, имеющих выход на зарубежный рынок.
Телефон для связи: (812) 103-73-73.
Е・гпаН: grigorjan@piter.com
Издательский дом «Питер» приглашает к сотрудничеству авторов. Обращайтесь по телефонам: Санкт-Петербург - (812) 103-73-72, Москва — (095) 777-54-67.
Заказ книг для вузов и библиотек: (812) 103-73-73.
Специальное предложение - e-mail: kozin@piter.com
пзадтепьскпп дом屋ППТЕР®v^ WWW.PITER.COM
УВАЖАЕМЫЕ ГОСПОДА!
КНИГИ ИЗДАТЕЛЬСКОГО ДОМА «ПИТЕР»ВЫ МОЖЕТЕ ПРИОБРЕСТИОПТОМ И В РОЗНИЦУ
У НАШИХ РЕГИОНАЛЬНЫХ ПАРТНЕРОВ.
Башкортостан
Уфа, «Азия», ул. Зенцова, д. 70 (оптовая продажа), маг. «Оазис», ул. Чернышевского, д. 88, тел./факс (3472) 50-39-00-
E-mail: asiaufa@ufanet.ru
Дальний Восток
Владивосток, «Приморский торговый дом книги», тел./факс(4232) 23-82-12.
E-mail: bookbase@mail.prifncHye.ru
Хабаровск, «Мирс», тел. (4212) 30-54-47, факс 22-73-30.
E-mail: sate_book@bookmirs.khv.ru
Хабаровск, «Книжный мир», тел. (4212) 32-85-51, факс 32-82-50.
E-mail: postmaster@woridbooks.kht.ru
Европейские регионы России
Архангельск, *Дрм книги», тел. (8182) 65-41-34, факс 65-41-34.
E-mail: book@atnet.ru
Калининград, «Вестер»,
тел./факс (0112) 21-56-28,2 Ь62-07.
Е-таУ: nshibkov3@vester.ru
http:/川ww.vester.ru
Ростов-на-Дону, ПБОЮЛ Остроменский, пр. Соколова, д. 73, тел./факс (8632) 32-18-20.
E-mail: ostrom@don.sitek.net
Северный Кавказ
Еоаентуки, «Аоссы», ул. Октябрьская, 424, тел./факс (87934) 6-93-09.
E-mail: rossy@kmw.ru
Сибирь
Иркутск, «ПродаЛитЪ»,
тел. (3952) 59-13-70, факс 51-30-70.
E-mail: prodalit@iTk.ru
http://\MWw.prodalit.irk.ru
Иркутск, «Антей-книга», тел./факс (3952) 33-42-47.
E-mail: antey@irk.ru
Красноярск, «Книжный мир», тел./факс (3912) 27-39-71
E-mail: book-world@public.krasnet.ru
Нижневартовск, «Дом книги-, тел. (3466) 23-27-14, факс 23-59-50.
E-mail: book@nvartovsk. wsnet. г и
Новосибирск, «Топ-книга», тел. (3832) 36-10-26, факс 36-10-27.
E-mail: office@top-kniga.nj http://\vww.top-kniga.ru
Тюмень, «Друг», тел./факс (3452) 21-34-82.
E-mail; drug^tyumen.ru
Тюмень, «Фолиант^, тел. (3452) 27-36-06. факс 27-36-11.
E-mail: foliant@tyumen.ru
Челябинск, 7Д «Эврика», ул. Барбюса, д. 61, телефакс (3512) 52-49-23.
E-mail;evrika@chel.sumet.ru
Татарстан
Казань, «Таис», тел. (8432) 72-34-55, факс 72-27-82.
E-mail: tais@bancorp ги
Урал
Екатеринбург, магазин № 14, ул. Челюскинцев, д. 23, тел./факс (3432) 53-24-90.
E-mail: gvardia@mail.ur.ru
Екатеринбург, «Валео-книга», ул. Ключевская, д. 5, тел./факс (3432) 42-56-00.
E-mail: valeo@etel.ru
Понамарев Вячеслав Александрович
Базы данных в Delphi 7. Самоучитель
Главный редактор Заведующий редакцией Ведущий проекта Литературные редакторы Художник Корректоры ВерсткаГлавный редактор Заведующий редакцией Ведущий проекта Литературные редакторы Художник Корректоры ВерсткаЕ. Строганова И. Корнеев А. Васильев £. Васильев £. Ваулина М. Соколинская Н. Лукина, ". Тимофеева А. КругловаЕ. Строганова И. Корнеев А. Васильев £. Васильев £. Ваулина М. Соколинская Н. Лукина, ". Тимофеева А. Круглова
Главный редактор Заведующий редакцией Ведущий проекта Литературные редакторы Художник Корректоры Верстка
Главный редактор Заведующий редакцией Ведущий проекта Литературные редакторы Художник Корректоры Верстка
Е. Строганова И. Корнеев А. Васильев £. Васильев £. Ваулина М. Соколинская Н. Лукина, ". Тимофеева А. Круглова
Е. Строганова И. Корнеев А. Васильев £. Васильев £. Ваулина М. Соколинская Н. Лукина, ". Тимофеева А. Круглова
Лицензия ИД № 05784 от 07.09.01.
Подписано к печати 03.03.03. Формат 70х 100/16. Усл. п. л. 18,06.Доп. тираж 4500. Заказ 95ООО «Питер Принт», 196105, Санкт-Петербург, ул. Благодатная, д. 67в.Нало)'овая льгота — общероссийский классификатор продукцииОК 005-93, том 2; 95 3005 — литература учебная.
Отпечатано с готовых дналознтивов а ФГУП одаена Трудового Красного Знамени «Техническая книга»MHHHCrqxTBa РФ по делам печати, телерадиовещання и средств массовых коммуникаций.
198005, Санкт-Петербург, Измайловский пр., 29.