计算字段

时间:2016-12-18 07:55:43

标签: delphi

我有一个带有计算字段的dbGrid ...是否有任何解决方案可以在计算字段中添加不同的表达式? (每行都有自己的表达式)

3 个答案:

答案 0 :(得分:4)

  

是否有任何添加不同表达的解决方案

这取决于你所说的“添加”。你当然可以改变表达方式 用于根据其他字段中的值计算字段的值 在数据行中。例如,给定带有字段

的订单数据集
OrderTotal : TFloatField;  //  type = fkCalculated
OrderDiscount : TFloatField;  //  type = fkData
OrderCashPayment : TBooleanField;  //  type = fkData
OrderPricePerUnit : TFloatField;  //  type = fkData
OrderShipping : TFloatField;  //  type = fkData
OrderUnits: TIntegerField;  //  type = fkData

然后你可以

procedure DataModule1.OrderCalcFields(DataSet : TDataSet);
begin
  if OrderCashPayment.AsBoolean then begin
    //  don't charge for shipping
    OrderTotal.AsFloat := OrderPricePerUnit.AsFloat * (1 -  OrderDiscount.AsFloat)
  end
  else begin
    OrderTotal.AsFloat := OrderPricePerUnit.AsFloat * (1 - OrderDiscount.AsFloat) +
      + OrderShipping.AsFloat;
  end;
end;

另一方面,如果你问的是用于计算的表达式 一个字段的值可以在运行时更改,答案也是“是”,但你 必须要小心你是如何做到这一点,以避免影响性能太多。您 可以使用一个可用于Delphi的表达式 - 赋值器对象 评估作为文本字符串提供的表达式,最好是一个 仅在表达式(表达式)发生更改和构建时才解析表达式 在每个OnCalcFields事件中重复评估的表达式树。免费软件Jedi库包括一个Pascal解释器,可用于运行时表达式评估,并允许表达式包含从例如字段值,但我无法回想它是否可以只执行一次表达式树的构建。

答案 1 :(得分:0)

您必须使用函数根据字段的值计算表达式 例如,我们要将名为 Tax 的字段添加到 dbdemos.mdb 的表 employee 中,并根据 Salary

  1. 创建新的VCL项目
  2. TADOTable TDataSource TDBGrid 添加到您的表单和" wire"它们
  3. ConnectionString 分配给 ADOTable1
  4. Float 类型的新计算字段添加到 ADOTable1 并将其命名为 Tax
  5. 转到 ADOTable1 事件,然后双击 OnCalcFields 并添加以下事件处理程序:
  6. procedure TForm1.ADOTable1CalcFields(DataSet: TDataSet);
      var
        nSalary, nTax: Double;
    begin
      nSalary := ADOTable1Salary.AsFloat;
      if nSalary < 30000 then
        nTax := 10
      else if nSalary < 40000 then
        nTax := 20
      else
        nTax := 30;
      ADOTable1Tax.AsFloat := nSalary * nTax / 100;
    end;
    

答案 2 :(得分:-1)

不,但您可以在表格中包含多个计算字段,并根据条件显示/隐藏它们。