И. 3. Елманова. C++Builder 3.0, архитектура "клиент/сервер" и Internet
DataSet,  UpdateKind,   E)
TUpdateKind UpdateKind,  TReconcileAction &Action)
Action = HandleReconcileError(Owner, }
Отметим, что в модуле, связанном с вновь созданным диалогом, уже содержится функция HandleReconcileError, ссылка на которую находится в обработчике событий.
TReconcileAction HandleReconcileError(TComponent* Owner, TDataSet *DataSet, TUpdateKind UpdateKind, EReconcileError *ReconcileError) {
TReconcileAction     retVal;
TReconcileErrorForm *UpdateForm;
UpdateForm = new TReconcileErrorForm (Owner, DataSet, UpdateKind, ReconcileError);
try {
if (UpdateForm->ShowModal() == mrOk) {
retVal = (TReconcileAction) (UpdateForm->ActionGroup->Items->Objects[UpdateForm->ActionGroup->ItemIndex]);
if (retVal == raCorrect)
UpdateForm->SetFieldValues(DataSet);
} else
retVal = raAbort; } _finally {
delete UpdateForm; }  //  try return  retVal; }  // HandleReconcileError
Скомпилируем и сохраним проект, а затем запустим две копии созданного приложения. В каждой из копий приложения внесем разные изменения в одно и то же поле одной и той же записи и попытаемся сохранить изменения в базе данных. При этом первое изменение с успехом сохранится, а в результате попытки внести второе изменение появится вновь созданная диалоговая панель (рис. 8.27).
В таблице в нижней части формы содержатся значения полей, вызвавшие коллизию: значение, которое данный пользователь пытается сохранить в базе данных, значение, которое содержится там на момент сохранения (внесенное другим пользователем), и исходное значение поля, сгруженное в кэш при открытии TClientDataSet. Пользователь может пропустить эту запись, отказаться от внесения своей версии значения поля в базу данных, переписать его поверх старого, перечитать данные с сервера или объединить значения полей в одно.
Создание многозвенных информационных систем с помощью C++Builder 3.0
Update EIIOI - ClienlDataSetl
Update Type:   Modified Error Message:
Couldn't perform the edit because another user changed the record
Reconcile Action ff:Skip <~: Cancel f Correct С Refresh С Merge
Field Name
Modified Value
Conflictipgyalue
j Original Value
I Jennifer-1
•Jennifer
P? SJioylc*
Cancel
Puc. 8.27. Сообщение о конфликте, получаемое пользователем при попытке сохранения измененных данных
Если по-каким-либо причинам обработка коллизий при многопользовательской работе должна быть отличной от предложенной, можно отредактировать имеющийся код (и при необходимости саму диалоговую панель).
8.7  Создание дополнительных методов удаленных модулей данных
Удаленные модули данных могут обладать дополнительными свойствами и методами, которые можно создать в редакторе библиотек типов (Туре Library Editor). В качестве примера рассмотрим создание метода Login, позволяющего пользователю клиентского приложения обратиться к данным, поставляемым сервером приложений, со своим именем и паролем.
Очевидно, что для этой цели в первую очередь в удаленный модуль данных сервера приложений, созданного ранее, следует поместить компонент TDatabase. В отличие от предыдущего примера, где все пользователи употребляли общий для всех компонент TDatabase и, соответственно, общее имя и пароль, выданном случае компонент TDatabase у каждого пользователя должен J5biTb свой, так как имя и пароль являются свойствами этого компонента.
194
195