Просмотр исходного кода

树结构发生修改时,计算相关调整

MaiXinRong 9 лет назад
Родитель
Сommit
c3fb115a5c
2 измененных файлов с 33 добавлено и 10 удалено
  1. 2 10
      DataModules/BillsCompileDm.pas
  2. 31 0
      Units/BillsTree.pas

+ 2 - 10
DataModules/BillsCompileDm.pas

@@ -27,7 +27,6 @@ type
     FBillsData: TBillsData;
     FBillsCompileTree: TBillsIDTree;
 
-    FBeforeChangeParentID: Integer;
     FOnRecChange: TRecChangeEvent;
 
     function GatherChildrenOrg(ANode: TsdIDTreeNode): Double;
@@ -121,6 +120,7 @@ begin
   FBillsCompileTree.DataView := sdvBillsCompile;
   FBillsCompileTree.SeedID := Max(FBillsCompileTree.SeedID, 100);
   FBillsCompileTree.DoOnAfterDeleteNode := DoOnAfterDeleteNode;
+  FBillsCompileTree.OnReCalcParent := Calculate;
 end;
 
 destructor TBillsCompileData.Destroy;
@@ -228,12 +228,6 @@ begin
       SameText(AValue.FieldName, 'DgnQuantity1') then
     CalculateTotal(AValue.Owner.ValueByName('ID').AsInteger);
 
-  if (AValue.FieldName = 'ParentID') then
-  begin
-    Calculate(FBeforeChangeParentID);
-    Calculate(AValue.AsInteger);
-  end;
-
   if (AValue.FieldName = 'LockedInfo') then
   begin
     stnNode := BillsCompileTree.FindNode(AValue.Owner.ValueByName('ID').AsInteger);
@@ -307,9 +301,7 @@ begin
       DataSetErrorMessage(Allow, '变更清单不可填写0号台账数量与金额');
   end;
   if not Allow then Exit;
-
-  if SameText(AValue.FieldName, 'ParentID') then
-    FBeforeChangeParentID := AValue.AsInteger;
+    
   if SameText(AValue.FieldName, 'OrgQuantity') or
       SameText(AValue.FieldName, 'MisQuantity') or
       SameText(AValue.FieldName, 'OthQuantity') or

+ 31 - 0
Units/BillsTree.pas

@@ -6,6 +6,8 @@ uses
   sdIDTree, sdDB, mDataRecord;
 
 type
+  TReCalculateTreeNode = procedure(AID: Integer) of Object;
+
   TBillsIDTreeNode = class(TsdIDTreeNode)
   private
     FDealQuantity: Double;
@@ -57,6 +59,7 @@ type
   TBillsIDTree = class(TsdIDTree)
   private
     FDoOnAfterDeleteNode: TbitAfterDeleteNode;
+    FOnReCalcParent: TReCalculateTreeNode;
   protected
     function CreateItem: TsdIDTreeNode; override;
   public
@@ -64,8 +67,10 @@ 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;
   end;
 
   TEstimateIDTreeNode = class(TsdIDTreeNode)
@@ -120,6 +125,12 @@ begin
     FDoOnAfterDeleteNode(vParent);
 end;
 
+procedure TBillsIDTree.DoOnReCalcParent(AID: Integer);
+begin
+  if Assigned(FOnReCalcParent) then
+    FOnReCalcParent(AID);
+end;
+
 { TBillsIDTreeNode }
 
 function TBillsIDTreeNode.CanDownLevel: Boolean;
@@ -172,15 +183,25 @@ begin
 end;
 
 function TBillsIDTreeNode.DownLevel: Boolean;
+var
+  iOrgParentID: Integer;
 begin
+  iOrgParentID := ParentID;
   Result := inherited DownLevel;
 
+  if not Result then Exit;
   // 如升级后变为父项,则清空数量、单价
   if Assigned(Parent) then
   begin
+    Parent.Rec.ValueByName('OrgQuantity').AsFloat := 0;
+    Parent.Rec.ValueByName('MisQuantity').AsFloat := 0;
+    Parent.Rec.ValueByName('OthQuantity').AsFloat := 0;
     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;
@@ -239,15 +260,25 @@ begin
 end;
 
 function TBillsIDTreeNode.UpLevel: Boolean;
+var
+  iOrgParentID: Integer;
 begin
+  iOrgParentID := ParentID;
   Result := inherited UpLevel;
 
+  if not Result then Exit;
   // 如升级后变为父项,则清空数量、单价
   if HasChildren then
   begin
+    Rec.ValueByName('OrgQuantity').AsFloat := 0;
+    Rec.ValueByName('MisQuantity').AsFloat := 0;
+    Rec.ValueByName('OthQuantity').AsFloat := 0;
     Rec.ValueByName('Quantity').AsFloat := 0;
     Rec.ValueByName('Price').AsFloat := 0;
   end;
+
+  TBillsIDTree(Owner).OnReCalcParent(iOrgParentID);
+  TBillsIDTree(Owner).OnReCalcParent(ParentID);
 end;
 
 { TEstimateIDTreeNode }