【问题标题】:Number is out of range error in Delphi XEDelphi XE中的数字超出范围错误
【发布时间】:2014-12-02 02:51:18
【问题描述】:

我正在使用旧的 Paradox 数据库以及我继承的旧 Delphi 程序,当我点击以下语句时,它一直给我一个 Number is out of range 错误:

POE_Data.OrdersTaxRate.AsFloat:= StrToFloat(Copy(TaxRateLabel.Caption, 1,1));

TaxRateLabel.Caption 等于 7%,因此 StrToFloat 只传递了第 7 个字符。 TaxRate 字段在数据库中定义为具有 2 个小数位的 BCD 字段。我没有看到数据库中设置了任何最小值或最大值,那么为什么会产生数字超出范围错误?

【问题讨论】:

  • 数据库中 OrdersTaxRate 字段的类型?例如,对于 Postgres,不可能将大于 0.99 的值分配给类型为 numeric(2,2) 的字段,因为(我记得)类型声明中的第一个参数是值的位数的总数(包括精度)。
  • OrdersTaxRate 是一个带有 2 位小数的 BCD 字段。
  • 不幸的是,我对 Paradox 并不熟悉(实际上我几乎忘记了它们)。所以,这不是答案,只是提示:尝试这两个代码 sn-ps:POE_Data.OrdersTaxRate.AsFloat := 0.1;POE_Data.OrdersTaxRate.AsFloat := 1.0; 如果第一个有效,第二个无效 - 您在数据类型方面遇到了一些问题。
  • 还有一个提示:尝试使用POE_Data.OrdersTaxRate.Value 而不是POE_Data.OrdersTaxRate.AsFloat
  • 我尝试了上面所有的建议,但没有一个奏效。我检查了数据库中的其他记录,它们的值似乎是 7.00。

标签: delphi delphi-xe6 paradox


【解决方案1】:

在更新旧的 C++Builder 项目时,我遇到了类似的问题。解决方案是将 Source\data\Data.DB.pas 文件复制到项目的代码文件夹中,然后进行以下代码更改:

procedure TBCDField.SetAsCurrency(Value: Currency);
begin
  if FCheckRange and ((Value < FMinValue) or (Value > FMaxValue)) then
    RangeError(Value, FMinValue, FMaxValue);
//  if FIOBuffer <> nil then
//    TDBBitConverter.UnsafeFrom<System.Currency>(Value, FIOBuffer);
//  SetData(FIOBuffer, False);
  SetData(@Value, False);    // replaces the lines above
end;                         // so can TField.AsBCD

然后将修改后的 Data.DB.pas 文件添加到您的项目中并重建您的项目。

【讨论】:

    【解决方案2】:

    在 Delphi XE 中有一个 AsBcd 属性。您可以将它与 StrToBcd 函数一起使用,该函数将字符串转换为TBcd

    POE_Data.OrdersTaxRate.AsBcd:= StrToBcd(Copy(TaxRateLabel.Caption, 1,1));
    

    【讨论】:

    • 当我使用上面的行时,我得到一个未声明的标识符:'StrToBcd' 错误。我需要在“用途”部分中包含一些内容吗?
    • 我认为是FMTBcd。你检查过帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2022-11-26
    • 2015-05-27
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多