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 -
This commit is contained in:
lacak 2015-12-01 07:45:54 +00:00
parent 11dd843f77
commit e0ee5c30bf

View File

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