Browse Source

其他台账 -- 分期计量台账

MaiXinRong 8 years ago
parent
commit
c0242aed47

+ 99 - 0
DataModules/OtherMeasurePhaseDm.dfm

@@ -0,0 +1,99 @@
+object OtherMeasurePhaseData: TOtherMeasurePhaseData
+  OldCreateOrder = False
+  Left = 367
+  Top = 303
+  Height = 267
+  Width = 215
+  object sdpPhase: TsdADOProvider
+    TableName = 'OtherMeasurePhase'
+    Left = 56
+    Top = 32
+  end
+  object sddPhase: TsdDataSet
+    Active = False
+    Provider = sdpPhase
+    AfterValueChanged = sddPhaseAfterValueChanged
+    OnGetRecordClass = sddPhaseGetRecordClass
+    Left = 56
+    Top = 96
+    FieldListData = {
+      0101044E616D6506024944094669656C644E616D650602494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650909507265636973696F6E02000453697A6502000001044E616D
+      65060853657269616C4E6F094669656C644E616D65060853657269616C4E6F08
+      44617461547970650203084461746153697A6502040549734B6579080F4E6565
+      6450726F636573734E616D650909507265636973696F6E02000453697A650200
+      0001044E616D650604436F6465094669656C644E616D650604436F6465084461
+      7461547970650218084461746153697A6502320549734B6579080F4E65656450
+      726F636573734E616D650909507265636973696F6E02000453697A6502000001
+      044E616D6506044E616D65094669656C644E616D6506044E616D650844617461
+      547970650218084461746153697A6503FF000549734B6579080F4E6565645072
+      6F636573734E616D650909507265636973696F6E02000453697A650200000104
+      4E616D6506054D54797065094669656C644E616D6506054D5479706508446174
+      61547970650218084461746153697A6502320549734B6579080F4E6565645072
+      6F636573734E616D650909507265636973696F6E02000453697A650200000104
+      4E616D65060A546F74616C5072696365094669656C644E616D65060A546F7461
+      6C50726963650844617461547970650206084461746153697A6502080549734B
+      6579080F4E65656450726F636573734E616D650909507265636973696F6E0200
+      0453697A6502000001044E616D6506074D656D6F537472094669656C644E616D
+      6506074D656D6F5374720844617461547970650218084461746153697A650203
+      0549734B6579080F4E65656450726F636573734E616D65090950726563697369
+      6F6E02000453697A6502000001044E616D65060D437265617465506861736549
+      44094669656C644E616D65060D43726561746550686173654944084461746154
+      7970650203084461746153697A6502040549734B6579080F4E65656450726F63
+      6573734E616D650909507265636973696F6E02000453697A6502000001044E61
+      6D65060D437572546F74616C5072696365094669656C644E616D65060D437572
+      546F74616C50726963650844617461547970650206084461746153697A650208
+      0549734B6579080F4E65656450726F636573734E616D65090950726563697369
+      6F6E02000453697A6502000001044E616D65060D507265546F74616C50726963
+      65094669656C644E616D65060D507265546F74616C5072696365084461746154
+      7970650206084461746153697A6502080549734B6579080F4E65656450726F63
+      6573734E616D650909507265636973696F6E02000453697A6502000001044E61
+      6D65060D456E64546F74616C5072696365094669656C644E616D65060D456E64
+      546F74616C50726963650844617461547970650206084461746153697A650208
+      0549734B6579080F4E65656450726F636573734E616D65090950726563697369
+      6F6E02000453697A6502000001044E616D65060D416464546F74616C50726963
+      65094669656C644E616D65060D416464546F74616C5072696365084461746154
+      7970650206084461746153697A6502080549734B6579080F4E65656450726F63
+      6573734E616D650909507265636973696F6E02000453697A6502000000}
+  end
+  object sdvPhase: TsdDataView
+    Active = False
+    DataSet = sddPhase
+    Filtered = False
+    Columns = <
+      item
+        FieldName = 'Code'
+      end
+      item
+        FieldName = 'Name'
+      end
+      item
+        FieldName = 'MType'
+      end
+      item
+        FieldName = 'TotalPrice'
+      end
+      item
+        FieldName = 'MemoStr'
+      end
+      item
+        FieldName = 'CreatePhaseID'
+      end
+      item
+        FieldName = 'CurTotalPrice'
+      end
+      item
+        FieldName = 'PreTotalPrice'
+      end
+      item
+        FieldName = 'EndTotalPrice'
+      end
+      item
+        FieldName = 'AddTotalPrice'
+      end>
+    BeforeAddRecord = sdvPhaseBeforeAddRecord
+    Left = 56
+    Top = 160
+  end
+end

+ 219 - 0
DataModules/OtherMeasurePhaseDm.pas

@@ -0,0 +1,219 @@
+unit OtherMeasurePhaseDm;
+
+interface
+
+uses
+  SysUtils, Classes, sdDB, sdProvider, ADODB, OMPhaseRecord;
+
+type
+  TOtherMeasurePhaseData = class(TDataModule)
+    sdpPhase: TsdADOProvider;
+    sddPhase: TsdDataSet;
+    sdvPhase: TsdDataView;
+    procedure sdvPhaseBeforeAddRecord(ARecord: TsdDataRecord;
+      var Allow: Boolean);
+    procedure sdvPhaseAfterValueChanged(AValue: TsdValue);
+    procedure sddPhaseGetRecordClass(var ARecordClass: TsdRecordClass);
+    procedure sddPhaseAfterValueChanged(AValue: TsdValue);
+  private
+    FProjectData: TObject;
+
+    function GetNewID: Integer;
+    function GetNewSerialNo: Integer;
+
+    procedure SaveDetailData;
+
+    procedure BeforeBatchOperation;
+    procedure AfterBatchOperation;
+  public
+    constructor Create(AProjectData: TObject);
+    destructor Destroy; override;
+
+    procedure Open(AConnection: TADOConnection);
+    procedure Save;
+
+    procedure LoadCurStageData;
+  end;
+
+implementation
+
+uses
+  ProjectData, UtilMethods, Math;
+
+{$R *.dfm}
+
+{ TOtherMeasurePhaseData }
+
+procedure TOtherMeasurePhaseData.AfterBatchOperation;
+begin
+  sddPhase.EndUpdate;
+  sddPhase.EnableControls;
+  sddPhase.AfterValueChanged := sddPhaseAfterValueChanged;
+end;
+
+procedure TOtherMeasurePhaseData.BeforeBatchOperation;
+begin
+  sddPhase.AfterValueChanged := nil;
+  sddPhase.DisableControls;
+  sddPhase.BeginUpdate;
+end;
+
+constructor TOtherMeasurePhaseData.Create(AProjectData: TObject);
+begin
+  inherited Create(nil);
+  FProjectData := AProjectData;
+end;
+
+destructor TOtherMeasurePhaseData.Destroy;
+begin
+  inherited;
+end;
+
+function TOtherMeasurePhaseData.GetNewID: Integer;
+var
+  idx: TsdIndex;
+begin
+  idx := sddPhase.FindIndex('idxID');
+  if idx.RecordCount > 0 then
+    Result := idx.Records[idx.RecordCount - 1].ValueByName('ID').AsInteger + 1
+  else
+    Result := 1;
+end;
+
+function TOtherMeasurePhaseData.GetNewSerialNo: Integer;
+var
+  idx: TsdIndex;
+begin
+  idx := sddPhase.FindIndex('idxSerial');
+  if idx.RecordCount > 0 then
+    Result := idx.Records[idx.RecordCount - 1].ValueByName('SerialNo').AsInteger + 1
+  else
+    Result := 1;
+end;
+
+procedure TOtherMeasurePhaseData.LoadCurStageData;
+
+  procedure LoadData;
+  const
+    sSelectSql = 'Select * From OMPhaseDetail Where (PhaseID = %d) and (StageID = %d)';
+  var
+    vQuery: TADOQuery;
+    i: Integer;
+    Rec: TOMPhaseRecord;
+  begin
+    try
+      with TProjectData(FProjectData) do
+        vQuery := QueryData(sdpPhase.Connection, Format(sSelectSql, [PhaseIndex, StageIndex]));
+      for i := 0 to sddPhase.RecordCount - 1 do
+      begin
+        Rec := TOMPhaseRecord(sddPhase.Records[i]);
+        if vQuery.Locate('ID', Rec.ValueByName('ID').AsInteger, []) then
+        begin
+          Rec.PreTotalPrice.AsFloat := vQuery.FieldByName('PreTotalPrice').AsFloat;
+          Rec.CurTotalPrice.AsFloat := vQuery.FieldByName('CurTotalPrice').AsFloat;
+          Rec.EndTotalPrice.AsFloat := vQuery.FieldByName('EndTotalPrice').AsFloat;
+        end
+        else
+        begin
+          Rec.PreTotalPrice.AsFloat := 0;
+          Rec.CurTotalPrice.AsFloat := 0;
+          Rec.EndTotalPrice.AsFloat := 0;
+        end;
+      end;
+    finally
+      vQuery.Free;
+    end;
+  end;
+
+begin
+  BeforeBatchOperation;
+  try
+    LoadData;
+  finally
+    AfterBatchOperation;
+  end;
+end;
+
+procedure TOtherMeasurePhaseData.Open(AConnection: TADOConnection);
+begin
+  sdpPhase.Connection := AConnection;
+  sddPhase.Open;
+  if not Assigned(sddPhase.FindIndex('idxID')) then
+    sddPhase.AddIndex('idxID', 'ID');
+  if not Assigned(sddPhase.FindIndex('idxSerial')) then
+    sddPhase.AddIndex('idxSerial', 'SerialNo');
+  sdvPhase.Open;
+  sdvPhase.IndexName := 'idxSerial';
+
+  LoadCurStageData;
+end;
+
+procedure TOtherMeasurePhaseData.Save;
+begin
+  sddPhase.Save;
+  if not TProjectData(FProjectData).StageDataReadOnly then
+    SaveDetailData;
+end;
+
+procedure TOtherMeasurePhaseData.SaveDetailData;
+const
+  sDeleteSql = 'Delete From OMPhaseDetail where (PhaseID = %d) and (StageID = %d)';
+  sInsertSql = 'Insert Into OMPhaseDetail' +
+               '  Select ID, %d As PhaseID, %d As StageID, PreTotalPrice, CurTotalPrice, EndTotalPrice' +
+               '    From OtherMeasurePhase';
+var
+  iPhase, iStage: Integer;
+  vQuery: TADOQuery;
+begin
+  if TProjectData(FProjectData).StageDataReadOnly then Exit;
+
+  iPhase := TProjectData(FProjectData).PhaseIndex;
+  iStage := TProjectData(FProjectData).StageIndex;
+
+  ExecuteSql(sdpPhase.Connection, Format(sDeleteSql, [iPhase, iStage]));
+  ExecuteSql(sdpPhase.Connection, Format(sInsertSql, [iPhase, iStage]));
+
+  ExecuteSql(sdpPhase.Connection, Format(sDeleteSql, [iPhase, -1]));
+  ExecuteSql(sdpPhase.Connection, Format(sInsertSql, [iPhase, -1]));
+end;
+
+procedure TOtherMeasurePhaseData.sdvPhaseBeforeAddRecord(
+  ARecord: TsdDataRecord; var Allow: Boolean);
+begin
+  ARecord.ValueByName('ID').AsInteger := GetNewID;
+  ARecord.ValueByName('SerialNo').AsInteger := GetNewSerialNo;
+  ARecord.ValueByName('CreatePhaseID').AsInteger := TProjectData(FProjectData).PhaseIndex;
+end;
+
+procedure TOtherMeasurePhaseData.sdvPhaseAfterValueChanged(
+  AValue: TsdValue);
+var
+  Rec: TOMPhaseRecord;
+begin
+  if SameText(AValue.FieldName, 'CurTotalPrice') then
+  begin
+    Rec := TOMPhaseRecord(AValue.Owner);
+    Rec.SetFloatValue(Rec.EndTotalPrice, TotalPriceRoundTo(Rec.CurTotalPrice.AsFloat + Rec.PreTotalPrice.AsFloat));
+  end;
+end;
+
+procedure TOtherMeasurePhaseData.sddPhaseGetRecordClass(
+  var ARecordClass: TsdRecordClass);
+begin
+  ARecordClass := TOMPhaseRecord;
+end;
+
+procedure TOtherMeasurePhaseData.sddPhaseAfterValueChanged(
+  AValue: TsdValue);
+var
+  Rec: TOMPhaseRecord;
+begin
+  if SameText(AValue.FieldName, 'CurTotalPrice') then
+  begin
+    Rec := TOMPhaseRecord(AValue.Owner);
+    Rec.SetFloatValue(Rec.EndTotalPrice, TotalPriceRoundTo(Rec.CurTotalPrice.AsFloat + Rec.PreTotalPrice.AsFloat));
+    Rec.SetFloatValue(Rec.AddTotalPrice, Rec.EndTotalPrice.AsFloat);
+  end;
+end;
+
+end.

+ 4 - 19
DataModules/ProjectGLDm.pas

@@ -47,7 +47,6 @@ type
     procedure CalculatePALRela(ARec: TProjectGLRecord);
     procedure CalculatePALRelas;
 
-    procedure ExecuteSql(const ASql: string);
     procedure SaveGLPrice;
     procedure SavePM_CurData;
 
@@ -214,13 +213,13 @@ var
 begin
   iPhaseID := TProjectData(FProjectData).ProjProperties.PhaseCount;
   sSql := Format(sDeleteSql, [iPhaseID]);
-  ExecuteSql(sSql);
+  ExecuteSql(sdpProjectGL.Connection, sSql);
 
   sSql := Format(sInsertSql, [iPhaseID]);
-  ExecuteSql(sSql);
+  ExecuteSql(sdpProjectGL.Connection, sSql);
 
   sSql := Format(sUpdateSql, [iPhaseID]);
-  ExecuteSql(sSql);
+  ExecuteSql(sdpProjectGL.Connection, sSql);
 end;
 
 procedure TProjectGLData.sddProjectGLAfterAddRecord(
@@ -305,20 +304,6 @@ begin
   RefreshGatherData;
 end;
 
-procedure TProjectGLData.ExecuteSql(const ASql: string);
-var
-  vQuery: TADOQuery;
-begin
-  vQuery := TADOQuery.Create(nil);
-  try
-    vQuery.Connection := sdpProjectGL.Connection;
-    vQuery.SQL.Add(ASql);
-    vQuery.ExecSQL;
-  finally
-    vQuery.Free;
-  end;
-end;
-
 function TProjectGLData.GetValidDeltaPrice(AID: Integer): Double;
 var
   Rec: TProjectGLRecord;
@@ -431,7 +416,7 @@ begin
   iStageIndex := TProjectData(FProjectData).PhaseData.StageIndex;
   iPhaseCount := TProjectData(FProjectData).ProjProperties.PhaseCount;
   sSql := Format(sUpdateSql, [iStageIndex, iStageIndex, iStageIndex, iStageIndex, iStageIndex, iStageIndex, iPhaseCount]);
-  ExecuteSql(sSql);
+  ExecuteSql(sdpProjectGL.Connection, sSql);
 end;
 
 procedure TProjectGLData.CalculateGL_PM(AGLID: Integer);

+ 12 - 12
Forms/MainFrm.dfm

@@ -21,7 +21,7 @@ object MainForm: TMainForm
   object jtsProjects: TJimTabSet
     Left = 0
     Top = 49
-    Width = 734
+    Width = 742
     Height = 21
     Align = alTop
     BackgroundColor = clGradientInactiveCaption
@@ -45,8 +45,8 @@ object MainForm: TMainForm
   end
   object dxStatusBar: TdxStatusBar
     Left = 0
-    Top = 480
-    Width = 734
+    Top = 487
+    Width = 742
     Height = 20
     Panels = <
       item
@@ -78,12 +78,12 @@ object MainForm: TMainForm
     object dxStatusBarContainer2: TdxStatusBarContainerControl
       Left = 604
       Top = 2
-      Width = 128
+      Width = 136
       Height = 16
       object ProgressBar: TProgressBar
         Left = 0
         Top = 0
-        Width = 128
+        Width = 136
         Height = 16
         Align = alClient
         Max = 200
@@ -94,8 +94,8 @@ object MainForm: TMainForm
   object jpsMain: TJimPages
     Left = 0
     Top = 70
-    Width = 734
-    Height = 410
+    Width = 742
+    Height = 417
     ActivePage = jpsMainProjectsManager
     ActivePageIndex = 0
     Align = alClient
@@ -103,8 +103,8 @@ object MainForm: TMainForm
     object jpsMainProjectsManager: TJimPage
       Left = 0
       Top = 0
-      Width = 734
-      Height = 410
+      Width = 742
+      Height = 417
       TabName = 'ProjectsManager'
       Caption = 'ProjsMgr'
       object pnlUser: TPanel
@@ -201,8 +201,8 @@ object MainForm: TMainForm
     object jpsMainProjects: TJimPage
       Left = 0
       Top = 0
-      Width = 734
-      Height = 410
+      Width = 742
+      Height = 417
       TabName = 'Projects'
       Caption = 'Projects'
       object jpsProjects: TJimPages
@@ -220,7 +220,7 @@ object MainForm: TMainForm
     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

+ 0 - 1
Forms/MainFrm.pas

@@ -235,7 +235,6 @@ var
 implementation
 
 uses
-
   ProjectProperty, ConstUnit, PHPWebDm, Math, ShellAPI,
   FindUserFrm, ImportExcelHintFrm, ConfigDoc, ExportExcel,
   ProjectCommands, BillsCompileDm, tpMainFrm,

+ 1 - 0
Frames/ProjectFme.pas

@@ -1405,6 +1405,7 @@ begin
   FBillsMeasureFrame.RefreshPhase_Stage;
   FDealPaymentFrame.RefreshPhase_Stage;
   FPriceMarginFrame.ResetViewControl;
+  FOtherMeasureFrame.ResetViewControl;
 end;
 
 procedure TProjectFrame.ExpandCurPhase;

+ 23 - 2
Units/DataBaseTables.pas

@@ -713,7 +713,7 @@ const
 
   {其他台账 -- 分期计量}
   SOtherMeasurePhase = 'OtherMeasurePhase';
-  tdOtherMeasurePhase: array [0..6] of TScFieldDef =(
+  tdOtherMeasurePhase: array [0..11] of TScFieldDef =(
     (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
     // 排序
     (FieldName: 'SerialNo'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
@@ -723,10 +723,31 @@ const
     (FieldName: 'Name'; FieldType: ftString; Size: 200; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // 台账类型
     (FieldName: 'MType'; FieldType: ftString; Size: 20; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 台账金额
+    (FieldName: 'TotalPrice'; FieldType: ftString; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // 备注
     (FieldName: 'MemoStr'; FieldType: ftString; Size: 255; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // 创建日期
-    (FieldName: 'CreatePhaseID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
+    (FieldName: 'CreatePhaseID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 以下为根据期数缓存DetailMeasure中数据
+    // 本期计量
+    (FieldName: 'CurTotalPrice'; 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: 'EndTotalPrice'; 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)
+  );
+
+  SOMPhaseDetail = 'OMPhaseDetail';
+  tdOMPhaseDetail: array [0..5] of TScFieldDef =(
+    (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    (FieldName: 'PhaseID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    (FieldName: 'StageID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    (FieldName: 'PreTotalPrice'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'CurTotalPrice'; 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)
   );
 
   {PhaseData}

+ 71 - 0
Units/DataRecord/OMPhaseRecord.pas

@@ -0,0 +1,71 @@
+unit OMPhaseRecord;
+
+interface
+
+uses
+  sdDB, mDataRecord;
+
+type
+  TOMPhaseRecord = class(TMeasureBaseRecord)
+  private
+    FID: TsdValue;
+    FSerialNo: TsdValue;
+
+    FName: TsdValue;
+    FMType: TsdValue;
+    FTotalPrice: TsdValue;
+    FMemoStr: TsdValue;
+
+    FCreatePhaseID: TsdValue;
+    FCreateStageID: TsdValue;
+
+    FCurTotalPrice: TsdValue;
+    FPreTotalPrice: TsdValue;
+    FEndTotalPrice: TsdValue;
+    FAddTotalPrice: TsdValue;
+  protected
+    procedure DoAfterAddFields; override;
+  public
+    property ID: TsdValue read FID;
+    property SerialNo: TsdValue read FSerialNo;
+
+    property Name: TsdValue read FName;
+    property MType: TsdValue read FMType;
+    property TotalPrice: TsdValue read FTotalPrice;
+    property MemoStr: TsdValue read FMemoStr;
+
+    property CreatePhaseID: TsdValue read FCreatePhaseID;
+    property CreateStageID: TsdValue read FCreateStageID;
+
+    property CurTotalPrice: TsdValue read FCurTotalPrice;
+    property PreTotalPrice: TsdValue read FPreTotalPrice;
+    property EndTotalPrice: TsdValue read FEndTotalPrice;
+    property AddTotalPrice: TsdValue read FAddTotalPrice;
+  end;
+
+implementation
+
+{ TOMPhaseRecord }
+
+procedure TOMPhaseRecord.DoAfterAddFields;
+begin
+  inherited;
+  FID := ValueByName('ID');
+  FSerialNo := ValueByName('SerialNo');
+
+  FName := ValueByName('Name');
+  FMType := ValueByName('MType');
+  FTotalPrice := ValueByName('TotalPrice');
+  FMemoStr := ValueByName('MemoStr');
+
+  FCreatePhaseID := ValueByName('CreatePhaseID');
+  FCreateStageID := ValueByName('CreateStageID');
+
+  FCurTotalPrice := ValueByName('CurTotalPrice');
+  FPreTotalPrice := ValueByName('PreTotalPrice');
+  FEndTotalPrice := ValueByName('EndTotalPrice');
+
+  FAddTotalPrice := ValueByName('AddTotalPrice');
+end;
+
+end.

+ 1 - 18
Units/PhaseData.pas

@@ -29,8 +29,6 @@ type
 
     procedure UpdatePhaseDataBase;
 
-    procedure ExecuteSql(const ASql: string);
-
     procedure CopyPreStageData;
 
     procedure CheckAuditCount;
@@ -311,22 +309,7 @@ begin
   sPre := StageTableName[FPhaseProperty.AuditCount-1];
   sCur := StageTableName[FPhaseProperty.AuditCount];
   sSql := Format(sCopySql, [sCur, sPre]);
-  ExecuteSql(sSql);
-end;
-
-procedure TPhaseData.ExecuteSql(const ASql: string);
-var
-  FQuery: TADOQuery;
-begin
-  FQuery := TADOQuery.Create(nil);
-  try
-    FQuery.Connection := FConnection.Connection;
-    FQuery.SQL.Clear;
-    FQuery.SQL.Add(ASql);
-    FQuery.ExecSQL;
-  finally
-    FQuery.Free;
-  end;
+  ExecuteSql(FConnection.Connection, sSql);
 end;
 
 procedure TPhaseData.SimpleOpen2(const AProjectName: string);

+ 39 - 1
Units/ProjectData.pas

@@ -7,7 +7,7 @@ uses
   PhaseCompareDm, DealPaymentDm, SearchDm, DealBillsDm, MainDataListDm,
   BillsGatherDm, BGLDm, StaffDm, BillsCompileDm, BillsMeasureDm,
   BillsBookmarkDm, UpFileManageUnit, ProjectGLDm, PriceMarginBillsDm,
-  DetailGLDm, OtherMeasureOnceDm,
+  DetailGLDm, OtherMeasureOnceDm, OtherMeasurePhaseDm,
   Classes, SysUtils, ADODB, sdDB, Checker;
 
 type
@@ -47,6 +47,7 @@ type
     FPriceMarginBillsData: TPriceMarginBillsData;
 
     FOtherMeasureOnceData: TOtherMeasureOnceData;
+    FOtherMeasurePhaseData: TOtherMeasurePhaseData;
 
     FCanUnlockInfo: Boolean;
 
@@ -214,6 +215,7 @@ type
     property PriceMarginBillsData: TPriceMarginBillsData read FPriceMarginBillsData;
 
     property OtherMeasureOnceData: TOtherMeasureOnceData read FOtherMeasureOnceData;
+    property OtherMeasurePhaseData: TOtherMeasurePhaseData read FOtherMeasurePhaseData;
 
     // 台账、合同支付
     property AllowInsert: Boolean read GetAllowInsert;
@@ -296,6 +298,7 @@ begin
   FDetailGLData := TDetailGLData.Create(Self);
   FPriceMarginBillsData := TPriceMarginBillsData.Create(Self);
   FOtherMeasureOnceData := TOtherMeasureOnceData.Create(Self);
+  FOtherMeasurePhaseData := TOtherMeasurePhaseData.Create(Self);
   FAttachmentData := TUpFiles.Create;
   FPhaseIndex := 0;
 end;
@@ -316,6 +319,7 @@ destructor TProjectData.Destroy;
 begin
   try
     FCheckers.Free;
+    FOtherMeasurePhaseData.Free;
     FOtherMeasureOnceData.Free;
     FPriceMarginBillsData.Free;
     FDetailGLData.Free;
@@ -457,7 +461,9 @@ begin
 
   //FBillsGatherData.RefreshBills;
   FMainListData.Open(FConnection.Connection);
+  UpdateSysProgress(190, '正在读取数据');
   FOtherMeasureOnceData.Open(FConnection.Connection);
+  FOtherMeasurePhaseData.Open(FConnection.Connection);
   UpdateSysProgress(200, '就绪');
 
   if _IsDebugView then
@@ -505,6 +511,7 @@ begin
     UpdateSysProgress(165, '正在保存数据');
 
     FOtherMeasureOnceData.Save;
+    FOtherMeasurePhaseData.Save;
     UpdateSysProgress(170, '正在保存数据');
 
     FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
@@ -564,6 +571,8 @@ var
 begin
   SaveLastestPhaseMainData;
   FProjectGLData.Save;
+  FOtherMeasurePhaseData.Save;
+
   iOrgPhaseIndex := FPhaseIndex;
   FPhaseIndex := Value;
   ProjProperties.PhaseIndex := FPhaseIndex;
@@ -574,6 +583,8 @@ begin
   FProjectGLData.LoadCurPhaseInfoPrice;
   FProjectGLData.LoadStagePM_CalcData;
   FProjectGLData.RefreshGatherData;
+  // 须保存其他台账--分期计量数据
+  FOtherMeasurePhaseData.LoadCurStageData;
   //BillsGatherData.RefreshBills;
 end;
 
@@ -669,6 +680,17 @@ procedure TProjectData.UpdatePhaseData;
     ExecuteSql(sSql);
   end;
 
+  procedure UpdateOMPhaseDetailData;
+  const
+    sUpdateSql = 'Insert Into OMPhaseDetail (ID, PhaseID, StageID,' +
+                 '    PreTotalPrice, CurTotalPrice, EndTotalPrice)' +
+                 '  Select ID, %d, %d, PreTotalPrice, CurTotalPrice, EndTotalPrice' +
+                 '  From OMPhaseDetail Where (PhaseID = %d) and (StageID = -1)';
+  begin
+    if (ProjProperties.PhaseCount > 0) and (ProjProperties.AuditStatus > 0) then
+      ExecuteSql(Format(sUpdateSql, [FPhaseIndex, FProjProperties.AuditStatus, FPhaseIndex]));
+  end;
+
 var
   iPhase: Integer;
 begin
@@ -679,6 +701,7 @@ begin
     PhaseData.CreateNewAuditData;
     StaffData.UpdateDataForNewAudit;
     UpdateGLPriceData;
+    UpdateOMPhaseDetailData;
   end;
 end;
 
@@ -1887,12 +1910,25 @@ procedure TProjectData.CopyPreData;
       ExecuteSql(Format(sCopySql, [FProjProperties.PhaseCount, FProjProperties.PhaseCount - 1]));
   end;
 
+  procedure CopyPreOMPhaseDetail;
+  const
+    sCopySql = 'Insert Into OMPhaseDetail (ID, PhaseID, StageID,' +
+               '    PreTotalPrice, CurTotalPrice, EndTotalPrice)' +
+               '  Select ID, %d, 0, PreTotalPrice + CurTotalPrice, 0, PreTotalPrice + CurTotalPrice' +
+               '  From OMPhaseDetail Where (PhaseID = %d) and (StageID = -1)';
+  begin
+    if FProjProperties.PhaseCount > 1 then
+      ExecuteSql(Format(sCopySql, [FProjProperties.PhaseCount, FProjProperties.PhaseCount - 1]));
+  end;
+
 begin
   CopyPreGLPrice;
+  CopyPreOMPhaseDetail;
   PhaseData.CopyPreData;
   ProjectGLData.LoadCurPhaseInfoPrice;
   ProjectGLData.LoadStagePM_CalcData;
   FProjectGLData.RefreshGatherData;
+  FOtherMeasurePhaseData.LoadCurStageData;
   BillsMeasureData.ResetTreeNodeStageRec;
 end;
 
@@ -1904,8 +1940,10 @@ end;
 procedure TProjectData.SetStageIndex(const Value: Integer);
 begin
   FProjectGLData.Save;
+  FOtherMeasurePhaseData.Save;
   FPhaseData.StageIndex := Value;
   FProjectGLData.LoadStagePM_CalcData;
+  FOtherMeasurePhaseData.LoadCurStageData;
 end;
 
 procedure TProjectData.ClearReportCacheData;

+ 1 - 0
Units/UpdateDataBase.pas

@@ -100,6 +100,7 @@ begin
     Updater.AddTableDef(SDetailGL, @tdDetailGL, Length(tdDetailGL), False, False);
     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.ExcuteUpdate;
   finally
     Updater.Free;

+ 27 - 2
Units/UtilMethods.pas

@@ -4,8 +4,8 @@ interface
 
 uses
   Controls, ZhAPI, ActnList, ZjIDTree, DB, ZjGridDBA, ZjGrid, Windows, Messages,
-  sdDB, VCLZip, VCLUnZip, Dialogs, Forms, ShlObj, Classes, StrUtils, Math;
-  
+  sdDB, VCLZip, VCLUnZip, Dialogs, Forms, ShlObj, Classes, StrUtils, Math, ADODB;
+
 type
   TBookmarkRefreshEvent = procedure (AExpandFrame: Boolean) of object;
 
@@ -21,6 +21,8 @@ type
 
   {DataBase Rela}
   function GetsdDataSetNewID(ADataSet: TsdDataSet; const AIndex: string): Integer;
+  procedure ExecuteSql(AConnection: TADOConnection; const ASql: string);
+  function QueryData(AConnection: TADOConnection; const ASql: string): TADOQuery;
 
   {Message}
   procedure WarningMessage(const AMsg: string; AHandle: THandle = 0);
@@ -181,6 +183,29 @@ begin
     Result := 1;
 end;
 
+procedure ExecuteSql(AConnection: TADOConnection; const ASql: string);
+var
+  vQuery: TADOQuery;
+begin
+  vQuery := TADOQuery.Create(nil);
+  try
+    vQuery.Connection := AConnection;
+    vQuery.SQL.Add(ASql);
+    vQuery.ExecSQL;
+  finally
+    vQuery.Free;
+  end;
+end;
+
+function QueryData(AConnection: TADOConnection; const ASql: string): TADOQuery;
+begin
+  Result := TADOQuery.Create(nil);
+  Result.Connection := AConnection;
+  Result.SQL.Clear;
+  Result.SQL.Add(ASql);
+  Result.Open;
+end;
+
 {Message}
 
 function GetValidHandle(AHandle: THandle = 0): THandle;