Îņîáåííî číōåđåņķåō Refresh äë˙ ņâ˙įęč Master-Detail.
Ņōāđî ęāę ėčđ, č íåō íč÷åãî âîåííîãî:
procedure RefreshQuery( Query: TQuery; F: boolean );
var
B: TBookMark;
begin
with Query do
if Query.Active then
begin
B := GetBookMark;
try
Close;
Unprepare; {Åņëč íå īîņōāâčōü
ũōîãî, ōî åņëč čņīîëüįķåōņ˙ select
SP, ōî číîãäā
īîņëåäķūųā˙ îīåđāöč˙ âåøāåō
ņåđâåđ.
Ęōî ņęāæåō
īî÷åėķ?!}
Active:=True;
if F then
begin
try
GotoBookMark(B)
except
on EDatabaseError do First;
end
end
else First;
finally
FreeBookmark(B);
end;
end;
end;
Eugene Zhilkin
(2:461/88)Ķôô! Ęāæåōņ˙, ëy÷øå yæå íå ņäåëāōü. :)
dbtables ėîæíî îīöčîíāëüíî īpîīāō÷čōü (ņė. â ęîíöå), ÷ōîáû čėåōü ōāęîé âîō pyëåįíûé Detail query.
New interface function DoRefreshQuery can
Refresh TQuery component in master-detail scheme
and alone.
TQuery.RefreshParams should be updated
function GetFieldNamesStr( DataSet: TDataSet ): String;
var
I: Integer;
begin
Result := '';
with DataSet do
for I := 0 to FieldCount - 1 do
begin
Result := Result + Fields[ I ].FieldName + ';';
end;
end;
procedure DoRefreshQuery( Query: TQuery; KeyFields: String;
BookMarkSearch: Boolean);
var
Fields: TList;
KeyValues: Variant;
KeyNames: String;
Bmk: TBookmark;
I: Integer;
BookmarkFound: Boolean;
CanLocate: Boolean;
begin
Fields := TList.Create;
if KeyFields = '' then KeyFields := GetFieldNamesStr( Query
);
try
Query.GetFieldList( Fields, KeyFields );
for I := Fields.Count - 1 downto 0 do
with TField( Fields[I] ) do
if Calculated or Lookup then Fields.Delete( I );
CanLocate := Fields.Count > 0;
if CanLocate then
begin
if Fields.Count = 1 then
KeyValues := TField(Fields[0]).Value
else
begin
KeyValues := VarArrayCreate( [0, Fields.Count -
1], varVariant );
KeyValues[0] := TField( Fields[0] ).Value;
end;
KeyNames := TField( Fields[0] ).FieldName;
for I := 1 to Fields.Count - 1 do
begin
KeyNames := KeyNames + ';' + TField( Fields[I]
).FieldName;
KeyValues[ I ] := TField( Fields[I] ).Value;
end;
end;
finally
Fields.Free;
end;
with Query do
begin
Bmk := nil;
DisableControls;
try
BookmarkFound := False;
if BookMarkSearch then
Bmk := GetBookmark;
Close;
Open;
if Assigned( Bmk ) then
try
GotoBookMark( Bmk );
BookmarkFound := True;
except
end;
if not BookmarkFound and CanLocate then
Locate( KeyNames, KeyValues, [] );
finally
EnableControls;
Screen.Cursor := crDefault;
FreeBookmark( Bmk );
end;
end;
end;
procedure TQuery.RefreshParams;
var
DataSet: TDataSet;
begin
DisableControls;
try
if FDataLink.DataSource <> nil then
begin
DataSet := FDataLink.DataSource.DataSet;
if DataSet <> nil then
if DataSet.Active and ( DataSet.State <>
dsSetKey ) then
DoRefreshQuery( Self, GetFieldNamesStr( Self
), False );
end;
finally
EnableControls;
end;
end;
Vladimir Gaitanoff
vg@divo.ru www.tsinet.ru/~vg (2:5017/5.69)