Browse Source

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

git-svn-id: trunk@43900 -
michael 5 years ago
parent
commit
8700f1d090
2 changed files with 89 additions and 5 deletions
  1. 50 0
      packages/fcl-report/src/fpjsonreport.pp
  2. 39 5
      packages/fcl-report/src/fpreport.pp

+ 50 - 0
packages/fcl-report/src/fpjsonreport.pp

@@ -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.
 
 

+ 39 - 5
packages/fcl-report/src/fpreport.pp

@@ -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;