现在我用的计算字段中有查询语句因此在数据量超过500条的时候就打开的很慢了.而我发现在计算字段在很多条件下都会触发计算,而且计算都是重新计算一次的,我怎样才可以让计算字段只计算当前操作的记录不去计算所有的记录
我在计算字段中的语句为:用的是BDE
 
procedure TfrmSettlement.qyDetailsCalcFields(DataSet: TDataSet);
var str: string;
  mQuery: TQuery;
begin
  if FCalculated = true then exit;
  if (qyDetails.State in [dsedit, dsinsert]) then Exit;
  mQuery := gObjFactory.CreateQuery(GetDB);//建立query 
  str := 'select InvoiceNo, PolicyNo ,OldSettle, SettleAmount,Currency,Amount from T_ApInvoice where ';
  str := str + ' InvoiceNo=''' + qyDetails.fieldbyname('InvoiceNo').AsString + '''';
  with mQuery do
  begin
    close;
    sql.Clear;
    sql.Add(str);
    open;
  end;
  DataSet.FieldByName('CAmount').AsCurrency := mQuery.fieldbyname('Amount').AsCurrency;
  DataSet.FieldByName('CSettleAmount').AsCurrency := mQuery.fieldbyname('SettleAmount').AsCurrency;
  DataSet.FieldByName('CPolicyNo').asstring := mQuery.fieldbyname('PolicyNo').asstring;
  DataSet.FieldByName('Coldsettle').AsCurrency := mQuery.fieldbyname('oldsettle').AsCurrency;
  DataSet.FieldByName('Ccurrency').asstring := mQuery.fieldbyname('currency').asstring;
  if (copy(qyDetails.fieldbyname('InvoiceNo').AsString, 1, 3) = 'DIN') or (copy(qyDetails.fieldbyname('InvoiceNo').AsString, 1, 3) = 'CIN') then
  begin
    DataSet.FieldByName('CalcuOutstanding').AsCurrency :=
      DataSet.FieldByName('CAmount').AsCurrency -
      DataSet.FieldByName('CSettleAmount').AsCurrency -
      DataSet.FieldByName('Coldsettle').AsCurrency;    DataSet.FieldByName('CalcuADJustment').AsCurrency :=
      DataSet.FieldByName('PaymentAmount').AsCurrency -
      DataSet.FieldByName('Exchange').AsCurrency -
      DataSet.FieldByName('SettleAmount').AsCurrency;
  end;
  mQuery.Close;
  mQuery.Free;
end;