使用Delphi 2005,我有一個TwwDBGrid(InfoPower),允許用戶選擇零件數量來生成報價。部分選擇過程是允許用戶爲由DiscountAmount和DiscountType組成的每個部分添加折扣。 DiscountAmount是折扣金額,DiscountType是折扣金額類型(折扣,折扣或平價)。這些數據保存在一個名爲ClientDataSetParts的ClientDataSet中。OnCalcFields導致StackOverflow
在OnCalc方法(ClientDataSetPartsCalcFields)中,我有以下代碼將根據零件成本和任何折扣重新計算TotalPrice。 RangePricing在其中一個價格是基於數量的範圍內(即,1-100 = $ 100 101-200 = $ 150等)內計算的情況下使用:
procedure TfrmCustom_Services.ClientDataSetPartsCalcFields(
DataSet: TDataSet);
begin
inherited;
// if part is selected then calculate Total
if (ClientDataSetPartsSelected.Value) then begin
// if range pricing is defined
if (ClientDataSetParts.FieldByName('RangePricing').AsBoolean) then begin
ClientDataSetParts.FieldByName('TotalPrice').Value :=
ClientDataSetParts.FieldbyName('UnitPrice').Value;
// otherwise use regular pricing
end else begin
ClientDataSetParts.FieldByName('TotalPrice').Value :=
ClientDataSetParts.FieldbyName('UnitPrice').Value *
ClientDataSetParts.FieldByName('Quantity').Value;
end;
// otherwise clear the Total
end else begin
ClientDataSetParts.FieldByName('TotalPrice').Clear;
if (ClientDataSetParts.FieldByName('Quantity').Value <> null) then
ClientDataSetParts.FieldByName('Quantity').Clear;
if (ClientDataSetParts.FieldByName('DiscountAmount').Value <> null) then
ClientDataSetParts.FieldByName('DiscountAmount').Clear;
if (ClientDataSetParts.FieldByName('DiscountType').Value <> null) then
ClientDataSetParts.FieldByName('DiscountType').Clear;
end;
// Update totals if Discount is applied
// Only recalculate if both discount value and type are applied
// otherwise will constantly get errors when switching fields
if ((ClientDataSetPartsDiscountAmount.Value > 0) and (ClientDataSetPartsDiscountType.Value <> '')) then begin
case StringToCaseSelect((ClientDataSetPartsDiscountType.Value), ['% Disc','$ Disc','Price']) of
0 :
begin
ClientDataSetParts.FieldByName('DiscountDollarAmount').Value :=
ClientDataSetParts.FieldByName('TotalPrice').Value * (ClientDataSetParts.FieldByName('DiscountAmount').Value/100);
ClientDataSetPartsTotalPrice.Value := ClientDataSetPartsTotalPrice.Value - (ClientDataSetPartsTotalPrice.Value * (ClientDataSetPartsDiscountAmount.Value/100));
end;
1 :
begin
ClientDataSetParts.FieldByName('DiscountDollarAmount').Value := ClientDataSetPartsDiscountAmount.Value;
ClientDataSetPartsTotalPrice.Value := ClientDataSetPartsTotalPrice.Value - ClientDataSetPartsDiscountAmount.Value;
end;
2 :
begin
ClientDataSetParts.FieldByName('DiscountDollarAmount').Value :=
ClientDataSetPartsTotalPrice.Value - ClientDataSetPartsDiscountAmount.Value;
ClientDataSetPartsTotalPrice.Value := ClientDataSetPartsDiscountAmount.Value;
end;
end;
end;
end;
問題是當我嘗試計算DiscountDollarAmount(折扣的實際美元數字,我必須通過API返回到外部來源)。每次我設置ClientDataSetParts.FieldByName('DiscountDollarAmount')。值時,ClientDataSetPartsCalcFields被再次調用,導致無盡的調用並最終導致堆棧溢出。
如何在不遞迴調用ClientDataSetPartsCalcFields的情況下更新此值?
您是否嘗試過將AutoCalcFields設置爲false? –
不改變任何東西。 – BrianKE
好的。但是請閱讀關於'AutoCalcFields'的文檔,或許它會提供一些見解。 –