Преглед изворни кода

fcl-db: sdfdataset: fix seting/geting calculated fields. Offset is calculated using DataSize not Size and they should be stored in internal representation used by TField

git-svn-id: trunk@30531 -
lacak пре 10 година
родитељ
комит
c8f610282d
2 измењених фајлова са 28 додато и 25 уклоњено
  1. 22 19
      packages/fcl-db/src/sdf/sdfdata.pp
  2. 6 6
      packages/fcl-db/tests/testdbbasics.pas

+ 22 - 19
packages/fcl-db/src/sdf/sdfdata.pp

@@ -631,27 +631,28 @@ begin
       TempPos := RecBuf;
       SetFieldPos(TRecordBuffer(RecBuf), Field.FieldNo);
       Result := (RecBuf < StrEnd(TempPos));
-    end
-    else
-      if (State in [dsBrowse, dsEdit, dsInsert, dsCalcFields]) then
+      if Result and (Buffer <> nil) then
       begin
-        Inc(RecBuf, FRecordSize + Field.Offset);
-        Result := Boolean(Byte(RecBuf[0]));
+        StrLCopy(Buffer, RecBuf, Field.Size);
+        if FTrimSpace then
+        begin
+          TempPos := StrEnd(Buffer);
+          repeat
+            Dec(TempPos);
+            if (TempPos[0] = ' ') then
+              TempPos[0]:= #0
+            else
+              break;
+          until (TempPos = Buffer);
+        end;
       end;
-  end;
-  if Result and (Buffer <> nil) then
-  begin
-    StrLCopy(Buffer, RecBuf, Field.Size);
-    if FTrimSpace then
+    end
+    else // fkCalculated, fkLookup
     begin
-      TempPos := StrEnd(Buffer);
-      repeat
-        Dec(TempPos);
-        if (TempPos[0] = ' ') then
-          TempPos[0]:= #0
-        else
-          break;
-      until (TempPos = Buffer);
+      Inc(RecBuf, FRecordSize + Field.Offset); // Offset is calculated using DataSize not Size
+      Result := Boolean(RecBuf[0]);
+      if Result and Assigned(Buffer) then
+        Move(RecBuf[1], Buffer^, Field.DataSize);
     end;
   end;
 end;
@@ -689,7 +690,9 @@ begin
   else // fkCalculated, fkLookup
   begin
     Inc(RecBuf, FRecordSize + Field.Offset);
-    Move(Buffer^, RecBuf[0], Field.Size);
+    Boolean(RecBuf[0]) := Assigned(Buffer);
+    if Assigned(Buffer) then
+      Move(Buffer^, RecBuf[1], Field.DataSize);
   end;
   if not (State in [dsCalcFields, dsFilter, dsNewValue]) then
     DataEvent(deFieldChange, Ptrint(Field));

+ 6 - 6
packages/fcl-db/tests/testdbbasics.pas

@@ -678,9 +678,9 @@ end;
 procedure TTestDBBasics.TestDetectionNonMatchingDataset;
 var
   F: TField;
-  ds: tdataset;
+  ds: TDataSet;
 begin
-  // TDataset.Bindfields should detect problems when the underlying data does
+  // TDataset.BindFields should detect problems when the underlying data does
   // not reflect the fields of the dataset. This test is to check if this is
   // really done.
   ds := DBConnector.GetNDataset(true,6);
@@ -2791,7 +2791,7 @@ procedure TTestDBBasics.TestCalculatedField;
 var ds   : TDataset;
     AFld1, AFld2, AFld3 : Tfield;
 begin
-  ds := DBConnector.GetNDataset(5);
+  ds := DBConnector.GetNDataset(True,5);
   with ds do
     begin
     AFld1 := TIntegerField.Create(ds);
@@ -2810,10 +2810,10 @@ begin
     CheckEquals(3,FieldCount);
     ds.OnCalcFields := TestcalculatedField_OnCalcfields;
     open;
-    CheckEquals(1,FieldByName('ID').asinteger);
-    CheckEquals(5,FieldByName('CALCFLD').asinteger);
+    CheckEquals(1, FieldByName('ID').AsInteger);
+    CheckEquals(5, FieldByName('CALCFLD').AsInteger);
     next;
-    CheckEquals(70000,FieldByName('CALCFLD').asinteger);
+    CheckEquals(70000,FieldByName('CALCFLD').AsInteger);
     next;
     CheckTrue(FieldByName('CALCFLD').IsNull, '#3 Null');
     next;