| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 | unit OtherMeasurePhaseDm;interfaceuses  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;implementationuses  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.
 |