mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 16:59:21 +02:00
LazReport, fix master/detail reports not updating detail ds when master ds changes activerecord
git-svn-id: trunk@16594 -
This commit is contained in:
parent
f74132f80f
commit
ddd16f211e
@ -5888,11 +5888,18 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TfrPage.FormPage;
|
procedure TfrPage.FormPage;
|
||||||
|
type
|
||||||
|
TBookRecord = record
|
||||||
|
Dataset: TfrDataset;
|
||||||
|
Bookmark: Pointer;
|
||||||
|
end;
|
||||||
var
|
var
|
||||||
BndStack: Array[1..MAXBNDS * 3] of TfrBand;
|
BndStack: Array[1..MAXBNDS * 3] of TfrBand;
|
||||||
MaxLevel, BndStackTop: Integer;
|
MaxLevel, BndStackTop: Integer;
|
||||||
i, sfPage : Integer;
|
i, sfPage : Integer;
|
||||||
HasGroups : Boolean;
|
HasGroups : Boolean;
|
||||||
|
DetailCount : Integer;
|
||||||
|
BooksBkUp : array of TBookRecord;
|
||||||
|
|
||||||
procedure AddToStack(b: TfrBand);
|
procedure AddToStack(b: TfrBand);
|
||||||
begin
|
begin
|
||||||
@ -5903,6 +5910,41 @@ var
|
|||||||
end;
|
end;
|
||||||
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;
|
procedure ShowStack;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -5944,11 +5986,13 @@ var
|
|||||||
b := Bands[Bnds[Level, bpData]];
|
b := Bands[Bnds[Level, bpData]];
|
||||||
while (b <> nil) and (b.Dataset <> nil) do
|
while (b <> nil) and (b.Dataset <> nil) do
|
||||||
begin
|
begin
|
||||||
BM:=b.DataSet.GetBookMark;
|
|
||||||
b.DataSet.DisableControls;
|
|
||||||
try
|
try
|
||||||
b.DataSet.First;
|
b.DataSet.First;
|
||||||
|
|
||||||
|
//if Level<>1 then begin
|
||||||
|
// b.Dataset.Refresh;
|
||||||
|
//end;
|
||||||
|
|
||||||
if Mode = pmBuildList then
|
if Mode = pmBuildList then
|
||||||
AddRecord(b, rtFirst)
|
AddRecord(b, rtFirst)
|
||||||
else
|
else
|
||||||
@ -6043,9 +6087,6 @@ var
|
|||||||
Dec(BndStackTop);
|
Dec(BndStackTop);
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
b.DataSet.GotoBookMark(BM);
|
|
||||||
b.DataSet.FreeBookMark(BM);
|
|
||||||
b.DataSet.EnableControls;
|
|
||||||
end;
|
end;
|
||||||
b := b.Next;
|
b := b.Next;
|
||||||
end;
|
end;
|
||||||
@ -6107,16 +6148,23 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
BndStackTop := 0;
|
BndStackTop := 0;
|
||||||
|
SetLength(BooksBkUp, 0);
|
||||||
|
DetailCount := 0;
|
||||||
for i := 1 to MAXBNDS do
|
for i := 1 to MAXBNDS do
|
||||||
begin
|
begin
|
||||||
if BandExists(Bands[Bnds[i, bpData]]) then
|
if BandExists(Bands[Bnds[i, bpData]]) then
|
||||||
|
begin
|
||||||
MaxLevel := i;
|
MaxLevel := i;
|
||||||
|
BackupBookmark(Bands[Bnds[i, bpData]]);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
HasGroups := Bands[btGroupHeader].Objects.Count > 0;
|
HasGroups := Bands[btGroupHeader].Objects.Count > 0;
|
||||||
{$IFDEF DebugLR}
|
{$IFDEF DebugLR}
|
||||||
DebugLn('%sMaxLevel=%d doing DoLoop(1)',[sspc,MaxLevel]);
|
DebugLn('%sMaxLevel=%d doing DoLoop(1)',[sspc,MaxLevel]);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
DisableControls;
|
||||||
DoLoop(1);
|
DoLoop(1);
|
||||||
|
RestoreBookmarks; // this also enablecontrols
|
||||||
if Mode = pmNormal then
|
if Mode = pmNormal then
|
||||||
begin
|
begin
|
||||||
if not RowsLayout then
|
if not RowsLayout then
|
||||||
|
@ -42,6 +42,7 @@ type
|
|||||||
procedure Exit; override;
|
procedure Exit; override;
|
||||||
procedure First; override;
|
procedure First; override;
|
||||||
procedure Next; override;
|
procedure Next; override;
|
||||||
|
procedure Refresh; override;
|
||||||
procedure Open;
|
procedure Open;
|
||||||
procedure Close;
|
procedure Close;
|
||||||
function Eof: Boolean; override;
|
function Eof: Boolean; override;
|
||||||
@ -197,6 +198,12 @@ begin
|
|||||||
inherited Next;
|
inherited Next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TfrDBDataSet.Refresh;
|
||||||
|
begin
|
||||||
|
if GetDataset<>nil then
|
||||||
|
GetDataset.Refresh;
|
||||||
|
end;
|
||||||
|
|
||||||
function TfrDBDataSet.Eof: Boolean;
|
function TfrDBDataSet.Eof: Boolean;
|
||||||
begin
|
begin
|
||||||
Result := inherited Eof or GetDataSet.Eof or FEof;
|
Result := inherited Eof or GetDataSet.Eof or FEof;
|
||||||
|
@ -38,6 +38,7 @@ type
|
|||||||
procedure Exit; virtual;
|
procedure Exit; virtual;
|
||||||
procedure First; virtual;
|
procedure First; virtual;
|
||||||
procedure Next; virtual;
|
procedure Next; virtual;
|
||||||
|
procedure Refresh; virtual;
|
||||||
|
|
||||||
function GetBookMark : Pointer; virtual;
|
function GetBookMark : Pointer; virtual;
|
||||||
procedure GotoBookMark(BM : Pointer); virtual;
|
procedure GotoBookMark(BM : Pointer); virtual;
|
||||||
@ -94,6 +95,10 @@ begin
|
|||||||
if Assigned(FOnNext) then FOnNext(Self);
|
if Assigned(FOnNext) then FOnNext(Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TfrDataset.Refresh;
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
function TfrDataset.GetBookMark: Pointer;
|
function TfrDataset.GetBookMark: Pointer;
|
||||||
begin
|
begin
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
|
Loading…
Reference in New Issue
Block a user