    22 ГЛАВА 

    За пределами двухуровневой модели 

    Когда технология клиент/сервер только входила в моду, казалось очевидным, 
что когда-нибудь появятся программы, которые заполнят разрыв между серверной и 
клиентной частями уравнения. Реализация бизнес-правил на уровне сервера 
никогда не составляла проблем. Однако встраивание серверных бизнес-правил в 
приложение оказалось непростой задачей, особенно на заре революции 
"Клиент/сервер". Предполагалось, что наступит время, и серверы с клиентами 
станут работать в полном согласии, преодолеют эти ограничения и подарят 
конечным пользователям цельные приложения. 
    Все больше компаний переходило на технологию клиент/сервер, а чудо 
заставляло себя ждать. Разочарованные недостатком интеграции между серверами 
баз данных и средствами разработки приложений, разработчики начали встраивать 
бизнес-правила в приложения. Нередки были системы, в которых бизнес-правила и 
ограничения реализовывались почти полностью или исключительно на уровне 
клиентной части. 
    Хотя этот подход наилучшим образом обеспечивал конечных пользователей 
отшлифованными приложениями, у него был существенный недостаток. Он состоял в 
том, что ограничения уровня приложения, в отличие от серверных, не могли 
свободно использоваться другими средствами или переноситься на другие 
платформы. Программистам приходилось заново реализовывать бизнес-правила для 
каждого используемого средства разработки и для всех поддерживаемых платформ. 
Результат — много потерянного времени и ошибки, допущенные при переносе бизнес-правил. 
    Решение этой головоломки состоит в многоуровневой модели, появление 
которой на заре технологии клиент/сервер не было предусмотрено. Помимо двух 
основных уровней — клиент и сервер — многоуровневая модель допускает 
существование промежуточных уровней, каждому из которых предназначается 
определенная роль. 
    Delphi поддерживает создание многоуровневых приложений благодаря следующим технологиям. 
    Q	Remote Data Broker (брокер удаленных данных) 
    Q	Constraint Broker (брокер ограничений) 
    Q	Отложенная обработка данных 
    Q	Обработка отдельных пакетов данных 
    Я расскажу о каждой из этих технологий отдельно и покажу, как использовать 
их в реальных приложениях. 

    Remote Data Broker 

    Технология Remote Data Broker позволяет создавать в Delphi приложения с 
облегченной клиентной частью (thin-client), не требующие наличия механизмов 
доступа к СУБД или соответствующих драйверов на компьютере клиента. В случае 
необходимости такие приложения связываются по сети с сервером приложений, 
который содержит компоненты ТТаЫе, TQuery и TStoredProc, необходимые для 
доступа к серверу базы данных. На сервере приложений можно определить 
ограничения и бизнес-правила, которые будут совместно использоваться 
приложениями при их обращении к серверу. Таким образом, бизнес-правила будут 
централизованы, а приложения смогут работать так же, как если бы они сами 
содержали бизнес-правила. 
    Для создания программы типа Remote Data Broker нужно сделать следующее. 

    432 IV. Темы повышенной сложности 

    1.   Убедитесь, что сервер InterBase доступен. 
    2.   Запустите Database Explorer и создайте новый псевдоним BDE с именем 
IB_EMPLOYEE, представляющий демонстрационную базу данных InterBase EMPLOYEE. 
GDB, которая входит в комплект поставки Delphi (по умолчанию она расположена в 
каталоге С: \Program Files\Borland\IntrBase\Examples). 

    Примечание 

    Хотя в Delphi модель приложения с облегченной клиентной частью 
действительно позволяет создавать приложения, не требующие Borland Database 
Engine, тем не менее им необходимы некоторые инструменты для связи с сервером. 
Эти средства содержатся в файле DBCLIENT.DLL, который нужно включать в 
комплект поставки таких приложений. Хотя библиотека DBCLIENT.DLL действительно 
необходима лишь в том случае, когда приложение вносит изменения в данные и 
отсылает их на сервер, но ради безопасности все же дополните приложение этим файлом. 
    3.    Щелкните правой кнопкой мыши на новом псевдониме и из появившегося- 
контекстного меню выберите команду Import to Dictionary. В результате 
ограничения базы данных и другая информация будет импортирована из InterBase в 
словарь баз данных Delphi. 
    4.    Выйдите из Database Explorer и вернитесь в Delphi. 
    5.    С помощью команды File^New Application создайте новое приложение. 
    6.    Выберите команду File^New и дважды щелкните на параметре Remote Data 
Module в диалоговом окне New Items. 
    7.   В строке Class Name of Remote Data Broker диалоговго окна мастера 
Remote Dataset Wizard введите имя класса, затем щелкните на кнопке ОК. 
    8.    Поместите на форму компоненты ТТаЫе, Database и Session. 
    9.    Измените значение свойства AutoSessionName компонента Session на True. 
    10. Укажите в качестве значения свойств AliasName и DatabaseName 
компонента Database псевдоним IB_EMPLOYEE. Измените свойство LoginPrompt этого 
же компонента на False и введите в поле Pa rams следующие два параметра: 

    USER NAME=SYSDBA PASSWORD=masterkey 

    11. Переключите его свойство HandleShared на True. 
    12. Укажите в качестве значения свойства DatabaseName компонента Table 
псевдоним IB_EMPLOYEE, а в качестве значения свойства TableName — имя таблицы DEPARTMENT. 
    13. Щелкните правой кнопкой мыши на компоненте Table и из появившегося 
контекстного меню выберите команду Export Table'1 from data module. 
    14. Сохраните проект на диске: модуль Unit2 — в файле RDB01. PAS, модуль 
Unitl — в файле RDBOO . PAS, а сам проект — в файле RDB. DPR. 
    15. Теперь запустите программу RDB, чтобы зарегистрировать его в качестве 
СОМ-сервера. Его можно закрыть сразу после загрузки. 
    Теперь, когда брокер данных создан, можно приступить к разработке 
использующего его приложения. Для"создания приложения RDC (Remote Data Client 
— клиент удаленных данных) нужно сделать следующее. 
    1.	С помощью команды File^New Application создайте новое приложение Delphi. 
    2.	Поместите на стандартную форму компоненты ClientDataSet, RemoteServer и DataSource. 
    3.	Поместите на форму компонент DBGrid. 
    4.	Определите свойство ServerName компонента RemoteServer как RDB.RemoteDataBroker. 
    5.   Определите свойство RemoteServer компонента ClientDataSet как 
RemoteServerl, а его свойство ProviderName — как Tablel (Tablel ссылается на 
таблицу DEPARTMENT в вашем приложении RDB). 
    6.   Укажите  в  качестве  значения  свойства   DataSet   компонента   
DataSource   ссылку  на  компонент • 
    ClientDataSet, а свойства DataSource компонента DBGrid — ссылку на DataSourcel. 
    7.   Откройте компонент ClientDataSet, изменив его свойство Active на True. 

    Глава 22. За пределами двухуровневой модели 433 

    В DBGrid должны появиться данные из таблицы DEPARTMENT. Примите мои 
поздравления — вы только что создали программу типа Remote Data Broker и 
соответствующее приложение-клиент. 
    Прежде чем продолжить работу, сохраните проект на диске: модуль Unitl — в 
файле RDCOO. PAS, а сам проект — в файле RDC. DPR. 

    Брокер ограничений 

    Кроме выполнения посреднических функций при работе с данными, компонент 
модуля удаленных данных в Delphi может также выступать в роли брокера 
(посредника) ограничений. Используя информацию об ограничениях, 
импортированную с сервера, он предупреждает отправление неправильных данных на 
сервер. Это снижает нагрузку на сеть и повышает быстродействие приложения. 
Чтобы увидеть, как это работает, сделайте следующее. 
    1.   Снова загрузите в Delphi приложение RDB. 
    2.    Откройте окно редактора полей, дважды щелкнув на компоненте Table. 
Затем, чтобы добавить новые поля, нажмите комбинацию клавиш <Ctrl+A>. Щелкните 
на кнопке ОК, чтобы добавить на форму все поля таблицы DEPARTMENT. 
    3.    Щелкните на поле Budget в окне редакторе полей. В окне Object 
Inspector появятся соответствующие ему ограничения ImportedConstraints. 
    4.   Закройте редактор полей, сохраните приложение и заново откомпилируйте его. 
    5.   Снова откройте приложение RDC и выполните его. 
    6.    Когда приложение появится на экране, отредактируйте таблицу 
DEPARTMENT с помощью элемента управления DBGrid. Попробуйте ввести в поле 
Budget недопустимую величину (любое значение, меньшее 10001). 
    Обратите внимание, что неправильное значение отбрасывается немедленно и не 
отправляется на сервер. Брокер ограничений использует собственную версию 
серверных ограничений и перехватывает неправильные данные, не пропуская их на 
сервер. Заметьте, что это ограничение упоминается в выводимом сообщении об ошибке. 

    Поддержка отложенной обработки данных 

    Кроме посреднических услуг сервера приложений, Delphi также обеспечивает 
возможность локального сохранения данных. Это позволяет работать с данными 
сервера в автономном режиме, используя отложенную обработку (briefcase 
computing). Это делается следующим образом. 
    1.	Если приложение RDC еще работает, закройте его. 
    2.	Поместите на главную форму RDC три компонента Button. 
    3.	Присвойте первому из них имя btSave, второму — btLoad, третьему — btSend. 
    4.    Определите свойство Caption этих компонентов как '&Save locally' для 
btSave, 'sLoad local data' — для btLoad и 'Send changes to server' — для btSend. 
    5.    Выберите такой размер кнопок, чтобы их названия отображались полностью. 
    6.   Дважды щелкните на кнопке btSave и добавьте следующий оператор в 
исходный текст обработчика события OnClick. 
    ClientDataSetl.SaveToFile('С:\TESTLOCAL.DAT'); 
    7.   Дважды щелкните на кнопке btLoad и добавьте следующий оператор в 
исходный текст обработчика события OnClick. 
    ClientDataSetl.LoadFromFile('С:\TESTLOCAL.DAT'); 
    8.   Дважды щелкните на кнопке btSend и добавьте следующий оператор в 
исходный текст обработчика события OnClick. 
    ClientDataSetl.ApplyUpdates(0); 

    434	IV. Темы повышенной сложности 

    9.   Сохраните и выполните приложение. 
    10. Когда окно приложения появится на экране, щелкните на кнопке btSave. 
    11. Найдите вновь созданное приложение RDB (которое загрузилось 
автоматически) и закройте его. Проигнорируйте сообщение об ошибке и щелкните 
на кнопке Yes, чтобы закрыть сервер приложений. 
    12. Вернувшись в RDC, обратите внимание, что можете продолжить работу с 
уже загруженным набором данных. Внесите какие-нибудь изменения и, щелкнув на 
кнопке btSave, сохраните данные локально. 
    13. Закройте приложение RDC и запустите его снова. Это приведет к 
повторному открытию сервера приложений RDB. Обратите внимание, что ваши 
изменения не сохранились, поскольку данные были загружены с сервера. 
    14. Чтобы_загрузить локальную копию данных, щелкните на кнопке btLoad. Вот 
теперь все в порядке. 
    15. Чтобы отправить изменения на сервер, щелкните на кнопке btSend. Если 
сейчас выйти из приложения и вновь запустить его, то изменения, которые 
первоначально были сохранены локально, теперь внесены и в данные на сервере. 
Теперь вам понятно, что подразумевается под отложенной обработкой — изменения 
в данных можно сохранить локально, а затем использовать в удобный момент, как 
если бы работа с ними не прерывалась. 

    Обработка отдельных пакетов данных 

    Еще одним достоинством технологии брокеров данных в Delphi является 
возможность загрузки в приложения отдельных пакетов данных. Вместо того, чтобы 
получать от сервера большие наборы данных, разработчик приложения может 
предусмотреть режим, при котором за один раз загружается лишь несколько строк. 
Это особенно выгодно в случае приложений, требующих небольших наборов данных, 
таких как при-"ложёния с формами вида "главная-подчиненная". Чтобы увидеть, 
как это работает, выполните следующее. 
    1.	Закройте приложение RDC, если оно еще работает. 
    2.	Поместите на форму компонент TStatusBar. Он автоматически расположится 
по нижнему краю формы. 
    3.	В окне Object Inspector переключите свойство SimplePanel панели 
состояния на True. 
    4.    Щелкните на компоненте DataSource, затем в окне Object Inspector 
дважды щелкните на событии 
    OnDataChange. 
    5.   Добавьте в исходный текст обработчика события следующие операторы. 

    With  DataSourcel.DataSet  do StatusBarl.SimpleText   := 
    Format('%d /  %d',[RecNo,RecordCount]); 

    6.    В окне Object Inspector укажите 5 в качестве значения свойства 
PacketRecords компонента ClientDataSet. Это означает, что данные с сервера 
будут загружаться по пять строк одновременно. По умолчанию значение этого 
свойства равно -1, что приводит к загрузке всех строк сразу. Если значение 
этого свойства равно 0, то будет загружаться только информация словаря данных. 
    7.    Загрузите приложение. Переходя от одной записи к другой, вы 
заметите, что каждые последующие пять строк загружаются с сервера. Такой 
уровень контроля позволяет полностью определить, сколько данных из набора 
загружается в компьютер клиента за один раз. Это значительно повышает 
производительность, особенно при работе с очень большими таблицами или при 
осуществлении доступа к данным по глобальной сети. 

    На рис. 22.1 показано окно работающего приложения RDC. 

    Глава 22. За пределами двухуровневой модели	435 

    Рис. 22.1. Приложение, являющееся удаленным клиентом данных, во время работы 

    Резюме 

    Для создания настоящих многоуровневых приложений клиент/сервер в Delphi 
можно использовать мощную технологию брокеров данных и ограничений. Можно 
импортировать ограничения и другую информацию словаря данных непосредственно 
на сервер приложений. Брокер ограничений позволяет применять импортированные 
ограничения, не пропуская неправильные данные на сервер. Это уменьшает 
загрузку сети и увеличивает производительность приложения. 
    Кроме того, возможность отложенной обработки данных может быть 
использована при реализации мобильных систем, таких, например, как приложения 
для выездных торговых точек, которые должны постоянно работать в автономном 
режиме. Контроль над объемом пакетов данных расширяет возможности разработчика 
в области настройки приложений для работы в той или иной операционной среде. 

    Что дальше... 

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

    436 IV. Темы повышенной сложности 
