Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Горев “Эффективная работа с СУБД”.pdf
Скачиваний:
208
Добавлен:
28.06.2014
Размер:
4.71 Mб
Скачать

converted to PDF by HupBaH9I

=SQLEXEC(lhandle,"INSERT fuel_oil (name_fuel_oil) ; VALUES ('Дизельное топливо')")

. . .

&& Заполнение таблицы Tyre

=SQLEXEC(lhandle,"INSERT tyre (name_tyre) VALUES ('4.5 ; J')")

. . .

* Заполнение таблицы Body

=SQLEXEC(lhandle,"INSERT body (name_body) VALUES ; ('Хэтчбек')")

. . .

* Заполнение таблицы Model

=SQLEXEC(lhandle,"INSERT model ; (name_model,key_firm,swept_volume, ; quantity_drum,key_fuel_oil,key_tyre,key_body) VALUES ; ('145 1.4',1,1351,4,3,3,1)")

. . .

* Заполнение таблицы Automobile_passenger_car

=SQLEXEC(lhandle,"INSERT automobile_passenger_car ; (key_model,date_issue,cost); VALUES (1,'7/7/94',10000)")

. . .

* Заполнение таблицы Customer

=SQLEXEC(lhandle,"INSERT customer ; (name_customer,address,tel, ; first_name,juridical) ;

VALUES ('Общество национальных героев','CПб ; ул М Маклая','77710','Юлиан',1)")

. . .

* Заполнение таблицы Sale =SQLEXEC(lhandle,"INSERT sale

(account_,date_sale,sum_) ; VALUES (101,'5/1/96',10000)")

. . .

* Заполнение таблицы Account

=SQLEXEC(lhandle,"INSERT account ; (account_,key_customer,key_auto, ; date_write,selled,sum_) VALUES ; (101,1,1,'1/1/96',1,10000)")

. . .

* Заполнение таблицы Salesman

=SQLEXEC(lhandle,"INSERT salesman ; (last_name,first_name,patronymic) ; VALUES ('Ажуров','Аристарх','Ариевич')")

. . .

* Заполнение таблицы Order_

=SQLEXEC(lhandle,"INSERT order_ ; (key_customer,key_model,key_salman) ; VALUES (1,1,1)")

. . .

* Создание привилегий (прав) доступа к полям таблиц БД

=SQLEXEC(lhandle,"USE auto_store") =SQLEXEC(lhandle,"GRANT insert, delete ON model ; TO ruben") =SQLEXEC(lhandle,"GRANT update,select ON model ;

TO ruben, karina, lena, elena, ira")

=SQLEXEC(lhandle,"REVOKE update,select ON customer ; (comment) ; FROM karina, lena")

. . .

* Разрываем соединение с источником данных ODBC =SQLDISCONNECT(lhandle)

ELSE

WAIT WIND "Связаться с сервером не удается !" ENDIF

Глава 7

Средства работы с данными

7.1. Организация ввода данных, их поиска и редактирования Работа с данными в Visual FoxPro

Работа с данными в Microsoft Access 7.2. Создание SQL-запросов

Запросы выборки

converted to PDF by HupBaH9I

Запросы добавления Запросы обновления Запросы удаления

7.3.Изменение структуры данных с помощью SQL

7.4.Запросы и локальные представления в Microsoft Visual FoxPro

7.5.Запросы в Microsoft Access

Запрос добавления Запрос - Создание таблицы

Запрос удаления Запрос обновления Перекрестный запрос

7.6. Работа с данными в локальной сети

Visual FoxPro

Несколько советов по увеличению производительности при работе в сети в приложениях

MicroxPro Microsoft Access

Постоянно сталкиваясь с громадным потоком информации, которая обрушивается на нас, не давая передышки ни дома, ни на работе, мы привыкли к невзгодам информационного взрыва. Кажется, что тут сложного, вот она, информация! Поглощай ее глазами с экрана телевизора, лови из радиоприемника, читай, записывай, запоминай. Громадные массивы данных стали заполонять все возможные устройства, которые способны хоть в каком-то виде хранить данные. Почему так быстро растет значение информации? Да потому, что без нее не обойтись не только при управлении государством, маленькой фирмой, без информации трудно надеяться на успех даже не очень дорогой покупки.

Информация нужна всем, но больше всего нужна обработанная информация. Согласитесь, что

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

7.1. Организация ввода данных, их поиска и редактирования

Для работы с данными, хранящимися в таблицах, необходимо организовать ввод данных, поиск и обновление устаревшей информации. Для ввода и редактирования данных лучший способ работы - создание форм. Как это сделать, мы расскажем в главе 9.

Вэтом параграфе вы узнаете:

о наиболее эффективных методах поиска данных;

о способах модернизации данных в отдельных полях и группах записей;

о том, каким образом в поиске данных могут помочь фильтры;

и как использовать для работы с данными объекты DAO.

Работа с данными в Visual FoxPro

Данные, для того чтобы отредактировать, необходимо найти. Самый простой способ - вывести данные в табличной форме, например, в окно Browse или воспользоваться объектом Grid. После этого, воспользовавшись клавишами навигации, найти нужную запись и изменить ее. Этот способ вполне пригоден для небольших таблиц, имеющих количество записей, измеряемое двузначным числом. Когда их количество составляет тысячи или даже миллионы, такой поиск затрудняется. В этом случае рекомендуется использовать команды и функции поиска. Одни из них работают без индексов, другие обязательно требуют их создания и подключения.

Одна из наиболее универсальных команд - LOCATE - работает без индексов. В то же время наличие индекса по выражению, по которому проводится поиск, без его подключения, значительно повышает скорость поиска. При наличии неподключенного индекса Visual FoxPro использует технологию Rushmore. Эта технология представляет собой специальный метод, существенно ускоряющий процесс поиска нужных данных. В то же время необходимо учитывать, что наличие большого количества индексов требует времени на их обновление.

Для проверки скорости поиска можно использовать следующую процедуру:

*В таблице Customer существует индекс по полю

*key_customer.

converted to PDF by HupBaH9I

*Отключая на всякий случай индексы, мы используем

*технологию Rushmore, что дает нам ускорение поиска

*более чем в 150 раз при работе с таблицей, имеющей

*больше 100000 записей.

SELECT Customer SET ORDER TO nPeriod = SECONDS()

LOCATE FOR key_customer = 45004 nPeriod_1 = SECONDS()

? nPeriod_1 - nPeriod

Еще более солидный выигрыш в скорости вы можете получить при работе с символьными полями.

Команда LOCATE имеет следующий синтаксис:

LOCATE FOR lExpression1 [Scope]

[WHILE lExpression2] [NOOPTIMIZE]

Команда LOCATE часто используется в связке с командой CONTINUE, которая позволяет продолжить поиск по установленному критерию поиска до тех пор, пока не будут найдены все записи.

Другой способ поиска всех нужных данных - использование фильтров, которые устанавливаются с помощью команды SET FILTER. Установка фильтров также дает выигрыш в скорости при наличии индекса по выражению поиска.

Команда SEEK позволяет проводить поиск по выражению, для которого имеется индекс и который подключен в момент поиска. Это самый быстрый метод поиска, но требующий постоянного переключения индексов в случае, если необходимо производить поиск по разным выражениям. При использовании этой команды для поиска нужных данных нет необходимости указывать поле, по которому проводится поиск. Таким полем автоматически объявляется активный в данный момент индекс.

SELECT Customer

SET ORDER TO key_customer t=SECONDS()

SEEK 45004 t1=SECONDS() ? t1-t

Если вам необходимо найти значение какого-то поля и вам известно значение одного из полей в соответствующей записи, то используйте функцию LOOKUP()

LOOKUP(ReturnField, eSearchExpression, SearchedField [, cTagName])

Аргументы в этой функции имеют следующее назначение:

ReturnField - поле, значение которого возвратит функция LOOKUP();

eSearchExpression - значение, по которому производится поиск;

SearchedField - поле, в котором производится поиск;

cTagName - имя тега, если есть возможность использовать подключенный индекс.

По скорости поиска функция LOOKUP() вполне сравнима с командой SEEK. Она также дает выигрыш в скорости при наличии индекса за счет использования технологии Rushmore. После успешного поиска указатель записи переводится в ту запись, в которой найдено искомое значение.

Пример использования функции LOOKUP():

CLEAR t=SECONDS() SET ORDER TO

mlook=LOOKUP(lastname,45004,Key_customer)

converted to PDF by HupBaH9I

t1=SECONDS()

?t1-t

?Mlook

Когда вам необходимо отредактировать одну запись, что, как правило, является обычным условием работы, используйте прямое редактирование полей с помощью форм или окон Browse. Если вы хотите, чтобы данные в полях записей редактировались без участия пользователя, то используйте команду REPLACE.

Иной раз возникают задачи глобального изменения значений какого-нибудь из полей. К примеру, раньше все были гражданами СССР, а теперь стали гражданами России.

Чтобы одновременно поменять все значения в поле, часто применяется следующая команда:

REPLACE ALL citizenship WITH "Россия"

Тем, кто знаком с SQL, возможно, больше по душе следующая конструкция:

UPDATE kadry SET citizenship = "Россия"

которая работает раза в полтора быстрее.

Тем не менее наибольшей скорости глобального изменения гражданства можно добиться, имея уникальный ключ для всех работников. Например:

SELE kadry

SET ORDER TO rabId

FOR I=1 TO 100000

SEEK I

REPLACE citizenship WITH "Россия"

NEXT

Данная программа выполнит замену в три раза быстрее, чем программа, использующая команду REPLACE с опцией ALL. Единственный ее недостаток - это необходимость строгого соблюдения правил присваивания идентификатора каждой записи. В противном случае надо обрабатывать еще и ошибку, которая может возникнуть, если не будет найдена подходящая запись. Если глобальный поиск выполняется часто, можем посоветовать создать индекс по выражению RECNO(), то есть по функции, которая возвращает номер записи по порядку.

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

Key_auto key_model

date_ cost

swept_ quantity_ capacity

 

 

issue

volume

drum

 

100001

1

07.07.94 10000

1351

4

90

100002

1

06.06.95 10500

1351

4

90

100003

2

05.10.95 10500

1929

4

90

100004

3

08.09.95 25000

3982

4

286

100005

4

10.12.95 30000

3982

8

286

100006

4

02.01.96 30000

3982

8

286

100007

5

10.10.95 37000

3201

6

321

100008

6

12.06.96 26000

4300

6

193

В приведенной выше таблице сразу видна избыточность данных. Информация в полях swept_volume, quantity_drum, capacity явно дублируется; представьте, сколько записей придется вам редактировать, если характеристики одного из автомобилей надо изменить хотя бы потому, что перед этим они были введены с ошибкой. Разумнее разделить эту таблицу на две, в одной хранить информацию о автомобиле, характерную для каждого отдельного экземпляра, а в другой

converted to PDF by HupBaH9I

- общие характеристики автомобилей. Одна таблица Automobil_passenger_car будет выглядеть примерно так:

key_auto

key_model

date_issue

cost

100001

1

07.07.94

10000

100002

1

06.06.95

10500

100003

2

05.10.95

10500

100004

3

08.09.95

25000

100005

4

10.12.95

30000

100006

4

02.01.96

30000

100007

5

10.10.95

37000

100008

6

12.06.96

26000

Вторая таблица - MODEL - вот так:

key_model name_model key_firm swept_volume quantity_drum capacity

1

145 1.4

1

1351

4

90

2

146 1.9

1

1929

4

90

3

740I 4.0

2

3982

4

286

4

840Ci 4.0

2

3982

8

286

5

M3 3.0

2

3201

6

321

6

GMC Jimmy

3

4300

6

193

 

4.3

 

 

 

 

Для связи таблицы используется поле key_model. С помощью связующего поля мы легко можем получить любую информацию, которая хранится в этих таблицах.

Вам может понадобиться изменить идентификатор одного из автомобилей в таблице Model. Как сделать, чтобы записи не остались одинокими в первой таблице - Automobil_passenger_car? Можно провести замену с помощью команды REPLACE, то есть найти записи с этим идентификатором и заменить на новое значение. Но лучше использовать ссылочную целостность и написать триггер для выполнения изменений данных в таблице Model. В нем следует написать код, который будет искать все соответствующие записи в таблице Automobil_passenger_car. Теперь у пользователя будет создаваться впечатление, что умный компьютер сам знает, что нужно поменять идентификатор автомобиля во всех таблицах, в которых он присутствует. Если вам не хочется писать триггеры самостоятельно, то в некоторых случаях Visual FoxPro сможет вам помочь, если вы воспользуетесь диалоговым окном Referential Integrity, которое можно вызвать из меню Database.

Работа с данными в Microsoft Access

Для ввода и редактирования данных в Microsoft Access используются формы, которые могут иметь несколько режимов, таблицы и запросы. При открытии формы, по умолчанию, если вы не подключили свое меню, становится активным меню Форма, в котором имеются команды для поиска, сортировки и фильтрации данных. Аналогичные команды присутствуют в меню, связанном с таблицами и запросами. Как правило, при простом редактировании данных в таблицах этих средств более чем достаточно.

Среди средств поиска наиболее простым является использование диалогового окна Поиск, с помощью которого вы можете последовательно находить нужные вам записи. Это диалоговое окно позволяет искать данные как в текущем поле, так и в других полях используемого источника данных. Вы можете последовательно находить несколько записей, удовлетворяющих выражению или его части, введенному в строке образца. Поиск можно проводить как вверх по таблице от текущей записи, так и вниз, либо по всей таблице. Но совершенно очевидно, что таким образом поиск можно производить только по одному полю, либо при случайном стечении обстоятельств по нескольким, к примеру, слово "Петрович" может быть и отчеством и фамилией.

В форме вы можете с помощью Мастера кнопок построить кнопку, которая будет служить для поиска записей. После того как вы создадите подобную кнопку с характерным рисунком бинокля или надписью "Поиск записи", откройте окно кода для события Click. Скорее всего там будут следующие строчки:

converted to PDF by HupBaH9I

Sub Кнопка40_Click()

On Error GoTo Err_Кнопка40_Click

Screen.PreviousControl.SetFocus

DoCmd.DoMenuItem acFormBar, acEditMenu, 10, ,_ acMenuVer70

Exit_Кнопка40_Click:

Exit Sub

Err_Кнопка40_Click:

MsgBox Err.Description

Resume Exit_Кнопка40_Click

End Sub

По сути, код события Click для этой кнопки просто выполняет команду Найти меню Правка. С тем же успехом вы могли создать макрос с единственной макрокомандой Команда меню, имеющей аргументы:

Строка меню - Форма

Название меню - Правка

Команда - Найти

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

DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70

Выполнить этот макрос, когда не активна строка меню Форма, невозможно, впрочем, как невозможно воспользоваться и методом объекта DoCmd DoMenuItem из процедуры Мастера. Мы все время зависим от наличия на экране меню Форма. Единственное преимущество кода события по сравнению с нашим макросом заключается в том, что первый обработает ошибку, когда выяснит, что не может выполниться. Будет выдано сообщение, связанное с этой ошибкой, а наш макрос просто "повиснет", выведя на экран окно обработчика ошибок макросов. Впрочем, даже если меню присутствует на экране, то совсем не обязательно, что будет найдена запись, соответствующая введенному образцу.

Если нужная запись не будет найдена, на экран будет выведено стандартное сообщение Access: "Поиск записей в приложении `Microsoft Access' завершен. Элемент не найден"

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

Пример формы "ПОИСК" вы найдете в файле базы данных AUTOSTORE.MDB, который находится на дискете, прилагаемой к данной книге. Форма "AUTOMOBIL_PASSENGER_CAR" имеет кнопку для поиска данных в текущем текстовом поле. При ее нажатии вызывается форма "ПОИСК".

В модуле Bookmodule объявляются две переменные: LastForm типа Form и lastcntr типа

Control:

Dim LastForm As Form

Dim lastcntr As Control

Первая служит для передачи переменной формы, а вторая для передачи переменной последнего активного элемента управления для использования их в форме "ПОИСК".

В событии Click кнопки Поиск формы "AUTOMOBIL_PASSENGER_CAR" записываем следующий код:

Sub Кнопка40_Click()

Set LastForm = Screen.ActiveForm Set lastcntr = Screen.PreviousControl mybook=LastForm.Bookmark PoiskSub

End Sub

Процедура PoiskSub служит для установки флажка "В текущем поле". Дело в том, что последний элемент управления, который был активным до нажатия на кнопку Поиск, может быть

converted to PDF by HupBaH9I

не связанным ни с каким полем - для него будет отсутствовать понятие "текущее поле". Следовательно, флажок нужно сделать недоступным, так как его значение используется для дальнейшего поиска:

Public Sub PoiskSub()

DoCmd.OpenForm "Поиск"

Select Case lastcntr.ControlType

Case 109, 106, 110, 111

If Not IsNull(lastcntr.ControlSource) Then

Forms![Поиск].[Flag3] = True

Else

Forms![Поиск].[Flag2] = False

Forms![Поиск].[Flag3] = False

End If

Case Else

Forms![Поиск].[Flag2] = False

Forms![Поиск].[Flag3] = False

End Select

End Sub

Таким образом мы передали в процедуру обработки события Click последний активный элемент и последнюю активную форму как параметры и при этом выяснили, был ли последний активный элемент управления связанным или нет.

Для поиска мы используем методы из серии Find объекта RecordSet и метод FindRecord объекта

DoCmd.

Набор данных для формы мы создаем с помощью свойства RecordSource. Это может быть таблица, запрос или выражение SQL. С помощью свойства RecordsetClone мы получаем ссылку на объект Recordset, указанный в свойстве RecordSource. Если источник данных для формы

"AUTOMOBILE PASSENGER CAR" - таблица с тем же именем, то с помощью свойства RecordsetClone

формы мы ссылаемся на объект, который создается с помощью следующей конструкции:

Dim myDb As DataBase, rst As Recordset

Set Mydb = dbEngine.Workspaces(0).Databases(0)

Set rst = MyDb.OpenRecordset("AUTOMOBIL PASSENGER CAR", _ dbOpenDynaset)

Учтите, что объект Recordset функционирует сам по себе, то есть перемещение с помощью методов серии Move и Find не влияет на текущую отображаемую в форме запись. С целью синхронизации перемещения необходимо использовать свойство Bookmark, которое определяет текущую запись. Для этого свойство Bookmark формы сохраняют в переменной строкового типа, а потом присваивают это значение свойству Bookmark объекта Recordset, на который ссылаются

спомощью свойства RecordsetClone формы.

Вкоде кнопки Поиск формы "AUTOMOBIL PASSENGER CAR" имеется следующая строчка:

mybook=LastForm.Bookmark

В коде кнопки Найти для формы "ПОИСК" свойство Bookmark устанавливается следующим образом:

LastForm.RecordsetClone.Bookmark=mybook

После поиска, если он удачен, значение свойства Bookmark объекта Recordset присваивается свойству Bookmark формы.

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

Как правило, скорость работы в Access понижается с увеличением числа записей в таблице, что, впрочем, происходит и во многих других приложениях. Для того чтобы снизить негативные последствия этого явления, в Access предлагается использовать развитую систему фильтров.

Фильтры можно устанавливать при работе с формой с помощью меню, макрокоманд или методов объекта DoCmd в программном коде.

Например, используя опцию "Фильтр по выделенному", вы можете, последовательно выделяя поля, устанавливать достаточно сложные фильтры. Последовательность действий выглядит следующим образом:

converted to PDF by HupBaH9I

1.Открытие формы.

2.Выделение любого поля или части поля.

3.Выполнение команды Фильтр по выделенному из меню Записи или нажатие кнопки с тем же названием на панели инструментов Режим Формы.

4.Повторение вышеприведенной последовательности действий с другими полями.

Можно открыть форму в режиме "Форма с установленным фильтром". Это делается с помощью макрокоманды OpenForm или с помощью метода OpenForm объекта DoCmd:

DoCmd.OpenForm "automobile passenger car",,,"key_model=1"

Кроме того, вы можете установить источником данных для формы параметрический запрос, который позволяет значительно уменьшить количество записей, обрабатываемых в текущем сеансе работы формы.

При работе с объектами DAO можно динамически изменять размер выборки, тем самым значительно ускоряя доступ к нужным вам данным. В качестве примера приведем две процедуры. Одна ищет запись в неотфильтрованном наборе данных, другая использует фильтр.

Процедура поиска в неотфильтрованном наборе данных:

Public Sub findexp()

***В данной процедуре ищется запись, и в окне отладки

***выводится время поиска в секундах

***Вы можете подставить свою таблицу

***и свои поля

***При этом имеет смысл экспериментировать

***на таблице с количеством записей более 1000,

***либо использовать WINAPI для фиксирования времени

***поиска

Dim myDb As DATABASE Dim myRst As Recordset Dim t1 As Double

Dim t2 As Double

Set myDb = DBEngine.Workspaces(0).Databases(0)

*** Можете подставить имя вашей таблицы здесь

Set myRst = myDb.OpenRecordset("first", _ dbOpenDynaset) t1 = Now()

***Соответственно поле и критерий поиска

***тоже необходимо подставить свои myRst.FindFirst "first like 'Чф*'"

t2 = Now()

If Not myRst.NoMatch Then

Debug.Print myRst!First, myRst!Third

Else

Debug.Print "Пролет"

End If

***Здесь можете использовать свою

***функцию для форматирования вывода времени поиска

Debug.Print DateDiff("s", t1, t2)

End Sub

Поиск в отфильтрованном наборе данных:

Public Sub findexpFilt() Dim myDb As DATABASE

Dim myRst As Recordset, NmyRst As Recordset Dim t1 As Double

Dim t2 As Double Dim i As Long

Set myDb = DBEngine.Workspaces(0).Databases(0)

Set myRst = myDb.OpenRecordset("first",_ dbOpenDynaset) myRst.Filter = "third >> 56700 and third << 58000"

Set NmyRst = myRst.OpenRecordset() t1 = Now()

NmyRst.FindFirst "first like 'Чф*'"

converted to PDF by HupBaH9I

t2 = Now()

If Not NmyRst.NoMatch Then

Debug.Print NmyRst!First, NmyRst!Third

Else

Debug.Print "Пролет"

End If

Debug.Print DateDiff("s", t1, t2)

End Sub

7.2. Создание SQL-запросов

Как уже было отмечено, всем, кто хочет работать с базами данных, необходимо знать язык SQL, который, по сути, стал стандартом для работы с базами данных.

Вэтом параграфе вы узнаете:

сферы наиболее эффективного применения языка SQL при разработке систем обработки данных;

основные виды запросов, которые могут быть составлены для работы с данными;

назначение основных составляющих элементов команд SQL;

особенности составления команд SQL в рассматриваемых средствах разработки.

К сожалению (а может быть наоборот), рынок программного обеспечения развивается не по принципам единого планирования. Каждый продукт, который использует SQL, применяет его диалект, как правило, отличающийся от ANSI-стандарта этого языка. Обидно, - иначе бы мы могли одинаково обращаться к данным любого продукта, используя одинаковые языковые конструкции. Но в принципе, все еще может быть, а пока приходится довольствоваться тем, что есть. А есть масса приложений для разработки баз данных, которые при этом данные хранят в своем формате, как правило, секрета не представляющем, и все без исключения соревнуются друг с другом в как можно большем количестве отличий от общепринятых стандартов ANSI SQL. Однако общаться программам с данными чужих форматов необходимо, и существет несколько путей для этого общения. Перечислим некоторые из них.

Вы покупаете продукт, который поддерживает несколько форматов. Или - создаете продукт, который поддерживает несколько форматов. Есть прекрасные примеры: Lotus Approach, Microsoft Access, продукты фирмы Borland Dbase и Paradox читают форматы друг друга. Но почти наверняка вы не найдете приложения, которое поддерживает все форматы. А на практике работать с данными иного формата приходится очень часто. Даже если вы очень упорно будете избегать встречи с другими форматами, она все равно когда-нибудь произойдет. Бесспорно, можно воспользоваться следующим способом для работы с внешними форматами, но он таит свои сюрпризы.

Вы используете операции экспорта или импорта. Опять же необязательно, что у вас будут в наличии все необходимые конверторы. Но все же допустим, что они есть. Вы импортировали данные. Отредактировали. Сколько вы поставите на то, что изменения отразились в исходных данных, то есть в файле, где они хранятся в родном формате? Готовы с вами поспорить на любую сумму. Можно, конечно, провести обратную операцию и экспортировать отредактированные данные в исходный формат. Но, согласитесь, что это очень непродуктивный путь для редактирования одной записи в базе данных, где их 100000, а ведь очень часто их бывает много больше. Кроме этого, вам становятся недоступными все триггеры, бизнес-правила и хранимые процедуры для данных внешнего формата, если они, конечно, используются.

Способ, который звучит наиболее современно и который делает вас поистине всесильным, но оставляющий все же место для всевозможных придирок по отношению к себе. Это, само собой разумеется, - OLE 2.0. А в OLE 2.0 нас больше всего интересует его составная часть OLE Automation. Термин, который редко переводится, и мы тоже не возьмемся за это. Придирки здесь могут возникнуть со стороны консервативных любителей DOS. Дело в том, что технологию OLE Automation невозможно реализовать в рамках этой операционной оболочки. Позволим себе лирическое отступление. Вам наверняка придется слышать патетические высказывания, изрекаемые достаточно образованными людьми. Они будут гласить, что на их программах работают сотрудники, которым надо только стучать по клавиатуре. Или что наращивание мощности техники для обработки информации - это от лукавого. Не слушайте их. Нам нужны различные, мощные, еще мощнее, самые мощные средства обработки данных. При этом неважно, где вы работаете. Это может быть ЖЭК, банк, спортклуб. Каждый грамм информации имеет право на существование, даже количество бензина, которое вы сегодня израсходовали, отлучившись на служебной машине к вашей любовнице. Не слушайте их, приземленных противников прогресса, которым легче обслуживать свои любительские творения, чем осваивать новые вершины самой нужной профессии современности - специалиста по обработке информации. Бесспорно, на смену

Соседние файлы в предмете Программирование на Delphi