unit ProjectGLDm; interface uses SysUtils, Classes, sdDB, sdProvider, ADODB; type TProjectGLData = class(TDataModule) sdpProjectGL: TsdADOProvider; sddProjectGL: TsdDataSet; sdvProjectGL: TsdDataView; procedure sddProjectGLAfterAddRecord(ARecord: TsdDataRecord); procedure sddProjectGLBeforeValueChange(AValue: TsdValue; const NewValue: Variant; var Allow: Boolean); private FProjectData: TObject; function CheckSameCode(ACode: Integer): Boolean; procedure SaveGLPrice; public constructor Create(AProjectData: TObject); destructor Destroy; override; procedure Open(AConnection: TADOConnection); procedure Save; procedure LoadCurPhaseInfoPrice; property ProjectData: TObject read FProjectData write FProjectData; end; implementation uses ProjectData, UtilMethods, DB, Variants; {$R *.dfm} { TProjectGLData } function TProjectGLData.CheckSameCode(ACode: Integer): Boolean; var Rec: TsdDataRecord; begin Rec := sddProjectGL.FindKey('idxCode', ACode); Result := Assigned(Rec); end; constructor TProjectGLData.Create(AProjectData: TObject); begin inherited Create(nil); FProjectData := AProjectData; end; destructor TProjectGLData.Destroy; begin inherited; end; procedure TProjectGLData.LoadCurPhaseInfoPrice; const sSelectSql = 'Select * From GLPrice Where PhaseID = %d'; var sSql: string; vQuery: TADOQuery; procedure LoadInfoPrice; var Rec: TsdDataRecord; begin vQuery.First; while not vQuery.Eof do begin Rec := sddProjectGL.FindKey('idxID', vQuery.FieldByName('GLID').AsInteger); Rec.ValueByName('InfoPrice').AsFloat := vQuery.FieldByName('InfoPrice').AsFloat; Rec.ValueByName('InfoDate').AsString := vQuery.FieldByName('InfoDate').AsVariant; vQuery.Next; end; end; begin sddProjectGL.BeginUpdate; vQuery := TADOQuery.Create(nil); try vQuery.Connection := sdpProjectGL.Connection; sSql := Format(sSql, [TProjectData(FProjectData).PhaseIndex]); vQuery.SQL.Clear; vQuery.SQL.Add(sSql); vQuery.ExecSQL; LoadInfoPrice; finally vQuery.Free; sddProjectGL.EndUpdate; end; end; procedure TProjectGLData.Open(AConnection: TADOConnection); begin sdpProjectGL.Connection := AConnection; sddProjectGL.Open; if not Assigned(sddProjectGL.IndexList.FindByName('idxID')) then sddProjectGL.AddIndex('idxID', 'ID'); if not Assigned(sddProjectGL.IndexList.FindByName('idxCode')) then sddProjectGL.AddIndex('idxCode', 'Code'); sdvProjectGL.Open; sdvProjectGL.IndexName := 'idxCode'; end; procedure TProjectGLData.Save; begin sddProjectGL.Save; with TProjectData(FProjectData) do if Assigned(PhaseData) and not PhaseData.StageDataReadOnly and (PhaseData.StageCount > 1) then SaveGLPrice; end; procedure TProjectGLData.SaveGLPrice; const sDeleteSql = 'Delete From GLPrice Where PhaseID = %d'; const sInsertSql = 'Insert Into GLPrice'+ ' Select ID As GLID, %d As PhaseID, InfoPrice, InfoDate' + ' From ProjectGL'; var vQuery: TADOQuery; iPhaseID: Integer; sSql: String; begin iPhaseID := TProjectData(FProjectData).ProjProperties.PhaseCount; vQuery := TADOQuery.Create(nil); try vQuery.Connection := sdpProjectGL.Connection; sSql := Format(sDeleteSql, [iPhaseID]); vQuery.SQL.Clear; vQuery.SQL.Add(sSql); vQuery.ExecSQL; sSql := Format(sInsertSql, [iPhaseID]); vQuery.SQL.Clear; vQuery.SQL.Add(sSql); vQuery.ExecSQL; finally vQuery.Free; end; end; procedure TProjectGLData.sddProjectGLAfterAddRecord( ARecord: TsdDataRecord); begin ARecord.ValueByName('ID').AsInteger := GetsdDataSetNewID(sddProjectGL, 'idxID'); ARecord.ValueByName('CreatePhaseID').AsInteger := TProjectData(FProjectData).ProjProperties.PhaseCount; ARecord.ValueByName('CreateStageID').AsInteger := TProjectData(FProjectData).ProjProperties.AuditStatus; end; procedure TProjectGLData.sddProjectGLBeforeValueChange(AValue: TsdValue; const NewValue: Variant; var Allow: Boolean); begin if SameText(AValue.FieldName, 'Code') then begin Allow := False; if VarIsNull(NewValue) then ErrorMessage('编号不可为空。') else if CheckSameCode(NewValue) then ErrorMessage('编号不可重复。') else Allow := True; end else if not(SameText(AValue.FieldName, 'ID') or SameText(AValue.FieldName, 'CreatePhaseID') or SameText(AValue.FieldName, 'CreateStageID')) then begin Allow := False; if (AValue.Owner.ValueByName('Code').AsString = '') then ErrorMessage('编号不可为空,请先填写编号,再填写其他信息。') else Allow := True; end; end; end.