* 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;
procedure LoadFromStream(const aStream: TStream);
procedure SaveToStream(const aStream: TStream);
procedure SaveRenderToStream(const aStream: TStream);
Procedure LoadFromJSON(aJSON : TJSONObject); virtual;
Procedure SavetoJSON(aJSON : TJSONObject); virtual;
Procedure SaveRenderToJSON(aJSON : TJSONObject); virtual;
Procedure LoadFromFile(const aFileName : String);
Procedure SaveToFile(const aFileName : String);
procedure SaveRenderToFile(const aFileName: String);
Property LoadErrors : TStrings Read FLoadErrors;
Property DataManager : TFPCustomReportDataManager Read FDataManager Write SetDataManager;
Property DesignDataName : String Read GetDesignDataName Write SetDesignDataName Stored StoreDesignDataName;
@ -242,6 +245,23 @@ begin
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);
Var
@ -275,6 +295,23 @@ begin
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);
Var
@ -302,5 +339,18 @@ begin
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.

View File

@ -22,7 +22,7 @@ unit fpreport;
// Global debugging
{ $define gdebug}
// Separate for aggregate variables
{$define gdebuga}
{ $define gdebuga}
interface
@ -1676,6 +1676,7 @@ type
Procedure SaveDataToNames;
Procedure RestoreDataFromNames;
procedure WriteElement(AWriter: TFPReportStreamer; AOriginal: TFPReportElement = nil); override;
procedure WriteRTElement(AWriter: TFPReportStreamer; AOriginal: TFPReportElement = nil);
procedure ReadElement(AReader: TFPReportStreamer); override;
procedure AddPage(APage: TFPReportCustomPage);
procedure RemovePage(APage: TFPReportCustomPage);
@ -3305,9 +3306,9 @@ begin
if (aNode is TFPExprVariable) then
begin
DS:=ExtractWord(1,TFPExprVariable(ANode).Identifier.Name,['.']);
If AData.FindReportData(DS)<>Nil then
If AData.FindReportData(DS)<>Nil then
FDataName:=DS;
end
end
else if (ANode is TFPExprFunction) then
begin
I:=0;
@ -3643,7 +3644,7 @@ begin
begin
WriteString('Name',Self.Name);
WriteString('DataType',ResultTypeName(DataType));
WriteString('Value',Value);
// WriteString('Value',Value);
WriteString('Expression',Expression);
WriteString('ResetValueExpression',ResetValueExpression);
WriteString('ResetType',GetEnumName(TypeInfo(TFPReportResetType),Ord(ResetType)));
@ -3668,7 +3669,7 @@ begin
DataType:=rtString
else
DataType:=TResultType(I);
Value:=ReadString('Value','');
// Value:=ReadString('Value','');
Expression:=ReadString('Expression','');
ResetValueExpression:=ReadString('ResetValueExpression','');
S:=ReadString('ResetType','');
@ -8726,6 +8727,39 @@ begin
// TODO: Implement writing OnRenderReport, OnBeginReport, OnEndReport
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);
var
E: TObject;