瀏覽代碼

Bug #901 不允许新增编号为0的工料
重构计量台账&台账分解的树,以解决在计量台账处升降级树节点,实时计算的问题,并修复,计量台账处随控件编译偶尔报错的问题。

MaiXinRong 9 年之前
父節點
當前提交
fda6411786

+ 2 - 2
DataModules/BillsBookmarkDm.pas

@@ -92,14 +92,14 @@ end;
 procedure TBillsBookmarkData.sdvStageBookmarkFilterRecord(
   ARecord: TsdDataRecord; var Allow: Boolean);
 var
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
   StageRec: TsdDataRecord;
 begin
   if (TProjectData(FProjectData).ProjProperties.PhaseCount > 0) and
      (TProjectData(FProjectData).PhaseData.Active) then
   begin
     with TProjectData(FProjectData).BillsMeasureData do
-      vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
+      vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
     if Assigned(vNode) then
     begin
       StageRec := vNode.StageRec;

+ 4 - 5
DataModules/BillsCompileDm.pas

@@ -25,7 +25,7 @@ type
   private
     FProjectData: TObject;
     FBillsData: TBillsData;
-    FBillsCompileTree: TBillsIDTree;
+    FBillsCompileTree: TCompileBillsIDTree;
 
     FOnRecChange: TRecChangeEvent;
 
@@ -92,7 +92,7 @@ type
 
     property ProjectData: TObject read FProjectData;
     property BillsData: TBillsData read FBillsData;
-    property BillsCompileTree: TBillsIDTree read FBillsCompileTree;
+    property BillsCompileTree: TCompileBillsIDTree read FBillsCompileTree;
     property Active: Boolean read GetActive;
 
     property OnRecChange: TRecChangeEvent read FOnRecChange write SetOnRecChange;
@@ -112,7 +112,7 @@ begin
   inherited Create(nil);
   FProjectData := AProjectData;
   FBillsData := TProjectData(FProjectData).BillsData;
-  FBillsCompileTree := TBillsIDTree.Create;
+  FBillsCompileTree := TCompileBillsIDTree.Create;
   FBillsCompileTree.KeyFieldName := 'ID';
   FBillsCompileTree.ParentFieldName := 'ParentID';
   FBillsCompileTree.NextSiblingFieldName := 'NextSiblingID';
@@ -120,8 +120,7 @@ begin
   FBillsCompileTree.AutoExpand := True;
   FBillsCompileTree.DataView := sdvBillsCompile;
   FBillsCompileTree.SeedID := Max(FBillsCompileTree.SeedID, 100);
-  FBillsCompileTree.DoOnAfterDeleteNode := DoOnAfterDeleteNode;
-  FBillsCompileTree.OnReCalcParent := Calculate;
+  FBillsCompileTree.OnReCalcNode := Calculate;
 end;
 
 destructor TBillsCompileData.Destroy;

+ 13 - 12
DataModules/BillsMeasureDm.pas

@@ -25,7 +25,7 @@ type
   private
     FProjectData: TObject;
     FBillsData: TBillsData;
-    FBillsMeasureTree: TBillsIDTree;
+    FBillsMeasureTree: TMeasureBillsIDTree;
 
     FFormulaCalc: TFormulaCalc;
     FShowParentData: Boolean;
@@ -39,7 +39,7 @@ type
     function SelectAndUpdateBGL(ABillsID: Integer; ARec: TsdDataRecord;
       ANewValue: Double; const AType: string): Boolean;
 
-    procedure CalculateNode(ANode: TBillsIDTreeNode);
+    procedure CalculateNode(ANode: TMeasureBillsIDTreeNode);
     procedure UpdateRecordGather(ANode: TsdIDTreeNode; AQuantity, ATotalPrice: Double);
 
     function GetStageData: TStageData;
@@ -73,7 +73,7 @@ type
 
     property ProjectData: TObject read FProjectData;
     property BillsData: TBillsData read FBillsData;
-    property BillsMeasureTree: TBillsIDTree read FBillsMeasureTree;
+    property BillsMeasureTree: TMeasureBillsIDTree read FBillsMeasureTree;
 
     property StageData: TStageData read GetStageData;
     property ShowParentData: Boolean read FShowParentData write FShowParentData;
@@ -95,7 +95,7 @@ begin
   inherited Create(nil);
   FProjectData := AProjectData;
   FBillsData := TProjectData(FProjectData).BillsData;
-  FBillsMeasureTree := TBillsIDTree.Create;
+  FBillsMeasureTree := TMeasureBillsIDTree.Create;
   FBillsMeasureTree.KeyFieldName := 'ID';
   FBillsMeasureTree.ParentFieldName := 'ParentID';
   FBillsMeasureTree.NextSiblingFieldName := 'NextSiblingID';
@@ -104,6 +104,7 @@ begin
   FBillsMeasureTree.DataView := sdvBillsMeasure;
   FBillsMeasureTree.SeedID := Max(FBillsMeasureTree.SeedID, 100);
   FBillsMeasureTree.Link(TProjectData(FProjectData).BillsCompileData.BillsCompileTree, True);
+  FBillsMeasureTree.CompileTree := TProjectData(FProjectData).BillsCompileData.BillsCompileTree;
 
   FFormulaCalc := TFormulaCalc.Create(FBillsMeasureTree);
   FFormulaCalc.OnGetValue := OnGetCardinalNum;
@@ -445,7 +446,7 @@ end;
 procedure TBillsMeasureData.sdvBillsMeasureNeedLookupRecord(
   ARecord: TsdDataRecord; AColumn: TsdViewColumn; ANewText: String);
 
-  function CheckNeedAddPhaseRecord(ANode: TBillsIDTreeNode): Boolean;
+  function CheckNeedAddPhaseRecord(ANode: TMeasureBillsIDTreeNode): Boolean;
   begin
     Result := SameText(AColumn.FieldName, 'CurDealQuantity') or
               SameText(AColumn.FieldName, 'CurQcQuantity') or
@@ -574,9 +575,9 @@ procedure TBillsMeasureData.sdvBillsMeasureNeedLookupRecord(
 
 var
   NewRec: TStageRecord;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
-  vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
+  vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
   if not CheckNodeWritable(vNode) then
     Exit;
 
@@ -697,7 +698,7 @@ begin
   if not TProjectData(FProjectData).StageDataReadOnly then
 
   for i := 0 to BillsMeasureTree.Count - 1 do
-    CalculateNode(TBillsIDTreeNode(BillsMeasureTree.Items[i]));
+    CalculateNode(TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]));
 
   {Cacl := TBillsCalculate.Create(Self);
   try
@@ -828,7 +829,7 @@ begin
   for iIndex := 0 to BillsMeasureTree.Count - 1 do
   begin
     stnNode := BillsMeasureTree.Items[iIndex];
-    StageRec := TBillsIDTreeNode(stnNode).StageRec;
+    StageRec := TMeasureBillsIDTreeNode(stnNode).StageRec;
     if (stnNode.ParentID <> -1) then
       if Assigned(StageRec) then
         stnNode.Expanded := StageRec.GatherTotalPrice.AsFloat <> 0
@@ -939,12 +940,12 @@ end;
 procedure TBillsMeasureData.ResetTreeNodeStageRec;
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   if not StageData.Active then Exit;
   for i := 0 to BillsMeasureTree.Count - 1 do
   begin
-    vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
+    vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
     vNode.StageRec := StageData.StageRecord(vNode.ID);
   end;
 end;
@@ -961,7 +962,7 @@ begin
   UpdateRecordPM(stnNode.ParentID, ADiffer);
 end;
 
-procedure TBillsMeasureData.CalculateNode(ANode: TBillsIDTreeNode);
+procedure TBillsMeasureData.CalculateNode(ANode: TMeasureBillsIDTreeNode);
 begin
   if Assigned(ANode.StageRec) then
   begin

+ 15 - 3
DataModules/ProjectGLDm.pas

@@ -360,7 +360,7 @@ var
   fQuantity: Double;
   i: Integer;
   GLRec: TsdDataRecord;
-  BillsNode: TBillsIDTreeNode;
+  BillsNode: TMeasureBillsIDTreeNode;
 begin
   vGLs := TList.Create;
   try
@@ -372,7 +372,7 @@ begin
     begin
       GLRec := TsdDataRecord(vGLs.Items[i]);
       with TProjectData(FProjectData).BillsMeasureData do
-        BillsNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GLRec.ValueByName('BillsID').AsInteger));
+        BillsNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(GLRec.ValueByName('BillsID').AsInteger));
       if Assigned(BillsNode.StageRec) then
         fQuantity := fQuantity + BillsNode.StageRec.GatherQuantity.AsFloat * GLRec.ValueByName('Quantity').AsFloat;
     end;
@@ -485,7 +485,9 @@ procedure TProjectGLData.sdvProjectGLSetText(var Text: String;
   var Allow: Boolean);
 var
   iPhaseID: Integer;
+  Rec: TProjectGLRecord;
 begin
+  Rec := TProjectGLRecord(ARecord);
   if SameText(AColumn.FieldName, 'Code') or
      SameText(AColumn.FieldName, 'Name') or
      SameText(AColumn.FieldName, 'Units') or
@@ -493,7 +495,7 @@ begin
      SameText(AColumn.FieldName, 'BasePrice') or
      SameText(AColumn.FieldName, 'RiskRange') then
   begin
-    iPhaseID := TProjectGLRecord(ARecord).LockedPhaseID.AsInteger;
+    iPhaseID := Rec.LockedPhaseID.AsInteger;
     if iPhaseID > 0 then
       DataSetErrorMessage(Allow, Format('该工料在第%d期已进行调差计算,不可修改基础数据。', [iPhaseID]));
   end;
@@ -501,6 +503,16 @@ begin
   if AValue.DataType in [ftInteger, ftFloat] then
     if not CheckNumeric(Text) then
       Text := '';
+
+  if SameText(AColumn.FieldName, 'Code') then
+  begin
+    if StrToIntDef(Text, 0) = 0 then
+    begin
+      DataSetErrorMessage(Allow, '编号不可为0。');
+      if Rec.Code.AsString = '' then
+        sddProjectGL.Remove(ARecord);
+    end
+  end;
 end;
 
 procedure TProjectGLData.LoadStagePM_CalcData;

+ 7 - 7
DataModules/ReportMemoryDm/rmHaBaiCustomizedDm.pas

@@ -156,7 +156,7 @@ type
     constructor Create(AProjectCount: Integer);
     destructor Destroy;
 
-    function AddGclNode(ANode: TBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
+    function AddGclNode(ANode: TMeasureBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
 
     procedure ReCalculateTotalPrice;
     procedure Calculate;
@@ -431,14 +431,14 @@ end;
 procedure TrmHaBaiCustomizedData.FilterGcl(AProjectIndex: Integer);
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
   GclNode: TGclNode;
 begin
   with FProjectData.BillsMeasureData do
   begin
     for i := 0 to BillsMeasureTree.Count - 1 do
     begin
-      vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
+      vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
       if not vNode.HasChildren and (vNode.Rec.B_Code.AsString <> '') then
         GclNode := FGclControl.AddGclNode(vNode, AProjectIndex);
     end;
@@ -830,7 +830,7 @@ end;
 
 procedure TrmHaBaiCustomizedData.WriteFlowData;
 
-  procedure AddNodeData(ANode: TBillsIDTreeNode);
+  procedure AddNodeData(ANode: TMeasureBillsIDTreeNode);
   begin
     cdsCustom14.Append;
     cdsCustom14IndexCode.AsString := ANode.Rec.IndexCode.AsString;
@@ -848,11 +848,11 @@ procedure TrmHaBaiCustomizedData.WriteFlowData;
 
 var
   iIndex: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   for iIndex := 0 to FProjectData.BillsMeasureData.BillsMeasureTree.Count - 1 do
   begin
-    vNode := TBillsIDTreeNode(FProjectData.BillsMeasureData.BillsMeasureTree.Items[iIndex]);
+    vNode := TMeasureBillsIDTreeNode(FProjectData.BillsMeasureData.BillsMeasureTree.Items[iIndex]);
     if (not vNode.HasChildren) and (vNode.Rec.B_Code.AsString <> '') and
         Assigned(vNode.StageRec) and (vNode.StageRec.GatherTotalPrice.AsFloat <> 0) then
       AddNodeData(vNode);
@@ -912,7 +912,7 @@ end;
 
 { TGclControl }
 
-function TGclControl.AddGclNode(ANode: TBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
+function TGclControl.AddGclNode(ANode: TMeasureBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
 begin
   Result := FindGclNode(ANode.Rec);
   if not Assigned(Result) then

+ 8 - 8
DataModules/SearchDm.pas

@@ -25,7 +25,7 @@ type
   private
     FProjectData: TObject;
 
-    procedure AddSearchResult(ANode: TBillsIDTreeNode);
+    procedure AddSearchResult(ANode: TMeasureBillsIDTreeNode);
   public
     constructor Create(AProjectData: TObject);
     destructor Destroy; override;
@@ -49,7 +49,7 @@ uses
 
 { TSearchData }
 
-procedure TSearchData.AddSearchResult(ANode: TBillsIDTreeNode);
+procedure TSearchData.AddSearchResult(ANode: TMeasureBillsIDTreeNode);
 begin
   if not Assigned(ANode) then Exit;
 
@@ -127,7 +127,7 @@ end;
 procedure TSearchData.SearchKeyword(const AKeyword: string);
 var
   iNode: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   if AKeyword = '' then Exit;
 
@@ -138,7 +138,7 @@ begin
     begin
       for iNode := 0 to BillsMeasureTree.Count - 1 do
       begin
-        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[iNode]);
+        vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[iNode]);
         if (Pos(AKeyword, vNode.Rec.B_Code.AsString) > 0) or
             (Pos(AKeyword, vNode.Rec.Name.AsString) > 0) then
           AddSearchResult(vNode);
@@ -152,7 +152,7 @@ end;
 procedure TSearchData.SearchOverRange;
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   cdsSearch.DisableControls;
   try
@@ -161,7 +161,7 @@ begin
     begin
       for i := 0 to BillsMeasureTree.Count - 1 do
       begin
-        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
+        vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
         if not vNode.HasChildren then
           if vNode.Rec.Quantity.AsFloat < vNode.Rec.AddDealQuantity.AsFloat then
             AddSearchResult(vNode);
@@ -184,7 +184,7 @@ end;
 procedure TSearchData.SearchBelowRange;
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   cdsSearch.DisableControls;
   try
@@ -193,7 +193,7 @@ begin
     begin
       for i := 0 to BillsMeasureTree.Count - 1 do
       begin
-        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
+        vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
         if not vNode.HasChildren then
           if vNode.Rec.Quantity.AsFloat > vNode.Rec.AddDealQuantity.AsFloat then
             AddSearchResult(vNode);

+ 11 - 11
DataModules/StageDm.pas

@@ -44,9 +44,9 @@ type
     procedure CalculateQuantityChange(ABillsID: Integer);
     procedure CalculatePriceChange(ABillsID: Integer);
 
-    procedure CalculateParent(ANode: TBillsIDTreeNode);
-    procedure CalculateLeaf(ANode: TBillsIDTreeNode);
-    procedure CalculateSpecialLeaf(ANode: TBillsIDTreeNode);
+    procedure CalculateParent(ANode: TMeasureBillsIDTreeNode);
+    procedure CalculateLeaf(ANode: TMeasureBillsIDTreeNode);
+    procedure CalculateSpecialLeaf(ANode: TMeasureBillsIDTreeNode);
 
     function GetTotalPrice(ABillsID, AType, AStageIndex: Integer): Double;
 
@@ -654,22 +654,22 @@ begin
   if ANode.HasChildren then
   begin
     CalculateNode(ANode.FirstChild);
-    CalculateParent(TBillsIDTreeNode(ANode));
+    CalculateParent(TMeasureBillsIDTreeNode(ANode));
   end
   else
   begin
     if IsSpecialNode then
-      CalculateSpecialLeaf(TBillsIDTreeNode(ANode))
+      CalculateSpecialLeaf(TMeasureBillsIDTreeNode(ANode))
     else
-      CalculateLeaf(TBillsIDTreeNode(ANode));
+      CalculateLeaf(TMeasureBillsIDTreeNode(ANode));
   end;
   CalculateNode(ANode.NextSibling);
 end;
 
-procedure TStageData.CalculateParent(ANode: TBillsIDTreeNode);
+procedure TStageData.CalculateParent(ANode: TMeasureBillsIDTreeNode);
 var
   iChild: Integer;
-  ChildNode: TBillsIDTreeNode;
+  ChildNode: TMeasureBillsIDTreeNode;
   fDeal, fQc, fPc, fPM: Double;
 begin
   if not Assigned(ANode.StageRec) then Exit;
@@ -680,7 +680,7 @@ begin
   fPM := 0;
   for iChild := 0 to ANode.ChildCount - 1 do
   begin
-    ChildNode := TBillsIDTreeNode(ANode.ChildNodes[iChild]);
+    ChildNode := TMeasureBillsIDTreeNode(ANode.ChildNodes[iChild]);
     if not Assigned(ChildNode.StageRec) then Continue;
     fDeal := TotalPriceRoundTo(fDeal + ChildNode.StageRec.DealTotalPrice.AsFloat);
     fQc := TotalPriceRoundTo(fQc + ChildNode.StageRec.QcTotalPrice.AsFloat);
@@ -710,7 +710,7 @@ begin
   end;
 end;
 
-procedure TStageData.CalculateLeaf(ANode: TBillsIDTreeNode);
+procedure TStageData.CalculateLeaf(ANode: TMeasureBillsIDTreeNode);
 
   procedure CalculateMeasure(ARec: TsdDataRecord; const AType: string);
   begin
@@ -931,7 +931,7 @@ begin
   end;
 end;
 
-procedure TStageData.CalculateSpecialLeaf(ANode: TBillsIDTreeNode);
+procedure TStageData.CalculateSpecialLeaf(ANode: TMeasureBillsIDTreeNode);
 
   procedure GatherPriceMargin(ARec: TStageRecord);
   begin

+ 6 - 6
Frames/BillsMeasureFme.pas

@@ -190,14 +190,14 @@ end;
 procedure TBillsMeasureFrame.zgBillsMeasureCellGetColor(Sender: TObject; ACoord: TPoint;
   var AColor: TColor);
 var
-  stnNode: TBillsIDTreeNode;
+  stnNode: TMeasureBillsIDTreeNode;
   iCreatePhaseID: Integer;
   StageRec: TStageRecord;
   fDiffer: Double;
 begin
   AColor := clWindow;
   if ACoord.Y > stdBillsMeasure.IDTree.Count + 1 then Exit;
-  stnNode := TBillsIDTreeNode(stdBillsMeasure.IDTree.Items[ACoord.Y - 2]);
+  stnNode := TMeasureBillsIDTreeNode(stdBillsMeasure.IDTree.Items[ACoord.Y - 2]);
   if not Assigned(stnNode) then Exit;
   iCreatePhaseID := stnNode.Rec.CreatePhaseID.AsInteger;
   // ¸ù¾Ý²ã´Îµ×É«²»Í¬
@@ -299,7 +299,7 @@ procedure TBillsMeasureFrame.zgBillsMeasureCellButtonClick(Sender: TObject;
     StageRec: TStageRecord;
   begin
     if not Assigned(ANode) then Exit;
-    StageRec := TBillsIDTreeNode(ANode).StageRec;
+    StageRec := TMeasureBillsIDTreeNode(ANode).StageRec;
     try
       if Assigned(StageRec) then
       begin
@@ -316,7 +316,7 @@ procedure TBillsMeasureFrame.zgBillsMeasureCellButtonClick(Sender: TObject;
         if not Assigned(StageRec) then
         begin
           StageRec := FBillsMeasureData.StageData.AddStageRecord(ANode.ID);
-          TBillsIDTreeNode(ANode).StageRec := StageRec;
+          TMeasureBillsIDTreeNode(ANode).StageRec := StageRec;
         end;
         StageRec.ValueByName(AType + AField).AsFloat := vNewBGL.TotalNum;
         StageRec.ValueByName(AType + 'BGLCode').AsString := vNewBGL.MergedCode;
@@ -433,10 +433,10 @@ end;
 
 procedure TBillsMeasureFrame.actnSetStageBookmarkExecute(Sender: TObject);
 var
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
   StageRec: TStageRecord;
 begin
-  vNode := TBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.Selected);
+  vNode := TMeasureBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.Selected);
   StageRec := vNode.StageRec;
   if not Assigned(StageRec) then
   begin

+ 135 - 33
Units/BillsTree.pas

@@ -6,8 +6,6 @@ uses
   sdIDTree, sdDB, mDataRecord;
 
 type
-  TReCalculateTreeNode = procedure(AID: Integer) of Object;
-
   TBillsIDTreeNode = class(TsdIDTreeNode)
   private
     FDealQuantity: Double;
@@ -19,8 +17,6 @@ type
     FGatherTotalPrice: Double;
     FGatherQuantity: Double;
 
-    FStageRec: TStageRecord;
-
     function HasCountPrice: Boolean;
     function HasTotalPrice: Boolean;
 
@@ -50,16 +46,11 @@ type
     property PcTotalPrice: Double read FPcTotalPrice write FPcTotalPrice;
     property GatherQuantity: Double read FGatherQuantity write FGatherQuantity;
     property GatherTotalPrice: Double read FGatherTotalPrice write FGatherTotalPrice;
-    // Cache Data
-    property StageRec: TStageRecord read FStageRec write FStageRec;
   end;
 
-  TbitAfterDeleteNode = procedure (AParent: TsdIDTreeNode) of object;
+  TReCalculateNode = procedure(AID: Integer) of object;
 
   TBillsIDTree = class(TsdIDTree)
-  private
-    FDoOnAfterDeleteNode: TbitAfterDeleteNode;
-    FOnReCalcParent: TReCalculateTreeNode;
   protected
     function CreateItem: TsdIDTreeNode; override;
   public
@@ -67,10 +58,50 @@ type
     function DeleteNode(ANode: TsdIDTreeNode): Boolean; override;
 
     function Add(AParentID, ANextSiblingID: TsdTreeNodeID): TsdIDTreeNode; override;
-    procedure DoOnReCalcParent(AID: Integer);
 
-    property DoOnAfterDeleteNode: TbitAfterDeleteNode read FDoOnAfterDeleteNode write FDoOnAfterDeleteNode;
-    property OnReCalcParent: TReCalculateTreeNode read FOnReCalcParent write FOnReCalcParent;
+    procedure DoOnReCalcNode(AID: Integer); overload; virtual; abstract;
+    procedure DoOnReCalcNode(ANode: TsdIDTreeNode); overload; virtual; abstract;
+  end;
+
+  TCompileBillsIDTreeNode = class(TBillsIDTreeNode)
+  public
+    function UpLevel: Boolean; override;
+    function DownLevel: Boolean; override;
+  end;
+
+  TCompileBillsIDTree = class(TBillsIDTree)
+  private
+    FOnReCalcNode: TReCalculateNode;
+  protected
+    function CreateItem: TsdIDTreeNode; override;
+  public
+    procedure DoOnReCalcNode(AID: Integer); overload;
+    procedure DoOnReCalcNode(ANode: TsdIDTreeNode); overload;
+
+    property OnReCalcNode: TReCalculateNode read FOnReCalcNode write FOnReCalcNode;
+  end;
+
+  TMeasureBillsIDTreeNode = class(TBillsIDTreeNode)
+  private
+    FStageRec: TStageRecord;
+  public
+    function UpLevel: Boolean; override;
+    function DownLevel: Boolean; override;
+
+    // Cache Data
+    property StageRec: TStageRecord read FStageRec write FStageRec;
+  end;
+
+  TMeasureBillsIDTree = class(TBillsIDTree)
+  private
+    FCompileTree: TCompileBillsIDTree;
+  protected
+    function CreateItem: TsdIDTreeNode; override;
+  public
+    procedure DoOnReCalcNode(AID: Integer); overload;
+    procedure DoOnReCalcNode(ANode: TsdIDTreeNode); overload;
+
+    property CompileTree: TCompileBillsIDTree read FCompileTree write FCompileTree;
   end;
 
   TEstimateIDTreeNode = class(TsdIDTreeNode)
@@ -121,14 +152,7 @@ var
 begin
   vParent := ANode.Parent;
   Result := inherited DeleteNode(ANode);
-  if Assigned(FDoOnAfterDeleteNode) then
-    FDoOnAfterDeleteNode(vParent);
-end;
-
-procedure TBillsIDTree.DoOnReCalcParent(AID: Integer);
-begin
-  if Assigned(FOnReCalcParent) then
-    FOnReCalcParent(AID);
+  DoOnReCalcNode(vParent);
 end;
 
 { TBillsIDTreeNode }
@@ -183,10 +207,7 @@ begin
 end;
 
 function TBillsIDTreeNode.DownLevel: Boolean;
-var
-  iOrgParentID: Integer;
 begin
-  iOrgParentID := ParentID;
   Result := inherited DownLevel;
 
   if not Result then Exit;
@@ -199,9 +220,6 @@ begin
     Parent.Rec.ValueByName('Quantity').AsFloat := 0;
     Parent.Rec.ValueByName('Price').AsFloat := 0;
   end;
-                                                   
-  TBillsIDTree(Owner).OnReCalcParent(ParentID);
-  TBillsIDTree(Owner).OnReCalcParent(iOrgParentID);
 end;
 
 function TBillsIDTreeNode.GetRec: TBillsRecord;
@@ -260,10 +278,7 @@ begin
 end;
 
 function TBillsIDTreeNode.UpLevel: Boolean;
-var
-  iOrgParentID: Integer;
 begin
-  iOrgParentID := ParentID;
   Result := inherited UpLevel;
 
   if not Result then Exit;
@@ -276,9 +291,6 @@ begin
     Rec.ValueByName('Quantity').AsFloat := 0;
     Rec.ValueByName('Price').AsFloat := 0;
   end;
-
-  TBillsIDTree(Owner).OnReCalcParent(iOrgParentID);
-  TBillsIDTree(Owner).OnReCalcParent(ParentID);
 end;
 
 { TEstimateIDTreeNode }
@@ -308,4 +320,94 @@ begin
   Result := TEstimateIDTreeNode.Create(Self);
 end;
 
+{ TCompileBillsIDTree }
+
+procedure TCompileBillsIDTree.DoOnReCalcNode(AID: Integer);
+begin
+  if (AID <> -1) and Assigned(FOnReCalcNode) then
+    FOnReCalcNode(AID);
+end;
+
+function TCompileBillsIDTree.CreateItem: TsdIDTreeNode;
+begin
+  Result := TCompileBillsIDTreeNode.Create(Self);
+end;
+
+procedure TCompileBillsIDTree.DoOnReCalcNode(ANode: TsdIDTreeNode);
+begin
+  if Assigned(ANode) then
+    DoOnReCalcNode(ANode.ID);
+end;
+
+{ TMeasureBillsIDTree }
+
+procedure TMeasureBillsIDTree.DoOnReCalcNode(AID: Integer);
+begin
+  if Assigned(FCompileTree) then
+    FCompileTree.DoOnReCalcNode(AID);
+end;
+
+function TMeasureBillsIDTree.CreateItem: TsdIDTreeNode;
+begin
+  Result := TMeasureBillsIDTreeNode.Create(Self);
+end;
+
+procedure TMeasureBillsIDTree.DoOnReCalcNode(ANode: TsdIDTreeNode);
+begin
+  if Assigned(FCompileTree) then
+    FCompileTree.DoOnReCalcNode(ANode);
+end;
+
+{ TCompileBillsIDTreeNode }
+
+function TCompileBillsIDTreeNode.DownLevel: Boolean;
+var
+  iOrgParentID: Integer;
+begin
+  iOrgParentID := ParentID;
+  Result := inherited DownLevel;
+
+  if not Result then Exit;
+  TCompileBillsIDTree(Owner).DoOnReCalcNode(ParentID);
+  TCompileBillsIDTree(Owner).DoOnReCalcNode(iOrgParentID);
+end;
+
+function TCompileBillsIDTreeNode.UpLevel: Boolean;
+var
+  iOrgParentID: Integer;
+begin
+  iOrgParentID := ParentID;
+  Result := inherited UpLevel;
+
+  if not Result then Exit;
+  TCompileBillsIDTree(Owner).DoOnReCalcNode(iOrgParentID);
+  TCompileBillsIDTree(Owner).DoOnReCalcNode(ParentID);
+end;
+
+{ TMeasureBillsIDTreeNode }
+
+function TMeasureBillsIDTreeNode.DownLevel: Boolean;
+var
+  iOrgParentID: Integer;
+begin
+  iOrgParentID := ParentID;
+  Result := inherited DownLevel;
+
+  if not Result then Exit;
+  TMeasureBillsIDTree(Owner).DoOnReCalcNode(ParentID);
+  TMeasureBillsIDTree(Owner).DoOnReCalcNode(iOrgParentID);
+end;
+
+function TMeasureBillsIDTreeNode.UpLevel: Boolean;
+var
+  iOrgParentID: Integer;
+begin
+  iOrgParentID := ParentID;
+  Result := inherited UpLevel;
+
+  if not Result then Exit;
+  TMeasureBillsIDTree(Owner).DoOnReCalcNode(iOrgParentID);
+  TMeasureBillsIDTree(Owner).DoOnReCalcNode(ParentID);
+end;
+
 end.

+ 4 - 4
Units/GclBillsGatherModel.pas

@@ -371,7 +371,7 @@ type
     function GetGclNode(const AB_Code, AName, AUnits: string; APrice: Double): TGclNode; overload;
     function GetGclNode(ARec: TBillsRecord): TGclNode; overload;
 
-    procedure AddBillsNode(ANode: TBillsIDTreeNode);
+    procedure AddBillsNode(ANode: TMeasureBillsIDTreeNode);
     procedure GatherBillsData;
     procedure GatherDealData;
     procedure GatherBGLData;
@@ -406,7 +406,7 @@ uses
 
 { TGclGatherModel }
 
-procedure TGclGatherModel.AddBillsNode(ANode: TBillsIDTreeNode);
+procedure TGclGatherModel.AddBillsNode(ANode: TMeasureBillsIDTreeNode);
 var
   vGclNode: TGclNode;
   vDetailGclNode: TDetailGclNode;
@@ -589,11 +589,11 @@ end;
 procedure TGclGatherModel.GatherBillsData;
 var
   i: Integer;
-  vNode: TBillsIDTreeNode;
+  vNode: TMeasureBillsIDTreeNode;
 begin
   for i := 0 to FBillsTree.Count - 1 do
   begin
-    vNode := TBillsIDTreeNode(FBillsTree.Items[i]);
+    vNode := TMeasureBillsIDTreeNode(FBillsTree.Items[i]);
     if not vNode.HasChildren and (vNode.Rec.B_Code.AsString <> '') then
       AddBillsNode(vNode);
   end;