LazReport, fix master/detail reports not updating detail ds when master ds changes activerecord

git-svn-id: trunk@16594 -
This commit is contained in:
jesus 2008-09-15 14:45:29 +00:00
parent f74132f80f
commit ddd16f211e
3 changed files with 65 additions and 5 deletions

View File

@ -5888,11 +5888,18 @@ begin
end;
procedure TfrPage.FormPage;
type
TBookRecord = record
Dataset: TfrDataset;
Bookmark: Pointer;
end;
var
BndStack: Array[1..MAXBNDS * 3] of TfrBand;
MaxLevel, BndStackTop: Integer;
i, sfPage : Integer;
HasGroups : Boolean;
DetailCount : Integer;
BooksBkUp : array of TBookRecord;
procedure AddToStack(b: TfrBand);
begin
@ -5903,6 +5910,41 @@ var
end;
end;
procedure BackupBookmark(b: TfrBand);
var
n: Integer;
begin
n := Length(BooksBkUp);
SetLength(BooksBkUp, n+1);
BooksBkUp[n].Dataset := b.Dataset;
BooksBkUp[n].Bookmark := b.Dataset.GetBookmark;
if b.Typ in [btDetailData,btSubDetailData] then
inc(DetailCount);
end;
procedure RestoreBookmarks;
var
n: Integer;
begin
for n:=0 to Length(BooksBkUp)-1 do
with BooksBkUp[n] do begin
Dataset.GotoBookMark(Bookmark);
Dataset.FreeBookMark(Bookmark);
if DetailCount=0 then
Dataset.EnableControls;
end;
SetLength(BooksBkUp, 0);
end;
procedure DisableControls;
var
n: Integer;
begin
if DetailCount=0 then
for n:=0 to Length(BooksBkUp)-1 do
BooksBkUp[n].Dataset.DisableControls;
end;
procedure ShowStack;
var
i: Integer;
@ -5944,11 +5986,13 @@ var
b := Bands[Bnds[Level, bpData]];
while (b <> nil) and (b.Dataset <> nil) do
begin
BM:=b.DataSet.GetBookMark;
b.DataSet.DisableControls;
try
b.DataSet.First;
//if Level<>1 then begin
// b.Dataset.Refresh;
//end;
if Mode = pmBuildList then
AddRecord(b, rtFirst)
else
@ -6043,9 +6087,6 @@ var
Dec(BndStackTop);
end;
finally
b.DataSet.GotoBookMark(BM);
b.DataSet.FreeBookMark(BM);
b.DataSet.EnableControls;
end;
b := b.Next;
end;
@ -6107,16 +6148,23 @@ begin
end;
BndStackTop := 0;
SetLength(BooksBkUp, 0);
DetailCount := 0;
for i := 1 to MAXBNDS do
begin
if BandExists(Bands[Bnds[i, bpData]]) then
begin
MaxLevel := i;
BackupBookmark(Bands[Bnds[i, bpData]]);
end;
end;
HasGroups := Bands[btGroupHeader].Objects.Count > 0;
{$IFDEF DebugLR}
DebugLn('%sMaxLevel=%d doing DoLoop(1)',[sspc,MaxLevel]);
{$ENDIF}
DisableControls;
DoLoop(1);
RestoreBookmarks; // this also enablecontrols
if Mode = pmNormal then
begin
if not RowsLayout then

View File

@ -42,6 +42,7 @@ type
procedure Exit; override;
procedure First; override;
procedure Next; override;
procedure Refresh; override;
procedure Open;
procedure Close;
function Eof: Boolean; override;
@ -197,6 +198,12 @@ begin
inherited Next;
end;
procedure TfrDBDataSet.Refresh;
begin
if GetDataset<>nil then
GetDataset.Refresh;
end;
function TfrDBDataSet.Eof: Boolean;
begin
Result := inherited Eof or GetDataSet.Eof or FEof;

View File

@ -38,6 +38,7 @@ type
procedure Exit; virtual;
procedure First; virtual;
procedure Next; virtual;
procedure Refresh; virtual;
function GetBookMark : Pointer; virtual;
procedure GotoBookMark(BM : Pointer); virtual;
@ -94,6 +95,10 @@ begin
if Assigned(FOnNext) then FOnNext(Self);
end;
procedure TfrDataset.Refresh;
begin
end;
function TfrDataset.GetBookMark: Pointer;
begin
Result:=nil;