Смекни!
smekni.com

MIDAS. Практическое применение (стр. 6 из 6)

Для показа значения поля "Поставщик" удобно воспользоваться процедурой из модуля DMCommon:

procedure TDMDoc.SetSenderName(Value: integer);begin with cdsTitle do begin if not (State in [dsEdit, dsInsert]) then Edit; if Value <> 0 then FieldByName('FROM_ID').AsInteger := Value else FieldByName('FROM_ID').Clear; FieldByName('FromName').AsString := DMCommon.ClientName[FieldByName('FROM_ID').AsInteger];//и оставляем в режиме редактирования end;end;

Поле, содержащее имя поставщика (FromName), также вычисляемое (InternalCalc). В поле FROM_ID содержится ID поставщика, а в поле FromName – его полное наименование. Аналогичная процедура заполняет поля для Получателя.

После редактирования документа изменения должны отсылаться на сервер для сохранения в базе данных:

function TDMDoc.ApplyDoc: boolean;var AServer: IrdmDocDisp; ErrorLog: string;begin with cdsTitle do begin if State in [dsEdit, dsInsert] then Post; if ChangeCount > 0 then ApplyUpdates(0); end; with cdsBody do begin if State in [dsEdit, dsInsert] then Post; if ChangeCount > 0 then ApplyUpdates(-1); end; AServer := IrdmDocDisp(scDoc.GetServer); ErrorLog := AServer.ApplyChanges; if ErrorLog <> '' thenbegin MessageDlg('Произошли следующие ошибки:'#13#10 + ErrorLog,mtError, [mbOK], 0); //обновляем cdsBody.Active := False; cdsTitle.Active := False; cdsTitle.Active := True; cdsBody.Active := True; end; Result := ErrorLog = '';end;

Сначала все сделанные изменения отсылаются на сервер вызовом методов клиентских наборов данных ApplyUpdates. Затем вызывается метод сервера ApplyChanges, который сохраняет изменения в БД. При наличии ошибок их список помещается в переменную ErrorLog и отображается пользователю.

Отчет

Необходимо получить от сервера содержимое отчета и присвоить результат запроса свойству TClientDataSet.Data с пустым набором полей. Автоматически будет создан список полей с необходимыми заголовками:

procedure TDMReport.RefreshInOut(FromDate, ToDate: TDateTime);begin scReport.Connected := True; with cdsInOutRes do begin Active := False; Data := FServer.InOutData(int(FromDate), int(ToDate));Active := True; end;end;

Здесь scReport – компонент TSocketConnection, настроенный на соединение с удаленным модулем rdmReport, а компонент cdsInOutRes предназначен для получения результата. Поля этого набора данных создаются динамически на основе полученного от сервера пакета.

Переменная FServer получает свое значение в событии OnAfterConnect компонента scReport:

procedure TDMReport.scReportAfterConnect(Sender: TObject);begin FServer := IrdmReportDisp(scReport.GetServer)end;

В результате на клиенте получается ClientDataSet, полностью заполненный данными отчета, которые можно показать в DBGrid. Примерный результат можно увидеть на рисунке 5.

Рисунок 5. Внешний вид отчета.

Заключение

Технологию MIDAS стоит применять в средних и больших приложениях, база данных которых насчитывает десятки и сотни таблиц. Именно в этом случае применение MIDAS дает значительные преимущества в разработке и сопровождении приложения. Какие же преимущества дает использование MIDAS:

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

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

Независимость от конкретной СУБД. Действительно, на рабочих станциях не нужно устанавливать клиентскую часть сервера баз данных, соединение с сервером приложений обеспечивается одной библиотекой midas.dll. При переходе на другой сервер БД достаточно переписать только сервер приложений, не затрагивая клиентскую часть. Может оказаться полезным добавление еще одного слоя абстракции данных между сервером приложений и сервером БД, обеспечивающего просто доступ к элементам базы. В этом случае при переходе на другой сервер БД нужно переписать только отдельные модули, не затрагивая сервер приложений в целом. Необходимо также учитывать, что при групповой разработке приложений обычно часть программистов специализируется на базе данных, другая часть – на интерфейсе пользователя. При этом каждая группа программистов может работать над своей частью приложения, не отвлекаясь на особенности работы другой группы.

Значительно упрощается синхронизация работы пользователей, которую теперь обеспечивает сервер приложений.

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

При эксплуатации также проявляются некоторые преимущества:

Уменьшается поток данных между клиентским приложением и серверной частью. Дело в том, что иногда приходится при расчетах обращаться к дополнительным таблицам БД. В случае трехуровнего приложения эти таблицы можно обрабатывать на сервере приложений, который часто установлен на одном компьютере с сервером БД или связан с ним каналом большой пропускной способности. Также необходимо учитывать, что, как правило, помимо непосредственно данных, сервер БД и использующее его приложение обмениваются значительным количеством служебной информации, например, о типах полей таблиц. Выбор отдельной строки результата запроса (курсора) происходит отдельной командой (fetch), что увеличивает сетевой обмен. В пакеты MIDAS включаются только необходимые данные, передаваемые единым массивом, что заметно уменьшает нагрузку на сеть.

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

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

Как видно, преимуществ довольно много, и на практике они с запасом окупают необходимость написания «дополнительного» кода.

Теперь мне хотелось бы сказать несколько слов о переходе на более новые версии Delphi. В Delphi 6 технология MIDAS поменяла свое название, и теперь называется DataSnap. По-видимому, в связи с этим произошли некоторые изменения в составе компонентов. В частности, в том, что касается данного проекта, при переводе его на Delphi 6 я столкнулся с необходимостью изменения объявлений некоторых обработчиков событий TClientDataSet и TDataSetProvider. Это связано с тем, что в Delphi 6 появился компонент TCustomClientDataSet, который заменил TClientDataSet. Например, объявление

procedure TrdmDoc.cdsTitleReconcileError(DataSet: TClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);

теперь должно выглядеть так:

procedure TrdmDoc.cdsTitleReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);

Аналогичным образом необходимо заменить остальные объявления.

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

Приложения

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

При установке сервера приложений рекомендуется просто запустить его, главная форма сервера дает возможность выбрать местоположение базы данных. Диалог для этого использован стандартный, входящий в поставку IBX. При этом необходимо учитывать, что если в пути к базе не указано имя сервера, что подразумевает, что сервер Interbase и база находятся на одном компьютере с сервером приложений, рекомендуется выбирать удаленный доступ (указать путь вида localhost:<ПутьКБазе>). Дело в том, что Interbase выполняет все запросы локальных соединений в одном потоке, в результате один клиент будет ждать выполнения запроса другого клиента.

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

Некоторые замечания.

Исходные тексты созданы в Delphi 5. Для правильной работы сервера приложений необходимо производить компиляцию с использованием IBX версии 4.52, исходные тексты этой версии можно взять на http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=102. Перед установкой этого обновления должен быть установлен Delphi5 Update pack 1.

Клиент соединяется с сервером при помощи TSocketConnection, поэтому для работы приложения должен быть запущен Borland Socket Server. Исполнимый файл обычно находится в каталоге ($Delphi)&bsol;bin и называется scktsrvr.exe.

Для работы приложения MIDAS используют библиотеку midas.dll, которая при установленном Delphi 5 находится в системном каталоге Windows. Этот модуль необходим как для работы клиента, так и сервера приложений.

Для Delphi 6 необходима установка Update pack 2 и пакета обновления компонент IBX6.xx. Для компиляции проекта я использовал, в частности, IBX 6.04.

Вот вроде и все.

Огромное спасибо Александру Капустину, Павлу Шмакову и другим, кто помогал мне советами и критикой.