* Patch from Pascal Riekenberg to allow saving rendered report to JSON (bug ID 36547)

git-svn-id: trunk@43900 -
This commit is contained in:
michael 2020-01-10 13:44:10 +00:00
parent 52c32837d1
commit 8700f1d090
2 changed files with 89 additions and 5 deletions

View File

@ -52,10 +52,13 @@ Type
destructor Destroy; override; destructor Destroy; override;
procedure LoadFromStream(const aStream: TStream); procedure LoadFromStream(const aStream: TStream);
procedure SaveToStream(const aStream: TStream); procedure SaveToStream(const aStream: TStream);
procedure SaveRenderToStream(const aStream: TStream);
Procedure LoadFromJSON(aJSON : TJSONObject); virtual; Procedure LoadFromJSON(aJSON : TJSONObject); virtual;
Procedure SavetoJSON(aJSON : TJSONObject); virtual; Procedure SavetoJSON(aJSON : TJSONObject); virtual;
Procedure SaveRenderToJSON(aJSON : TJSONObject); virtual;
Procedure LoadFromFile(const aFileName : String); Procedure LoadFromFile(const aFileName : String);
Procedure SaveToFile(const aFileName : String); Procedure SaveToFile(const aFileName : String);
procedure SaveRenderToFile(const aFileName: String);
Property LoadErrors : TStrings Read FLoadErrors; Property LoadErrors : TStrings Read FLoadErrors;
Property DataManager : TFPCustomReportDataManager Read FDataManager Write SetDataManager; Property DataManager : TFPCustomReportDataManager Read FDataManager Write SetDataManager;
Property DesignDataName : String Read GetDesignDataName Write SetDesignDataName Stored StoreDesignDataName; Property DesignDataName : String Read GetDesignDataName Write SetDesignDataName Stored StoreDesignDataName;
@ -242,6 +245,23 @@ begin
end; end;
end; end;
procedure TFPJSONReport.SaveRenderToJSON(aJSON: TJSONObject);
Var
R : TFPReportJSONStreamer;
begin
DoWriteJSON(aJSON);
R:=TFPReportJSONStreamer.Create(Nil);
try
R.OwnsJSON:=False;
R.JSON:=aJSON;
WriteRTElement(R);
finally
R.Free;
end;
end;
procedure TFPJSONReport.LoadFromStream(const aStream : TStream); procedure TFPJSONReport.LoadFromStream(const aStream : TStream);
Var Var
@ -275,6 +295,23 @@ begin
end; end;
end; end;
procedure TFPJSONReport.SaveRenderToStream(const aStream: TStream);
Var
O : TJSONObject;
S : TJSONStringType;
begin
O:=TJSONObject.Create;
try
SaveRendertoJSON(O);
S:=O.AsJSON;
aStream.WriteBuffer(S[1],Length(S));
finally
O.Free;
end;
end;
procedure TFPJSONReport.LoadFromFile(const aFileName: String); procedure TFPJSONReport.LoadFromFile(const aFileName: String);
Var Var
@ -302,5 +339,18 @@ begin
end; end;
end; end;
procedure TFPJSONReport.SaveRenderToFile(const aFileName: String);
Var
F : TFileStream;
begin
F:=TFileStream.Create(aFileName,fmCreate);
try
SaveRenderToStream(F);
finally
F.Free;
end;
end;
end. end.

View File

@ -22,7 +22,7 @@ unit fpreport;
// Global debugging // Global debugging
{ $define gdebug} { $define gdebug}
// Separate for aggregate variables // Separate for aggregate variables
{$define gdebuga} { $define gdebuga}
interface interface
@ -1676,6 +1676,7 @@ type
Procedure SaveDataToNames; Procedure SaveDataToNames;
Procedure RestoreDataFromNames; Procedure RestoreDataFromNames;
procedure WriteElement(AWriter: TFPReportStreamer; AOriginal: TFPReportElement = nil); override; procedure WriteElement(AWriter: TFPReportStreamer; AOriginal: TFPReportElement = nil); override;
procedure WriteRTElement(AWriter: TFPReportStreamer; AOriginal: TFPReportElement = nil);
procedure ReadElement(AReader: TFPReportStreamer); override; procedure ReadElement(AReader: TFPReportStreamer); override;
procedure AddPage(APage: TFPReportCustomPage); procedure AddPage(APage: TFPReportCustomPage);
procedure RemovePage(APage: TFPReportCustomPage); procedure RemovePage(APage: TFPReportCustomPage);
@ -3305,9 +3306,9 @@ begin
if (aNode is TFPExprVariable) then if (aNode is TFPExprVariable) then
begin begin
DS:=ExtractWord(1,TFPExprVariable(ANode).Identifier.Name,['.']); DS:=ExtractWord(1,TFPExprVariable(ANode).Identifier.Name,['.']);
If AData.FindReportData(DS)<>Nil then If AData.FindReportData(DS)<>Nil then
FDataName:=DS; FDataName:=DS;
end end
else if (ANode is TFPExprFunction) then else if (ANode is TFPExprFunction) then
begin begin
I:=0; I:=0;
@ -3643,7 +3644,7 @@ begin
begin begin
WriteString('Name',Self.Name); WriteString('Name',Self.Name);
WriteString('DataType',ResultTypeName(DataType)); WriteString('DataType',ResultTypeName(DataType));
WriteString('Value',Value); // WriteString('Value',Value);
WriteString('Expression',Expression); WriteString('Expression',Expression);
WriteString('ResetValueExpression',ResetValueExpression); WriteString('ResetValueExpression',ResetValueExpression);
WriteString('ResetType',GetEnumName(TypeInfo(TFPReportResetType),Ord(ResetType))); WriteString('ResetType',GetEnumName(TypeInfo(TFPReportResetType),Ord(ResetType)));
@ -3668,7 +3669,7 @@ begin
DataType:=rtString DataType:=rtString
else else
DataType:=TResultType(I); DataType:=TResultType(I);
Value:=ReadString('Value',''); // Value:=ReadString('Value','');
Expression:=ReadString('Expression',''); Expression:=ReadString('Expression','');
ResetValueExpression:=ReadString('ResetValueExpression',''); ResetValueExpression:=ReadString('ResetValueExpression','');
S:=ReadString('ResetType',''); S:=ReadString('ResetType','');
@ -8726,6 +8727,39 @@ begin
// TODO: Implement writing OnRenderReport, OnBeginReport, OnEndReport // TODO: Implement writing OnRenderReport, OnBeginReport, OnEndReport
end; end;
procedure TFPCustomReport.WriteRTElement(AWriter: TFPReportStreamer; AOriginal: TFPReportElement);
var
i: integer;
begin
// ignore AOriginal here as we don't support whole report diffs, only element diffs
AWriter.PushElement('Report');
try
inherited WriteElement(AWriter, AOriginal);
// local properties
AWriter.WriteString('Title', Title);
AWriter.WriteString('Author', Author);
AWriter.WriteBoolean('TwoPass',TwoPass);
AWriter.WriteDateTime('DateCreated', DateCreated);
// now the pages
AWriter.PushElement('Pages');
try
for i := 0 to RTObjects.Count - 1 do
begin
AWriter.PushElement(IntToStr(i)); // use page index as identifier
try
TFPReportComponent(RTObjects[i]).WriteElement(AWriter);
finally
AWriter.PopElement;
end;
end;
finally
AWriter.PopElement;
end;
finally
AWriter.PopElement;
end;
end;
procedure TFPCustomReport.ReadElement(AReader: TFPReportStreamer); procedure TFPCustomReport.ReadElement(AReader: TFPReportStreamer);
var var
E: TObject; E: TObject;