Модель 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 …...
Вышеописанный метод организации подкачки имеет, к сожалению, один большой недостаток он будет работать лишь при сортировке набора данных на клиенте по первичному ключу. Однако не так сложно доработать его для обхода и этой проблемы.
Список литературы
Для подготовки данной работы были использованы материалы с сайта