소스 검색

Task #1231 标准项目表,添加固定id节点,添加后保持固定id

MaiXinRong 8 년 전
부모
커밋
c12297fe30
2개의 변경된 파일51개의 추가작업 그리고 6개의 파일을 삭제
  1. 5 4
      DataModules/BillsCompileDm.pas
  2. 46 2
      Units/BillsTree.pas

+ 5 - 4
DataModules/BillsCompileDm.pas

@@ -395,7 +395,7 @@ begin
     else
     begin
       if TBillsIDTreeNode(stnCurNode).HasLedger or
-         (not stnCurNode.HasChildren and TBillsIDTreeNode(stnCurNode).HasMeasure) then
+          (not stnCurNode.HasChildren and TBillsIDTreeNode(stnCurNode).HasMeasure) then
         raise Exception.Create('不可添加该项目节数据!')
       else
         stnCurNode := InsertChild(stnCurNode, stnStdNode);
@@ -526,13 +526,14 @@ end;
 function TBillsCompileData.InsertChild(AParentNode,
   ANode: TsdIDTreeNode): TsdIDTreeNode;
 var
-  iNextSiblingID: Integer;
+  iID, iNextSiblingID: Integer;
 begin
   iNextSiblingID := GetNextSiblingID(AParentNode, ANode);
+  iID := ANode.Rec.ValueByName('StaticID').AsInteger;
   if Assigned(AParentNode) then
-    Result := BillsCompileTree.Add(AParentNode.ID, iNextSiblingID)
+    Result := BillsCompileTree.AddNode(AParentNode.ID, iNextSiblingID, iID)
   else
-    Result := BillsCompileTree.Add(-1, iNextSiblingID);
+    Result := BillsCompileTree.AddNode(-1, iNextSiblingID, iID);
   Result.Rec.ValueByName('Code').AsString := ANode.Rec.ValueByName('Code').AsString;
   Result.Rec.ValueByName('B_Code').AsString := ANode.Rec.ValueByName('B_Code').AsString;
   Result.Rec.ValueByName('Name').AsString := ANode.Rec.ValueByName('Name').AsString;

+ 46 - 2
Units/BillsTree.pas

@@ -64,6 +64,8 @@ type
   TReCalculateNode = procedure(AID: Integer) of object;
 
   TBillsIDTree = class(TsdIDTree)
+  private
+    function GetNewID(AID: Integer = -1): Integer;
   protected
     function CreateItem: TsdIDTreeNode; override;
   public
@@ -71,6 +73,7 @@ type
     function DeleteNode(ANode: TsdIDTreeNode): Boolean; override;
 
     function Add(AParentID, ANextSiblingID: TsdTreeNodeID): TsdIDTreeNode; override;
+    function AddNode(AParentID, ANextSiblingID: TsdTreeNodeID; AID: Integer = -1): TsdIDTreeNode;
 
     procedure RecodeChildrenCode(ANode: TBillsIDTreeNode; AOrgCode, ANewCode: string);
     procedure RecodeChildrenB_Code(ANode: TBillsIDTreeNode; AOrgCode, ANewCode: string);
@@ -121,7 +124,7 @@ type
 
 implementation
 
-uses SysUtils;
+uses SysUtils, UtilMethods;
 
 { TBillsIDTree }
 
@@ -135,10 +138,40 @@ begin
     Result := inherited Add(AParentID, ANextSiblingID);
 end;
 
+function TBillsIDTree.AddNode(AParentID, ANextSiblingID: TsdTreeNodeID;
+  AID: Integer): TsdIDTreeNode;
+var
+  iID: Integer;
+  Rec: TsdDataRecord;
+begin
+  if not (Assigned(DataView) and DataView.Active){Active} then
+  begin
+    WarningMessage('无法在一个关闭的数据集上执行该操作');
+    Exit;
+  end;
+  Result := nil;
+
+  if CanAdd(AParentID, ANextSiblingID) then
+  begin
+    Rec := DataView.Append(True);
+    try
+      Rec.AddValue(ParentField, AParentID);
+      Rec.AddValue(NextSiblingField, ANextSiblingID);
+      iID := GetNewID(AID);
+      if AutoCreateKeyID then
+        Rec.AddValue(KeyField, iID);
+      InitDBRecord(Rec);
+    finally
+      Rec.EndUpdate;
+    end;
+    Result := Add(iID, AParentID, ANextSiblingID, Rec);
+  end;
+end;
+
 function TBillsIDTree.CanDelete(ANode: TsdIDTreeNode): Boolean;
 begin
   Result := Inherited CanDelete(ANode)
-            and (ANode.ID >= 100)
+            and ((ANode.ID >= 100) or (ANode.Level > 0))
             and (not ANode.Rec.ValueByName('LockedLevel').AsBoolean)
             and (ANode.Rec.ValueByName('AddDealQuantity').AsFloat = 0)
             and (ANode.Rec.ValueByName('AddDealTotalPrice').AsFloat = 0)
@@ -162,6 +195,17 @@ begin
   DoOnReCalcNode(vParent);
 end;
 
+function TBillsIDTree.GetNewID(AID: Integer): Integer;
+var
+  vNode: TsdIDTreeNode;
+begin
+  vNode := FindNode(AID);
+  if Assigned(vNode) then
+    Result := NextNewID
+  else
+    Result := AID;
+end;
+
 procedure TBillsIDTree.RecodeChildrenB_Code(ANode: TBillsIDTreeNode;
   AOrgCode, ANewCode: string);
 var