Browse Source

1. 总分包汇总,导入分包汇总数据
2. 总分包汇总,纠错数据完善

MaiXinRong 8 years ago
parent
commit
16034bc5b6

+ 3 - 3
DataModules/StageDm.pas

@@ -25,9 +25,6 @@ type
     FBeforeChangeQuantity: Double;
     FBeforeChangeQuantity: Double;
     FBeforeChangeTotalPrice: Double;
     FBeforeChangeTotalPrice: Double;
 
 
-    procedure BeforeBatchOperation;
-    procedure AfterBatchOperation;
-
     procedure UpdateParentRecord(ABillsID: Integer; ATotalPrice: Double; const AFieldName: string);
     procedure UpdateParentRecord(ABillsID: Integer; ATotalPrice: Double; const AFieldName: string);
     procedure UpdateComplete(ABillsID: Integer; AQuantity, ATotalPrice: Double);
     procedure UpdateComplete(ABillsID: Integer; AQuantity, ATotalPrice: Double);
 
 
@@ -78,6 +75,9 @@ type
     procedure Open(AConnection: TADOConnection);
     procedure Open(AConnection: TADOConnection);
     procedure Save;
     procedure Save;
 
 
+    procedure BeforeBatchOperation;
+    procedure AfterBatchOperation;
+
     // 计算任一清单节点的价差金额,并增量汇总至父项
     // 计算任一清单节点的价差金额,并增量汇总至父项
     procedure CalculatePriceMargin(ABillsID: Integer);
     procedure CalculatePriceMargin(ABillsID: Integer);
     // 计算材料调差节点
     // 计算材料调差节点

+ 7 - 4
DataModules/ZJJLDm.pas

@@ -534,9 +534,12 @@ procedure TZJJLData.CheckZjjlVerison;
     for i := 0 to sddZJJL.RecordCount - 1 do
     for i := 0 to sddZJJL.RecordCount - 1 do
     begin
     begin
       Rec := sddZJJL.Records[i];
       Rec := sddZJJL.Records[i];
-      SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
-      SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
-      SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
+      if Rec.ValueByName('CertificateCode').AsString <> '' then
+        SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
+      if Rec.ValueByName('FormulaMemo').AsString <> '' then
+        SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
+      if Rec.ValueByName('RelaFile').AsString <> '' then
+        SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
     end;
     end;
   end;
   end;
 
 
@@ -725,7 +728,7 @@ procedure TZJJLData.sdvZJJLBeforeValueChange(AValue: TsdValue;
 var
 var
   sNewValue: string;
   sNewValue: string;
 begin
 begin
-  if CheckFieldNeedHistory(AValue.FieldName) then
+  if CheckFieldNeedHistory(AValue.FieldName) and not TPhaseData(FPhaseData).StageDataReadOnly then
   begin
   begin
     sNewValue := VarToStrDef(NewValue, '');
     sNewValue := VarToStrDef(NewValue, '');
     if sNewValue <> AValue.AsString then
     if sNewValue <> AValue.AsString then

+ 14 - 0
Forms/MainFrm.dfm

@@ -416,6 +416,10 @@ object MainForm: TMainForm
           BeginGroup = True
           BeginGroup = True
           Item = dxbtnExportSumBaseFile
           Item = dxbtnExportSumBaseFile
           Visible = True
           Visible = True
+        end
+        item
+          Item = dxbtnImportSubTenderGather
+          Visible = True
         end>
         end>
     end
     end
     object dxsiEdit: TdxBarSubItem
     object dxsiEdit: TdxBarSubItem
@@ -1173,6 +1177,10 @@ object MainForm: TMainForm
       Hint = #23548#20986#20998#21253#27719#24635#32467#26524
       Hint = #23548#20986#20998#21253#27719#24635#32467#26524
       Visible = ivAlways
       Visible = ivAlways
     end
     end
+    object dxbtnImportSubTenderGather: TdxBarButton
+      Action = actnImportSubTenderGather
+      Category = 0
+    end
   end
   end
   object Images: TImageList
   object Images: TImageList
     DrawingStyle = dsTransparent
     DrawingStyle = dsTransparent
@@ -3352,6 +3360,12 @@ object MainForm: TMainForm
       OnExecute = actnExportSumBaseFileExecute
       OnExecute = actnExportSumBaseFileExecute
       OnUpdate = actnUnlockInfoUpdate
       OnUpdate = actnUnlockInfoUpdate
     end
     end
+    object actnImportSubTenderGather: TAction
+      Category = 'File'
+      Caption = #23548#20837#20998#21253#27719#24635#25968#25454
+      OnExecute = actnImportSubTenderGatherExecute
+      OnUpdate = actnImportSubTenderGatherUpdate
+    end
   end
   end
   object dxpmTabSet: TdxBarPopupMenu
   object dxpmTabSet: TdxBarPopupMenu
     BarManager = dxBarManager
     BarManager = dxBarManager

+ 21 - 0
Forms/MainFrm.pas

@@ -175,6 +175,8 @@ type
     dxbtnExportAllError: TdxBarButton;
     dxbtnExportAllError: TdxBarButton;
     dxbtnExportStgResultExcel: TdxBarButton;
     dxbtnExportStgResultExcel: TdxBarButton;
     dxbtnExportStgResult: TdxBarButton;
     dxbtnExportStgResult: TdxBarButton;
+    dxbtnImportSubTenderGather: TdxBarButton;
+    actnImportSubTenderGather: TAction;
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
@@ -222,6 +224,8 @@ type
     procedure dxbtnHelpCenterClick(Sender: TObject);
     procedure dxbtnHelpCenterClick(Sender: TObject);
     procedure actnExportSumBaseFileExecute(Sender: TObject);
     procedure actnExportSumBaseFileExecute(Sender: TObject);
     procedure dxbtnGatherSubTenderClick(Sender: TObject);
     procedure dxbtnGatherSubTenderClick(Sender: TObject);
+    procedure actnImportSubTenderGatherExecute(Sender: TObject);
+    procedure actnImportSubTenderGatherUpdate(Sender: TObject);
   private
   private
     FProjectManagerFrame: TProjectManagerFrame;
     FProjectManagerFrame: TProjectManagerFrame;
     FProjectFrames: TList;
     FProjectFrames: TList;
@@ -929,4 +933,21 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TMainForm.actnImportSubTenderGatherExecute(Sender: TObject);
+var
+  sFileName: string;
+begin
+  if CurProjectFrame.ProjectData.ProjProperties.PhaseCount = 0 then
+    WarningMessage('未开始计量,请在开始计量后再导入分包汇总数据。')
+  else if CurProjectFrame.ProjectData.StageDataReadOnly then
+    WarningMessage('当前正在查看往期数据,请切换至最新一起再导入分包汇总数据。')
+  else if SelectFile(sFileName, '.sgf') then
+    CurProjectFrame.ProjectData.ImportSubTenderGather(sFileName);
+end;
+
+procedure TMainForm.actnImportSubTenderGatherUpdate(Sender: TObject);
+begin
+  TAction(Sender).Enabled := (jtsProjects.Tabs.Count > 1) and Assigned(CurProjectFrame);
+end;
+
 end.
 end.

+ 2 - 1
SubTenderGather/stgGather.pas

@@ -152,7 +152,8 @@ begin
   //if Assigned(ASourceNode.StageRec) and
   //if Assigned(ASourceNode.StageRec) and
   //   ((ASourceNode.StageRec.GatherQuantity.AsFloat <> 0) or (ASourceNode.StageRec.GatherTotalPrice.AsFloat <> 0)) then
   //   ((ASourceNode.StageRec.GatherQuantity.AsFloat <> 0) or (ASourceNode.StageRec.GatherTotalPrice.AsFloat <> 0)) then
   
   
-  if not ASourceNode.HasChildren then
+  //if not ASourceNode.HasChildren then
+  if (AGatherNode.IsSubTender) or (not ASourceNode.HasChildren) then
   begin
   begin
     vSubTender := AGatherNode.SafeSubTender(FCurSubTenderID);
     vSubTender := AGatherNode.SafeSubTender(FCurSubTenderID);
     vSubTender.AddDetail(ASourceNode);
     vSubTender.AddDetail(ASourceNode);

+ 7 - 1
SubTenderGather/stgGatherDm.dfm

@@ -59,7 +59,13 @@ object stgGatherData: TstgGatherData
       616D650608516342474C4E756D094669656C644E616D650608516342474C4E75
       616D650608516342474C4E756D094669656C644E616D650608516342474C4E75
       6D0844617461547970650218084461746153697A6503FF000549734B6579080F
       6D0844617461547970650218084461746153697A6503FF000549734B6579080F
       4E65656450726F636573734E616D650809507265636973696F6E02000453697A
       4E65656450726F636573734E616D650809507265636973696F6E02000453697A
-      6502000000}
+      6502000001044E616D650609497353756D42617365094669656C644E616D6506
+      09497353756D426173650844617461547970650205084461746153697A650201
+      0549734B6579080F4E65656450726F636573734E616D65080950726563697369
+      6F6E02000453697A6502000001044E616D65060649734C656166094669656C64
+      4E616D65060649734C6561660844617461547970650205084461746153697A65
+      02010549734B6579080F4E65656450726F636573734E616D6508095072656369
+      73696F6E02000453697A6502000000}
   end
   end
   object sdvGatherTree: TsdDataView
   object sdvGatherTree: TsdDataView
     Active = False
     Active = False

+ 17 - 0
SubTenderGather/stgGatherDm.pas

@@ -1,4 +1,5 @@
 unit stgGatherDm;
 unit stgGatherDm;
+// ½á¹ûչʾ£¬ÄÚ´æ±í
 
 
 interface
 interface
 
 
@@ -98,6 +99,8 @@ begin
   Rec.ValueByName('Name').AsString := ANode.Name;
   Rec.ValueByName('Name').AsString := ANode.Name;
   Rec.ValueByName('Units').AsString := ANode.Units;
   Rec.ValueByName('Units').AsString := ANode.Units;
   Rec.ValueByName('IsSubTender').AsBoolean := ANode.IsSubTender;
   Rec.ValueByName('IsSubTender').AsBoolean := ANode.IsSubTender;
+  Rec.ValueByName('IsSumBase').AsBoolean := ANode.IsSumBase;
+  Rec.ValueByName('IsLeaf').AsBoolean := ANode.IsLeaf;
 
 
   Rec.ValueByName('DealQuantity').AsFloat := ANode.Gather.DealQuantity;
   Rec.ValueByName('DealQuantity').AsFloat := ANode.Gather.DealQuantity;
   Rec.ValueByName('DealTotalPrice').AsFloat := ANode.Gather.DealTotalPrice;
   Rec.ValueByName('DealTotalPrice').AsFloat := ANode.Gather.DealTotalPrice;
@@ -211,6 +214,16 @@ begin
 end;
 end;
 
 
 procedure TstgGatherData.LoadError(AError: TstgErrorInfo);
 procedure TstgGatherData.LoadError(AError: TstgErrorInfo);
+
+  function GetSubTenderSerialNo(ANode: TstgGatherTreeNode; ATenderID: Integer): Integer;
+  var
+    vSource: TstgSubTenderStageData;
+  begin
+    vSource := ANode.FindSubTender(ATenderID);
+    if Assigned(vSource) then
+      Result := vSource.Detail[0].SerialNo;
+  end;
+
 var
 var
   i, j, k: Integer;
   i, j, k: Integer;
   vRelaDetail: TstgGatherTreeNode;
   vRelaDetail: TstgGatherTreeNode;
@@ -228,6 +241,10 @@ begin
         Rec := sddErrorDetail.Add;
         Rec := sddErrorDetail.Add;
         Rec.ValueByName('TenderID').AsInteger := vRelaDetail.SubTender[j].SubTenderID;
         Rec.ValueByName('TenderID').AsInteger := vRelaDetail.SubTender[j].SubTenderID;
         Rec.ValueByName('RelaCode').AsString := AError.RelaNode.Code + AError.RelaNode.B_Code;
         Rec.ValueByName('RelaCode').AsString := AError.RelaNode.Code + AError.RelaNode.B_Code;
+        if AError.RelaNode.IsLeaf then
+          Rec.ValueByName('RelaSerialNo').AsInteger := vRelaDetailStage.Detail[k].SerialNo
+        else
+          Rec.ValueByName('RelaSerialNo').AsInteger := GetSubTenderSerialNo(AError.RelaNode, vRelaDetailStage.SubTenderID);
         Rec.ValueByName('DetailCode').AsString := vRelaDetail.Code + vRelaDetail.B_Code;
         Rec.ValueByName('DetailCode').AsString := vRelaDetail.Code + vRelaDetail.B_Code;
         Rec.ValueByName('DetailSerialNo').AsInteger := vRelaDetailStage.Detail[k].SerialNo;
         Rec.ValueByName('DetailSerialNo').AsInteger := vRelaDetailStage.Detail[k].SerialNo;
         Rec.ValueByName('ErrorType').AsInteger := AError.ErrorType;
         Rec.ValueByName('ErrorType').AsInteger := AError.ErrorType;

+ 0 - 84
SubTenderGather/stgResultExportDm.dfm

@@ -1,84 +0,0 @@
-object stgResultExportData: TstgResultExportData
-  OldCreateOrder = False
-  Left = 27
-  Top = 244
-  Height = 202
-  Width = 270
-  object sdpBills: TsdADOProvider
-    Connection = acResult
-    TableName = 'Bills'
-    Left = 114
-    Top = 32
-  end
-  object sddBills: TsdDataSet
-    Active = False
-    Provider = sdpBills
-    Left = 114
-    Top = 96
-    FieldListData = {
-      0101044E616D6506024944094669656C644E616D650602494408446174615479
-      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
-      650608506172656E744944094669656C644E616D650608506172656E74494408
-      44617461547970650203084461746153697A6502040549734B6579080F4E6565
-      6450726F636573734E616D650909507265636973696F6E02000453697A650200
-      0001044E616D65060D4E6578745369626C696E674944094669656C644E616D65
-      060D4E6578745369626C696E6749440844617461547970650203084461746153
-      697A6502040549734B6579080F4E65656450726F636573734E616D6509095072
-      65636973696F6E02000453697A6502000001044E616D650604436F6465094669
-      656C644E616D650604436F64650844617461547970650218084461746153697A
-      6502320549734B6579080F4E65656450726F636573734E616D65090950726563
-      6973696F6E02000453697A6502000001044E616D650606425F436F6465094669
-      656C644E616D650606425F436F64650844617461547970650218084461746153
-      697A6502320549734B6579080F4E65656450726F636573734E616D6509095072
-      65636973696F6E02000453697A6502000001044E616D6506044E616D65094669
-      656C644E616D6506044E616D650844617461547970650218084461746153697A
-      6503C8000549734B6579080F4E65656450726F636573734E616D650909507265
-      636973696F6E02000453697A6502000001044E616D650605556E697473094669
-      656C644E616D650605556E697473084461746154797065021808446174615369
-      7A6502140549734B6579080F4E65656450726F636573734E616D650909507265
-      636973696F6E02000453697A6502000000}
-  end
-  object sdpStage: TsdADOProvider
-    Connection = acResult
-    TableName = 'Stage'
-    Left = 195
-    Top = 32
-  end
-  object sddStage: TsdDataSet
-    Active = False
-    Provider = sdpStage
-    Left = 195
-    Top = 96
-    FieldListData = {
-      0101044E616D65060742696C6C734944094669656C644E616D65060742696C6C
-      7349440844617461547970650203084461746153697A6502040549734B657908
-      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
-      7A6502000001044E616D65060C4465616C5175616E74697479094669656C644E
-      616D65060C4465616C5175616E74697479084461746154797065020608446174
-      6153697A6502080549734B6579080F4E65656450726F636573734E616D650909
-      507265636973696F6E02000453697A6502000001044E616D65060E4465616C54
-      6F74616C5072696365094669656C644E616D65060E4465616C546F74616C5072
-      6963650844617461547970650206084461746153697A6502080549734B657908
-      0F4E65656450726F636573734E616D650909507265636973696F6E0200045369
-      7A6502000001044E616D65060A51635175616E74697479094669656C644E616D
-      65060A51635175616E746974790844617461547970650206084461746153697A
-      6502080549734B6579080F4E65656450726F636573734E616D65090950726563
-      6973696F6E02000453697A6502000001044E616D65060C5163546F74616C5072
-      696365094669656C644E616D65060C5163546F74616C50726963650844617461
-      547970650206084461746153697A6502080549734B6579080F4E65656450726F
-      636573734E616D650909507265636973696F6E02000453697A6502000001044E
-      616D650609516342474C436F6465094669656C644E616D650609516342474C43
-      6F64650844617461547970650218084461746153697A6503FF000549734B6579
-      080F4E65656450726F636573734E616D650909507265636973696F6E02000453
-      697A6502000001044E616D650608516342474C4E756D094669656C644E616D65
-      0608516342474C4E756D0844617461547970650218084461746153697A6503FF
-      000549734B6579080F4E65656450726F636573734E616D650909507265636973
-      696F6E02000453697A6502000000}
-  end
-  object acResult: TADOConnection
-    LoginPrompt = False
-    Left = 40
-    Top = 32
-  end
-end

+ 0 - 125
SubTenderGather/stgResultExportDm.pas

@@ -1,125 +0,0 @@
-unit stgResultExportDm;
-
-interface
-
-uses
-  SysUtils, Classes, sdDB, sdProvider, stgGatherDm, ADODB, DB;
-
-type
-  TstgResultExportData = class(TDataModule)
-    sdpBills: TsdADOProvider;
-    sddBills: TsdDataSet;
-    sdpStage: TsdADOProvider;
-    sddStage: TsdDataSet;
-    acResult: TADOConnection;
-  private
-    FTempFile: string;
-    procedure LoadMemortyRecord(ARec: TsdDataRecord);
-
-    procedure BeforeExport;
-    procedure AfterExport;
-  public
-    procedure SaveTo(const AFileName: string);
-
-    procedure LoadMemoryGatherData(AGatherData: TstgGatherData);
-    procedure ExportGatherDataTo(AGatherData:TstgGatherData; const AFileName: string);
-  end;
-
-implementation
-
-uses
-  UtilMethods, ZhAPI, Connections, stgTables, ScAutoUpdateUnit;
-
-{$R *.dfm}
-
-{ TstgResultExportData }
-
-procedure TstgResultExportData.AfterExport;
-begin
-  if FileExists(FTempFile) then
-    DeleteFile(FTempFile);
-end;
-
-procedure TstgResultExportData.BeforeExport;
-
-  procedure UpdateDataTables;
-  var
-    Updater: TScUpdater;
-  begin
-    Updater := TScUpdater.Create;
-    try
-      Updater.ForceUpdate := True;
-      Updater.Open('', acResult, '', '');
-      Updater.AddTableDef(sStgBills, @tdStgBills, Length(tdStgBills), False, False);
-      Updater.AddTableDef(sStgStage, @tdStgStage, Length(tdStgStage), False, False);
-      Updater.ExcuteUpdate;
-    finally
-      Updater.Free;
-    end;
-  end;
-
-begin
-  FTempFile := GetTempFileName;
-  CopyFileOrFolder(GetEmptyDataBaseFileName, FTempFile);
-  acResult.ConnectionString := Format(SAdoConnectStr, [FTempFile]);
-  acResult.Open;
-  UpdateDataTables;
-  sddBills.Open;
-  sddStage.Open;
-end;
-
-procedure TstgResultExportData.ExportGatherDataTo(
-  AGatherData: TstgGatherData; const AFileName: string);
-begin
-  BeforeExport;
-  try
-    LoadMemoryGatherData(AGatherData);
-    SaveTo(AFileName);
-  finally
-    AfterExport;
-  end;
-end;
-
-procedure TstgResultExportData.LoadMemortyRecord(ARec: TsdDataRecord);
-var
-  vBills, vStage: TsdDataRecord;
-begin
-  vBills := sddBills.Add;
-  vBills.ValueByName('ID').AsInteger := ARec.ValueByName('ID').AsInteger;
-  vBills.ValueByName('ParentID').AsInteger := ARec.ValueByName('ParentID').AsInteger;
-  vBills.ValueByName('NextSiblingID').AsInteger := ARec.ValueByName('NextSiblingID').AsInteger;
-  vBills.ValueByName('Code').AsString := ARec.ValueByName('Code').AsString;
-  vBills.ValueByName('B_Code').AsString := ARec.ValueByName('B_Code').AsString;
-  vBills.ValueByName('Name').AsString := ARec.ValueByName('Name').AsString;
-  vBills.ValueByName('Units').AsString := ARec.ValueByName('Units').AsString;
-  vStage := sddStage.Add;
-  vStage.ValueByName('BillsID').AsInteger := ARec.ValueByName('ID').AsInteger;
-  vStage.ValueByName('DealQuantity').AsFloat := ARec.ValueByName('DealQuantity').AsFloat;
-  vStage.ValueByName('DealTotalPrice').AsFloat := ARec.ValueByName('DealTotalPrice').AsFloat;
-  vStage.ValueByName('QcQuantity').AsFloat := ARec.ValueByName('QcQuantity').AsFloat;
-  vStage.ValueByName('QcTotalPrice').AsFloat := ARec.ValueByName('QcTotalPrice').AsFloat;
-  vStage.ValueByName('QcBGLCode').AsString := ARec.ValueByName('QcBGLCode').AsString;
-  vStage.ValueByName('QcBGLNum').AsString := ARec.ValueByName('QcBGLNum').AsString;
-end;
-
-procedure TstgResultExportData.LoadMemoryGatherData(
-  AGatherData: TstgGatherData);
-var
-  i: Integer;
-  vRec: TsdDataRecord;
-begin
-  for i := 0 to AGatherData.sddGatherTree.RecordCount - 1 do
-  begin
-    vRec := AGatherData.sddGatherTree.Records[i];
-    LoadMemortyRecord(vRec);
-  end;
-end;
-
-procedure TstgResultExportData.SaveTo(const AFileName: string);
-begin
-  sddBills.Save;
-  sddStage.Save;
-  CopyFileOrFolder(FTempFile, AFileName);
-end;
-
-end.

+ 2 - 0
SubTenderGather/stgResultFrm.dfm

@@ -4,6 +4,7 @@ object stgResultForm: TstgResultForm
   Width = 1305
   Width = 1305
   Height = 675
   Height = 675
   ActiveControl = zgGatherTree
   ActiveControl = zgGatherTree
+  BorderIcons = [biSystemMenu, biMaximize]
   Caption = #20998#21253#27719#24635
   Caption = #20998#21253#27719#24635
   Color = clBtnFace
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
   Font.Charset = DEFAULT_CHARSET
@@ -12,6 +13,7 @@ object stgResultForm: TstgResultForm
   Font.Name = 'MS Sans Serif'
   Font.Name = 'MS Sans Serif'
   Font.Style = []
   Font.Style = []
   OldCreateOrder = False
   OldCreateOrder = False
+  Position = poMainFormCenter
   PixelsPerInch = 96
   PixelsPerInch = 96
   TextHeight = 13
   TextHeight = 13
   object jpsResult: TJimPages
   object jpsResult: TJimPages

+ 3 - 3
SubTenderGather/stgResultFrm.pas

@@ -3,7 +3,7 @@ unit stgResultFrm;
 interface
 interface
 
 
 uses
 uses
-  stgGatherDm, sdIDTree, UtilMethods, stgExcelExport, stgResultExportDm,
+  stgGatherDm, sdIDTree, UtilMethods, stgExcelExport, stgSubGatherFile,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, JimTabs, JimPages, sdGridDBA, sdGridTreeDBA, ZJGrid, ExtCtrls,
   Dialogs, JimTabs, JimPages, sdGridDBA, sdGridTreeDBA, ZJGrid, ExtCtrls,
   StdCtrls, dxBar, ActnList;
   StdCtrls, dxBar, ActnList;
@@ -174,11 +174,11 @@ end;
 procedure TstgResultForm.actnExportStgResultExecute(Sender: TObject);
 procedure TstgResultForm.actnExportStgResultExecute(Sender: TObject);
 var
 var
   sFileName: string;
   sFileName: string;
-  vExportor: TstgResultExportData;
+  vExportor: TstgSubGatherFileExportor;
 begin
 begin
   if SaveFile(sFileName, '.sgf') then
   if SaveFile(sFileName, '.sgf') then
   begin
   begin
-    vExportor := TstgResultExportData.Create(nil);
+    vExportor := TstgSubGatherFileExportor.Create;
     try
     try
       vExportor.ExportGatherDataTo(FGatherData, sFileName);
       vExportor.ExportGatherDataTo(FGatherData, sFileName);
     finally
     finally

+ 214 - 0
SubTenderGather/stgSubGatherFile.pas

@@ -0,0 +1,214 @@
+unit stgSubGatherFile;
+// µ¼Èëµ¼³ö»ã×ܽá¹û
+
+interface
+
+uses
+  stgSubGatherFileDm, ADODB, sdDB, stgGatherDm, SysUtils, StageDm, mDataRecord;
+
+type
+  TstgSubGatherFileHelper = class
+  private
+    FTempFile: string;
+    FConnection: TADOConnection;
+    FGatherData: TstgSubGatherData;
+  public
+    constructor Create;
+    destructor Destroy; override;
+
+    procedure Open(const AFileName: string);
+    procedure Close;
+    procedure SaveTo(const AFileName: string);
+
+    property Connection: TADOConnection read FConnection;
+    property GatherData: TstgSubGatherData read FGatherData;
+  end;
+
+  TstgSubGatherFileExportor = class(TstgSubGatherFileHelper)
+  private
+    procedure LoadMemoryRecord(ARec: TsdDataRecord);
+    procedure LoadMemoryGatherData(AGatherData: TstgGatherData);
+  public
+    procedure ExportGatherDataTo(AGatherData:TstgGatherData; const AFileName: string);
+  end;
+
+  TstgSubGatherFileImportor = class(TstgSubGatherFileHelper)
+  private
+    procedure ClearOldData(AStageData: TStageData);
+    procedure ImportGatherData(AStageData: TStageData);
+  public
+    procedure ImportGatherDataTo(AStageData: TStageData; const AFileName: string);
+  end;
+
+implementation
+
+
+uses
+  UtilMethods, ZhAPI, Connections, stgTables, ScAutoUpdateUnit, Math;
+
+{ TstgSubGatherFileExportor }
+
+procedure TstgSubGatherFileExportor.ExportGatherDataTo(
+  AGatherData: TstgGatherData; const AFileName: string);
+begin
+  Open(GetEmptyDataBaseFileName);
+  try
+    LoadMemoryGatherData(AGatherData);
+  finally                             
+    SaveTo(AFileName);
+  end;
+end;
+
+procedure TstgSubGatherFileExportor.LoadMemoryRecord(ARec: TsdDataRecord);
+var
+  vRec: TsdDataRecord;
+begin
+  vRec := GatherData.sddBills.Add;
+  vRec.ValueByName('ID').AsInteger := ARec.ValueByName('ID').AsInteger;
+  vRec.ValueByName('ParentID').AsInteger := ARec.ValueByName('ParentID').AsInteger;
+  vRec.ValueByName('NextSiblingID').AsInteger := ARec.ValueByName('NextSiblingID').AsInteger;
+  vRec.ValueByName('Code').AsString := ARec.ValueByName('Code').AsString;
+  vRec.ValueByName('B_Code').AsString := ARec.ValueByName('B_Code').AsString;
+  vRec.ValueByName('Name').AsString := ARec.ValueByName('Name').AsString;
+  vRec.ValueByName('Units').AsString := ARec.ValueByName('Units').AsString;
+  vRec.ValueByName('IsSumBase').AsBoolean := ARec.ValueByName('IsSumBase').AsBoolean;
+  vRec.ValueByName('IsLeaf').AsBoolean := ARec.ValueByName('IsLeaf').AsBoolean;
+  vRec.ValueByName('DealQuantity').AsFloat := ARec.ValueByName('DealQuantity').AsFloat;
+  vRec.ValueByName('DealTotalPrice').AsFloat := ARec.ValueByName('DealTotalPrice').AsFloat;
+  vRec.ValueByName('QcQuantity').AsFloat := ARec.ValueByName('QcQuantity').AsFloat;
+  vRec.ValueByName('QcTotalPrice').AsFloat := ARec.ValueByName('QcTotalPrice').AsFloat;
+  vRec.ValueByName('QcBGLCode').AsString := ARec.ValueByName('QcBGLCode').AsString;
+  vRec.ValueByName('QcBGLNum').AsString := ARec.ValueByName('QcBGLNum').AsString;
+end;
+
+procedure TstgSubGatherFileExportor.LoadMemoryGatherData(
+  AGatherData: TstgGatherData);
+var
+  i: Integer;
+  vRec: TsdDataRecord;
+begin
+  GatherData.sddBills.BeginUpdate;
+  try
+    for i := 0 to AGatherData.sddGatherTree.RecordCount - 1 do
+    begin
+      vRec := AGatherData.sddGatherTree.Records[i];
+      LoadMemoryRecord(vRec);
+    end;
+  finally
+    GatherData.sddBills.EndUpdate;
+  end;
+end;
+
+{ TstgSubGatherFileHelper }
+
+procedure TstgSubGatherFileHelper.Close;
+begin
+  FConnection.Close;
+  if FileExists(FTempFile) then
+    DeleteFile(FTempFile);
+end;
+
+constructor TstgSubGatherFileHelper.Create;
+begin
+  FConnection := TADOConnection.Create(nil);
+  FConnection.LoginPrompt := False;
+  FGatherData := TstgSubGatherData.Create(nil);
+end;
+
+destructor TstgSubGatherFileHelper.Destroy;
+begin
+  Close;
+  FGatherData.Free;
+  FConnection.Free;
+  inherited;
+end;
+
+procedure TstgSubGatherFileHelper.Open(const AFileName: string);
+
+  procedure UpdateDataTables;
+  var
+    Updater: TScUpdater;
+  begin
+    Updater := TScUpdater.Create;
+    try
+      Updater.ForceUpdate := True;
+      Updater.Open('', FConnection, '', '');
+      Updater.AddTableDef(sStgBills, @tdStgBills, Length(tdStgBills), False, False);
+      Updater.ExcuteUpdate;
+    finally
+      Updater.Free;
+    end;
+  end;
+
+begin
+  FTempFile := GetTempFileName;
+  CopyFileOrFolder(AFileName, FTempFile);
+  FConnection.ConnectionString := Format(SAdoConnectStr, [FTempFile]);
+  FConnection.Open;
+  UpdateDataTables;
+  GatherData.Open(FConnection);
+end;
+
+procedure TstgSubGatherFileHelper.SaveTo(const AFileName: string);
+begin
+  FGatherData.Save;
+  CopyFileOrFolder(FTempFile, AFileName);
+end;
+
+{ TstgSubGatherFileImportor }
+
+procedure TstgSubGatherFileImportor.ClearOldData(AStageData: TStageData);
+var
+  i: Integer;
+  vRec: TStageRecord;
+begin
+  for i := 0 to AStageData.sddStage.RecordCount - 1 do
+  begin
+    vRec := TStageRecord(AStageData.sddStage.Records[i]);
+    vRec.DealQuantity.AsFloat := 0;
+    vRec.DealTotalPrice.AsFloat := 0;
+    vRec.DealFlag.AsInteger := 0;
+    vRec.DealFormula.AsString := '';
+    vRec.QcQuantity.AsFloat := 0;
+    vRec.QcTotalPrice.AsFloat := 0;
+    vRec.QcFlag.AsInteger := 0;
+    vRec.QcFormula.AsString := '';
+    vRec.QcBGLCode.AsString := '';
+    vRec.QcBGLNum.AsString := '';
+  end;
+end;
+
+procedure TstgSubGatherFileImportor.ImportGatherData(
+  AStageData: TStageData);
+var
+  i: Integer;
+  vOrgRec: TsdDataRecord;
+  vStageRec: TStageRecord;
+begin
+  for i := 0 to GatherData.sddBills.RecordCount - 1 do
+  begin
+    vOrgRec := GatherData.sddBills.Records[i];
+    if vOrgRec.ValueByName('IsSumBase').AsBoolean and vOrgRec.ValueByName('IsLeaf').AsBoolean then
+    begin
+      vStageRec := AStageData.StageRecordWithAdd(vOrgRec.ValueByName('ID').AsInteger);
+      vStageRec.DealQuantity.AsFloat := vOrgRec.ValueByName('DealQuantity').AsFloat;
+    end;
+  end;
+end;
+
+procedure TstgSubGatherFileImportor.ImportGatherDataTo(
+  AStageData: TStageData; const AFileName: string);
+begin
+  Open(AFileName);
+  AStageData.sddStage.BeginUpdate;
+  AStageData.BeforeBatchOperation;
+  try
+    ClearOldData(AStageData);
+    ImportGatherData(AStageData);
+  finally
+    AStageData.AfterBatchOperation;
+    AStageData.sddStage.EndUpdate;
+  end;
+end;
+
+end.

+ 68 - 0
SubTenderGather/stgSubGatherFileDm.dfm

@@ -0,0 +1,68 @@
+object stgSubGatherData: TstgSubGatherData
+  OldCreateOrder = False
+  Left = 27
+  Top = 244
+  Height = 202
+  Width = 186
+  object sdpBills: TsdADOProvider
+    TableName = 'Bills'
+    Left = 35
+    Top = 32
+  end
+  object sddBills: TsdDataSet
+    Active = False
+    Provider = sdpBills
+    Left = 35
+    Top = 96
+    FieldListData = {
+      0101044E616D6506024944094669656C644E616D650602494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      650608506172656E744944094669656C644E616D650608506172656E74494408
+      44617461547970650203084461746153697A6502040549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D65060D4E6578745369626C696E674944094669656C644E616D65
+      060D4E6578745369626C696E6749440844617461547970650203084461746153
+      697A6502040549734B6579080F4E65656450726F636573734E616D6509095072
+      65636973696F6E02000453697A6502000001044E616D650604436F6465094669
+      656C644E616D650604436F64650844617461547970650218084461746153697A
+      6502320549734B6579080F4E65656450726F636573734E616D65090950726563
+      6973696F6E02000453697A6502000001044E616D650606425F436F6465094669
+      656C644E616D650606425F436F64650844617461547970650218084461746153
+      697A6502320549734B6579080F4E65656450726F636573734E616D6509095072
+      65636973696F6E02000453697A6502000001044E616D6506044E616D65094669
+      656C644E616D6506044E616D650844617461547970650218084461746153697A
+      6503C8000549734B6579080F4E65656450726F636573734E616D650909507265
+      636973696F6E02000453697A6502000001044E616D650605556E697473094669
+      656C644E616D650605556E697473084461746154797065021808446174615369
+      7A6502140549734B6579080F4E65656450726F636573734E616D650909507265
+      636973696F6E02000453697A6502000001044E616D650609497353756D426173
+      65094669656C644E616D650609497353756D4261736508446174615479706502
+      05084461746153697A6502010549734B6579080F4E65656450726F636573734E
+      616D650909507265636973696F6E02000453697A6502000001044E616D650606
+      49734C656166094669656C644E616D65060649734C6561660844617461547970
+      650205084461746153697A6502010549734B6579080F4E65656450726F636573
+      734E616D650909507265636973696F6E02000453697A6502000001044E616D65
+      060C4465616C5175616E74697479094669656C644E616D65060C4465616C5175
+      616E746974790844617461547970650206084461746153697A6502080549734B
+      6579080F4E65656450726F636573734E616D650909507265636973696F6E0200
+      0453697A6502000001044E616D65060E4465616C546F74616C50726963650946
+      69656C644E616D65060E4465616C546F74616C50726963650844617461547970
+      650206084461746153697A6502080549734B6579080F4E65656450726F636573
+      734E616D650909507265636973696F6E02000453697A6502000001044E616D65
+      060A51635175616E74697479094669656C644E616D65060A51635175616E7469
+      74790844617461547970650206084461746153697A6502080549734B6579080F
+      4E65656450726F636573734E616D650909507265636973696F6E02000453697A
+      6502000001044E616D65060C5163546F74616C5072696365094669656C644E61
+      6D65060C5163546F74616C507269636508446174615479706502060844617461
+      53697A6502080549734B6579080F4E65656450726F636573734E616D65090950
+      7265636973696F6E02000453697A6502000001044E616D650609516342474C43
+      6F6465094669656C644E616D650609516342474C436F64650844617461547970
+      650218084461746153697A6503FF000549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      650608516342474C4E756D094669656C644E616D650608516342474C4E756D08
+      44617461547970650218084461746153697A6503FF000549734B6579080F4E65
+      656450726F636573734E616D650909507265636973696F6E02000453697A6502
+      000000}
+  end
+end

+ 36 - 0
SubTenderGather/stgSubGatherFileDm.pas

@@ -0,0 +1,36 @@
+unit stgSubGatherFileDm;
+// 导入导出汇总结果,连接数据表
+
+interface
+
+uses
+  SysUtils, Classes, sdDB, sdProvider, ADODB, DB;
+
+type
+  TstgSubGatherData = class(TDataModule)
+    sdpBills: TsdADOProvider;
+    sddBills: TsdDataSet;
+  private
+  public
+    procedure Open(AConnection: TADOConnection);
+    procedure Save;
+  end;
+
+implementation
+
+{$R *.dfm}
+
+{ TstgSubGatherData }
+
+procedure TstgSubGatherData.Open(AConnection: TADOConnection);
+begin
+  sdpBills.Connection := AConnection;
+  sddBills.Open;
+end;
+
+procedure TstgSubGatherData.Save;
+begin
+  sddBills.Save;
+end;
+
+end.

+ 4 - 7
SubTenderGather/stgTables.pas

@@ -7,19 +7,16 @@ uses
 
 
 const
 const
   sStgBills = 'Bills';
   sStgBills = 'Bills';
-  tdStgBills : array [0..6] of TScFieldDef = (
+  tdStgBills : array [0..14] of TScFieldDef = (
     (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
     (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
     (FieldName: 'ParentID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'ParentID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'NextSiblingID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'NextSiblingID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'B_Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'B_Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'Name'; FieldType: ftString; Size: 200; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'Name'; FieldType: ftString; Size: 200; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
-    (FieldName: 'Units'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
-  );
-
-  sStgStage = 'Stage';
-  tdStgStage: array [0..6] of TScFieldDef = (
-    (FieldName: 'BillsID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    (FieldName: 'Units'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'IsSumBase'; FieldType: ftBoolean; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'IsLeaf'; FieldType: ftBoolean; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'DealQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'DealQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'DealTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'DealTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'QcQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'QcQuantity'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),

+ 17 - 1
Units/ProjectData.pas

@@ -198,6 +198,7 @@ type
 
 
     procedure ImportCloudTenderFile(const AFileName: string);
     procedure ImportCloudTenderFile(const AFileName: string);
     procedure ImportDmfFile(const AFileName: string);
     procedure ImportDmfFile(const AFileName: string);
+    procedure ImportSubTenderGather(const AFileName: string);
 
 
     function CheckPassword: Boolean;
     function CheckPassword: Boolean;
 
 
@@ -270,7 +271,7 @@ implementation
 uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
 uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
   ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
   ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
   mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
   mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
-  StrUtils, sdProvider, CalcDecimal, Math;
+  StrUtils, sdProvider, CalcDecimal, Math, stgSubGatherFile;
 
 
 { TProjectData }
 { TProjectData }
 
 
@@ -2200,4 +2201,19 @@ begin
   OpenForSignOnline(AFileName, APhaseIndex);
   OpenForSignOnline(AFileName, APhaseIndex);
 end;
 end;
 
 
+procedure TProjectData.ImportSubTenderGather(const AFileName: string);
+var
+  vImportor: TstgSubGatherFileImportor;
+begin
+  if PhaseData.StageDataReadOnly then Exit;
+
+  vImportor := TstgSubGatherFileImportor.Create;
+  try
+    vImportor.ImportGatherDataTo(PhaseData.StageData, AFileName);
+  finally
+    CalculateAll;
+    vImportor.Free;
+  end;
+end;
+
 end.
 end.