悖论BCD字段-数字超出范围错误

问题描述

我正在尝试使用旧的Delphi XE6应用程序更新旧的Paradox(BDE)表。一个特定的表有两个字段。日期字段和BCD字段。由于BCD(FuelSur)字段抛出“数字超出范围”错误,因此无法将新记录发布到(FuelSurch)表中。

所以我写了一个快速测试,但仍然是同样的问题。这是FuelSurch表字段的规格。

enter image description here

我刚刚在表单中添加了一个按钮,点击此过程就会触发。

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()返回小数点分隔符之前的位数,这有点令人困惑。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...