Преглед изворни кода

Merge branch 'tempCalc'

Conflicts:
	Units/ProjectData.pas
MaiXinRong пре 7 година
родитељ
комит
e3861256da

+ 44 - 2
DataModules/BillsMeasureDm.pas

@@ -4,7 +4,7 @@ interface
 
 uses
   BillsDm, BillsTree, FormulaCalc, sdIDTree, StageDm,
-  SysUtils, Classes, sdDB, DB;
+  SysUtils, Classes, sdDB, DB, CalcDecimal;
 
 type 
   TLocateZJJLEvent = procedure (ABillsID: Integer) of object;
@@ -48,6 +48,7 @@ type
 
     function GetStageData: TStageData;
     procedure SetOnRecChange(const Value: TRecChangeEvent);
+    function GetDecimal: TCalcDecimal;
   public
     constructor Create(AProjectData: TObject);
     destructor Destroy; override;
@@ -56,6 +57,7 @@ type
     procedure Close;
     procedure ReConnectTree;
 
+    function CheckNodeGatherCalc(ANode: TMeasureBillsIDTreeNode): Boolean;
     procedure CalculateAll;
 
     procedure ResetPhaseStageLink;
@@ -81,6 +83,7 @@ type
     property ProjectData: TObject read FProjectData;
     property BillsData: TBillsData read FBillsData;
     property BillsMeasureTree: TMeasureBillsIDTree read FBillsMeasureTree;
+    property Decimal: TCalcDecimal read GetDecimal;
 
     property StageData: TStageData read GetStageData;
     property ShowParentData: Boolean read FShowParentData write FShowParentData;
@@ -91,7 +94,7 @@ implementation
 
 uses
   ProjectData, PhaseData, Math, ZhAPI, BillsCommand, BGLSelectFrm,
-  BGLDm, UtilMethods, mDataRecord, ConstUnit, Variants;
+  BGLDm, UtilMethods, mDataRecord, ConstUnit, Variants, ConditionalDefines;
 
 {$R *.dfm}
 
@@ -1172,4 +1175,43 @@ begin
   end;
 end;
 
+function TBillsMeasureData.CheckNodeGatherCalc(
+  ANode: TMeasureBillsIDTreeNode): Boolean;
+var
+  fLeafSumDeal, fLeafSumQc, fLeafSumGather: Double;
+  i, iCount: Integer;
+  vChild: TMeasureBillsIDTreeNode;
+begin
+  if Assigned(ANode.StageRec) then
+  begin
+    fLeafSumDeal := 0;
+    fLeafSumQc := 0;
+    fLeafSumGather := 0;
+    iCount := ANode.PosterityCount;
+    i := 0;
+    vChild := TMeasureBillsIDTreeNode(ANode.NextNode);
+    while i < iCount do
+    begin
+      if not vChild.HasChildren and Assigned(vChild.StageRec) then
+      begin
+        fLeafSumDeal := fLeafSumDeal + vChild.StageRec.DealTotalPrice.AsFloat;
+        fLeafSumQc := fLeafSumQc + vChild.StageRec.QcTotalPrice.AsFloat;
+        fLeafSumGather := fLeafSumGather + vChild.StageRec.GatherTotalPrice.AsFloat;
+      end;
+      vChild := TMeasureBillsIDTreeNode(vChild.NextNode);
+      Inc(i);
+    end;
+    Result := Decimal.TotalPrice.CheckSameNum(fLeafSumDeal, ANode.StageRec.DealTotalPrice.AsFloat) and
+              Decimal.TotalPrice.CheckSameNum(fLeafSumQc, ANode.StageRec.QcTotalPrice.AsFloat) and
+              Decimal.TotalPrice.CheckSameNum(fLeafSumGather, ANode.StageRec.GatherTotalPrice.AsFloat);
+  end
+  else
+    Result := True;
+end;
+
+function TBillsMeasureData.GetDecimal: TCalcDecimal;
+begin
+  Result := TProjectData(FProjectData).ProjProperties.DecimalManager.Common;
+end;
+
 end.

+ 3 - 0
DataModules/StageDm.pas

@@ -484,12 +484,15 @@ end;
 procedure TStageData.UpdateParentRecord(ABillsID: Integer;
   ATotalPrice: Double; const AFieldName: string);
 var
+  vNode: TMeasureBillsIDTreeNode;
   iParentID: Integer;
   Rec: TsdDataRecord;
 begin
   iParentID := MainBillsTree.FindNode(ABillsID).ParentID;
   if iParentID = -1 then Exit;
+  vNode := TMeasureBillsIDTreeNode(MainBillsTree.FindNode(iParentID));
   Rec := StageRecordWithAdd(iParentID);
+  vNode.StageRec := TStageRecord(Rec);
   Rec.ValueByName(AFieldName).AsFloat := TotalPriceRoundTo(
       Rec.ValueByName(AFieldName).AsFloat + ATotalPrice);
   Rec.ValueByName('End' + AFieldName).AsFloat := TotalPriceRoundTo(

+ 1 - 1
DataModules/ZJJLDm.dfm

@@ -3,7 +3,7 @@ object ZJJLData: TZJJLData
   Left = 704
   Top = 204
   Height = 241
-  Width = 281
+  Width = 283
   object sdpZJJL: TsdADOProvider
     TableName = 'ZJJL'
     Left = 42

+ 30 - 0
DataModules/ZJJLDm.pas

@@ -111,6 +111,8 @@ type
     function GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
     function GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
 
+    function GetZJJLCalcData(ARec: TsdDataRecord; const AFileName: string): Double;
+
     procedure LocateBills;
     function FindZJJLRecord(ABillsID: Integer): TsdDataRecord;
 
@@ -167,6 +169,7 @@ begin
 
   sdpZJJLDetail.Connection := AConnection;
   sddZJJLDetail.Open;
+  sddZJJLDetail.AddIndex('idxID', 'ID');
 
   CheckZjjlVerison;
 end;
@@ -453,6 +456,10 @@ begin
   Rec.ValueByName('UnitName').AsString := GetFieldValue('UnitName', vInfoRec.UnitName);
   Rec.ValueByName('DrawingCode').AsString := GetFieldValue('DrawingCode', vInfoRec.DrawingCode);
 
+  Rec := sddZJJLDetail.Add;
+  Rec.ValueByName('ID').AsInteger := FNewID;
+  Rec.ValueByName('BillsID').AsInteger := ANode.ID;
+
   Inc(FNewID);
 end;
 
@@ -936,4 +943,27 @@ begin
     FRefreshDetailGrid;
 end;
 
+function TZJJLData.GetZJJLCalcData(ARec: TsdDataRecord;
+  const AFileName: string): Double;
+var
+  vIdx: TsdIndex;
+  iBegin, iEnd, i: Integer;
+  vRec, vStageRec: TsdDataRecord;
+begin
+  Result := 0;
+  vIdx := sddZJJLDetail.FindIndex('idxID');
+  iBegin := vIdx.FindKeyIndex(ARec.ValueByName('ID').AsInteger);
+  iEnd := vIdx.FindKeyLastIndex(ARec.ValueByName('ID').AsInteger);
+  if iBegin <> -1 then
+  begin
+    for i := iBegin to iEnd do
+    begin
+      vRec := vIdx.Records[i];
+      vStageRec := TPhaseData(FPhaseData).StageData.StageRecord(vRec.ValueByName('BillsID').AsInteger);
+      if Assigned(vStageRec) then
+        Result := QuantityRoundTo(Result + vStageRec.ValueByName(AFileName).AsFloat);
+    end;
+  end;
+end;
+
 end.

+ 2 - 2
Dprs/Pro/Measure.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2101
+Build=2102
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化专业版
-FileVersion=3.1.7.2101
+FileVersion=3.1.7.2102
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Pro/Measure.res


+ 2 - 2
Dprs/Pro/Measure_Cloud.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2101
+Build=2102
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化云版
-FileVersion=3.1.7.2101
+FileVersion=3.1.7.2102
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Pro/Measure_Cloud.res


+ 2 - 2
Dprs/Pro/Measure_GuangDong.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2101
+Build=2102
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化广东专业版
-FileVersion=3.1.7.2101
+FileVersion=3.1.7.2102
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Pro/Measure_GuangDong.res


+ 2 - 2
Dprs/Pro/Measure_GuangDong_Cloud.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2101
+Build=2102
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化广东云版
-FileVersion=3.1.7.2101
+FileVersion=3.1.7.2102
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Pro/Measure_GuangDong_Cloud.res


+ 2 - 2
Dprs/Pro/Measure_GuangDong_TZ.dof

@@ -115,7 +115,7 @@ AutoIncBuild=0
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2100
+Build=2101
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横0号台账广东专业版
-FileVersion=3.1.7.2100
+FileVersion=3.1.7.2101
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Pro/Measure_GuangDong_TZ.res


+ 2 - 2
Dprs/Pro/Measure_TZ.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2101
+Build=2102
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横0号台账专业版
-FileVersion=3.1.7.2101
+FileVersion=3.1.7.2102
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Pro/Measure_TZ.res


+ 2 - 2
Dprs/Trail/Measure.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2101
+Build=2102
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化学习版
-FileVersion=3.1.7.2101
+FileVersion=3.1.7.2102
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Trail/Measure.res


+ 2 - 2
Dprs/Trail/Measure_GuangDong.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=7
-Build=2101
+Build=2102
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化广东学习版
-FileVersion=3.1.7.2101
+FileVersion=3.1.7.2102
 InternalName=
 LegalCopyright=版权所有(C)珠海纵横创新软件有限公司2003-2016
 LegalTrademarks=Measure

BIN
Dprs/Trail/Measure_GuangDong.res


+ 1 - 1
Forms/MainFrm.dfm

@@ -637,7 +637,7 @@ object MainForm: TMainForm
       Caption = #20840#37096#35745#31639
       Category = 0
       Hint = #20840#37096#35745#31639
-      Visible = ivNever
+      Visible = ivAlways
       ImageIndex = 15
     end
     object dxbtnNewSubProject: TdxBarButton

+ 1 - 1
Forms/ReportsFrm.dfm

@@ -296,7 +296,7 @@ object ReportsForm: TReportsForm
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -12
-    Font.Name = #24494#36719#38597#40657
+    Font.Name = 'Microsoft YaHei UI'
     Font.Style = []
     Bars = <
       item

+ 3 - 1
Forms/ReportsFrm.pas

@@ -125,7 +125,7 @@ type
     function GetClassNode(ANode: TTemplateNode): TExTreeNode;
     function GetSubClassNode(AClassNode: TExTreeNode; ANode: TTemplateNode): TExTreeNode;
     procedure AddReportTemplate(ANode: TTemplateNode);
-	procedure LoadReportTemplets;
+  	procedure LoadReportTemplets;
 
     procedure SaveAuditOpinion(ATemplate: TTemplateNode);
     procedure SaveReportInteractData(ATemplate: TTemplateNode);
@@ -202,6 +202,8 @@ begin
   ReportsForm.InitReportSettings(ReportsForm.PreviewComXML);
   ReportsForm.InitFormView;
   try
+    if not _IsDebugView then
+      ReportsForm.extvReport.OnKeyDown := nil;
     ReportsForm.ShowModal;
   finally
     ReportsForm.Free;

+ 5 - 1
Frames/BillsCompileFme.pas

@@ -121,7 +121,8 @@ implementation
 
 uses
   MainFrm, BatchInsertBillsFrm, ExportExcel, ProjectData, mEncryptEditions,
-  ExcelImport, DetailExcelImport, mDataRecord, ExcelImport_GclBills;
+  ExcelImport, DetailExcelImport, mDataRecord, ExcelImport_GclBills,
+  ConditionalDefines;
 
 {$R *.dfm}
 
@@ -238,6 +239,9 @@ begin
   end;
   zgBillsCompile.OnExpandMouseDown := ExpandMouseDown;
   FBillsCompileData.RefreshRow := RefreshTreeRow;
+  
+  if not _IsDebugView then
+    zgBillsCompile.OnKeyDown := nil;
 end;
 
 destructor TBillsCompileFrame.Destroy;

+ 1 - 1
Frames/BillsMeasureFme.dfm

@@ -1132,8 +1132,8 @@ object BillsMeasureFrame: TBillsMeasureFrame
     object actnCalculateAll: TAction
       Caption = #20840#37096#35745#31639
       ImageIndex = 15
-      Visible = False
       OnExecute = actnCalculateAllExecute
+      OnUpdate = actnCalculateAllUpdate
     end
     object actnExportGridToExcel: TAction
       Caption = #23548#20986#34920#26684#25968#25454

+ 9 - 0
Frames/BillsMeasureFme.pas

@@ -60,6 +60,7 @@ type
     procedure actnCancelHiddenColExecute(Sender: TObject);
     procedure actnLocateZJJLExecute(Sender: TObject);
     procedure actnLocateZJJLUpdate(Sender: TObject);
+    procedure actnCalculateAllUpdate(Sender: TObject);
   private
     FBillsMeasureData: TBillsMeasureData;
     FShowPriceChange: Boolean;
@@ -143,6 +144,8 @@ begin
   zgBillsMeasure.OnExpandMouseDown := ExpandMouseDown;
 
   FColVisibleManager := TBM_ColVisibleManager.Create(stdBillsMeasure);
+  if not _IsDebugView then
+    zgBillsMeasure.OnKeyDown := nil;
 end;
 
 destructor TBillsMeasureFrame.Destroy;
@@ -801,4 +804,10 @@ begin
   FColVisibleManager.ShowIsGather(FShowIsGather);
 end;
 
+procedure TBillsMeasureFrame.actnCalculateAllUpdate(Sender: TObject);
+begin
+  with TProjectData(FBillsMeasureData.ProjectData) do
+  TAction(Sender).Enabled := PhaseData.Active and not PhaseData.StageDataReadOnly;
+end;
+
 end.

+ 3 - 1
Frames/OtherMeasureFme.pas

@@ -40,7 +40,7 @@ type
 implementation
 
 uses
-  OtherMeasurePhaseDm, sdDB;
+  OtherMeasurePhaseDm, sdDB, ConditionalDefines;
 
 {$R *.dfm}
 
@@ -50,6 +50,8 @@ begin
   FProjectData := AProjectData;
   saPhase.DataView := FProjectData.OtherMeasurePhaseData.sdvPhase;
   saOnce.DataView := FProjectData.OtherMeasureOnceData.sdvOnce;
+  if not _IsDebugView then
+    zgPhase.OnKeyDown := nil;
 end;
 
 destructor TOtherMeasureFrame.Destroy;

+ 29 - 5
Frames/ZJJLFme.pas

@@ -9,12 +9,12 @@ uses
   ToolWin, ActnList, ZjGridDBA, ZJGrid, dxBar, sdGridDBA, sdDB;
 
 type
-  TRowIndex = (riBGLCode, riPegName, riBeginPeg, riEndPeg, riFBFXName, riUnitName, riDrawingCode,
+  TRowIndex = (riCurGatherMeasure, riBGLCode, riPegName, riBeginPeg, riEndPeg, riFBFXName, riUnitName, riDrawingCode,
     riFormulaMemoTitle, riFormulaMemoValue, riRelaFileTitle, riRelaFileValue);
 const
-  RowFields: array [TRowIndex] of string = ('BGLCode', 'PegName', 'BeginPeg', 'EndPeg', 'FBFXName', 'UnitName', 'DrawingCode',
+  RowFields: array [TRowIndex] of string = ('', 'BGLCode', 'PegName', 'BeginPeg', 'EndPeg', 'FBFXName', 'UnitName', 'DrawingCode',
     '', 'FormulaMemo', '', 'RelaFile');
-  RowFormats: array [TRowIndex] of string = ('变更令号:', '部位:', '起始桩号:', '终止桩号:', '分部分项工程:', '计量单元:', '图号:',
+  RowFormats: array [TRowIndex] of string = ('本期计量%s:%s', '变更令号:', '部位:', '起始桩号:', '终止桩号:', '分部分项工程:', '计量单元:', '图号:',
     '计算式说明:', '', '计算草图几何尺寸:', '');
 type
   TZJJLFrame = class(TFrame)
@@ -93,6 +93,7 @@ uses
 constructor TZJJLFrame.Create(AParent: TFrame; AZJJLData: TZJJLData);
 begin
   inherited Create(AParent);
+  zgDetailInfo.RowCount := Integer(riRelaFileValue) + 1;
   ResetFrameLink(AZJJLData);
   if TPhaseData(FZJJLData.PhaseData).Active then
   begin
@@ -266,8 +267,31 @@ procedure TZJJLFrame.zgDetailInfoGetCellText(Sender: TObject;
       Result := GetDefaultValue(Rec, RowFields[ARow]);
   end;
 
+  function GetFloatStr(ANum: Double): string;
+  begin
+    if ANum = 0 then
+      Result := ''
+    else
+      Result := FloatToStr(ANum);
+  end;
+
+  function GetCurGatherMeasure: string;
+  var
+    Rec: TsdDataRecord;
+  begin
+    Rec := saZJJL.DataView.Current;
+    if not Assigned(Rec) then
+      Result := Format(RowFormats[riCurGatherMeasure], ['', ''])
+    else if Rec.ValueByName('Type').AsInteger = Integer(ztFx) then
+      Result := Format(RowFormats[riCurGatherMeasure], ['金额', GetFloatStr(FZJJLData.GetZJJLCalcData(Rec, 'GatherTotalPrice'))])
+    else
+      Result := Format(RowFormats[riCurGatherMeasure], ['数量', GetFloatStr(FZJJLData.GetZJJLCalcData(Rec, 'GatherQuantity'))]);
+  end;
+
 begin
-  if (ACoord.Y >= 0) and (ACoord.Y <= 10) then
+  if (ACoord.Y = Integer(riCurGatherMeasure)) then
+    Value := GetCurGatherMeasure
+  else if (ACoord.Y > Integer(riCurGatherMeasure)) and (ACoord.Y <= Integer(riRelaFileValue)) then
     Value := GetText(TRowIndex(ACoord.Y));
 end;
 
@@ -280,7 +304,7 @@ begin
     zgDetailInfo[0, iRowIndex].Align := gaTopLeft;
   zgDetailInfo.RowHeights[Integer(riFormulaMemoValue)] := 57;
   zgDetailInfo.Cells[0, Integer(riFormulaMemoValue)].Align := gaTopLeft;
-  zgDetailInfo.RowHeights[Integer(riRelaFileValue)] := 57;              
+  zgDetailInfo.RowHeights[Integer(riRelaFileValue)] := 57;
   zgDetailInfo.Cells[0, Integer(riRelaFileValue)].Align := gaTopLeft;
 end;
 

+ 7 - 1
Units/CalcDecimal.pas

@@ -23,6 +23,7 @@ type
 
     function RoundTo(AValue: Double): Double;
     function StrRoundTo(const AValue: string): string;
+    function CheckSameNum(AValue1, AValue2: Double): Boolean;
 
     procedure ClearLinkViewCols;
     procedure AddLinkViewCol(ACol: TObject);
@@ -78,7 +79,7 @@ type
 implementation
 
 uses
-  ProjectData, UtilMethods, SysUtils;
+  ProjectData, UtilMethods, SysUtils, Math;
 
 { TDecimal }
 
@@ -87,6 +88,11 @@ begin
   FLinkViewCols.Add(ACol);
 end;
 
+function TDecimal.CheckSameNum(AValue1, AValue2: Double): Boolean;
+begin
+  Result := Abs(RoundTo(AValue1 - AValue2)) < CompareValue;
+end;
+
 procedure TDecimal.ClearLinkViewCols;
 begin
   FLinkViewCols.Clear;

+ 1 - 1
Units/DetailExcelImport.pas

@@ -128,7 +128,7 @@ function TDetailExcelImport.GetCellStr(ARow: TExportRow;
   ACol: Integer): string;
 begin
   if (ACol < ARow.Cells.Count) and (ACol >= 0) then
-    Result := ARow.Cells[ACol].SqlText
+    Result := TrimInvalidChar(ARow.Cells[ACol].SqlText)
   else
     Result := '';
 end;

+ 40 - 0
Units/ProjectData.pas

@@ -88,6 +88,7 @@ type
     procedure CloseAllData;
     procedure OpenAllData;
 
+    procedure CheckCalcBeforeSave;
     procedure InnerSave;
 
     procedure LoadCheckersData;
@@ -275,7 +276,11 @@ uses
   ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
   mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
   StrUtils, sdProvider, CalcDecimal, Math, CslJson, OrderCheckerFme,
+<<<<<<< HEAD
   stgSubGatherFile;
+=======
+  Forms, ProgressHintFrm, BillsTree, Controls;
+>>>>>>> tempCalc
 
 { TProjectData }
 
@@ -2131,6 +2136,8 @@ begin
   try
     AppendProjectLog('Save Main Data');
 
+    CheckCalcBeforeSave;
+
     UpdateSysProgress(5, '正在保存数据');
     SaveLastestPhaseMainData;
     UpdateSysProgress(10, '正在保存数据');
@@ -2217,6 +2224,7 @@ begin
   end
 end;
 
+<<<<<<< HEAD
 procedure TProjectData.OpenForSumUpBase(const AFileName: string);
 begin
   FProjectID := -1;
@@ -2247,6 +2255,38 @@ begin
   finally
     CalculateAll;
     vImportor.Free;
+=======
+procedure TProjectData.CheckCalcBeforeSave;
+
+  function NeedReCalc: Boolean;
+  var
+    vTopNode: TsdIDTreeNode;
+  begin
+    Result := False;
+    vTopNode := BillsMeasureData.BillsMeasureTree.FirstNode;
+    while not Result and Assigned(vTopNode) do
+    begin
+      if not BillsMeasureData.CheckNodeGatherCalc(TMeasureBillsIDTreeNode(vTopNode)) then
+        Result := True;
+      vTopNode := vTopNode.NextSibling;
+    end;
+  end;
+
+var
+  i: Integer;
+  fLeafSum, fTopParent: Double;
+begin
+  if PhaseData.Active and (not StageDataReadOnly) and NeedReCalc then
+  begin
+    Screen.Cursor := crHourGlass;
+    try
+      ShowProgressHint('检查到有需要计算的清单,请稍候...');
+      CalculateAll;
+      CloseProgressHint;
+    finally
+      Screen.Cursor := crDefault;
+    end;
+>>>>>>> tempCalc
   end;
 end;
 

+ 14 - 0
Units/UtilMethods.pas

@@ -63,6 +63,7 @@ type
   function CheckPeg(const AStr: string): Boolean;
   function CheckValidPassword(APassword: string): Boolean;
   function ValidInteger(var AKey: Char): Boolean;
+  function TrimInvalidChar(const AText: string): string;
 
   {MergeStrings}
   function MergeRelaBGL(const ABGLCode1, ABGLCode2: string): string;
@@ -684,6 +685,19 @@ begin
   end;
 end;
 
+function TrimInvalidChar(const AText: string): string;
+var
+  i, iLength: Integer;
+begin
+  Result := '';
+  iLength := Length(AText);
+  for i := 1 to iLength do
+  begin
+    if not (AText[i] in [#0]) then
+      Result := Result + AText[i];
+  end;
+end;
+
 {MergeStrings}
 function MergeRelaBGL(const ABGLCode1, ABGLCode2: string): string;
 var