mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-17 13:39:36 +02:00
* Patch from Pascal Riekenberg to allow saving rendered report to JSON (bug ID 36547)
git-svn-id: trunk@43900 -
This commit is contained in:
parent
52c32837d1
commit
8700f1d090
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user