Kaynağa Gözat

fcl-db: bufdataset: add limited support for ftBCD fields in filter parser.
As DBF filter/expression parser does not support etBCD type of expression, I have used etFloat type, so I convert currency data type to double data type.
(which can lead in some cases in false results, when currency can not be expressed as double, without loss of precision)

git-svn-id: trunk@32558 -

lacak 9 yıl önce
ebeveyn
işleme
e0ee5c30bf
1 değiştirilmiş dosya ile 22 ekleme ve 1 silme
  1. 22 1
      packages/fcl-db/src/base/bufdataset_parser.pp

+ 22 - 1
packages/fcl-db/src/base/bufdataset_parser.pp

@@ -143,6 +143,12 @@ type
     procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
+  TBCDFieldVar = class(TFloatFieldVar)
+  public
+    procedure Refresh(Buffer: TRecordBuffer); override;
+  end;
+
+
 //--TFieldVar----------------------------------------------------------------
 constructor TFieldVar.Create(UseField: TField);
 begin
@@ -273,6 +279,16 @@ begin
     FFieldVal := False;
 end;
 
+procedure TBCDFieldVar.Refresh(Buffer: TRecordBuffer);
+var c: currency;
+begin
+  if FField.DataSet.GetFieldData(FField,@c) then
+    FFieldVal := c
+  else
+    FFieldVal := 0;
+end;
+
+
 //--TBufDatasetParser---------------------------------------------------------------
 
 constructor TBufDatasetParser.Create(Adataset: TDataSet);
@@ -387,7 +403,7 @@ begin
         TempFieldVar := TFloatFieldVar.Create(FieldInfo);
         TempFieldVar.FExprWord := DefineFloatVariable(VarName, TempFieldVar.FieldVal);
       end;
-    ftAutoInc, ftInteger, ftSmallInt:
+    ftAutoInc, ftInteger, ftSmallInt, ftWord:
       begin
         TempFieldVar := TIntegerFieldVar.Create(FieldInfo);
         TempFieldVar.FExprWord := DefineIntegerVariable(VarName, TempFieldVar.FieldVal);
@@ -402,6 +418,11 @@ begin
         TempFieldVar := TDateTimeFieldVar.Create(FieldInfo);
         TempFieldVar.FExprWord := DefineDateTimeVariable(VarName, TempFieldVar.FieldVal);
       end;
+    ftBCD:
+      begin
+        TempFieldVar := TBCDFieldVar.Create(FieldInfo);
+        TempFieldVar.FExprWord := DefineFloatVariable(VarName, TempFieldVar.FieldVal);
+      end;
   else
     raise EDatabaseError.CreateFmt(SErrIndexBasedOnInvField, [VarName,Fieldtypenames[FieldInfo.DataType]]);
   end;