【问题标题】:Paradox BCD field - Number is out of Range errorParadox BCD 字段 - 数字超出范围错误
【发布时间】:2020-12-30 05:49:39
【问题描述】:

我正在尝试使用旧的 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 变量之前,是否需要对字符串进行不同的格式化?

【问题讨论】:

  • 在将近六年前的the same question 中,您接受了一个答案,看来您正在这里的代码中进行调整。也许应用程序不一样,但两者之间仍然发生了变化。另一个答案建议更改 Data.DB.pas 文件。你试过吗?我们是否应该将这个问题作为重复问题结束?
  • @TomBrunberg - 有点相似,但有点不同,因为您引用的代码使用的是税率和 asFloat。我现在只是试图隔离将字符串放入 Paradox 表中的 BCD 字段。我没有看到对 Data.DB.pas 的引用。我需要在我的使用中包含它吗?
  • 再想一想,我认为这是格式问题。你的电脑里有什么小数分隔符?
  • @TomBrunberg - 一段时期
  • 好吧,那不是小数点分隔符(你自己的showmessage() 测试已经确认了)。我假设 Paradox 机器(如果是另一台机器)也设置了句点作为小数分隔符,是吗? Data.DB.pas 修改是在您之前 6 岁问题的第二个答案中提出的。我没有检查它,因此不认可它。

标签: delphi delphi-xe bcd paradox


【解决方案1】:

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

【讨论】:

  • 它不喜欢那样。它表明“TFormatSettings”不包含名为“Invariant”的成员。 E2003 未声明的标识符:“不变”。
  • @Hackbrew 如果您的 Delphi 版本不支持它,您可以将其删除。其目的是将点设置为小数点分隔符。
  • 由于我的字段精度只有2,我怎么能在'11.4 or 10.2'的数据库中有这个字段的条目呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2013-09-25
  • 2015-01-19
相关资源
最近更新 更多