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

四川交投,分部分项工料相关

MaiXinRong 10 лет назад
Родитель
Сommit
2a9304ef3f

+ 22 - 0
DataModules/BillsCompileDm.pas

@@ -80,6 +80,7 @@ type
     procedure CalculateAll;
 
     function GetLeafXmjParentID(ABillsID: Integer): Integer;
+    procedure LoadLeafBillsID(AID: Integer; ALeafBillsID: TList);
 
     procedure ExpandNodeTo(ALevel: Integer);
     procedure ExpandXmjNode;
@@ -1189,4 +1190,25 @@ begin
   end;
 end;
 
+procedure TBillsCompileData.LoadLeafBillsID(AID: Integer;
+  ALeafBillsID: TList);
+var
+  vNode, vChild: TsdIDTreeNode;
+  iChild: Integer;
+begin
+  vNode := BillsCompileTree.FindNode(AID);
+  if Assigned(vNode) and vNode.HasChildren then
+  begin
+    for iChild := 0 to vNode.ChildCount - 1 do
+    begin
+      vChild := vNode.ChildNodes[iChild];
+      if vChild.Rec.ValueByName('Code').AsString <> '' then Continue;
+      if vChild.HasChildren then
+        LoadLeafBillsID(vChild.ID, ALeafBillsID)
+      else
+        ALeafBillsID.Add(Pointer(vChild.ID));
+    end;
+  end;
+end;
+
 end.

+ 1 - 0
DataModules/BillsDm.dfm

@@ -14,6 +14,7 @@ object BillsData: TBillsData
     Provider = sdpBills
     AfterAddRecord = sddBillsAfterAddRecord
     BeforeDeleteRecord = sddBillsBeforeDeleteRecord
+    AfterDeleteRecord = sddBillsAfterDeleteRecord
     BeforeValueChange = sddBillsBeforeValueChange
     OnGetRecordClass = sddBillsGetRecordClass
     Left = 48

+ 6 - 0
DataModules/BillsDm.pas

@@ -26,6 +26,7 @@ type
     procedure sddBillsBeforeValueChange(AValue: TsdValue;
       const NewValue: Variant; var Allow: Boolean);
     procedure sddBillsGetRecordClass(var ARecordClass: TsdRecordClass);
+    procedure sddBillsAfterDeleteRecord(ARecord: TsdDataRecord);
   private
     FProjectData: TObject;
     FCurPhaseIndex: Integer;
@@ -577,4 +578,9 @@ begin
   ARecordClass := TBillsRecord;
 end;
 
+procedure TBillsData.sddBillsAfterDeleteRecord(ARecord: TsdDataRecord);
+begin
+  TProjectData(FProjectData).DetailGLData.ClearDetailGLs(ARecord.ValueByName('ID').AsInteger);
+end;
+
 end.

+ 24 - 20
DataModules/DetailGLDm.dfm

@@ -20,25 +20,29 @@ object DetailGLData: TDetailGLData
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D65090001044E616D65060742696C6C734944094669656C644E616D
-      65060742696C6C7349440844617461547970650203084461746153697A650204
-      0549734B6579080F4E65656450726F636573734E616D65090001044E616D6506
-      04474C4944094669656C644E616D650604474C49440844617461547970650203
-      084461746153697A6502040549734B6579080F4E65656450726F636573734E61
-      6D65090001044E616D650604436F6465094669656C644E616D650604436F6465
-      0844617461547970650203084461746153697A6502040549734B6579080F4E65
-      656450726F636573734E616D65090001044E616D6506085175616E7469747909
-      4669656C644E616D6506085175616E7469747908446174615479706502060844
-      61746153697A6502080549734B6579080F4E65656450726F636573734E616D65
-      090001044E616D65060D43726561746550686173654944094669656C644E616D
-      65060D4372656174655068617365494408446174615479706502030844617461
-      53697A6502040549734B6579080F4E65656450726F636573734E616D65090001
-      044E616D65060D4C6F636B656450686173654944094669656C644E616D65060D
-      4C6F636B6564506861736549440844617461547970650203084461746153697A
-      6502040549734B6579080F4E65656450726F636573734E616D65090001044E61
-      6D6506114C61737442696C6C735175616E74697479094669656C644E616D6506
-      114C61737442696C6C735175616E746974790844617461547970650206084461
-      746153697A6502080549734B6579080F4E65656450726F636573734E616D6509
-      0000}
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      65060742696C6C734944094669656C644E616D65060742696C6C734944084461
+      7461547970650203084461746153697A6502040549734B6579080F4E65656450
+      726F636573734E616D650909507265636973696F6E02000453697A6502000001
+      044E616D650604474C4944094669656C644E616D650604474C49440844617461
+      547970650203084461746153697A6502040549734B6579080F4E65656450726F
+      636573734E616D650909507265636973696F6E02000453697A6502000001044E
+      616D650604436F6465094669656C644E616D650604436F646508446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      6506085175616E74697479094669656C644E616D6506085175616E7469747908
+      44617461547970650206084461746153697A6502080549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D65060D43726561746550686173654944094669656C644E616D65
+      060D437265617465506861736549440844617461547970650203084461746153
+      697A6502040549734B6579080F4E65656450726F636573734E616D6509095072
+      65636973696F6E02000453697A6502000001044E616D65060D4C6F636B656450
+      686173654944094669656C644E616D65060D4C6F636B65645068617365494408
+      44617461547970650203084461746153697A6502040549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D6506114C61737442696C6C735175616E74697479094669656C64
+      4E616D6506114C61737442696C6C735175616E74697479084461746154797065
+      0206084461746153697A6502080549734B6579080F4E65656450726F63657373
+      4E616D650909507265636973696F6E02000453697A6502000000}
   end
 end

+ 95 - 8
DataModules/DetailGLDm.pas

@@ -14,13 +14,13 @@ type
       var Allow: Boolean);
     procedure sddDetailGLBeforeValueChange(AValue: TsdValue;
       const NewValue: Variant; var Allow: Boolean);
+    procedure sddDetailGLAfterDeleteRecord(ARecord: TsdDataRecord);
   private
     FProjectData: TObject;
 
     procedure LoadRelaProjectGL;
 
     function FindDetailGL(ABillsID, AGLID: Integer): TDetailGLRecord;
-    procedure ClearDetailGLs(ABillsID: Integer);
   public
     constructor Create(AProjectData: TObject);
     destructor Destroy; override;
@@ -30,16 +30,23 @@ type
     procedure Save;
     procedure SaveCacheData;
 
+    function AddLeafXmjGl(ARec: TDetailGLRecord): TsdDataRecord;
     function AddDetailGL(ABillsID: Integer; AProjectGLRec: TProjectGLRecord;
       var sMessage: string): TDetailGLRecord;
     procedure AddDetailGLs(ABillsID: Integer; AGLs: TList);
 
     procedure LoadDetailGLs(ABillsID: Integer; AGLs: TList);
     function HasLockedDetailGL(ABillsID: Integer): Boolean;
+    
+    procedure ClearDetailGLs(ABillsID: Integer);
     procedure ResetDetailGLs(ABillsID: Integer; AGLs: TList);
 
+    procedure LoadXmjDetailGLs(AXmjID, AGLID: Integer; AGLs: TList);
+
     procedure LoadProjectGL_DetailGLs(AGLID: Integer; AGLs: TList);
 
+    function HasXmjDetailGL(AXmjID, AGLID: Integer): Boolean;
+
     function GetUnitPriceMargin(ABillsID: Integer): Double;
 
     property ProjectData: TObject read FProjectData write FProjectData;
@@ -49,7 +56,7 @@ implementation
 
 uses
   Math, UtilMethods, ProjectData, ProjectProperty, ProjectGLDm,
-  PriceMarginBillsDm, StageDm, PhasePayDm;
+  PriceMarginBillsDm, StageDm, PhasePayDm, sdIDTree;
 
 {$R *.dfm}
 
@@ -74,6 +81,8 @@ begin
   end
   else
     sMessage := Format('编号:%s 名称:%s', [AProjectGLRec.Code.AsString, AProjectGLRec.Name.AsString]);
+
+  AddLeafXmjGl(Result);
 end;
 
 procedure TDetailGLData.AddDetailGLs(ABillsID: Integer; AGLs: TList);
@@ -120,6 +129,8 @@ begin
       Rec.CreatePhaseID.AsInteger := TProjectData(FProjectData).ProjProperties.PhaseCount;
 
       Rec.RelaProjectGL := GLRec.RelaProjectGL;
+
+      AddLeafXmjGl(Rec);
     end;
   finally
     sddDetailGL.EndUpdate;
@@ -129,17 +140,25 @@ end;
 procedure TDetailGLData.ClearDetailGLs(ABillsID: Integer);
 var
   idx: TsdIndex;
-  iFirst, iLast, iRec: Integer;
+  iFirst, iLast, iRec, iLeafXmjID, iGLID: Integer;
+  Rec: TDetailGLRecord;
 begin
   sddDetailGL.BeginUpdate;
   try
+    iLeafXmjID := TProjectData(FProjectData).BillsCompileData.GetLeafXmjParentID(ABillsID);
     idx := sddDetailGL.FindIndex('idxBillsID');
     iFirst := idx.FindKeyIndex(ABillsID);
     if iFirst <> -1 then
     begin
       iLast := idx.FindKeyLastIndex(ABillsID);
       for iRec := iFirst to iLast do
-        sddDetailGL.Remove(idx.Records[iRec]);
+      begin
+        Rec := TDetailGLRecord(idx.Records[iRec]);
+        iGLID := Rec.GLID.AsInteger;
+        sddDetailGL.Remove(Rec);
+        if not HasXmjDetailGL(iLeafXmjID, iGLID) then
+          TProjectData(FProjectData).LeafXmjGlData.DeleteLeafXmjGl(iLeafXmjID, iGLID);
+      end;
     end;
   finally
     sddDetailGL.EndUpdate;
@@ -272,17 +291,17 @@ procedure TDetailGLData.LoadRelaProjectGL;
 var
   idx: TsdIndex;
   i: Integer;
-  ProjectGLRec: TProjectGLRecord;
+  ProjGLRec: TProjectGLRecord;
 begin
   if not TProjectData(FProjectData).ProjectGLData.Active then Exit;
-  
+
   idx := sddDetailGL.FindIndex('idxGLID');
   with TProjectData(FProjectData).ProjectGLData do
   begin
     for i := 0 to sddProjectGL.RecordCount - 1 do
     begin
-      ProjectGLRec := TProjectGLRecord(sddProjectGL.Records[i]);
-      LoadRela(ProjectGLRec);
+      ProjGLRec := TProjectGLRecord(sddProjectGL.Records[i]);
+      LoadRela(ProjGLRec);
     end;
   end;
 end;
@@ -365,4 +384,72 @@ begin
   end;
 end;
 
+function TDetailGLData.AddLeafXmjGl(ARec: TDetailGLRecord): TsdDataRecord;
+var
+  iLeafXmjID: Integer;
+begin
+  // 对应最底层项目节应新增
+  with TProjectData(FProjectData) do
+  begin
+    iLeafXmjID := BillsCompileData.GetLeafXmjParentID(ARec.BillsID.AsInteger);
+    LeafXmjGlData.AddLeafXmjGl(iLeafXmjID, ARec.GLID.AsInteger);
+  end;
+end;
+
+procedure TDetailGLData.sddDetailGLAfterDeleteRecord(
+  ARecord: TsdDataRecord);
+var
+  iLeafXmjID: Integer;
+begin
+  with TProjectData(FProjectData) do
+  begin
+    iLeafXmjID := BillsCompileData.GetLeafXmjParentID(TDetailGLRecord(ARecord).BillsID.AsInteger);
+    if not HasXmjDetailGL(iLeafXmjID, TDetailGLRecord(ARecord).GLID.AsInteger) then
+      LeafXmjGlData.DeleteLeafXmjGl(iLeafXmjID, TDetailGLRecord(ARecord).GLID.AsInteger);
+  end;
+end;
+
+procedure TDetailGLData.LoadXmjDetailGLs(AXmjID, AGLID: Integer; AGLs: TList);
+var
+  vLeafBills: TList;
+  i: Integer;
+  Rec: TsdDataRecord;
+begin
+  vLeafBills := TList.Create;
+  try
+    TProjectData(FProjectData).BillsCompileData.LoadLeafBillsID(AXmjID, vLeafBills);
+    for i := 0 to vLeafBills.Count - 1 do
+    begin
+      Rec := sddDetailGL.FindKey('idxView', VarArrayOf([Integer(vLeafBills.Items[i]), AGLID]));
+      if Assigned(Rec) then
+        AGLs.Add(Rec);
+    end;
+  finally
+    vLeafBills.Free;
+  end;
+end;
+
+function TDetailGLData.HasXmjDetailGL(AXmjID, AGLID: Integer): Boolean;
+var
+  vXmj, vChild: TsdIDTreeNode;
+  iChild: Integer;
+begin
+  Result := False;
+  vXmj := TProjectData(FProjectData).BillsCompileData.BillsCompileTree.FindNode(AXmjID);
+  if vXmj.HasChildren then
+  begin
+    for iChild := 0 to vXmj.ChildCount - 1 do
+    begin
+      vChild := vXmj.ChildNodes[iChild];
+      if HasXmjDetailGL(vChild.ID, AGLID) then
+      begin
+        Result := True;
+        Break;
+      end;
+    end;
+  end
+  else
+    Result := Assigned(sddDetailGL.FindKey('idxFind', VarArrayOf([AXmjID, AGLID])));
+end;
+
 end.

+ 230 - 0
DataModules/LeafXmjGlDm.dfm

@@ -0,0 +1,230 @@
+object LeafXmjGlData: TLeafXmjGlData
+  OldCreateOrder = False
+  Left = 753
+  Top = 384
+  Height = 222
+  Width = 257
+  object sdpLeafXmjGL: TsdADOProvider
+    TableName = 'LeafXmjGL'
+    Left = 153
+    Top = 16
+  end
+  object sddLeafXmjGL: TsdDataSet
+    Active = False
+    Provider = sdpLeafXmjGL
+    OnGetRecordClass = sddLeafXmjGLGetRecordClass
+    Left = 153
+    Top = 72
+    FieldListData = {
+      0101044E616D6506024944094669656C644E616D650602494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      650605586D6A4944094669656C644E616D650605586D6A494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      650604474C4944094669656C644E616D650604474C4944084461746154797065
+      0203084461746153697A6502040549734B6579080F4E65656450726F63657373
+      4E616D650909507265636973696F6E02000453697A6502000001044E616D6506
+      0B4164645175616E74697479094669656C644E616D65060B4164645175616E74
+      6974790844617461547970650206084461746153697A6502080549734B657908
+      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
+      7A6502000001044E616D65060D416464546F74616C5072696365094669656C64
+      4E616D65060D416464546F74616C507269636508446174615479706502060844
+      61746153697A6502080549734B6579080F4E65656450726F636573734E616D65
+      0909507265636973696F6E02000453697A6502000001044E616D65060F416464
+      557365645175616E74697479094669656C644E616D65060F4164645573656451
+      75616E746974790844617461547970650206084461746153697A650208054973
+      4B6579080F4E65656450726F636573734E616D650909507265636973696F6E02
+      000453697A6502000001044E616D65061141646455736564546F74616C507269
+      6365094669656C644E616D65061141646455736564546F74616C507269636508
+      44617461547970650206084461746153697A6502080549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D65061341646450414C5F557365645175616E7469747909466965
+      6C644E616D65061341646450414C5F557365645175616E746974790844617461
+      547970650206084461746153697A6502080549734B6579080F4E65656450726F
+      636573734E616D650909507265636973696F6E02000453697A6502000001044E
+      616D65061541646450414C5F55736564546F74616C5072696365094669656C64
+      4E616D65061541646450414C5F55736564546F74616C50726963650844617461
+      547970650206084461746153697A6502080549734B6579080F4E65656450726F
+      636573734E616D650909507265636973696F6E02000453697A6502000001044E
+      616D65061141646450414C5F44656C74615072696365094669656C644E616D65
+      061141646450414C5F44656C7461507269636508446174615479706502060844
+      61746153697A6502080549734B6579080F4E65656450726F636573734E616D65
+      0909507265636973696F6E02000453697A6502000001044E616D65060C416464
+      50414C5F546F74616C094669656C644E616D65060C41646450414C5F546F7461
+      6C0844617461547970650206084461746153697A6502080549734B6579080F4E
+      65656450726F636573734E616D650909507265636973696F6E02000453697A65
+      02000000}
+  end
+  object sdvLeafXmjGL: TsdDataView
+    Active = False
+    DataSet = sddLeafXmjGL
+    Filtered = False
+    Columns = <
+      item
+        FieldName = 'ID'
+      end
+      item
+        FieldName = 'XmjID'
+      end
+      item
+        FieldName = 'GLID'
+      end
+      item
+        FieldName = 'Code'
+        KeyFields = 'GLID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'Code'
+      end
+      item
+        FieldName = 'Name'
+        KeyFields = 'GLID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'Name'
+      end
+      item
+        FieldName = 'Units'
+        KeyFields = 'GLID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'Units'
+      end
+      item
+        FieldName = 'Specs'
+        KeyFields = 'GLID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'Specs'
+      end
+      item
+        FieldName = 'Quantity'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'Quantity'
+      end
+      item
+        FieldName = 'UsedQuantity'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'UsedQuantity'
+      end
+      item
+        FieldName = 'PAL_UsedQuantity'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'PAL_UsedQuantity'
+      end
+      item
+        FieldName = 'PAL_UsedTotalPrice'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'PAL_UsedTotalPrice'
+      end
+      item
+        FieldName = 'PAL_DeltaPrice'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'PAL_DeltaPrice'
+      end
+      item
+        FieldName = 'PAL_Total'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'PAL_Total'
+      end
+      item
+        FieldName = 'EndQuantity'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'EndQuantity'
+      end
+      item
+        FieldName = 'EndUsedQuantity'
+        KeyFields = 'ID'
+        LookupKeyFields = 'ID'
+        LookupResultField = 'EndUsedQuantity'
+      end
+      item
+        FieldName = 'AddQuantity'
+      end
+      item
+        FieldName = 'AddTotalPrice'
+      end
+      item
+        FieldName = 'AddUsedQuantity'
+      end
+      item
+        FieldName = 'AddUsedTotalPrice'
+      end
+      item
+        FieldName = 'AddPAL_UsedQuantity'
+      end
+      item
+        FieldName = 'AddPAL_UsedTotalPrice'
+      end
+      item
+        FieldName = 'AddPAL_DeltaPrice'
+      end
+      item
+        FieldName = 'AddPAL_Total'
+      end>
+    Left = 153
+    Top = 128
+  end
+  object smpLeafXmj: TsdMemoryProvider
+    Left = 48
+    Top = 16
+  end
+  object sddLeafXmj: TsdDataSet
+    Active = False
+    Provider = smpLeafXmj
+    Left = 48
+    Top = 72
+    FieldListData = {
+      0101044E616D6506024944094669656C644E616D650602494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      65060853657269616C4E6F094669656C644E616D65060853657269616C4E6F08
+      44617461547970650203084461746153697A6502040549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D650604436F6465094669656C644E616D650604436F6465084461
+      7461547970650218084461746153697A6502320549734B6579080F4E65656450
+      726F636573734E616D650909507265636973696F6E02000453697A6502000001
+      044E616D6506044E616D65094669656C644E616D6506044E616D650844617461
+      547970650218084461746153697A6503FF000549734B6579080F4E6565645072
+      6F636573734E616D650909507265636973696F6E02000453697A650200000104
+      4E616D650605556E697473094669656C644E616D650605556E69747308446174
+      61547970650218084461746153697A6502140549734B6579080F4E6565645072
+      6F636573734E616D650909507265636973696F6E02000453697A650200000104
+      4E616D65060A4E616D6544616E576569094669656C644E616D65060A4E616D65
+      44616E5765690844617461547970650218084461746153697A6503FF00054973
+      4B6579080F4E65656450726F636573734E616D650909507265636973696F6E02
+      000453697A6502000001044E616D6506094E616D6546656E4275094669656C64
+      4E616D6506094E616D6546656E42750844617461547970650218084461746153
+      697A6503FF000549734B6579080F4E65656450726F636573734E616D65090950
+      7265636973696F6E02000453697A6502000001044E616D65060C4E616D654665
+      6E5869616E67094669656C644E616D65060C4E616D6546656E5869616E670844
+      617461547970650218084461746153697A6503FF000549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D6506084E616D65556E6974094669656C644E616D6506084E616D
+      65556E69740844617461547970650218084461746153697A6503FF000549734B
+      6579080F4E65656450726F636573734E616D650909507265636973696F6E0200
+      0453697A6502000001044E616D650603506567094669656C644E616D65060350
+      65670844617461547970650218084461746153697A6503FF000549734B657908
+      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
+      7A6502000001044E616D650608506F736974696F6E094669656C644E616D6506
+      08506F736974696F6E0844617461547970650218084461746153697A6503FF00
+      0549734B6579080F4E65656450726F636573734E616D65090950726563697369
+      6F6E02000453697A6502000001044E616D65060B44726177696E67436F646509
+      4669656C644E616D65060B44726177696E67436F646508446174615479706502
+      18084461746153697A6503FF000549734B6579080F4E65656450726F63657373
+      4E616D650909507265636973696F6E02000453697A6502000000}
+  end
+  object sdvLeafXmj: TsdDataView
+    Active = False
+    DataSet = sddLeafXmj
+    Filtered = False
+    Columns = <>
+    OnCurrentChanged = sdvLeafXmjCurrentChanged
+    Left = 48
+    Top = 128
+  end
+end

+ 323 - 0
DataModules/LeafXmjGlDm.pas

@@ -0,0 +1,323 @@
+unit LeafXmjGlDm;
+
+interface
+
+uses
+  SysUtils, Classes, ADODB, sdDB, sdProvider, mDataRecord;
+
+type
+  TLeafXmjGlData = class(TDataModule)
+    sdpLeafXmjGL: TsdADOProvider;
+    sddLeafXmjGL: TsdDataSet;
+    sdvLeafXmjGL: TsdDataView;
+    smpLeafXmj: TsdMemoryProvider;
+    sddLeafXmj: TsdDataSet;
+    sdvLeafXmj: TsdDataView;
+    procedure sdvLeafXmjCurrentChanged(ARecord: TsdDataRecord);
+    procedure sddLeafXmjGLGetRecordClass(var ARecordClass: TsdRecordClass);
+  private
+    FProjectData: TObject;
+
+    function GetNewLeafXmjGlID: Integer;
+  public
+    constructor Create(AProjectData: TObject);
+    destructor Destroy; override;
+
+    procedure Open(AConnetion: TADOConnection);
+    procedure Save;
+
+    procedure RefreshLeafXmj;
+
+    procedure ResetPhaseStageLink;
+    procedure ResetRecordLink;
+
+    procedure CalclateRec(ARec: TsdDataRecord);
+    procedure CalculateLeafXmjGL(AXmjID, AGLID: Integer);
+    procedure CalculateLeafXmj(AXmjID: Integer);
+    procedure CalcluateGL(AGLID: Integer);
+
+    function LeafXmjGLRec(AXmjID, AGLID: Integer): TLeafXmjGlRecord;
+
+    function AddLeafXmjGl(AXmjID, AGLID: Integer): TLeafXmjGlRecord;
+    procedure DeleteLeafXmjGl(AXmjID, AGLID: Integer);
+  end;
+
+implementation
+
+uses
+  ProjectData, BillsCompileDm, BillsTree, sdIDTree, GclBillsGatherModel,
+  UtilMethods, PhaseData, StageLeafXmjGlDm, Variants;
+
+{$R *.dfm}
+
+{ TLeafXmjGlData }
+
+function TLeafXmjGlData.AddLeafXmjGl(AXmjID,
+  AGLID: Integer): TLeafXmjGlRecord;
+begin
+  Result := TLeafXmjGlRecord(sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID])));
+  if not Assigned(Result) then
+  begin
+    Result := TLeafXmjGlRecord(sddLeafXmjGL.Add);
+    Result.ID.AsInteger := GetNewLeafXmjGlID;
+    Result.XmjID.AsInteger := AXmjID;
+    Result.GLID.AsInteger := AGLID;
+
+    with TProjectData(FProjectData).PhaseData.StageLeafXmjGlData do
+      Result.StageRec := StageLeafXmjGlRecord(Result.ID.AsInteger);
+  end;
+end;
+
+procedure TLeafXmjGlData.CalclateRec(ARec: TsdDataRecord);
+begin
+  with TProjectData(FProjectData).PhaseData do
+    if Assigned(ARec) and Active then
+      StageLeafXmjGlData.Calculate(ARec.ValueByName('ID').AsInteger);
+end;
+
+procedure TLeafXmjGlData.CalcluateGL(AGLID: Integer);
+var
+  idx: TsdIndex;
+  iRec, iFirst, iLast: Integer;
+  Rec: TsdDataRecord;
+begin
+  idx := sddLeafXmjGL.FindIndex('idxGl');
+  iFirst := idx.FindKeyIndex(AGLID);
+  iLast := idx.FindKeyLastIndex(AGLID);
+  for iRec := iFirst to iLast do
+  begin
+    Rec := idx.Records[iRec];
+    CalclateRec(Rec);
+  end;
+end;
+
+procedure TLeafXmjGlData.CalculateLeafXmj(AXmjID: Integer);
+var
+  idx: TsdIndex;
+  iRec, iFirst, iLast: Integer;
+  Rec: TsdDataRecord;
+begin
+  idx := sddLeafXmjGL.FindIndex('idxXmj');
+  iFirst := idx.FindKeyIndex(AXmjID);
+  iLast := idx.FindKeyLastIndex(AXmjID);
+  for iRec := iFirst to iLast do
+  begin
+    Rec := idx.Records[iRec];
+    CalclateRec(Rec);
+  end;
+end;
+
+procedure TLeafXmjGlData.CalculateLeafXmjGL(AXmjID, AGLID: Integer);
+var
+  Rec: TsdDataRecord;
+begin
+  Rec := sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID]));
+  CalclateRec(Rec);
+end;
+
+constructor TLeafXmjGlData.Create(AProjectData: TObject);
+begin
+  inherited Create(nil);
+  FProjectData := AProjectData;
+
+  sdvLeafXmjGL.Columns.FindColumn('Code').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
+  sdvLeafXmjGL.Columns.FindColumn('Name').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
+  sdvLeafXmjGL.Columns.FindColumn('Units').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
+  sdvLeafXmjGL.Columns.FindColumn('Specs').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
+end;
+
+procedure TLeafXmjGlData.DeleteLeafXmjGl(AXmjID, AGLID: Integer);
+var
+  Rec: TsdDataRecord;
+begin
+  Rec := sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID]));
+  if Assigned(Rec) then
+  begin
+    with TProjectData(FProjectData).PhaseData do
+      StageLeafXmjGlData.DeleteLeafXmjGLRecord(Rec.ValueByName('ID').AsInteger);
+    sddLeafXmjGL.Remove(Rec);
+  end;
+end;
+
+destructor TLeafXmjGlData.Destroy;
+begin
+  inherited;
+end;
+
+function TLeafXmjGlData.GetNewLeafXmjGlID: Integer;
+var
+  vIdx: TsdIndex;
+begin
+  vIdx := sddLeafXmjGL.FindIndex('idxID');
+  if vIdx.RecordCount > 0 then
+    Result := vIdx.Records[vIdx.RecordCount - 1].ValueByName('ID').AsInteger + 1
+  else
+    Result := 0;
+end;
+
+procedure TLeafXmjGlData.Open(AConnetion: TADOConnection);
+begin
+  sddLeafXmj.Open;
+  if not Assigned(sddLeafXmj.FindIndex('idxID')) then
+    sddLeafXmj.AddIndex('idxID', 'ID');
+  if not Assigned(sddLeafXmj.FindIndex('idxSerial')) then
+    sddLeafXmj.AddIndex('idxSerial', 'SerialNo');
+  sdvLeafXmj.Open;
+  sdvLeafXmj.IndexName := 'idxSerial';
+
+  sdpLeafXmjGL.Connection := AConnetion;
+  sddLeafXmjGL.Open;
+  if not Assigned(sddLeafXmjGL.FindIndex('idxID')) then
+    sddLeafXmjGL.AddIndex('idxID', 'ID');
+  if not Assigned(sddLeafXmjGL.FindIndex('idxView')) then
+    sddLeafXmjGL.AddIndex('idxView', 'XmjID;GLID');
+  if not Assigned(sddLeafXmjGL.FindIndex('idxXmj')) then
+    sddLeafXmjGL.AddIndex('idxXmj', 'XmjID');
+  if not Assigned(sddLeafXmjGL.FindIndex('idxGL')) then
+    sddLeafXmjGL.AddIndex('idxGL', 'GLID');
+  sdvLeafXmjGL.Open;
+  sdvLeafXmjGL.IndexName := 'idxView';
+end;
+
+procedure TLeafXmjGlData.RefreshLeafXmj;
+
+  function CheckLeafXmj(ANode: TBillsIDTreeNode): Boolean;
+  var
+    iChild: Integer;
+    vChild: TBillsIDTreeNode;
+  begin
+    Result := False;
+    if not Assigned(ANode) then Exit;
+    if ANode.Rec.B_Code.AsString = '' then
+    begin
+      if ANode.HasChildren then
+      begin
+        for iChild := 0 to ANode.ChildCount - 1 do
+        begin
+          vChild := TBillsIDTreeNode(ANode.ChildNodes[iChild]);
+          if vChild.Rec.B_Code.AsString <> '' then
+          begin
+            Result := True;
+            Break;
+          end;
+        end;
+      end
+      else
+        Result := False;
+    end
+    else
+      Result := False;
+  end;
+
+  function GetPegNode(ANode: TBillsIDTreeNode): TBillsIDTreeNode;
+  begin
+    Result := nil;
+    if not Assigned(ANode) then Exit;
+    if CheckPeg(ANode.Rec.Name.AsString) then
+      Result := ANode
+    else
+      Result := GetPegNode(TBillsIDTreeNode(ANode.Parent));
+  end;
+
+  procedure AddLeafXmj(ANode: TBillsIDTreeNode; ASerialNo: Integer);
+  var
+    Rec: TsdDataRecord;
+    vPeg: TBillsIDTreeNode;
+    vLeafXmj: TLeafXmjNode;
+  begin
+    vPeg := GetPegNode(ANode);
+    vLeafXmj := TLeafXmjNode.Create(ANode, vPeg);
+    try
+      Rec := sddLeafXmj.Add;
+      Rec.ValueByName('ID').AsInteger := ANode.ID;
+      Rec.ValueByName('SerialNo').AsInteger := ASerialNo;
+      Rec.ValueByName('Code').AsString := vLeafXmj.XmjCode;
+      Rec.ValueByName('Name').AsString := vLeafXmj.XmjName;
+      Rec.ValueByName('Units').AsString := vLeafXmj.XmjUnits;
+      Rec.ValueByName('NameDanWei').AsString := vLeafXmj.NameDanWei;
+      Rec.ValueByName('NameFenBu').AsString := vLeafXmj.NameFenBu;
+      Rec.ValueByName('NameFenXiang').AsString := vLeafXmj.NameFenXiang;
+      Rec.ValueByName('NameUnit').AsString := vLeafXmj.NameUnit;
+      Rec.ValueByName('Peg').AsString := vLeafXmj.Peg;
+      Rec.ValueByName('Position').AsString := vLeafXmj.Position;
+      Rec.ValueByName('DrawingCode').AsString := vLeafXmj.DrawingCode;
+    finally
+      vLeafXmj.Free;
+    end;
+  end;
+
+var
+  iNode: Integer;
+  vNode: TBillsIDTreeNode;
+begin
+  sddLeafXmj.BeginUpdate;
+  sddLeafXmj.DisableControls;
+  try
+    sddLeafXmj.DeleteAll;
+    with TProjectData(FProjectData).BillsCompileData do
+    begin
+      for iNode := 0 to BillsCompileTree.Count - 1 do
+      begin
+        vNode := TBillsIDTreeNode(BillsCompileTree.Items[iNode]);
+        if CheckLeafXmj(vNode) then
+          AddLeafXmj(vNode, iNode);
+      end;
+    end;
+  finally
+    sddLeafXmj.EnableControls;
+    sddLeafXmj.EndUpdate;
+  end;
+end;
+
+procedure TLeafXmjGlData.ResetPhaseStageLink;
+begin
+  with TProjectData(FProjectData).PhaseData do
+  begin
+    sdvLeafXmjGL.Columns.FindColumn('Quantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+    sdvLeafXmjGL.Columns.FindColumn('UsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+    sdvLeafXmjGL.Columns.FindColumn('PAL_UsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+    sdvLeafXmjGL.Columns.FindColumn('PAL_UsedTotalPrice').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+    sdvLeafXmjGL.Columns.FindColumn('PAL_DeltaPrice').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+    sdvLeafXmjGL.Columns.FindColumn('PAL_Total').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+    sdvLeafXmjGL.Columns.FindColumn('EndQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+    sdvLeafXmjGL.Columns.FindColumn('EndUsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
+  end;
+end;
+
+procedure TLeafXmjGlData.ResetRecordLink;
+var
+  i: Integer;
+  Rec: TLeafXmjGlRecord;
+begin
+  for i := 0 to sddLeafXmjGL.RecordCount - 1 do
+  begin
+    Rec := TLeafXmjGlRecord(sddLeafXmjGL.Records[i]);
+    with TProjectData(FProjectData).PhaseData.StageLeafXmjGlData do
+      Rec.StageRec := StageLeafXmjGlRecord(Rec.ID.AsInteger);
+  end;
+end;
+
+procedure TLeafXmjGlData.Save;
+begin
+  sddLeafXmjGL.Save;
+end;
+
+procedure TLeafXmjGlData.sdvLeafXmjCurrentChanged(ARecord: TsdDataRecord);
+begin
+  if Assigned(ARecord) then
+    sdvLeafXmjGL.SetRange([ARecord.ValueByName('ID').AsInteger], [ARecord.ValueByName('ID').AsInteger]);
+end;
+
+procedure TLeafXmjGlData.sddLeafXmjGLGetRecordClass(
+  var ARecordClass: TsdRecordClass);
+begin
+  ARecordClass := TLeafXmjGlRecord;
+end;
+
+function TLeafXmjGlData.LeafXmjGLRec(AXmjID,
+  AGLID: Integer): TLeafXmjGlRecord;
+begin
+  Result := TLeafXmjGlRecord(sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID])));
+end;
+
+end.

+ 0 - 1
DataModules/OtherMeasurePhaseDm.pas

@@ -181,7 +181,6 @@ const
                '    From OtherMeasurePhase Where not Deleted';
 var
   iPhase, iStage: Integer;
-  vQuery: TADOQuery;
 begin
   if TProjectData(FProjectData).StageDataReadOnly then Exit;
 

+ 45 - 38
DataModules/PriceMarginBillsDm.pas

@@ -33,6 +33,9 @@ type
   private
     FProjectData: TObject;
     procedure WriteGclBillsData(AGcls, AXmjs: TList);
+
+    procedure CalculateRela(ARec: TDetailGLRecord);
+
     function GetMainBillsTree: TBillsIDTree;
     function GetDecimal: TCalcDecimal;
   public
@@ -53,7 +56,7 @@ type
 implementation
 
 uses
-  ZhAPI, ProjectData, UtilMethods;
+  ZhAPI, ProjectData, UtilMethods, sdIDTree, StageDm;
 
 {$R *.dfm}
 
@@ -274,27 +277,12 @@ end;
 procedure TPriceMarginBillsData.sdvDetailGLAfterValueChanged(
   AValue: TsdValue);
 var
-  ARec: TDetailGLRecord;
+  Rec: TDetailGLRecord;
 begin
   if SameText(AValue.FieldName, 'Quantity') then
   begin
-    ARec := TDetailGLRecord(AValue.Owner);
-    // 更新调差工料--本期价差
-    with TProjectData(FProjectData).ProjectGLData do
-      CalculateGL_PM(ARec.GLID.AsInteger);
-    // 更新清单调差数据,材料调差节点数据
-    with TProjectData(FProjectData).PhaseData.StageData do
-    begin
-      CalculatePriceMargin(ARec.BillsID.AsInteger);
-      //CalculatePriceMarginNode;
-    end;
-    // 更新价差清单内存表信息
-    with TProjectData(FProjectData).PriceMarginBillsData do
-      RefreshDetailBills(ARec.BillsID.AsInteger);
-    // 更新合同支付
-    //TProjectData(FProjectData).PhaseData.PhasePayData.CalculateAll;
-    // 更新合计值
-    TProjectData(FProjectData).ProjectGLData.RefreshGatherData;
+    Rec := TDetailGLRecord(AValue.Owner);
+    CalculateRela(Rec);
   end;
 end;
 
@@ -320,28 +308,18 @@ end;
 procedure TPriceMarginBillsData.sdvDetailGLAfterDeleteRecord(
   ARecord: TsdDataRecord);
 var
-  ARec: TDetailGLRecord;
+  Rec: TDetailGLRecord;
+  iLeafXmjID: Integer;
 begin
-  if ARecord.ValueByName('Quantity').AsFloat <> 0 then
+  Rec := TDetailGLRecord(ARecord);
+  with TProjectData(FProjectData) do
   begin
-    ARec := TDetailGLRecord(ARecord);
-    // 更新调差工料--本期价差
-    with TProjectData(FProjectData).ProjectGLData do
-      CalculateGL_PM(ARec.GLID.AsInteger);
-    // 更新清单调差数据,材料调差节点数据
-    with TProjectData(FProjectData).PhaseData.StageData do
-    begin
-      CalculatePriceMargin(ARec.BillsID.AsInteger);
-      //CalculatePriceMarginNode;
-    end;
-    // 更新价差清单内存表信息
-    with TProjectData(FProjectData).PriceMarginBillsData do
-      RefreshDetailBills(ARec.BillsID.AsInteger);
-    // 更新合同支付
-    //TProjectData(FProjectData).PhaseData.PhasePayData.CalculateAll;
-    // 更新合计值
-    TProjectData(FProjectData).ProjectGLData.RefreshGatherData;
+    iLeafXmjID := BillsCompileData.GetLeafXmjParentID(Rec.BillsID.AsInteger);
+    if not DetailGLData.HasXmjDetailGL(iLeafXmjID, Rec.GLID.AsInteger) then
+      LeafXmjGlData.DeleteLeafXmjGl(iLeafXmjID, Rec.GLID.AsInteger);
   end;
+  if Rec.Quantity.AsFloat <> 0 then
+    CalculateRela(Rec);
 end;
 
 procedure TPriceMarginBillsData.sdvGclBillsGetText(var Text: String;
@@ -399,4 +377,33 @@ begin
   Result := TProjectData(FProjectData).ProjProperties.DecimalManager.PriceMargin;
 end;
 
+procedure TPriceMarginBillsData.CalculateRela(ARec: TDetailGLRecord);
+var
+  iLeafXmjID: Integer;
+begin
+  with TProjectData(FProjectData) do
+  begin
+    // 更新最底层项目节
+    iLeafXmjID := BillsCompileData.GetLeafXmjParentID(ARec.BillsID.AsInteger);
+    LeafXmjGlData.CalculateLeafXmjGL(iLeafXmjID, ARec.GLID.AsInteger);
+  end;
+  // 更新调差工料--本期价差
+  with TProjectData(FProjectData).ProjectGLData do
+    CalculateGL_PM(ARec.GLID.AsInteger);
+  // 更新清单调差数据,材料调差节点数据
+  with TProjectData(FProjectData).PhaseData.StageData do
+  begin
+    CalculatePriceMargin(ARec.BillsID.AsInteger);
+    //CalculatePriceMarginNode;
+    CalculateMaterialNode;
+  end;
+  // 更新价差清单内存表信息
+  with TProjectData(FProjectData).PriceMarginBillsData do
+    RefreshDetailBills(ARec.BillsID.AsInteger);
+  // 更新合同支付
+  //TProjectData(FProjectData).PhaseData.PhasePayData.CalculateAll;
+  // 更新合计值
+  TProjectData(FProjectData).ProjectGLData.RefreshGatherData;
+end;
+
 end.

+ 86 - 15
DataModules/ProjectGLDm.pas

@@ -6,8 +6,6 @@ uses
   SysUtils, Classes, sdDB, sdProvider, ADODB, mDataRecord, CalcDecimal;
 
 type
-
-
   TProjectGLData = class(TDataModule)
     sdpProjectGL: TsdADOProvider;
     sddProjectGL: TsdDataSet;
@@ -44,7 +42,6 @@ type
 
     procedure CalculateRelaBills(ARec: TProjectGLRecord);
 
-    procedure CalculatePALRela(ARec: TProjectGLRecord);
     procedure CalculatePALRelas;
 
     procedure SaveGLPrice;
@@ -59,6 +56,7 @@ type
     function GetPM_TotalPrice: Double;
     function GetActive: Boolean;
     function GetDecimal: TCalcDecimal;
+    function GetUsedTotalPrice: Double;
   public
     constructor Create(AProjectData: TObject);
     destructor Destroy; override;
@@ -72,14 +70,18 @@ type
     procedure CalculateAll;
     procedure CalculateGL_PM(AGLID: Integer);
     procedure CalculateGLs_PM(ADetailGLs: TList);
+    procedure CalculatePALRela(ARec: TProjectGLRecord);
 
     procedure RefreshGatherData;
 
+    function ProjectGLRec(AGLID: Integer): TProjectGLRecord;
+
     property ProjectData: TObject read FProjectData write FProjectData;
     property Active: Boolean read GetActive;
 
     property ValidDeltaPrice[AID: Integer]: Double read GetValidDeltaPrice;
     property PM_TotalPrice: Double read GetPM_TotalPrice;
+    property UsedTotalPrice: Double read GetUsedTotalPrice;
     property Decimal: TCalcDecimal read GetDecimal;
   end;
 
@@ -87,7 +89,8 @@ implementation
 
 uses
   ProjectData, UtilMethods, DB, Variants, PhaseData, DetailGLDm,
-  BillsMeasureDm, BillsTree, sdIDTree, PhasePayDm, DateUtils, ZhAPI;
+  BillsMeasureDm, BillsTree, sdIDTree, PhasePayDm, DateUtils, ZhAPI, Math,
+  StageLeafXmjGlDm;
 
 {$R *.dfm}
 
@@ -230,22 +233,26 @@ begin
 end;
 
 procedure TProjectGLData.sddProjectGLAfterValueChanged(AValue: TsdValue);
+var
+  Rec: TProjectGLRecord;
 begin
+  Rec := TProjectGLRecord(AValue.Owner);
   if SameText(AValue.FieldName, 'BasePrice') or
      SameText(AValue.FieldName, 'RiskRange') or
      SameText(AValue.FieldName, 'InfoPrice') then
   begin
-    CalculateDeltaPrice(TProjectGLRecord(AValue.Owner));
-    CalculatePM_Quantity(TProjectGLRecord(AValue.Owner));
-    CalculatePM_TotalPrice(TProjectGLRecord(AValue.Owner));
-    CalculatePALRela(TProjectGLRecord(AValue.Owner));
-    CalculateRelaBills(TProjectGLRecord(AValue.Owner));
+    CalculateDeltaPrice(Rec);
+    TProjectData(FProjectData).PhaseData.StageLeafXmjGlData.CalculatePriceRela(Rec.ID.AsInteger);
+    CalculatePM_Quantity(Rec);
+    CalculatePM_TotalPrice(Rec);
+    CalculatePALRela(Rec);
+    CalculateRelaBills(Rec);
     TProjectData(FProjectData).PriceMarginBillsData.RefreshAllDetailBills;
     RefreshGatherData;
   end;
   if SameText(AValue.FieldName, 'UsedQuantity') then
   begin
-    CalculatePALRela(TProjectGLRecord(AValue.Owner));
+    CalculatePALRela(Rec);
     RefreshGatherData;
   end;
 end;
@@ -455,8 +462,11 @@ begin
     with TProjectData(FProjectData).PhaseData do
       StageData.CalculatePriceMargin(DetailGLRec.BillsID.AsInteger);
   end;
-  {with TProjectData(FProjectData).PhaseData do
-    StageData.CalculatePriceMarginNode;}
+  with TProjectData(FProjectData).PhaseData do
+  begin
+    //StageData.CalculatePriceMarginNode;
+    StageData.CalculateMaterialNode;
+  end;
 end;
 
 procedure TProjectGLData.LoadDetailGLs(AGLID: Integer);
@@ -638,12 +648,55 @@ begin
 end;
 
 procedure TProjectGLData.CalculatePALRela(ARec: TProjectGLRecord);
-begin
-  ARec.UsedTotalPrice.AsFloat := Decimal.TotalPrice.RoundTo(ARec.UsedQuantity.AsFloat * ARec.InfoPrice.AsFloat);
+var
+  fUsedQuantity, fUsedTotalPrice: Double;
+  fPAL_UsedQuantity, fPAL_UsedTotalPrice: Double;
+  fPAL_DeltaPrice, fPAL_Total: Double;
+  vIdx: TsdIndex;
+  i, iFirst, iLast: Integer;
+  XmjGLRec: TLeafXmjGlRecord;
+  StageRec: TStageLeafXmjGlRecord;
+begin
+  fUsedQuantity := 0;
+  fUsedTotalPrice := 0;
+  fPAL_UsedQuantity := 0;
+  fPAL_UsedTotalPrice := 0;
+  fPAL_DeltaPrice := 0;
+  fPAL_Total := 0;
+
+  with TProjectData(FProjectData) do
+  begin
+    vIdx := LeafXmjGlData.sddLeafXmjGL.FindIndex('idxGL');
+    iFirst := vIdx.FindKeyIndex(ARec.ID.AsInteger);
+    iLast := vIdx.FindKeyLastIndex(ARec.ID.AsInteger);
+    for i := iFirst to iLast do
+    begin
+      XmjGLRec := TLeafXmjGlRecord(vIdx.Records[i]);
+      StageRec := TStageLeafXmjGlRecord(XmjGLRec.StageRec);
+      if Assigned(StageRec) then
+      begin
+        fUsedQuantity := fUsedQuantity + StageRec.UsedQuantity.AsFloat;
+        fUsedTotalPrice := fUsedTotalPrice + StageRec.UsedTotalPrice.AsFloat;
+        fPAL_UsedQuantity := fPAL_UsedQuantity + StageRec.PAL_UsedQuantity.AsFloat;
+        fPAL_UsedTotalPrice := fPAL_UsedTotalPrice + StageRec.PAL_UsedTotalPrice.AsFloat;
+        fPAL_DeltaPrice := fPAL_DeltaPrice + StageRec.PAL_DeltaPrice.AsFloat;
+        fPAL_Total := fPAL_Total + StageRec.PAL_Total.AsFloat;
+      end;
+    end;
+  end;
+
+  ARec.SetFloatValue(ARec.UsedQuantity, fUsedQuantity);
+  ARec.SetFloatValue(ARec.UsedTotalPrice, fUsedTotalPrice);
+  ARec.SetFloatValue(ARec.PAL_UsedQuantity, fPAL_UsedQuantity);
+  ARec.SetFloatValue(ARec.PAL_UsedTotalPrice, fPAL_UsedTotalPrice);
+  ARec.SetFloatValue(ARec.PAL_DeltaPrice, fPAL_DeltaPrice);
+  ARec.SetFloatValue(ARec.PAL_Total, fPAL_Total);
+  // 改为汇总分部分项处计算结果
+  {ARec.UsedTotalPrice.AsFloat := Decimal.TotalPrice.RoundTo(ARec.UsedQuantity.AsFloat * ARec.InfoPrice.AsFloat);
   ARec.PAL_UsedQuantity.AsFloat := Decimal.Quantity.RoundTo(ARec.PM_Quantity.AsFloat - ARec.UsedQuantity.AsFloat);
   ARec.PAL_UsedTotalPrice.AsFloat := Decimal.TotalPrice.RoundTo(ARec.PAL_UsedQuantity.AsFloat * ARec.BasePrice.AsFloat);
   ARec.PAL_DeltaPrice.AsFloat := Decimal.TotalPrice.RoundTo( - ARec.UsedQuantity.AsFloat * ARec.DeltaPrice.AsFloat);
-  ARec.PAL_Total.AsFloat := Decimal.TotalPrice.RoundTo(ARec.BasePrice.AsFloat*ARec.PM_Quantity.AsFloat - ARec.InfoPrice.AsFloat*ARec.UsedQuantity.AsFloat);
+  ARec.PAL_Total.AsFloat := Decimal.TotalPrice.RoundTo(ARec.BasePrice.AsFloat*ARec.PM_Quantity.AsFloat - ARec.InfoPrice.AsFloat*ARec.UsedQuantity.AsFloat);}
 end;
 
 procedure TProjectGLData.CalculatePALRelas;
@@ -750,4 +803,22 @@ begin
     GetDisplayText;
 end;
 
+function TProjectGLData.ProjectGLRec(AGLID: Integer): TProjectGLRecord;
+begin
+  Result := TProjectGLRecord(sddProjectGL.FindKey('idxID', AGLID));
+end;
+
+function TProjectGLData.GetUsedTotalPrice: Double;
+var
+  i: Integer;
+  Rec: TProjectGLRecord;
+begin
+  Result := 0;
+  for i := 0 to sddProjectGL.RecordCount - 1 do
+  begin
+    Rec := TProjectGLRecord(sddProjectGL.Records[i]);
+    Result := Result + Rec.UsedQuantity.AsFloat * Rec.InfoPrice.AsFloat;
+  end;
+end;
+
 end.

+ 40 - 4
DataModules/StageDm.pas

@@ -32,6 +32,7 @@ type
     procedure UpdateComplete(ABillsID: Integer; AQuantity, ATotalPrice: Double);
 
     function HasPriceMarginBills: Boolean;
+    function HasMaterialBills: Boolean;
 
     // 向父项增量--PM_TotalPrice
     procedure UpdateParentPriceMargin(ABillsID: Integer; ADiffer: Double);
@@ -82,6 +83,8 @@ type
     procedure CalculatePriceMargin(ABillsID: Integer);
     // 计算材料调差节点
     procedure CalculatePriceMarginNode;
+    // 四川交投,计算材料摊销成本节点
+    procedure CalculateMaterialNode;
     procedure CalculateNode(ANode: TsdIDTreeNode);
     procedure CalculateAll;
 
@@ -833,7 +836,7 @@ var
   fDiffer: Double;
 begin
   if not HasPriceMarginBills then Exit;
-   
+
   with TProjectData(TPhaseData(FPhaseData).ProjectData) do
   begin
     Rec := StageRecord(iPriceMarginID);
@@ -926,15 +929,17 @@ begin
 end;
 
 procedure TStageData.UpdateProjectGL(ABillsID: Integer);
-var
+var           
+  iLeafXmjID: Integer;
   vGLs: TList;
-  iGL: Integer;
-  GLRec: TDetailGLRecord;
 begin
   vGLs := TList.Create;
   try
     with TProjectData(TPhaseData(FPhaseData).ProjectData) do
     begin
+      iLeafXmjID := BillsCompileData.GetLeafXmjParentID(ABillsID);
+      LeafXmjGlData.CalculateLeafXmj(iLeafXmjID);
+
       DetailGLData.LoadDetailGLs(ABillsID, vGLs);
       ProjectGLData.CalculateGLs_PM(vGLs);
       ProjectGLData.RefreshGatherData;
@@ -986,4 +991,35 @@ begin
   UpdateComplete(ABillsID, fQuantity, fTotalPrice);
 end;
 
+procedure TStageData.CalculateMaterialNode;
+var
+  Rec: TStageRecord;
+  fDiffer: Double;
+begin
+  if not HasPriceMarginBills then Exit;
+
+  with TProjectData(TPhaseData(FPhaseData).ProjectData) do
+  begin
+    Rec := StageRecord(iMaterialID);
+    if not Assigned(Rec) then
+      Rec := AddStageRecord(iMaterialID);
+
+    fDiffer := TotalPriceRoundTo(ProjectGLData.UsedTotalPrice - Rec.GatherTotalPrice.AsFloat);
+    if fDiffer <> 0 then
+    begin
+      Rec.AddDifferValue(Rec.GatherTotalPrice, fDiffer);
+      Rec.AddDifferValue(Rec.EndGatherTotalPrice, fDiffer);
+      UpdateParentRecord(Rec.BillsID.AsInteger, fDiffer, 'GatherTotalPrice');
+    end;
+  end;
+end;
+
+function TStageData.HasMaterialBills: Boolean;
+var
+  vNode: TsdIDTreeNode;
+begin
+  vNode := MainBillsTree.FindNode(iMaterialID);
+  Result := Assigned(vNode);
+end;
+
 end.

+ 111 - 0
DataModules/StageLeafXmjGlDm.dfm

@@ -0,0 +1,111 @@
+object StageLeafXmjGlData: TStageLeafXmjGlData
+  OldCreateOrder = False
+  Left = 528
+  Top = 277
+  Height = 214
+  Width = 239
+  object sdpStageLeafXmjGl: TsdADOProvider
+    TableName = 'StageLeafXmjGL'
+    Left = 64
+    Top = 40
+  end
+  object sddStageLeafXmjGl: TsdDataSet
+    Active = False
+    Provider = sdpStageLeafXmjGl
+    AfterValueChanged = sddStageLeafXmjGlAfterValueChanged
+    OnGetRecordClass = sddStageLeafXmjGlGetRecordClass
+    Left = 64
+    Top = 104
+    FieldListData = {
+      0101044E616D6506024944094669656C644E616D650602494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      65060B5072655175616E74697479094669656C644E616D65060B507265517561
+      6E746974790844617461547970650206084461746153697A6502080549734B65
+      79080F4E65656450726F636573734E616D650909507265636973696F6E020004
+      53697A6502000001044E616D65060D507265546F74616C507269636509466965
+      6C644E616D65060D507265546F74616C50726963650844617461547970650206
+      084461746153697A6502080549734B6579080F4E65656450726F636573734E61
+      6D650909507265636973696F6E02000453697A6502000001044E616D65060F50
+      7265557365645175616E74697479094669656C644E616D65060F507265557365
+      645175616E746974790844617461547970650206084461746153697A65020805
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000001044E616D65061150726555736564546F74616C50
+      72696365094669656C644E616D65061150726555736564546F74616C50726963
+      650844617461547970650206084461746153697A6502080549734B6579080F4E
+      65656450726F636573734E616D650909507265636973696F6E02000453697A65
+      02000001044E616D65061350726550414C5F557365645175616E746974790946
+      69656C644E616D65061350726550414C5F557365645175616E74697479084461
+      7461547970650206084461746153697A6502080549734B6579080F4E65656450
+      726F636573734E616D650909507265636973696F6E02000453697A6502000001
+      044E616D65061550726550414C5F55736564546F74616C507269636509466965
+      6C644E616D65061550726550414C5F55736564546F74616C5072696365084461
+      7461547970650206084461746153697A6502080549734B6579080F4E65656450
+      726F636573734E616D650909507265636973696F6E02000453697A6502000001
+      044E616D65061150726550414C5F44656C74615072696365094669656C644E61
+      6D65061150726550414C5F44656C746150726963650844617461547970650206
+      084461746153697A6502080549734B6579080F4E65656450726F636573734E61
+      6D650909507265636973696F6E02000453697A6502000001044E616D65060C50
+      726550414C5F546F74616C094669656C644E616D65060C50726550414C5F546F
+      74616C0844617461547970650206084461746153697A6502080549734B657908
+      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
+      7A6502000001044E616D6506085175616E74697479094669656C644E616D6506
+      085175616E746974790844617461547970650206084461746153697A65020805
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000001044E616D65060A546F74616C5072696365094669
+      656C644E616D65060A546F74616C507269636508446174615479706502060844
+      61746153697A6502080549734B6579080F4E65656450726F636573734E616D65
+      0909507265636973696F6E02000453697A6502000001044E616D65060C557365
+      645175616E74697479094669656C644E616D65060C557365645175616E746974
+      790844617461547970650206084461746153697A6502080549734B6579080F4E
+      65656450726F636573734E616D650909507265636973696F6E02000453697A65
+      02000001044E616D65060E55736564546F74616C5072696365094669656C644E
+      616D65060E55736564546F74616C507269636508446174615479706502060844
+      61746153697A6502080549734B6579080F4E65656450726F636573734E616D65
+      0909507265636973696F6E02000453697A6502000001044E616D65061050414C
+      5F557365645175616E74697479094669656C644E616D65061050414C5F557365
+      645175616E746974790844617461547970650206084461746153697A65020805
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000001044E616D65061250414C5F55736564546F74616C
+      5072696365094669656C644E616D65061250414C5F55736564546F74616C5072
+      6963650844617461547970650206084461746153697A6502080549734B657908
+      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
+      7A6502000001044E616D65060E50414C5F44656C74615072696365094669656C
+      644E616D65060E50414C5F44656C746150726963650844617461547970650206
+      084461746153697A6502080549734B6579080F4E65656450726F636573734E61
+      6D650909507265636973696F6E02000453697A6502000001044E616D65060950
+      414C5F546F74616C094669656C644E616D65060950414C5F546F74616C084461
+      7461547970650206084461746153697A6502080549734B6579080F4E65656450
+      726F636573734E616D650909507265636973696F6E02000453697A6502000001
+      044E616D65060B456E645175616E74697479094669656C644E616D65060B456E
+      645175616E746974790844617461547970650206084461746153697A65020805
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000001044E616D65060D456E64546F74616C5072696365
+      094669656C644E616D65060D456E64546F74616C507269636508446174615479
+      70650206084461746153697A6502080549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      65060F456E64557365645175616E74697479094669656C644E616D65060F456E
+      64557365645175616E746974790844617461547970650206084461746153697A
+      6502080549734B6579080F4E65656450726F636573734E616D65090950726563
+      6973696F6E02000453697A6502000001044E616D650611456E6455736564546F
+      74616C5072696365094669656C644E616D650611456E6455736564546F74616C
+      50726963650844617461547970650206084461746153697A6502080549734B65
+      79080F4E65656450726F636573734E616D650909507265636973696F6E020004
+      53697A6502000001044E616D650613456E6450414C5F557365645175616E7469
+      7479094669656C644E616D650613456E6450414C5F557365645175616E746974
+      790844617461547970650206084461746153697A6502080549734B6579080F4E
+      65656450726F636573734E616D650909507265636973696F6E02000453697A65
+      02000001044E616D650615456E6450414C5F55736564546F74616C5072696365
+      094669656C644E616D650615456E6450414C5F55736564546F74616C50726963
+      650844617461547970650206084461746153697A6502080549734B6579080F4E
+      65656450726F636573734E616D650909507265636973696F6E02000453697A65
+      02000001044E616D650611456E6450414C5F44656C7461507269636509466965
+      6C644E616D650611456E6450414C5F44656C7461507269636508446174615479
+      70650206084461746153697A6502080549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      65060C456E6450414C5F546F74616C094669656C644E616D65060C456E645041
+      4C5F546F74616C0844617461547970650206084461746153697A650208054973
+      4B6579080F4E65656450726F636573734E616D650909507265636973696F6E02
+      000453697A6502000000}
+  end
+end

+ 441 - 0
DataModules/StageLeafXmjGlDm.pas

@@ -0,0 +1,441 @@
+unit StageLeafXmjGlDm;
+
+interface
+
+uses
+  SysUtils, Classes, sdDB, sdProvider, ADODB, mDataRecord, CalcDecimal;
+
+type
+  TStageLeafXmjGlData = class(TDataModule)
+    sdpStageLeafXmjGl: TsdADOProvider;
+    sddStageLeafXmjGl: TsdDataSet;
+    procedure sddStageLeafXmjGlGetRecordClass(
+      var ARecordClass: TsdRecordClass);
+    procedure sddStageLeafXmjGlAfterValueChanged(AValue: TsdValue);
+  private
+    FPhaseData: TObject;
+
+    procedure SaveCurStageData;
+
+    procedure BeforeBatchOperation;
+    procedure AfterBatchOperation;
+
+    procedure UpdateEndTotalPrice(ARec: TStageLeafXmjGlRecord);
+    procedure UpdateEndQuantity(ARec: TStageLeafXmjGlRecord);
+    procedure CalculateQuantity(ARec: TStageLeafXmjGlRecord);
+
+    procedure UpdateEndPALRela(ARec:TStageLeafXmjGlRecord);
+    procedure CalculatePALRela(ARec:TStageLeafXmjGlRecord; AProjGLRec: TProjectGLRecord);
+
+    function GetDecimal: TCalcDecimal;
+  public
+    constructor Create(APhaseData: TObject);
+    destructor Destroy; override;
+
+    procedure Open(AConnection: TADOConnection);
+    procedure Save;
+
+    procedure CopyPrePhaseData;
+
+    procedure LoadCurStageData;
+
+    function StageLeafXmjGlRecord(AID: Integer): TStageLeafXmjGlRecord;
+    procedure DeleteLeafXmjGLRecord(AID: Integer);
+
+    procedure Calculate(AID: Integer);
+
+    // 调整工料价格后,需计算项
+    procedure CalculatePriceRela(AGLID: Integer);
+
+    property Decimal: TCalcDecimal read GetDecimal;
+  end;
+
+implementation
+
+uses
+  PhaseData, ProjectData, UtilMethods, LeafXmjGlDm, ProjectGLDm, StrUtils,
+  DetailGLDm, BillsTree, BillsMeasureDm;
+
+{$R *.dfm}
+
+{ TStageLeafXmjGlData }
+
+procedure TStageLeafXmjGlData.AfterBatchOperation;
+begin
+  sddStageLeafXmjGl.EndUpdate;
+  sddStageLeafXmjGl.EnableControls;
+  sddStageLeafXmjGl.AfterValueChanged := sddStageLeafXmjGlAfterValueChanged;
+end;
+
+procedure TStageLeafXmjGlData.BeforeBatchOperation;
+begin
+  sddStageLeafXmjGl.DisableControls;
+  sddStageLeafXmjGl.BeginUpdate;
+  sddStageLeafXmjGl.AfterValueChanged := nil;
+end;
+
+procedure TStageLeafXmjGlData.Calculate(AID: Integer);
+var
+  Rec: TStageLeafXmjGlRecord;
+  ProjGLRec: TProjectGLRecord;
+  fValue: Double;
+begin
+  Rec := StageLeafXmjGlRecord(AID);
+  CalculateQuantity(Rec);
+  with TProjectData(TPhaseData(FPhaseData).ProjectData) do
+    ProjGLRec := ProjectGLData.ProjectGLRec(Rec.GLID);
+  // 计算调差金额
+  fValue := Decimal.TotalPrice.RoundTo(Rec.Quantity.AsFloat * ProjGLRec.ValidDeltaPrice.AsFloat);
+  Rec.SetFloatValue(Rec.TotalPrice, fValue);
+  UpdateEndTotalPrice(Rec);
+  // 计算本期实耗分析相关
+  CalculatePALRela(Rec, ProjGLRec);
+end;
+
+procedure TStageLeafXmjGlData.CalculatePriceRela(AGLID: Integer);
+var
+  i: Integer;
+  Rec: TStageLeafXmjGlRecord;
+  ProjGLRec: TProjectGLRecord;
+  fValue: Double;
+begin
+  with TProjectData(TPhaseData(FPhaseData).ProjectData) do
+    ProjGLRec := ProjectGLData.ProjectGLRec(AGLID);
+  for i := 0 to sddStageLeafXmjGl.RecordCount - 1 do
+  begin
+    Rec := TStageLeafXmjGlRecord(sddStageLeafXmjGl.Records[i]);
+    if Rec.GLID = AGLID then
+    begin
+      // 计算调差金额
+      fValue := Decimal.TotalPrice.RoundTo(Rec.Quantity.AsFloat * ProjGLRec.ValidDeltaPrice.AsFloat);
+      Rec.SetFloatValue(Rec.TotalPrice, fValue);
+      UpdateEndTotalPrice(Rec);
+      // 计算本期实耗分析相关
+      CalculatePALRela(Rec, ProjGLRec);
+    end;
+  end;
+end;
+
+procedure TStageLeafXmjGlData.CalculateQuantity(ARec: TStageLeafXmjGlRecord);
+var
+  vDetails: TList;
+  fQuantity: Double;
+  i: Integer;
+  GLRec: TDetailGLRecord;
+  vNode: TMeasureBillsIDTreeNode;
+begin
+  vDetails := TList.Create;
+  try
+    with TProjectData(TPhaseData(FPhaseData).ProjectData).DetailGLData do
+      LoadXmjDetailGLs(ARec.XmjID, ARec.GLID, vDetails);
+
+    fQuantity := 0;
+    for i := 0 to vDetails.Count - 1 do
+    begin
+      GLRec := TDetailGLRecord(vDetails.Items[i]);
+      with TProjectData(TPhaseData(FPhaseData).ProjectData).BillsMeasureData do
+        vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(GLRec.BillsID.AsInteger));
+      if Assigned(vNode.StageRec) then
+        fQuantity := fQuantity + Decimal.Quantity.RoundTo(vNode.StageRec.GatherQuantity.AsFloat * GLRec.Quantity.AsFloat);
+    end;
+    ARec.SetFloatValue(ARec.Quantity, fQuantity);
+    UpdateEndQuantity(ARec);
+  finally
+    vDetails.Free;
+  end;
+end;
+
+constructor TStageLeafXmjGlData.Create(APhaseData: TObject);
+begin
+  inherited Create(nil);
+  FPhaseData := APhaseData;
+end;
+
+destructor TStageLeafXmjGlData.Destroy;
+begin
+  inherited;
+end;
+
+function TStageLeafXmjGlData.GetDecimal: TCalcDecimal;
+begin
+  Result := TProjectData(TPhaseData(FPhaseData).ProjectData).ProjProperties.DecimalManager.Common;
+end;
+
+procedure TStageLeafXmjGlData.LoadCurStageData;
+const
+  sSelectSql = 'Select * From PhaseLeafXmjGL Where StageID = %d';
+var
+  vQuery: TADOQuery;
+
+  procedure LoadData;
+  var
+    iRec: Integer;
+    Rec: TStageLeafXmjGlRecord;
+  begin
+    for iRec := 0 to sddStageLeafXmjGl.RecordCount - 1 do
+    begin
+      Rec := TStageLeafXmjGlRecord(sddStageLeafXmjGl.Records[iRec]);
+      if vQuery.Active and vQuery.Locate('ID', Rec.ID.AsInteger, []) then
+      begin
+        Rec.SetFloatValue(Rec.Quantity, vQuery.FieldByName('Quantity').AsFloat);
+        Rec.SetFloatValue(Rec.TotalPrice, vQuery.FieldByName('TotalPrice').AsFloat);
+        Rec.SetFloatValue(Rec.UsedQuantity, vQuery.FieldByName('UsedQuantity').AsFloat);
+        Rec.SetFloatValue(Rec.UsedTotalPrice, vQuery.FieldByName('UsedTotalPrice').AsFloat);
+        Rec.SetFloatValue(Rec.PAL_UsedQuantity, vQuery.FieldByName('PAL_UsedQuantity').AsFloat);
+        Rec.SetFloatValue(Rec.PAL_UsedTotalPrice, vQuery.FieldByName('PAL_UsedTotalPrice').AsFloat);
+        Rec.SetFloatValue(Rec.PAL_DeltaPrice, vQuery.FieldByName('PAL_DeltaPrice').AsFloat);
+        Rec.SetFloatValue(Rec.PAL_Total, vQuery.FieldByName('PAL_Total').AsFloat);
+
+        Rec.SetFloatValue(Rec.EndQuantity, Decimal.Quantity.RoundTo(Rec.PreQuantity.AsFloat + Rec.Quantity.AsFloat));
+        Rec.SetFloatValue(Rec.EndTotalPrice, Decimal.TotalPrice.RoundTo(Rec.PreTotalPrice.AsFloat + Rec.TotalPrice.AsFloat));
+        Rec.SetFloatValue(Rec.EndUsedQuantity, Decimal.Quantity.RoundTo(Rec.PreUsedQuantity.AsFloat + Rec.UsedQuantity.AsFloat));
+        Rec.SetFloatValue(Rec.EndUsedTotalPrice, Decimal.TotalPrice.RoundTo(Rec.PreUsedTotalPrice.AsFloat + Rec.UsedTotalPrice.AsFloat));
+        Rec.SetFloatValue(Rec.EndPAL_UsedQuantity, Decimal.Quantity.RoundTo(Rec.PrePAL_UsedQuantity.AsFloat + Rec.PAL_UsedQuantity.AsFloat));
+        Rec.SetFloatValue(Rec.EndPAL_UsedTotalPrice, Decimal.TotalPrice.RoundTo(Rec.PrePAL_UsedTotalPrice.AsFloat + Rec.PAL_UsedTotalPrice.AsFloat));
+        Rec.SetFloatValue(Rec.EndPAL_DeltaPrice, Decimal.TotalPrice.RoundTo(Rec.PrePAL_DeltaPrice.AsFloat + Rec.PAL_DeltaPrice.AsFloat));
+        Rec.SetFloatValue(Rec.EndPAL_Total, Decimal.TotalPrice.RoundTo(Rec.PrePAL_Total.AsFloat + Rec.PAL_Total.AsFloat));
+      end
+      else
+      begin
+        Rec.SetFloatValue(Rec.Quantity, 0);
+        Rec.SetFloatValue(Rec.TotalPrice, 0);
+        Rec.SetFloatValue(Rec.UsedQuantity, 0);
+        Rec.SetFloatValue(Rec.UsedTotalPrice, 0);
+        Rec.SetFloatValue(Rec.PAL_UsedQuantity, 0);
+        Rec.SetFloatValue(Rec.PAL_UsedTotalPrice, 0);
+        Rec.SetFloatValue(Rec.PAL_DeltaPrice, 0);
+        Rec.SetFloatValue(Rec.PAL_Total, 0);
+
+        Rec.SetFloatValue(Rec.EndQuantity, Rec.PreQuantity.AsFloat);
+        Rec.SetFloatValue(Rec.EndTotalPrice, Rec.PreTotalPrice.AsFloat);
+        Rec.SetFloatValue(Rec.EndUsedQuantity, Rec.PreUsedQuantity.AsFloat);
+        Rec.SetFloatValue(Rec.EndUsedTotalPrice, Rec.PreUsedTotalPrice.AsFloat);
+        Rec.SetFloatValue(Rec.EndPAL_UsedQuantity, Rec.PrePAL_UsedQuantity.AsFloat);
+        Rec.SetFloatValue(Rec.EndPAL_UsedTotalPrice, Rec.PrePAL_UsedTotalPrice.AsFloat);
+        Rec.SetFloatValue(Rec.EndPAL_DeltaPrice, Rec.PrePAL_DeltaPrice.AsFloat);
+        Rec.SetFloatValue(Rec.EndPAL_Total, Rec.PrePAL_Total.AsFloat);
+      end;
+    end;
+  end;
+
+begin
+  BeforeBatchOperation;
+  vQuery := TADOQuery.Create(nil);
+  try
+    vQuery.Connection := sdpStageLeafXmjGl.Connection;
+    vQuery.SQL.Clear;
+    vQuery.SQL.Add(Format(sSelectSql, [TPhaseData(FPhaseData).StageIndex]));
+    vQuery.Open;
+    LoadData;
+  finally
+    vQuery.Free;
+    AfterBatchOperation;
+  end;
+end;
+
+procedure TStageLeafXmjGlData.Open(AConnection: TADOConnection);
+begin
+  sdpStageLeafXmjGl.Connection := AConnection;
+  sddStageLeafXmjGl.Open;
+  if not Assigned(sddStageLeafXmjGl.FindIndex('idxID')) then
+    sddStageLeafXmjGl.AddIndex('idxID', 'ID');
+  LoadCurStageData;
+end;
+
+procedure TStageLeafXmjGlData.Save;
+begin
+  sddStageLeafXmjGl.Save;
+  if not TPhaseData(FPhaseData).StageDataReadOnly then
+    SaveCurStageData;
+end;
+
+procedure TStageLeafXmjGlData.SaveCurStageData;
+const
+  sDeleteSql = 'Delete From PhaseLeafXmjGL where (StageID = %d)';
+  sCopySql = 'Insert Into PhaseLeafXmjGL'+
+             '  Select ID, %d As StageID, Quantity, TotalPrice, UsedQuantity, UsedTotalPrice,'+
+             '    PAL_UsedQuantity, PAL_UsedTotalPrice, PAL_DeltaPrice, PAL_Total'+
+             '  From StageLeafXmjGL' +
+             '  Where (Quantity <> 0) or (UsedQuantity <> 0)';
+begin
+  if TPhaseData(FPhaseData).StageDataReadOnly then Exit;
+
+  ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sDeleteSql, [TPhaseData(FPhaseData).StageIndex]));
+  ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sCopySql, [TPhaseData(FPhaseData).StageIndex]));
+  // 不要问我为什么,不写下面这个,上面那句不执行
+  ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sDeleteSql, [-1]));
+  ExecuteSql(sdpStageLeafXmjGl.Connection, Format(sCopySql, [-1]));
+end;
+
+procedure TStageLeafXmjGlData.sddStageLeafXmjGlGetRecordClass(
+  var ARecordClass: TsdRecordClass);
+begin
+  ARecordClass := TStageLeafXmjGlRecord;
+end;
+
+function TStageLeafXmjGlData.StageLeafXmjGlRecord(
+  AID: Integer): TStageLeafXmjGlRecord;
+begin
+  Result := TStageLeafXmjGlRecord(sddStageLeafXmjGl.FindKey('idxID', AID));
+  if not Assigned(Result) then
+  begin
+    Result := TStageLeafXmjGlRecord(sddStageLeafXmjGl.Add);
+    Result.ID.AsInteger := AID;
+  end;
+end;
+
+procedure TStageLeafXmjGlData.sddStageLeafXmjGlAfterValueChanged(
+  AValue: TsdValue);
+var
+  Rec: TStageLeafXmjGlRecord;
+  ProjGLRec: TProjectGLRecord;
+begin
+  if SameText(AValue.FieldName, 'UsedQuantity') then
+  begin
+    Rec := TStageLeafXmjGlRecord(AValue.Owner);
+    with TProjectData(TPhaseData(FPhaseData).ProjectData) do
+    begin
+      ProjGLRec := ProjectGLData.ProjectGLRec(Rec.GLID);
+      CalculatePALRela(Rec, ProjGLRec);
+      ProjectGLData.CalculatePALRela(ProjGLRec);
+    end;
+  end;
+end;
+
+procedure TStageLeafXmjGlData.CalculatePALRela(
+  ARec: TStageLeafXmjGlRecord; AProjGLRec: TProjectGLRecord);
+var
+  fValue: Double;
+begin
+  // 计算 材料实耗金额
+  fValue := Decimal.TotalPrice.RoundTo(ARec.UsedQuantity.AsFloat * AProjGLRec.InfoPrice.AsFloat);
+  ARec.SetFloatValue(ARec.UsedTotalPrice, fValue);
+  // 计算 数量差
+  fValue := Decimal.Quantity.RoundTo(ARec.Quantity.AsFloat - ARec.UsedQuantity.AsFloat);
+  ARec.SetFloatValue(ARec.PAL_UsedQuantity, fValue);
+  // 计算 数量差金额
+  fValue := Decimal.Quantity.RoundTo(ARec.PAL_UsedQuantity.AsFloat * AProjGLRec.BasePrice.AsFloat);
+  ARec.SetFloatValue(ARec.PAL_UsedTotalPrice, fValue);
+  // 计算 实耗价差金额
+  fValue := Decimal.TotalPrice.RoundTo( - ARec.UsedQuantity.AsFloat * AProjGLRec.DeltaPrice.AsFloat);
+  ARec.SetFloatValue(ARec.PAL_DeltaPrice, fValue);
+  // 计算 节余金额
+  fValue := Decimal.TotalPrice.RoundTo(AProjGLRec.BasePrice.AsFloat*ARec.Quantity.AsFloat - AProjGLRec.InfoPrice.AsFloat*ARec.UsedQuantity.AsFloat);
+  ARec.SetFloatValue(ARec.PAL_Total, fValue);
+  UpdateEndPALRela(ARec);
+end;
+
+procedure TStageLeafXmjGlData.DeleteLeafXmjGLRecord(AID: Integer);
+var
+  Rec: TsdDataRecord;
+begin
+  Rec := sddStageLeafXmjGl.FindKey('idxID', AID);
+  sddStageLeafXmjGl.Remove(Rec);
+end;
+
+procedure TStageLeafXmjGlData.UpdateEndQuantity(
+  ARec: TStageLeafXmjGlRecord);
+var
+  fQuantity: Double;
+  AddRec: TLeafXmjGlRecord;
+begin
+  fQuantity := Decimal.Quantity.RoundTo(ARec.PreQuantity.AsFloat + ARec.Quantity.AsFloat);
+  ARec.SetFloatValue(ARec.EndQuantity, fQuantity);
+  if Assigned(ARec.MainRec) then
+  begin
+    AddRec := TLeafXmjGlRecord(ARec.MainRec);
+    AddRec.SetFloatValue(AddRec.AddQuantity, fQuantity);
+  end;
+end;
+
+procedure TStageLeafXmjGlData.UpdateEndPALRela(
+  ARec: TStageLeafXmjGlRecord);
+var
+  fValue: Double;
+  AddRec: TLeafXmjGlRecord;
+begin
+  // 实耗数量
+  fValue := Decimal.Quantity.RoundTo(ARec.PreUsedQuantity.AsFloat + ARec.UsedQuantity.AsFloat);
+  ARec.SetFloatValue(ARec.EndUsedQuantity, fValue);
+  // 实耗金额
+  fValue := Decimal.TotalPrice.RoundTo(ARec.PreUsedTotalPrice.AsFloat + ARec.UsedTotalPrice.AsFloat);
+  ARec.SetFloatValue(ARec.EndUsedTotalPrice, fValue);
+  // 数量差
+  fValue := Decimal.Quantity.RoundTo(ARec.PrePAL_UsedQuantity.AsFloat + ARec.PAL_UsedQuantity.AsFloat);
+  ARec.SetFloatValue(ARec.EndPAL_UsedQuantity, fValue);
+  // 数量差金额
+  fValue := Decimal.TotalPrice.RoundTo(ARec.PrePAL_UsedTotalPrice.AsFloat + ARec.PAL_UsedTotalPrice.AsFloat);
+  ARec.SetFloatValue(ARec.EndPAL_UsedTotalPrice, fValue);
+  // 实耗价差金额
+  fValue := Decimal.TotalPrice.RoundTo(ARec.PrePAL_DeltaPrice.AsFloat + ARec.PAL_DeltaPrice.AsFloat);
+  ARec.SetFloatValue(ARec.EndPAL_DeltaPrice, fValue);
+  // 节余金额
+  fValue := Decimal.TotalPrice.RoundTo(ARec.PrePAL_Total.AsFloat + ARec.PAL_Total.AsFloat);
+  ARec.SetFloatValue(ARec.EndPAL_Total, fValue);
+  if Assigned(ARec.MainRec) then
+  begin
+    AddRec := TLeafXmjGlRecord(ARec.MainRec);
+    AddRec.SetFloatValue(AddRec.AddUsedQuantity, ARec.EndUsedQuantity.AsFloat);
+    AddRec.SetFloatValue(AddRec.AddUsedTotalPrice, ARec.EndUsedTotalPrice.AsFloat);
+    AddRec.SetFloatValue(AddRec.AddPAL_UsedQuantity, ARec.EndPAL_UsedQuantity.AsFloat);
+    AddRec.SetFloatValue(AddRec.AddPAL_UsedTotalPrice, ARec.EndPAL_UsedTotalPrice.AsFloat);
+    AddRec.SetFloatValue(AddRec.AddPAL_DeltaPrice, ARec.EndPAL_DeltaPrice.AsFloat);
+    AddRec.SetFloatValue(AddRec.AddPAL_Total, ARec.EndPAL_Total.AsFloat);
+  end;
+end;
+
+procedure TStageLeafXmjGlData.UpdateEndTotalPrice(
+  ARec: TStageLeafXmjGlRecord);
+var
+  fValue: Double;
+  AddRec: TLeafXmjGlRecord;
+begin
+  fValue := Decimal.TotalPrice.RoundTo(ARec.PreTotalPrice.AsFloat + ARec.TotalPrice.AsFloat);
+  ARec.SetFloatValue(ARec.EndTotalPrice, fValue);
+  if Assigned(ARec.MainRec) then
+  begin
+    AddRec := TLeafXmjGlRecord(ARec.MainRec);
+    AddRec.SetFloatValue(AddRec.AddTotalPrice, fValue);
+  end;
+end;
+
+procedure TStageLeafXmjGlData.CopyPrePhaseData;
+var
+  iRecord: Integer;
+  Rec: TLeafXmjGlRecord;
+  NewRec: TStageLeafXmjGlRecord;
+begin
+  BeforeBatchOperation;
+  try
+    with TProjectData(TPhaseData(FPhaseData).ProjectData).LeafXmjGlData do
+      for iRecord := 0 to sddLeafXmjGL.RecordCount - 1 do
+      begin
+        Rec := TLeafXmjGlRecord(sddLeafXmjGL.Records[iRecord]);
+
+        NewRec := TStageLeafXmjGlRecord(Rec.StageRec);
+        NewRec.ID.AsInteger := Rec.ID.AsInteger;
+
+        NewRec.PreQuantity.AsFloat := Rec.AddQuantity.AsFloat;
+        NewRec.PreTotalPrice.AsFloat := Rec.AddQuantity.AsFloat;
+        NewRec.PreUsedQuantity.AsFloat := Rec.AddUsedQuantity.AsFloat;
+        NewRec.PreUsedTotalPrice.AsFloat := Rec.AddUsedTotalPrice.AsFloat;
+        NewRec.PrePAL_UsedQuantity.AsFloat := Rec.AddPAL_UsedQuantity.AsFloat;
+        NewRec.PrePAL_UsedTotalPrice.AsFloat := Rec.AddPAL_UsedTotalPrice.AsFloat;
+        NewRec.PrePAL_DeltaPrice.AsFloat := Rec.AddPAL_DeltaPrice.AsFloat;
+        NewRec.PrePAL_Total.AsFloat := Rec.AddPAL_Total.AsFloat;
+
+        NewRec.EndQuantity.AsFloat := Rec.AddQuantity.AsFloat;
+        NewRec.EndTotalPrice.AsFloat := Rec.AddQuantity.AsFloat;
+        NewRec.EndUsedQuantity.AsFloat := Rec.AddUsedQuantity.AsFloat;
+        NewRec.EndUsedTotalPrice.AsFloat := Rec.AddUsedTotalPrice.AsFloat;
+        NewRec.EndPAL_UsedQuantity.AsFloat := Rec.AddPAL_UsedQuantity.AsFloat;
+        NewRec.EndPAL_UsedTotalPrice.AsFloat := Rec.AddPAL_UsedTotalPrice.AsFloat;
+        NewRec.EndPAL_DeltaPrice.AsFloat := Rec.AddPAL_DeltaPrice.AsFloat;
+        NewRec.EndPAL_Total.AsFloat := Rec.AddPAL_Total.AsFloat;
+      end;
+  finally
+    AfterBatchOperation;
+  end;
+end;
+
+end.

+ 1 - 1
Forms/ReportsFrm.pas

@@ -1447,7 +1447,7 @@ begin
     APrintCom.FillZero := chkFillZero.Checked;
     InitPageSettings(APrintCom);
     APrintCom.ReadDBData;
-    APrintCom.AnalyseData;
+    APrintCom.AnalyseData(PreviewBox.Canvas);
   finally
     if Mem <> nil then
       Mem.Free;

+ 506 - 0
Frames/LeafXmjGlFme.dfm

@@ -0,0 +1,506 @@
+object LeafXmjGlFrame: TLeafXmjGlFrame
+  Left = 0
+  Top = 0
+  Width = 1184
+  Height = 685
+  TabOrder = 0
+  object zgLeafXmj: TZJGrid
+    Left = 0
+    Top = 0
+    Width = 1184
+    Height = 392
+    Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
+    OptionsEx = []
+    ColCount = 9
+    RowCount = 6
+    FixedRowCount = 2
+    ShowGridLine = False
+    DefaultColWidth = 73
+    DefaultFixedColWidth = 25
+    Selection.AlphaBlend = False
+    Selection.TransparentColor = False
+    FrozenCol = 0
+    FrozenRow = 0
+    Align = alClient
+  end
+  object pnlGL: TPanel
+    Left = 0
+    Top = 392
+    Width = 1184
+    Height = 293
+    Align = alBottom
+    BevelOuter = bvNone
+    TabOrder = 1
+    object pnlTopTag: TPanel
+      Left = 0
+      Top = 0
+      Width = 1184
+      Height = 21
+      Align = alTop
+      BevelOuter = bvNone
+      TabOrder = 0
+      object tbTopTag: TToolBar
+        Left = 0
+        Top = 0
+        Width = 67
+        Height = 21
+        Align = alLeft
+        AutoSize = True
+        ButtonHeight = 21
+        ButtonWidth = 67
+        EdgeBorders = []
+        Flat = True
+        ShowCaptions = True
+        TabOrder = 0
+        object tobtnGL: TToolButton
+          Left = 0
+          Top = 0
+          Caption = '  '#35814#32454#24037#26009'  '
+          Down = True
+          ImageIndex = 2
+          Style = tbsCheck
+        end
+      end
+    end
+    object zgLeafXmjGL: TZJGrid
+      Left = 0
+      Top = 21
+      Width = 1184
+      Height = 272
+      Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
+      OptionsEx = []
+      ColCount = 13
+      RowCount = 6
+      FixedRowCount = 2
+      ShowGridLine = False
+      DefaultColWidth = 73
+      DefaultFixedColWidth = 25
+      Selection.AlphaBlend = False
+      Selection.TransparentColor = False
+      FrozenCol = 0
+      FrozenRow = 0
+      Align = alClient
+    end
+  end
+  object saLeafXmj: TsdGridDBA
+    Columns = <
+      item
+        Title.Caption = #25152#23646#39033#30446#33410'|'#32534#21495
+        Title.CaptionAcrossCols = '3'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Code'
+        Width = 120
+        ReadOnly = True
+      end
+      item
+        Title.Caption = '|'#21517#31216
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Name'
+        Width = 150
+        ReadOnly = False
+      end
+      item
+        Title.Caption = '|'#21333#20301
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Units'
+        Width = 50
+        ReadOnly = False
+      end
+      item
+        Title.Caption = #37096#20301#20449#24687'|'#21333#20301#24037#31243
+        Title.CaptionAcrossCols = '5'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'NameDanWei'
+        Width = 80
+        ReadOnly = False
+      end
+      item
+        Title.Caption = '|'#20998#37096#24037#31243
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'NameFenBu'
+        Width = 80
+        ReadOnly = False
+      end
+      item
+        Title.Caption = '|'#20998#39033#24037#31243
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'NameFenXiang'
+        Width = 120
+        ReadOnly = False
+      end
+      item
+        Title.Caption = '|'#35745#37327#21333#20803
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'NameUnit'
+        Width = 120
+        ReadOnly = False
+      end
+      item
+        Title.Caption = '|'#26729#21495
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Peg'
+        Width = 80
+        ReadOnly = False
+      end>
+    Grid = zgLeafXmj
+    ExtendRowCount = 0
+    Options = []
+    Left = 264
+    Top = 152
+  end
+  object xpm: TXPMenu
+    DimLevel = 30
+    GrayLevel = 10
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clMenuText
+    Font.Height = -12
+    Font.Name = #23435#20307
+    Font.Style = []
+    Color = clBtnFace
+    IconBackColor = clBtnFace
+    MenuBarColor = clBtnFace
+    SelectColor = 38640
+    SelectBorderColor = clHighlight
+    SelectFontColor = clMenuText
+    DisabledColor = clInactiveCaption
+    SeparatorColor = clBtnFace
+    CheckedColor = clHighlight
+    IconWidth = 24
+    DrawSelect = True
+    UseSystemColors = False
+    OverrideOwnerDraw = False
+    Gradient = False
+    FlatMenu = False
+    AutoDetect = True
+    XPControls = [xcToolbar]
+    Active = True
+    ControlUseTrueXPStyle = True
+    BtnRoundArc = 5
+    BtnOutLineBorderColor = 7552000
+    BtnInnerBorderMoveColor = 3257087
+    BtnInnerBorderFocusColor = 15183500
+    BtnSurfaceNormalColor = 16251903
+    BtnSurfaceDownColor = 14608359
+    BtnSurfaceBottomLineColor = 14608359
+    BtnSurfaceDownBottomLineColor = 15199215
+    RdoChkControlChkColor = 41472
+    ComboBoxChkColor = 9201994
+    ComboboxSurfaceMoveColor = 16771030
+    ControlDisabledBorderColor = 11913158
+    Left = 279
+    Top = 56
+  end
+  object saLeafXmjGL: TsdGridDBA
+    Columns = <
+      item
+        Title.Caption = #32534#21495
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 2
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taCenter
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Code'
+        Width = 80
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #21517#31216
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 2
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Name'
+        Width = 150
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #21333#20301
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 2
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taCenter
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Units'
+        Width = 50
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #35268#26684
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 2
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Specs'
+        Width = 150
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #26412#26399#24212#32791#25968#37327
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 2
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Quantity'
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #26412#26399#23454#32791#20998#26512'|'#26412#26399#23454#32791#25968#37327
+        Title.CaptionAcrossCols = '5'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'UsedQuantity'
+        Width = 85
+        ReadOnly = False
+      end
+      item
+        Title.Caption = '|'#25968#37327#24046
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'PAL_UsedQuantity'
+        Width = 60
+        ReadOnly = True
+      end
+      item
+        Title.Caption = '|'#25968#37327#24046#37329#39069
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'PAL_UsedTotalPrice'
+        Width = 80
+        ReadOnly = True
+      end
+      item
+        Title.Caption = '|'#23454#32791#20215#24046#37329#39069
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'PAL_DeltaPrice'
+        Width = 85
+        ReadOnly = True
+      end
+      item
+        Title.Caption = '|'#33410#20313#37329#39069
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'PAL_Total'
+        Width = 60
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #25130#27490#26412#26399'|'#24212#32791#25968#37327
+        Title.CaptionAcrossCols = '2'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'EndQuantity'
+        ReadOnly = True
+      end
+      item
+        Title.Caption = '|'#23454#32791#25968#37327
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 2
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taRightJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'EndUsedQuantity'
+        ReadOnly = True
+      end>
+    Grid = zgLeafXmjGL
+    ExtendRowCount = 0
+    Options = [aoAllowEdit]
+    Left = 264
+    Top = 472
+  end
+end

+ 47 - 0
Frames/LeafXmjGlFme.pas

@@ -0,0 +1,47 @@
+unit LeafXmjGlFme;
+
+interface
+
+uses
+  LeafXmjGlDm,
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, XPMenu, ComCtrls, ToolWin, sdGridDBA, ExtCtrls, ZJGrid;
+
+type
+  TLeafXmjGlFrame = class(TFrame)
+    zgLeafXmj: TZJGrid;
+    pnlGL: TPanel;
+    saLeafXmj: TsdGridDBA;
+    pnlTopTag: TPanel;
+    tbTopTag: TToolBar;
+    tobtnGL: TToolButton;
+    xpm: TXPMenu;
+    zgLeafXmjGL: TZJGrid;
+    saLeafXmjGL: TsdGridDBA;
+  private
+    FLeafXmjGlData: TLeafXmjGlData;
+  public
+    constructor Create(ALeafXmjGlData: TLeafXmjGlData);
+    destructor Destroy; override;
+  end;
+
+implementation
+
+{$R *.dfm}
+
+{ TLeafXmjGlFrame }
+
+constructor TLeafXmjGlFrame.Create(ALeafXmjGlData: TLeafXmjGlData);
+begin
+  inherited Create(nil);
+  FLeafXmjGlData := ALeafXmjGlData;
+  saLeafXmj.DataView := ALeafXmjGlData.sdvLeafXmj;
+  saLeafXmjGL.DataView := ALeafXmjGlData.sdvLeafXmjGL;
+end;
+
+destructor TLeafXmjGlFrame.Destroy;
+begin
+  inherited;
+end;
+
+end.

+ 7 - 2
Frames/PriceMarginBillsFme.pas

@@ -135,7 +135,7 @@ procedure TPriceMarginBillsFrame.actnApplyToSameBillsExecute(
 var
   CurRec, Rec: TsdDataRecord;
   vGLs: TList;
-  iRec: Integer;
+  iRec, iLeafXmj: Integer;
 begin
   if saDetailGclBills.DataView.RecordCount = 1 then Exit;
 
@@ -149,9 +149,14 @@ begin
       if Rec <> CurRec then
       begin
         FDetailGLData.ResetDetailGLs(Rec.ValueByName('RelaBillsID').AsInteger, vGLs);
-        // 应重新计算清单
         with TProjectData(FPriceMarginBillsData.ProjectData) do
+        begin                                                                        
+          // 应重新计算清单
           PhaseData.StageData.CalculatePriceMargin(Rec.ValueByName('RelaBillsID').AsInteger);
+          // 应重新计算分部分项
+          iLeafXmj := BillsCompileData.GetLeafXmjParentID(Rec.ValueByName('RelaBillsID').AsInteger);
+          LeafXmjGlData.CalculateLeafXmj(iLeafXmj);
+        end;
         FPriceMarginBillsData.RefreshDetailBills(Rec.ValueByName('RelaBillsID').AsInteger);
       end;
       // 应重新计算使用到的工料

+ 20 - 3
Frames/PriceMarginFme.dfm

@@ -15,12 +15,12 @@ object PriceMarginFrame: TPriceMarginFrame
     object tbTopTag: TToolBar
       Left = 0
       Top = 0
-      Width = 134
+      Width = 273
       Height = 21
       Align = alLeft
       AutoSize = True
       ButtonHeight = 21
-      ButtonWidth = 67
+      ButtonWidth = 91
       EdgeBorders = []
       Flat = True
       ShowCaptions = True
@@ -36,13 +36,22 @@ object PriceMarginFrame: TPriceMarginFrame
       end
       object tobtnBills: TToolButton
         Tag = 1
-        Left = 67
+        Left = 91
         Top = 0
         Caption = ' '#28165#21333#27719#24635' '
         ImageIndex = 0
         Style = tbsCheck
         OnClick = tobtnBillsClick
       end
+      object tobtnLeafXmj: TToolButton
+        Tag = 2
+        Left = 182
+        Top = 0
+        Caption = '  '#20998#37096#20998#39033#24037#26009'  '
+        ImageIndex = 1
+        Style = tbsCheck
+        OnClick = tobtnBillsClick
+      end
     end
   end
   object jpsPriceMargin: TJimPages
@@ -69,6 +78,14 @@ object PriceMarginFrame: TPriceMarginFrame
       TabName = 'Bills'
       Caption = 'Bills'
     end
+    object jpsPriceMarginLeafXmj: TJimPage
+      Left = 0
+      Top = 0
+      Width = 1109
+      Height = 570
+      TabName = 'LeafXmj'
+      Caption = 'LeafXmj'
+    end
   end
   object xpm: TXPMenu
     DimLevel = 30

+ 10 - 1
Frames/PriceMarginFme.pas

@@ -3,7 +3,7 @@ unit PriceMarginFme;
 interface
 
 uses
-  ProjectGLFme, PriceMarginBillsFme,
+  ProjectGLFme, PriceMarginBillsFme, LeafXmjGlFme,
   ProjectData,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ExtCtrls, JimPages, ComCtrls, ToolWin, XPMenu;
@@ -18,12 +18,15 @@ type
     jpsPriceMarginBills: TJimPage;
     jpsPriceMarginGL: TJimPage;
     xpm: TXPMenu;
+    tobtnLeafXmj: TToolButton;
+    jpsPriceMarginLeafXmj: TJimPage;
     procedure tobtnBillsClick(Sender: TObject);
   private
     FProjectData: TProjectData;
 
     FProjectGLFrame: TProjectGLFrame;
     FPriceMarginBillsFrame: TPriceMarginBillsFrame;
+    FLeafXmjGlFrame: TLeafXmjGlFrame;
   public
     constructor Create(AProjectData: TProjectData);
     destructor Destroy; override;
@@ -52,10 +55,14 @@ begin
 
   FPriceMarginBillsFrame := TPriceMarginBillsFrame.Create(FProjectData.PriceMarginBillsData);
   AlignControl(FPriceMarginBillsFrame, jpsPriceMarginBills, alClient);
+
+  FLeafXmjGlFrame := TLeafXmjGlFrame.Create(FProjectData.LeafXmjGlData);
+  AlignControl(FLeafXmjGlFrame, jpsPriceMarginLeafXmj, alClient);
 end;
 
 destructor TPriceMarginFrame.Destroy;
 begin
+  FLeafXmjGlFrame.Free;
   FPriceMarginBillsFrame.Free;
   FProjectGLFrame.Free;
   inherited;
@@ -64,6 +71,7 @@ end;
 procedure TPriceMarginFrame.RefreshBills;
 begin
   FProjectData.PriceMarginBillsData.RefreshBills;
+  FProjectData.LeafXmjGlData.RefreshLeafXmj;
 end;
 
 procedure TPriceMarginFrame.ResetViewControl;
@@ -76,6 +84,7 @@ procedure TPriceMarginFrame.tobtnBillsClick(Sender: TObject);
 begin
   tobtnGL.Down := tobtnGL.Tag = TToolButton(Sender).Tag;
   tobtnBills.Down := tobtnBills.Tag = TToolButton(Sender).Tag;
+  tobtnLeafXmj.Down := tobtnLeafXmj.Tag = TToolButton(Sender).Tag;
   jpsPriceMargin.ActivePageIndex := TToolButton(Sender).Tag;
 end;
 

+ 1 - 1
Frames/ProjectGLFme.dfm

@@ -280,7 +280,7 @@ object ProjectGLFrame: TProjectGLFrame
         Font.Style = []
         FieldName = 'UsedQuantity'
         Width = 85
-        ReadOnly = False
+        ReadOnly = True
       end
       item
         Title.Caption = #26412#26399#28040#32791#30408#20111'|'#25968#37327#24046

+ 1 - 0
Report/ReportPrepare.pas

@@ -10,6 +10,7 @@ type
   private
     FProjectData: TProjectData;
     FPrepareGclGather: Boolean;
+    FPrepareLeafXmj: Boolean;
 
     procedure GatherGclAndSave;
     procedure UpdateGclGatherTables;

+ 1 - 0
Units/ConstUnit.pas

@@ -18,6 +18,7 @@ const
   iMaxStageCount = 15;
 // 固定ID
   iPriceMarginID = 54;
+  iMaterialID = 51;
   sBills_PMHint = '该清单为材料调差清单节点,结果由材料调差计算得到,不可编辑。';
 
 {$O-}

+ 109 - 1
Units/DataBaseTables.pas

@@ -672,6 +672,33 @@ const
     (FieldName: 'LockedPhaseID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
   );
 
+  SLeafXmjGL = 'LeafXmjGL';
+  tdLeafXmjGL: array [0..10] of TScFieldDef =(
+    (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    // 最底层ID
+    (FieldName: 'XmjID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
+    // 工料ID
+    (FieldName: 'GLID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
+
+    // 缓存 -- 累计
+    // 应耗 -- 数量
+    (FieldName: 'AddQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 应耗 -- 金额
+    (FieldName: 'AddTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 数量
+    (FieldName: 'AddUsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 金额
+    (FieldName: 'AddUsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏       盈亏 -- 工料损耗 -- 数量
+    (FieldName: 'AddPAL_UsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏金额   盈亏 -- 工料损耗 -- 金额
+    (FieldName: 'AddPAL_UsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 价差盈亏       盈亏 -- 价差盈亏
+    (FieldName: 'AddPAL_DeltaPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 合计盈亏       盈亏 -- 合计
+    (FieldName: 'AddPAL_Total'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
+  );
+
   {各期总数据 -- 为更新项目管理而储存的缓存数据}
   SMainDataList = 'MainDataList';
   tdMainDataList: array [0..15] of TScFieldDef =(
@@ -872,7 +899,7 @@ const
     (FieldName: 'PreDealTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     //---------------- 截止上期数量变更计量 ----------------
     // 数量
-    (FieldName: 'PreQcQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'PreQcQuantity'; FieldType: ftDouble ; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // 金额
     (FieldName: 'PreQcTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // 变更令
@@ -905,6 +932,87 @@ const
     // 本期材料调差
     (FieldName: 'PM_TotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
   );
+  
+  SStageLeafXmjGL = 'StageLeafXmjGL';
+  tdStageLeafXmjGL: array [0..24] of TScFieldDef =(
+    (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    // 截止上期
+    // 应耗 -- 数量
+    (FieldName: 'PreQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 应耗 -- 金额
+    (FieldName: 'PreTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 数量
+    (FieldName: 'PreUsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 金额
+    (FieldName: 'PreUsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏       盈亏 -- 工料损耗 -- 数量
+    (FieldName: 'PrePAL_UsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏金额   盈亏 -- 工料损耗 -- 金额
+    (FieldName: 'PrePAL_UsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 价差盈亏       盈亏 -- 价差盈亏
+    (FieldName: 'PrePAL_DeltaPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 合计盈亏       盈亏 -- 合计
+    (FieldName: 'PrePAL_Total'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+
+    // 缓存 -- 本期
+    // 应耗 -- 数量
+    (FieldName: 'Quantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 应耗 -- 金额
+    (FieldName: 'TotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 数量
+    (FieldName: 'UsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 金额
+    (FieldName: 'UsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏       盈亏 -- 工料损耗 -- 数量
+    (FieldName: 'PAL_UsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏金额   盈亏 -- 工料损耗 -- 金额
+    (FieldName: 'PAL_UsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 价差盈亏       盈亏 -- 价差盈亏
+    (FieldName: 'PAL_DeltaPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 合计盈亏       盈亏 -- 合计
+    (FieldName: 'PAL_Total'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+
+    // 缓存 -- 截止本期
+    // 应耗 -- 数量
+    (FieldName: 'EndQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 应耗 -- 金额
+    (FieldName: 'EndTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 数量
+    (FieldName: 'EndUsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 金额
+    (FieldName: 'EndUsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏       盈亏 -- 工料损耗 -- 数量
+    (FieldName: 'EndPAL_UsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏金额   盈亏 -- 工料损耗 -- 金额
+    (FieldName: 'EndPAL_UsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 价差盈亏       盈亏 -- 价差盈亏
+    (FieldName: 'EndPAL_DeltaPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 合计盈亏       盈亏 -- 合计
+    (FieldName: 'EndPAL_Total'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
+  );
+
+  SPhaseLeafXmjGL = 'PhaseLeafXmjGL';
+  tdPhaseLeafXmjGL: array [0..9] of TScFieldDef =(
+    (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    // 阶段ID
+    (FieldName: 'StageID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    // 应耗 -- 数量
+    (FieldName: 'Quantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 应耗 -- 金额
+    (FieldName: 'TotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 数量
+    (FieldName: 'UsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 实耗 -- 金额
+    (FieldName: 'UsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏       盈亏 -- 工料损耗 -- 数量
+    (FieldName: 'PAL_UsedQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 数量盈亏金额   盈亏 -- 工料损耗 -- 金额
+    (FieldName: 'PAL_UsedTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 价差盈亏       盈亏 -- 价差盈亏
+    (FieldName: 'PAL_DeltaPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 消耗盈亏 -- 合计盈亏       盈亏 -- 合计
+    (FieldName: 'PAL_Total'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
+  );
 
   // 计量期合同支付
   SPhasePay = 'PhasePay';

+ 24 - 2
Units/PhaseData.pas

@@ -3,7 +3,7 @@ unit PhaseData;
 interface
 
 uses
-  StageDm, PhasePayDm, ZJJLDm, ADODB, StageCompareDm,
+  StageDm, PhasePayDm, ZJJLDm, ADODB, StageCompareDm, StageLeafXmjGlDm,
   Connections, UpdateDataBase, UtilMethods, ZhAPI, PhaseProperty,
   Classes, SysUtils, sdDB;
 
@@ -24,6 +24,7 @@ type
     FProjectData: TObject;
     FPhasePayData: TPhasePayData;
     FZJJLData: TZJJLData;
+    FStageLeafXmjGlData: TStageLeafXmjGlData;
 
     FStageCompareData: TStageCompareData;
 
@@ -67,6 +68,7 @@ type
     property PhaseProperty: TPhaseProperties read FPhaseProperty;
     property PhasePayData: TPhasePayData read FPhasePayData;
     property ZJJLData: TZJJLData read FZJJLData;
+    property StageLeafXmjGlData: TStageLeafXmjGlData read FStageLeafXmjGlData;
 
     property StageCompareData: TStageCompareData read FStageCompareData;
 
@@ -101,6 +103,7 @@ begin
   FPhaseProperty := TPhaseProperties.Create(FConnection.Connection);
   FPhasePayData := TPhasePayData.Create(Self);
   FZJJLData := TZJJLData.Create(Self);
+  FStageLeafXmjGlData := TStageLeafXmjGlData.Create(Self);
 
   FStageCompareData := TStageCompareData.Create(Self);
 end;
@@ -123,6 +126,7 @@ end;
 destructor TPhaseData.Destroy;
 begin
   FStageCompareData.Free;
+  FStageLeafXmjGlData.Free;
   FPhasePayData.Free;
   FPhaseProperty.Free;
   FStageData.Free;
@@ -172,6 +176,8 @@ begin
   FStageData.Open(FConnection.Connection);
   UpdateSysProgress(160, '正在读取数据');
   FPhasePayData.Open(FConnection.Connection);
+  UpdateSysProgress(170, '正在读取数据'); 
+  FStageLeafXmjGlData.Open(FConnection.Connection);
   UpdateSysProgress(180, '正在读取数据');
   FZJJLData.Open(FConnection.Connection);
   UpdateSysProgress(200, '就绪');
@@ -185,8 +191,10 @@ begin
   FStageData.Save;
   UpdateSysProgress(150, '正在保存数据');
   FPhasePayData.Save;
-  UpdateSysProgress(170, '正在保存数据');
+  UpdateSysProgress(160, '正在保存数据');
   FZJJLData.Save;
+  UpdateSysProgress(170, '正在保存数据');
+  FStageLeafXmjGlData.Save;
   UpdateSysProgress(180, '正在保存数据');
   FConnection.Save;
   UpdateSysProgress(200, '就绪');
@@ -222,6 +230,7 @@ procedure TPhaseData.CopyPreData;
 begin
   StageData.CopyPrePhaseData;
   PhasePayData.CopyPrePhasePayData;
+  StageLeafXmjGlData.CopyPrePhaseData;
 end;
 
 function TPhaseData.GetADOConnection: TADOConnection;
@@ -300,6 +309,18 @@ begin
 end;
 
 procedure TPhaseData.CopyPreStageData;
+
+  procedure CopyPhaseLeafXmjGlData;
+  const
+    sUpdateSql = 'Insert Into PhaseLeafXmjGl(ID, StageID, Quantity, TotalPrice,' +
+                 '    UsedQuantity, UsedTotalPrice, PAL_UsedQuantity, PAL_UsedTotalPrice, PAL_DeltaPrice, PAL_Total)' +
+                 '  Select ID, %d, Quantity, TotalPrice,' +
+                 '    UsedQuantity, UsedTotalPrice, PAL_UsedQuantity, PAL_UsedTotalPrice, PAL_DeltaPrice, PAL_Total' +
+                 '  From PhaseLeafXmjGl Where (StageID = %d)';
+  begin
+    ExecuteSql(FConnection.Connection, Format(sUpdateSql, [FPhaseProperty.AuditCount, FPhaseProperty.AuditCount-1]));
+  end;
+
 const
   sCopySql = 'Insert Into %s Select * From %s';
 var
@@ -310,6 +331,7 @@ begin
   sCur := StageTableName[FPhaseProperty.AuditCount];
   sSql := Format(sCopySql, [sCur, sPre]);
   ExecuteSql(FConnection.Connection, sSql);
+  CopyPhaseLeafXmjGlData;
 end;
 
 procedure TPhaseData.SimpleOpen2(const AProjectName: string);

+ 36 - 8
Units/ProjectData.pas

@@ -7,7 +7,7 @@ uses
   PhaseCompareDm, DealPaymentDm, SearchDm, DealBillsDm, MainDataListDm,
   BillsGatherDm, BGLDm, StaffDm, BillsCompileDm, BillsMeasureDm,
   BillsBookmarkDm, UpFileManageUnit, ProjectGLDm, PriceMarginBillsDm,
-  DetailGLDm, OtherMeasureOnceDm, OtherMeasurePhaseDm,
+  DetailGLDm, OtherMeasureOnceDm, OtherMeasurePhaseDm, LeafXmjGlDm,
   Classes, SysUtils, ADODB, sdDB, Checker;
 
 type
@@ -45,6 +45,7 @@ type
     FProjectGLData: TProjectGLData;
     FDetailGLData: TDetailGLData;
     FPriceMarginBillsData: TPriceMarginBillsData;
+    FLeafXmjGlData: TLeafXmjGlData;
 
     FOtherMeasureOnceData: TOtherMeasureOnceData;
     FOtherMeasurePhaseData: TOtherMeasurePhaseData;
@@ -215,6 +216,7 @@ type
     property ProjectGLData: TProjectGLData read FProjectGLData;
     property DetailGLData: TDetailGLData read FDetailGLData;
     property PriceMarginBillsData: TPriceMarginBillsData read FPriceMarginBillsData;
+    property LeafXmjGlData: TLeafXmjGlData read FLeafXmjGlData;
 
     property OtherMeasureOnceData: TOtherMeasureOnceData read FOtherMeasureOnceData;
     property OtherMeasurePhaseData: TOtherMeasurePhaseData read FOtherMeasurePhaseData;
@@ -299,6 +301,7 @@ begin
   FProjectGLData := TProjectGLData.Create(Self);
   FDetailGLData := TDetailGLData.Create(Self);
   FPriceMarginBillsData := TPriceMarginBillsData.Create(Self);
+  FLeafXmjGlData := TLeafXmjGlData.Create(Self);
   FOtherMeasureOnceData := TOtherMeasureOnceData.Create(Self);
   FOtherMeasurePhaseData := TOtherMeasurePhaseData.Create(Self);
   FAttachmentData := TUpFiles.Create;
@@ -323,6 +326,7 @@ begin
     FCheckers.Free;
     FOtherMeasurePhaseData.Free;
     FOtherMeasureOnceData.Free;
+    FLeafXmjGlData.Free;
     FPriceMarginBillsData.Free;
     FDetailGLData.Free;
     FProjectGLData.Free;
@@ -456,16 +460,19 @@ begin
   FProjectGLData.Open(FConnection.Connection);
   FDetailGLData.Open(FConnection.Connection);
   FBGLData.Open(FConnection.Connection);
+  FLeafXmjGlData.Open(FConnection.Connection);
   UpdateSysProgress(160, '正在读取数据');
 
   FStaffData.Open(FConnection.Connection);
-  UpdateSysProgress(180, '正在读取数据');
+  UpdateSysProgress(170, '正在读取数据');
 
   //FBillsGatherData.RefreshBills;
   FMainListData.Open(FConnection.Connection);
-  UpdateSysProgress(190, '正在读取数据');
+  UpdateSysProgress(180, '正在读取数据');
   FOtherMeasureOnceData.Open(FConnection.Connection);
   FOtherMeasurePhaseData.Open(FConnection.Connection);
+  UpdateSysProgress(190, '正在读取数据');
+  ResetPhaseDataLink;
   UpdateSysProgress(200, '就绪');
 
   if _IsDebugView then
@@ -481,7 +488,6 @@ begin
   FPhaseIndex := ProjProperties.PhaseCount;
   FProjProperties.PhaseIndex := FPhaseIndex;
   FPhaseData.Open(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
-  ResetPhaseDataLink;
 end;
 
 procedure TProjectData.Save;
@@ -505,6 +511,7 @@ begin
 
     FProjectGLData.Save;
     FDetailGLData.Save;
+    FLeafXmjGlData.Save;
     UpdateSysProgress(100, '正在保存数据');
 
     FBillsCompileData.ReLockBaseData;
@@ -617,6 +624,8 @@ begin
   BillsMeasureData.ResetTreeNodeStageRec;
   DealPaymentData.ResetPhaseLink;
   BillsBookmarkData.ResetPhaseStageLink;
+  LeafXmjGlData.ResetPhaseStageLink;
+  LeafXmjGlData.ResetRecordLink;
 end;
 
 procedure TProjectData.SimpleOpen(const AFileName: string);
@@ -994,6 +1003,22 @@ procedure TProjectData.CopyPhaseData;
     ExecuteSql(sSql);
   end;
 
+  procedure CopyStageLeafXmjGLData(const AFileName: string);
+  const
+    sCopySql = 'Select ID' +
+               '    PreQuantity, PreTotalPrice, PreUsedQuantity, PreUsedTotalPrice,' +
+               '    PrePAL_UsedQuantity, PrePAL_UsedTotalPrice, PrePAL_DeltaPrice, PrePAL_Total,'+
+               '    Quantity, TotalPrice, UsedQuantity, UsedTotalPrice,' +
+               '    PAL_UsedQuantity, PAL_UsedTotalPrice, PAL_DeltaPrice, PAL_Total'+
+               '    EndQuantity, EndTotalPrice, EndUsedQuantity, EndUsedTotalPrice,' +
+               '    EndPAL_UsedQuantity, EndPAL_UsedTotalPrice, EndPAL_DeltaPrice, EndPAL_Total'+
+               '  Into P_StageLeafXmjGL' +
+               '  From StageLeafXmjGL' +
+               '  In ''%s''';
+  begin
+    ExecuteSql(Format(sCopySql, [AFileName]));
+  end;
+
   procedure CopyReportData(const AFileName: string);
   const
     sCopySql = 'Select Flag, SubFlag, SerialNo, Select1, Result1, Result2' +
@@ -1032,6 +1057,7 @@ procedure TProjectData.CopyPhaseData;
       AddSettlementData;
       CopyZJJLData(sTempFile);
       CopyPhasePayData(sTempFile);
+      CopyStageLeafXmjGLData(sTempFile);
       CopyReportData(sTempFile);
     finally
       DeleteFile(sTempFile);
@@ -1866,13 +1892,15 @@ procedure TProjectData.CalculatePriceMargin;
 begin
   // 计算工料价差数据
   FProjectGLData.CalculateAll;
-  {if not FPhaseData.StageDataReadOnly then
+  if not FPhaseData.StageDataReadOnly then
   begin
+    // 计算材料摊销节点
+    PhaseData.StageData.CalculateMaterialNode;
     // 计算清单价差节点
-    PhaseData.StageData.CalculatePriceMarginNode;
+    //PhaseData.StageData.CalculatePriceMarginNode;
     // 计算合同支付
-    PhaseData.PhasePayData.CalculateAll;
-  end;}
+    //PhaseData.PhasePayData.CalculateAll;
+  end;
 end;
 
 procedure TProjectData.LockProjectGLData;

+ 3 - 0
Units/UpdateDataBase.pas

@@ -101,6 +101,7 @@ begin
     Updater.AddTableDef(SOtherMeasureOnce, @tdOtherMeasureOnce, Length(tdOtherMeasureOnce), False, False);
     Updater.AddTableDef(SOtherMeasurePhase, @tdOtherMeasurePhase, Length(tdOtherMeasurePhase), False, False);
     Updater.AddTableDef(SOMPhaseDetail, @tdOMPhaseDetail, Length(tdOMPhaseDetail), False, False);
+    Updater.AddTableDef(SLeafXmjGL, @tdLeafXmjGL, Length(tdLeafXmjGL), False, False);
     Updater.ExcuteUpdate;
   finally
     Updater.Free;
@@ -175,6 +176,8 @@ begin
     Updater.AddTableDef(SPhasePay, @tdPhasePay, Length(tdPhasePay), False, False);
     Updater.AddTableDef(SZJJL, @tdZJJL, Length(tdZJJL), False, False);
     Updater.AddTableDef(SReportData, @tdReportData, Length(tdReportData), False, False);
+    Updater.AddTableDef(SStageLeafXmjGL, @tdStageLeafXmjGL, Length(tdStageLeafXmjGL), False, False);
+    Updater.AddTableDef(SPhaseLeafXmjGL, @tdPhaseLeafXmjGL, Length(tdPhaseLeafXmjGL), False, False);
     Updater.ExcuteUpdate;
   finally
     Updater.Free;

+ 6 - 1
Units/UtilMethods.pas

@@ -872,12 +872,14 @@ end;
 {Zip}
 procedure ZipFolder(AFileFolder, AFileName: string);
 var
+  sTempFile: string;
   vZip: TVCLZip;
 begin
+  sTempFile := GetTempFileName;
   vZip := TVCLZip.Create(nil);
   try
     vZip.FilesList.Clear;
-    vZip.ZipName := AFileName;
+    vZip.ZipName := sTempFile;
     vzip.RootDir := AFileFolder;
     vZip.OverwriteMode := Always;
     //vZip.AddDirEntriesOnRecurse:=True;
@@ -885,8 +887,11 @@ begin
     //vZip.RecreateDirs := True;
     vZip.FilesList.Add(AFileFolder + '\*.*');
     vZip.Zip;
+    CopyFileOrFolder(sTempFile, AFileName);
   finally
     vZip.Free;
+    if FileExists(sTempFile) then
+      DeleteFile(sTempFile);
   end;
 end;
 

+ 183 - 0
Units/mDataRecord.pas

@@ -493,6 +493,113 @@ type
     property TotalPrice14 : TsdValue read FTotalPrice0;
   end;
 
+  TLeafXmjGlRecord = class(TMeasureBaseRecord)
+  private
+    FID: TsdValue;
+    FXmjID: TsdValue;
+    FGLID: TsdValue;
+
+    FAddQuantity: TsdValue;
+    FAddTotalPrice: TsdValue;
+    FAddUsedQuantity: TsdValue;
+    FAddUsedTotalPrice: TsdValue;
+    FAddPAL_UsedQuantity: TsdValue;
+    FAddPAL_UsedTotalPrice: TsdValue;
+    FAddPAL_DeltaPrice: TsdValue;
+    FAddPAL_Total: TsdValue;
+
+    FStageRec: TsdDataRecord;
+    procedure SetStageRec(const Value: TsdDataRecord);
+  protected
+    procedure DoAfterAddFields; override;
+  public
+    property ID: TsdValue read FID;
+    property XmjID:  TsdValue read FXmjID;
+    property GLID: TsdValue read FGLID;
+
+    property AddQuantity: TsdValue read FAddQuantity;
+    property AddTotalPrice: TsdValue read FAddTotalPrice;
+    property AddUsedQuantity: TsdValue read FAddUsedQuantity;
+    property AddUsedTotalPrice: TsdValue read FAddUsedTotalPrice;
+    property AddPAL_UsedQuantity: TsdValue read FAddPAL_UsedQuantity;
+    property AddPAL_UsedTotalPrice: TsdValue read FAddPAL_UsedTotalPrice;
+    property AddPAL_DeltaPrice: TsdValue read FAddPAL_DeltaPrice;
+    property AddPAL_Total: TsdValue read FAddPAL_Total;
+
+    property StageRec: TsdDataRecord read FStageRec write SetStageRec;
+  end;
+
+  TStageLeafXmjGlRecord = class(TMeasureBaseRecord)
+  private
+    FID: TsdValue;
+
+    FPreQuantity: TsdValue;
+    FPreTotalPrice: TsdValue;
+    FPreUsedQuantity: TsdValue;
+    FPreUsedTotalPrice: TsdValue;
+    FPrePAL_UsedQuantity: TsdValue;
+    FPrePAL_UsedTotalPrice: TsdValue;
+    FPrePAL_DeltaPrice: TsdValue;
+    FPrePAL_Total: TsdValue;
+
+    FQuantity: TsdValue;
+    FTotalPrice: TsdValue;
+    FUsedQuantity: TsdValue;
+    FUsedTotalPrice: TsdValue;
+    FPAL_UsedQuantity: TsdValue;
+    FPAL_UsedTotalPrice: TsdValue;
+    FPAL_DeltaPrice: TsdValue;
+    FPAL_Total: TsdValue;
+
+    FEndQuantity: TsdValue;
+    FEndTotalPrice: TsdValue;
+    FEndUsedQuantity: TsdValue;
+    FEndUsedTotalPrice: TsdValue;
+    FEndPAL_UsedQuantity: TsdValue;
+    FEndPAL_UsedTotalPrice: TsdValue;
+    FEndPAL_DeltaPrice: TsdValue;
+    FEndPAL_Total: TsdValue;
+
+    FMainRec: TsdDataRecord;
+    function GetGLID: Integer;
+    function GetXmjID: Integer;
+  protected
+    procedure DoAfterAddFields; override;
+  public
+    property ID: TsdValue read FID;
+
+    property PreQuantity: TsdValue read FPreQuantity;
+    property PreTotalPrice: TsdValue read FPreTotalPrice;
+    property PreUsedQuantity: TsdValue read FPreUsedQuantity;
+    property PreUsedTotalPrice: TsdValue read FPreUsedTotalPrice;
+    property PrePAL_UsedQuantity: TsdValue read FPrePAL_UsedQuantity;
+    property PrePAL_UsedTotalPrice: TsdValue read FPrePAL_UsedTotalPrice;
+    property PrePAL_DeltaPrice: TsdValue read FPrePAL_DeltaPrice;
+    property PrePAL_Total: TsdValue read FPrePAL_Total;
+
+    property Quantity: TsdValue read FQuantity;
+    property TotalPrice: TsdValue read FTotalPrice;
+    property UsedQuantity: TsdValue read FUsedQuantity;
+    property UsedTotalPrice: TsdValue read FUsedTotalPrice;
+    property PAL_UsedQuantity: TsdValue read FPAL_UsedQuantity;
+    property PAL_UsedTotalPrice: TsdValue read FPAL_UsedTotalPrice;
+    property PAL_DeltaPrice: TsdValue read FPAL_DeltaPrice;
+    property PAL_Total: TsdValue read FPAL_Total;
+
+    property EndQuantity: TsdValue read FEndQuantity;
+    property EndTotalPrice: TsdValue read FEndTotalPrice;
+    property EndUsedQuantity: TsdValue read FEndUsedQuantity;
+    property EndUsedTotalPrice: TsdValue read FEndUsedTotalPrice;
+    property EndPAL_UsedQuantity: TsdValue read FEndPAL_UsedQuantity;
+    property EndPAL_UsedTotalPrice: TsdValue read FEndPAL_UsedTotalPrice;
+    property EndPAL_DeltaPrice: TsdValue read FEndPAL_DeltaPrice;
+    property EndPAL_Total: TsdValue read FEndPAL_Total;
+
+    property MainRec: TsdDataRecord read FMainRec write FMainRec;
+    property XmjID: Integer read GetXmjID;
+    property GLID: Integer read GetGLID;
+  end;
+
 implementation
 
 { TBillsRecord }
@@ -776,4 +883,80 @@ begin
   FTotalPrice14 := ValueByName('TotalPrice14');
 end;
 
+{ TStageLeafXmjGlRecord }
+
+procedure TStageLeafXmjGlRecord.DoAfterAddFields;
+begin
+  inherited;
+  FID := ValueByName('ID');
+
+  FPreQuantity := ValueByName('PreQuantity');
+  FPreTotalPrice := ValueByName('PreTotalPrice');
+  FPreUsedQuantity := ValueByName('PreUsedQuantity');
+  FPreUsedTotalPrice := ValueByName('PreUsedTotalPrice');
+  FPrePAL_UsedQuantity := ValueByName('PrePAL_UsedQuantity');
+  FPrePAL_UsedTotalPrice := ValueByName('PrePAL_UsedTotalPrice');
+  FPrePAL_DeltaPrice := ValueByName('PrePAL_DeltaPrice');
+  FPrePAL_Total := ValueByName('PrePAL_Total');
+
+  FQuantity := ValueByName('Quantity');
+  FTotalPrice := ValueByName('TotalPrice');
+  FUsedQuantity := ValueByName('UsedQuantity');
+  FUsedTotalPrice := ValueByName('UsedTotalPrice');
+  FPAL_UsedQuantity := ValueByName('PAL_UsedQuantity');
+  FPAL_UsedTotalPrice := ValueByName('PAL_UsedTotalPrice');
+  FPAL_DeltaPrice := ValueByName('PAL_DeltaPrice');
+  FPAL_Total := ValueByName('PAL_Total');
+
+  FEndQuantity := ValueByName('EndQuantity');
+  FEndTotalPrice := ValueByName('EndTotalPrice');
+  FEndUsedQuantity := ValueByName('EndUsedQuantity');
+  FEndUsedTotalPrice := ValueByName('EndUsedTotalPrice');
+  FEndPAL_UsedQuantity := ValueByName('EndPAL_UsedQuantity');
+  FEndPAL_UsedTotalPrice := ValueByName('EndPAL_UsedTotalPrice');
+  FEndPAL_DeltaPrice := ValueByName('EndPAL_DeltaPrice');
+  FEndPAL_Total := ValueByName('EndPAL_Total');
+end;
+
+function TStageLeafXmjGlRecord.GetGLID: Integer;
+begin
+  if Assigned(FMainRec) then
+    Result := TLeafXmjGlRecord(FMainRec).GLID.AsInteger
+  else
+    Result := -1;
+end;
+
+function TStageLeafXmjGlRecord.GetXmjID: Integer;
+begin
+  if Assigned(FMainRec) then
+    Result := TLeafXmjGlRecord(FMainRec).XmjID.AsInteger
+  else
+    Result := -1;
+end;
+
+{ TLeafXmjGlRecord }
+
+procedure TLeafXmjGlRecord.DoAfterAddFields;
+begin
+  inherited;
+  FID := ValueByName('ID');
+  FXmjID := ValueByName('XmjID');
+  FGLID := ValueByName('GLID');
+
+  FAddQuantity := ValueByName('AddQuantity');
+  FAddTotalPrice := ValueByName('AddTotalPrice');
+  FAddUsedQuantity := ValueByName('AddUsedQuantity');
+  FAddUsedTotalPrice := ValueByName('AddUsedTotalPrice');
+  FAddPAL_UsedQuantity := ValueByName('AddPAL_UsedQuantity');
+  FAddPAL_UsedTotalPrice := ValueByName('AddPAL_UsedTotalPrice');
+  FAddPAL_DeltaPrice := ValueByName('AddPAL_DeltaPrice');
+  FAddPAL_Total := ValueByName('AddPAL_Total');
+end;
+
+procedure TLeafXmjGlRecord.SetStageRec(const Value: TsdDataRecord);
+begin
+  FStageRec := Value;
+  TStageLeafXmjGlRecord(FStageRec).MainRec := Self;
+end;
+
 end.