问题描述
我正在尝试使用旧的Delphi XE6应用程序更新旧的Paradox(BDE)表。一个特定的表有两个字段。日期字段和BCD字段。由于BCD(FuelSur)字段抛出“数字超出范围”错误,因此无法将新记录发布到(FuelSurch)表中。
所以我写了一个快速测试,但仍然是同样的问题。这是FuelSurch表字段的规格。
我刚刚在表单中添加了一个按钮,点击此过程就会触发。
procedure TTestForm.BCDTestBtnClick(Sender: TObject);
var
Bcd: TBcd;
begin
POE_Data.FuelSurch.Open;
POE_Data.FuelSurch.Insert;
Bcd:= StrToBcd('2.01');
showMessage('Bcd = ' + BcdToStr(Bcd)); // This works and shows 'Bcd = 2.01'
POE_Data.FuelSurchFuelSur.AsBCD := Bcd; // Line produces "Number is out of range." error
POE_Data.FuelSurch.Post;
POE_Data.FuelSurch.Close;
end;
数据库连接被确认与我能够发布到其他表一样好。似乎BCD字段类型给我带来了问题。
在将字符串分配给Bcd变量之前,是否需要以其他方式设置字符串格式?
解决方法
内部BCD的精度是总数的位数,而不是小数点分隔符之后的位数。
它始终是偶数(奇数时加1)。原因是一个字节存储2位数字。
因此,如果您尝试这样做:
procedure TForm1.Button1Click(Sender: TObject);
var
Bcd: TBCD;
begin
Bcd := StrToBcd('2.01',TFormatSettings.Invariant);
ShowMessage(IntToStr(Bcd.Precision));
end;
您将看到4,因为使用了3位数字,加上1使其成为偶数。
您的字段精度仅为2。如果它与TBCD.Precision
相同,则还不够。
请注意,BcdPrecision()
返回小数点分隔符之前的位数,这有点令人困惑。