我有一个带有计算字段的dbGrid ...是否有任何解决方案可以在计算字段中添加不同的表达式? (每行都有自己的表达式)
答案 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
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)
不,但您可以在表格中包含多个计算字段,并根据条件显示/隐藏它们。