¿Y no será que el problema está en la traducción de un TBCD al Variant? De la ayuda leo que existen estas funciones sobrecargadas:
Código Delphi
[-]procedure VarFMTBcdCreate(var aDest: Variant; const ABcd: TBcd); overload;
function VarFMTBcdCreate: Variant; overload;
function VarFMTBcdCreate(const ABcd: TBcd): Variant; overload;
function VarFMTBcdCreate(const AValue: string, Precision, Scale: SmallInt): Variant; overload;
function VarFMTBcdCreate(const AValue: Double; Precision: SmallInt = 18; Scale: SmallInt = 4): Variant; overload;
Pero en tu código tu haces simplemente esto:
Código Delphi
[-]V := VarFMTBcdCreate (149.88)
Por lo que utilizas esta:
Código Delphi
[-]function VarFMTBcdCreate(const AValue: Double; Precision: SmallInt = 18; Scale: SmallInt = 4): Variant;
Si tu idea es tener una representación TBCD desde un Double, ¿porqué no directamente emplear DoubleToBCD?. Nos evitamos trabajar con el Variant en formato TBCD:
Código Delphi
[-]function DoubleToBcd( const aValue: Double): TBcd; overload;
procedure DoubleToBcd( const aValue: Double, var bcd: TBcd; overload;
En el TFMTBCDField cuando uno trabaja con el AsCurrency internamente hace las conversiones desde el Double. Por ejemplo, al leer la propiedad se invoca a GetAsCurrency:
Código Delphi
[-]function TFMTBCDField.GetAsCurrency: Currency;
begin
Result := GetAsFloat;
end;
Lo que se vé que utiliza al tipo Double para hacer el trabajo:
Código Delphi
[-]function TFMTBCDField.GetAsFloat: Double;
var
bcd: TBcd;
begin
if not GetValue(bcd) then
Result := 0
else
Result := BcdToDouble(bcd);
end;
Por tanto.
Hasta el momento yo no he utilizado Variant. Me manejo con las propiedades AsTipoConcreto, como en este caso el que tu dices, AsCurrency. De todas formas a tener en cuenta esto.
Saludos,