Причина поведения компонентов Delphi ADO заключается в том, что при прокрутке набора основных данных этот код в ADODB.Pas выполняет
procedure TCustomADODataSet.MasterChanged(Sender: TObject);
begin
if not Active then Exit;
if Parameters.Count = 0 then
begin
CheckBrowseMode;
if SetDetailFilter then First;
end else
RefreshParams;
end;
, и ни SetDetailFilter
, ни RefreshParams
не требуют закрытия и повторного выполнения.- открытие набора данных Detail.Requery
в конечном итоге вызывает
procedure TCustomADODataSet.InternalRequery(Options: TExecuteOptions = []);
begin
if FConnectionChanged then
DatabaseError(SCantRequery);
try
Recordset.Requery(ExecuteOptionsToOrd(Options));
except
if Recordset.State = adStateClosed then Close;
raise;
end;
DestroyLookupCursor;
end;
, который использует особую возможность (также называемую Requery
) объекта ADO RecordSet, лежащую в основе TCustomADODataSet
, для получения соответствующих подробных записей, что значительно более эффективно, чем закрытие иповторное открытие набора данных Detail, поэтому его событие AfterOpen
не вызывается.
См. также TDetailDatalink
и TMasterDatalink
, определенные в DB.Pas.