Модель briefcase средствами MIDAS

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

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

Для передачи значения первичного ключа последней прочитанной клиентом записи можно использовать событие BeforeGetRecords. Данное событие определено для набора данных ClientDataSet на клиенте и компонента провайдера на сервере. Перед получением пакета с записями это событие сначала генерируется на клиенте, а затем у провайдера на сервере приложений. Событие имеет параметр, передаваемый по ссылке OwnerData (типа OleVariant). Вот через этот параметр мы и будем передавать значение ключа последней записи. Код обработчика в клиентском приложении:

procedure TForm1.cdsParamsBeforeGetRecords(Sender: TObject;

var OwnerData: OleVariant);

begin

if not cdsParams.FieldByName(ParamID).IsNull then

OwnerData:=cdsParams.FieldByName(ParamID).Value;

end;Соответственно для провайдера на сервере приложений:

procedure TMIDAS_bc.dspParamsBeforeGetRecords(Sender: TObject;

var OwnerData: OleVariant);

begin

if not VarIsNull(OwnerData) and not VarIsClear(OwnerData) then

adsParams.Parameters.ParamValues[ID]:=OwnerData;

end;Чтобы инициировать подкачку, необходимо обрабатывать еще одно событие объекта ClientDataSet OnScroll:

procedure TForm1.cdsParamsAfterScroll(DataSet: TDataSet);

begin

if cdsParams.Eof then

cdsParams.GetNextPacket;

end;Вызов cdsParams.GetNextPacket; как раз и инициирует получение следующего пакета данных.

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

function TCustomClientDataSet.GetNextPacket: Integer;

begin

CheckActive;

if ProviderEOF then Result := 0 else

begin

UpdateCursorPos;

if (FPacketRecords = 0) and FMasterLink.Active and

0)thenCheckDetailRecordselse"> (FMasterLink.Fields.Count > 0) then CheckDetailRecords else

begin

AddDataPacket(DoGetRecords(FPacketRecords, Result, 0, , Unassigned),

Result <> FPacketRecords);

ProviderEOF := Result <> FPacketRecords;

end;

Resync([]);

end;

end;Исправлено это было явным присвоением ProviderEOF значения false перед выполнением проверки if ProviderEOF then Result := 0 else …...

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

Список литературы

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