ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.03.2025

Просмотров: 461

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Результат соединения проявляется только после запуска приложения. В принципе Delphi не считает ошибкой, если поменять местами ведущий и ведомый файлы при соединении, т.е. при отношении 1:N ведущим считать второй файл. Результат: при фиксации одной записи второго файла будет показана одна запись первого, передвижение по записям первого файла невозможно. В любой момент времени в таком случае на экране имеются по одной записи из каждого файла.

5.5. Внесение изменений в файл

До сих пор мы ограничились просмотром уже существующих файлов. Не менее важным является и внесение изменений в файлы. Обычно различают три вида изменений:

  • добавление новых записей;

  • изменение записей;

  • удаление записей.

Все перечисленные изменения могут быть выполнены через Database Desktop. Для этого надо войти в него, открыть обновляемый файл, перейти в режим редактирования и внести необходимые изменения. Так целесообразно поступить при большом количестве изменений. Не забудьте, что один и тот же файл не может быть одновременно открыт из Delphi и из Database Desktop.

1

2

3

4

5

6

7

8

9

10

Рис. 5.5. DBNavigator

Изменения могут быть внесены и во время работы приложения. Лучше всего это делать с помощью DBNavigator как для таблиц, так и для форм. В приведенных примерах были использованы только четыре его кнопки для передвижения по файлу. Полностью DBNavigator представлен на рис. 5.5.

Первые четыре из кнопок уже знакомы, они обеспечивают передвижение по файлу. При работе с таблицами они не особенно нужны (но и не запрещены), потому что передвижение обеспечивается и полосами скроллинга.

При работе с формами, как было показано раньше, без них не обойтись. Назначение кнопок:

First

– начало файла;

Previous

– на одну запись назад;

Next

– на одну запись вперед;

Last

– конец файла;

Add

– добавление новой записи перед текущей;

Delete

– удаление текущей записи;

Edit

– переход в режим редактирования;

Post

– записывать внесенные изменения в файл;

Cancel

– отменить внесенные изменения;

Refresh

– приводить весь файл в соответствие с определенными изменениями.


Возможности изменения данных в файлах должны быть предусмотрены уже на стадии проектирования приложения. Управлять этим можно следующими свойствами:

  • ReadOnly y Table, если этому свойству присвоить значение True, то изменения во время выполнения приложения невозможны;

  • AutoEdit y DataSource, если этому свойству присвоить значение False, то редактирование запрещено, но во время выполнения приложения можно переходить в режим редак­ти­ро­вания;

  • ReadOnly y DBEdit, если этому свойству присвоить значение True, то редактирование во время выполнения этого поля невозможно.

Очевидно, что свойства объектов Table и DataSource относятся ко всем полям. После этих уточнений рассмотрим назначения клавиш. Клавиша 7 переводит таблицу или форму в режим редактирования, после чего можно внести изменения, т.е. по сути свойство AutoEdit y DataSource получит значение True. После этого можно внести изменения в любое поле. Но эти изменения не сразу будут перенесены в файл. Если Вы убедились в правильности изменений, то нажатием клавиши 8 они будут перенесены; клавиша 9 отменяет их. Клавиша 10 вызывает обновление всего файла с учетом внесенных изменений. Например, если в результате внесенных изменений записи должны быть переупорядочены, то после нажатия клавиши 10 они появятся на экране в новой очередности. Назначение клавиши 5 и 6 понятно из названий. Вопрос: что надо делать после набора значений всех полей, чтобы они оказались в файле?


6. Язык sql и его использование в Delphi

Язык SQL (Structured Query Language – структурированный язык запросов) на сегодняшний день стал фактически стандартом среди языков, обеспечивающих операции над базами данных (создание, изменение, поиск) и включен в состав языковых средств многих систем управления базами данных. Имеется он и в Delphi. В первом параграфе рассмотрим сам язык, а во втором – его использование в Delphi.

6.1. Элементы языка sql

Для большей наглядности приведем его описание на примерах, базирующихся на двух приведенных таблицах.

Таблица VENDOR

VNUM

VNAME

VSTREET

V1

Chops Ahoy

Main

V2

The Board Walk

Back

V3

Tube City

Main

V4

The Drive-in

Middle

V5

Disks ‘ Us

Front

V6

Monitor Mania

Front

Таблица PART

PNUM

PNAME

PRICE

PVNUM

PUNUM

P1

XT

1000

V1

U1

P2

XT

1200

V2

U2

P3

AT

2000

V1

U3

P4

Mono

125

V3

U1

P5

mono

125

V6

U2

P6

Hi-res

325

V6

U3

P7

20 Meg

350

V4

U1

P8

20 Meg

300

V5

U2

P9

40 Meg

450

V5

U3


Простейшая программа на SQL:

SELECT *

FROM vendor

SELECT, FROM – операторы языка, vendor – имя обрабатываемого файла. Как Pascal, так и SQL нечувствителен к использованию больших или маленьких букв. Для большей ясности программ рекомендуют операторы языка писать большими буквами и с новой строки, все остальное – маленькими буквами. Для написания программ на SQL необходимо знать структуру файла, точнее, имя файла, имена и типы полей. Наша простейшая программа предназначена для выдачи файла полностью.

Как видно из самого названия языка SQL, он предназначен в первую очередь для формулирования запросов. Простейшие запросы ограничивают количество выдаваемой информации:

SELECT pname,punum

FROM part

WHERE price > 500

Нетрудно видеть, что перечисление полей за оператором SELECT ограничивает их число (в теории реляционных баз данных это называется проекцией, она вызывает сжатие исходной таблицы по горизонтали), а оператор WHERE ограничивает выдачу данных записями, удовлетворяющими заданному условию (в теории реляционных баз данных это называется селекцией и она вызывает сжатие таблицы по вертикали).

Оператор SELECT имеет более широкие возможности, рассмотрим здесь две из них.

  • В операторе SELECT можно использовать арифметические выражения и функции (sin, cos, exp, log и т.д.) над числовыми полями (вот почему надо знать тип данных в файле!):

  • SELECT pname, price*0.75, log(price)

  • FROM part

  • Moжно использовать дополнение DISTINCT

SELECT DISTINCT vstreet

FROM vendor

В результате будут выданы только разные значения поля vstreet, в нашем случае ответом является {Back Front Main Middle}.

Оператор FROM имеет следующие дополнительные возможности:

  • Задание полного имени файла, например, “D\MyDan\Vendor.db”, это нужно при одновременной обработке файлов из разных директорий или когда путь отличается от текущего (задание текущей директории рассмотрим ниже).

  • Введение псевдонимов, это нужно при одновременной обработке двух или более файлов. Например,

SELECT pp.pname, vv.vname

FROM “D\MyDan\Vendor.db” vv, part pp

WHERE vv.vnum=pp.pvnum

vv и pp – псевдонимы, которые используются для уточнения принадлежности полей. В данном случае запрос предполагает выдачу данных из двух таблиц по условию, сформулированному тоже по двум таблицам.

Примечание:в наших таблицах нет полей с одинаковыми именами, поэтому псевдонимы необязательны.

Вопрос читателю: какую операцию реляционной алгебры реализует эта программа? В случае затруднений с ответом – см. выше! Ответ на последний запрос показан на рис. 6.1.


Оператор WHERE предназначен для выражения условий поиска и должен содержать логическое выражение. Логическое выражение состоит из знакомых нам операций сравнения =, >, >=, <, <=, <>; логических операций OR, AND, NOT; для изменения приоритета можно использовать скобки. Правила написания логических выражений аналогичны правилам их написания на Pascal’e; необходимо запомнить, что в SQL символьные константы заключают в кавычки, а не в апострофы.

Рис. 6.1. Ответ на запрос

Пример.

SELECT *

FROM part

WHERE price>500 AND pvnum=“V1”

Ответ

PNUM

PNAME

PRICE

PVNUM

PUNUM

P1

XT

1000

V1

U1

P3

AT

2000

V1

U3

Имеются и свои предикаты SQL, не имеющие аналогов в Pascal’е. Рассмотрим их подробнее.

Предикат BETWEEN (между).

price BETWEEN 200 AND 500 эквивалентен (price >=200 AND price <=500)

Предикат IN

pname IN (“XT”,”AT”) эквивалентен (pname=“XT” OR pname=“AT”)

С помощью предиката IN можно составить сложные запросы, содержащие подзапросы (оператор subSELECT):

SELECT vname

FROM vendor

WHERE vnum IN

(SELECT pvnum

FROM part

WHERE pname =“XT”)

Ответ: Chips Ahoy

The Board Walk

В подзапросе можно выделить только одно поле т.е. за оператором SELECT можно писать имя только одного поля. Почему так сделано?

За оператором WHERE можно писать условие по полям нескольких файлов. Такой пример был приведен выше и его результат на рис. 6.1.

Приведенными тремя операторами возможности языка SQL не ограничиваются. Продолжим изучение операторов.

Оператор ORDER BY позволяет упорядочить выдаваемые записи.

Программа

SELECT vname,vstreet

FROM vendor

ORDER BY vname

выдает записи, упорядоченные по алфавиту по полю vname. По умолчанию упорядочивается по возрастанию.

Программа

SELECT vstreet, vname

FROM vendor

ORDER BY 1 ASC, 2 DESC

выдает поля vstreet и vname, упорядоченные по возрастанию по vstreet и при равенстве его значений по убыванию vname. Вместо имен полей можно писать их номера для сокращения записи, если в SELECT кроме имен полей используются функции (об этом позже), то при ссылках на них допускается указывать только их номера.