Browse Source

* Restore calculated fields storage, make sure they do not propagate to server

Michaël Van Canneyt 3 years ago
parent
commit
097a3d1167
2 changed files with 24 additions and 7 deletions
  1. 12 3
      packages/fcl-db/db.pas
  2. 12 4
      packages/fcl-db/jsondataset.pas

+ 12 - 3
packages/fcl-db/db.pas

@@ -1184,6 +1184,7 @@ type
     Procedure DoneChangeList; virtual;
     Procedure ClearChangeList;
     procedure ResetUpdateDescriptors;
+    function GetUpdateData(aBuffer: TDataRecord) : JSValue; virtual;
     Function IndexInChangeList(aBookmark: TBookmark): Integer; virtual;
     Function AddToChangeList(aChange : TUpdateStatus) : TRecordUpdateDescriptor ; virtual;
     Procedure RemoveFromChangeList(R : TRecordUpdateDescriptor); virtual;
@@ -2876,11 +2877,18 @@ begin
     Dec(Result);
 end;
 
+function TDataSet.GetUpdateData(aBuffer : TDataRecord) : JSValue;
+
+begin
+  Result:=aBuffer.Data;
+end;
+
 function TDataSet.AddToChangeList(aChange: TUpdateStatus): TRecordUpdateDescriptor;
 
 Var
   B : TBookmark;
   I : Integer;
+  aData : JSValue;
 
 begin
   Result:=Nil;
@@ -2890,10 +2898,11 @@ begin
   I:=IndexInChangeList(B);
   if (I=-1) then
     begin
+    aData:=GetUpdateData(ActiveBuffer);
     if Assigned(DataProxy) then
-      Result:=DataProxy.GetUpdateDescriptor(Self,B,ActiveBuffer.data,aChange)
+      Result:=DataProxy.GetUpdateDescriptor(Self,B,aData,aChange)
     else
-      Result:=TRecordUpdateDescriptor.Create(Nil,Self,B,ActiveBuffer.data,aChange);
+      Result:=TRecordUpdateDescriptor.Create(Nil,Self,B,aData,aChange);
     FChangeList.Add(Result);
     end
   else
@@ -2908,7 +2917,7 @@ begin
           Result.FStatus:=usDeleted;
         end;
       usInserted : DatabaseError(SErrInsertingSameRecordtwice,Self);
-      usModified : Result.FData:=ActiveBuffer.Data;
+      usModified : Result.FData:=GetUpdateData(ActiveBuffer);
     end
     end;
 end;

+ 12 - 4
packages/fcl-db/jsondataset.pas

@@ -281,13 +281,14 @@ type
     FRowType: TJSONRowType;
     FFilterExpression : TFPExpressionParser;
     function GetFilterField(const AName: String): TFPExpressionResult;
-    procedure RemoveCalcFields(Buf: JSValue);
     procedure SetActiveIndex(AValue: String);
     procedure SetIndexes(AValue: TJSONIndexDefs);
     procedure SetMetaData(AValue: TJSObject);
     procedure SetRows(AValue: TJSArray);
     procedure SetRowType(AValue: TJSONRowType);
   protected
+    // Remove calculated fields from buffer
+    procedure RemoveCalcFields(Buf: JSValue);
     procedure ActivateIndex(Build : Boolean);
     // Determine filter value type based on field type
     function FieldTypeToExpressionType(aDataType: TFieldType): TResultType; virtual;
@@ -326,6 +327,7 @@ type
     procedure SetFilterText(const Value: string); override;
     procedure SetFiltered(Value: Boolean); override;
     function  GetFieldClass(FieldType: TFieldType): TFieldClass; override;
+    Function GetUpdateData(Buffer : TDataRecord) : JSValue; override;
     function IsCursorOpen: Boolean; override;
     // Bookmark operations
     procedure GetBookmarkData(Buffer: TDataRecord; var Data: TBookmark); override;
@@ -1359,7 +1361,7 @@ begin
       Buffer.Data:=FRows[bkmIdx];
       Buffer.BookmarkFlag := bfCurrent;
       Buffer.Bookmark:=BkmIdx;
-      CalculateFields(Buffer);
+      GetCalcFields(Buffer);
       if Filtered then
         begin
         FFilterRow:=Buffer.Data;
@@ -1468,7 +1470,7 @@ begin
   if not isUndefined(Rows[FEditIdx]) then
     begin
     FEditRow:=FieldMapper.CopyRow(Rows[FEditIdx]);
-    RemoveCalcFields(FEditRow);
+
     end
   else
     FEditRow:=FFieldMapper.CreateRow;
@@ -1607,6 +1609,12 @@ begin
     Result:=inherited GetFieldClass(FieldType);
 end;
 
+function TBaseJSONDataSet.GetUpdateData(Buffer: TDataRecord): JSValue;
+begin
+  Result:=FieldMapper.CopyRow(Buffer.Data);
+  RemoveCalcFields(Result);
+end;
+
 function TBaseJSONDataSet.IsCursorOpen: Boolean;
 begin
   Result := Assigned(FDefaultIndex);
@@ -1690,7 +1698,7 @@ begin
     if State=dsOldValue then
       R:=Buffer.data
     else
-      R:=FEditRow
+      R:=FEditRow;
     end
   else
     begin