ProjectGLDm.pas 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. unit ProjectGLDm;
  2. interface
  3. uses
  4. SysUtils, Classes, sdDB, sdProvider, ADODB;
  5. type
  6. TProjectGLData = class(TDataModule)
  7. sdpProjectGL: TsdADOProvider;
  8. sddProjectGL: TsdDataSet;
  9. sdvProjectGL: TsdDataView;
  10. procedure sddProjectGLAfterAddRecord(ARecord: TsdDataRecord);
  11. procedure sddProjectGLBeforeValueChange(AValue: TsdValue;
  12. const NewValue: Variant; var Allow: Boolean);
  13. private
  14. FProjectData: TObject;
  15. function CheckSameCode(ACode: Integer): Boolean;
  16. procedure SaveGLPrice;
  17. public
  18. constructor Create(AProjectData: TObject);
  19. destructor Destroy; override;
  20. procedure Open(AConnection: TADOConnection);
  21. procedure Save;
  22. procedure LoadCurPhaseInfoPrice;
  23. property ProjectData: TObject read FProjectData write FProjectData;
  24. end;
  25. implementation
  26. uses
  27. ProjectData, UtilMethods, DB, Variants;
  28. {$R *.dfm}
  29. { TProjectGLData }
  30. function TProjectGLData.CheckSameCode(ACode: Integer): Boolean;
  31. var
  32. Rec: TsdDataRecord;
  33. begin
  34. Rec := sddProjectGL.FindKey('idxCode', ACode);
  35. Result := Assigned(Rec);
  36. end;
  37. constructor TProjectGLData.Create(AProjectData: TObject);
  38. begin
  39. inherited Create(nil);
  40. FProjectData := AProjectData;
  41. end;
  42. destructor TProjectGLData.Destroy;
  43. begin
  44. inherited;
  45. end;
  46. procedure TProjectGLData.LoadCurPhaseInfoPrice;
  47. const
  48. sSelectSql = 'Select * From GLPrice Where PhaseID = %d';
  49. var
  50. sSql: string;
  51. vQuery: TADOQuery;
  52. procedure LoadInfoPrice;
  53. var
  54. Rec: TsdDataRecord;
  55. begin
  56. vQuery.First;
  57. while not vQuery.Eof do
  58. begin
  59. Rec := sddProjectGL.FindKey('idxID', vQuery.FieldByName('GLID').AsInteger);
  60. Rec.ValueByName('InfoPrice').AsFloat := vQuery.FieldByName('InfoPrice').AsFloat;
  61. Rec.ValueByName('InfoDate').AsString := vQuery.FieldByName('InfoDate').AsVariant;
  62. vQuery.Next;
  63. end;
  64. end;
  65. begin
  66. sddProjectGL.BeginUpdate;
  67. vQuery := TADOQuery.Create(nil);
  68. try
  69. vQuery.Connection := sdpProjectGL.Connection;
  70. sSql := Format(sSql, [TProjectData(FProjectData).PhaseIndex]);
  71. vQuery.SQL.Clear;
  72. vQuery.SQL.Add(sSql);
  73. vQuery.ExecSQL;
  74. LoadInfoPrice;
  75. finally
  76. vQuery.Free;
  77. sddProjectGL.EndUpdate;
  78. end;
  79. end;
  80. procedure TProjectGLData.Open(AConnection: TADOConnection);
  81. begin
  82. sdpProjectGL.Connection := AConnection;
  83. sddProjectGL.Open;
  84. if not Assigned(sddProjectGL.IndexList.FindByName('idxID')) then
  85. sddProjectGL.AddIndex('idxID', 'ID');
  86. if not Assigned(sddProjectGL.IndexList.FindByName('idxCode')) then
  87. sddProjectGL.AddIndex('idxCode', 'Code');
  88. sdvProjectGL.Open;
  89. sdvProjectGL.IndexName := 'idxCode';
  90. end;
  91. procedure TProjectGLData.Save;
  92. begin
  93. sddProjectGL.Save;
  94. with TProjectData(FProjectData) do
  95. if Assigned(PhaseData) and not PhaseData.StageDataReadOnly and (PhaseData.StageCount > 1) then
  96. SaveGLPrice;
  97. end;
  98. procedure TProjectGLData.SaveGLPrice;
  99. const
  100. sDeleteSql = 'Delete From GLPrice Where PhaseID = %d';
  101. const
  102. sInsertSql = 'Insert Into GLPrice'+
  103. ' Select ID As GLID, %d As PhaseID, InfoPrice, InfoDate' +
  104. ' From ProjectGL';
  105. var
  106. vQuery: TADOQuery;
  107. iPhaseID: Integer;
  108. sSql: String;
  109. begin
  110. iPhaseID := TProjectData(FProjectData).ProjProperties.PhaseCount;
  111. vQuery := TADOQuery.Create(nil);
  112. try
  113. vQuery.Connection := sdpProjectGL.Connection;
  114. sSql := Format(sDeleteSql, [iPhaseID]);
  115. vQuery.SQL.Clear;
  116. vQuery.SQL.Add(sSql);
  117. vQuery.ExecSQL;
  118. sSql := Format(sInsertSql, [iPhaseID]);
  119. vQuery.SQL.Clear;
  120. vQuery.SQL.Add(sSql);
  121. vQuery.ExecSQL;
  122. finally
  123. vQuery.Free;
  124. end;
  125. end;
  126. procedure TProjectGLData.sddProjectGLAfterAddRecord(
  127. ARecord: TsdDataRecord);
  128. begin
  129. ARecord.ValueByName('ID').AsInteger := GetsdDataSetNewID(sddProjectGL, 'idxID');
  130. ARecord.ValueByName('CreatePhaseID').AsInteger := TProjectData(FProjectData).ProjProperties.PhaseCount;
  131. ARecord.ValueByName('CreateStageID').AsInteger := TProjectData(FProjectData).ProjProperties.AuditStatus;
  132. end;
  133. procedure TProjectGLData.sddProjectGLBeforeValueChange(AValue: TsdValue;
  134. const NewValue: Variant; var Allow: Boolean);
  135. begin
  136. if SameText(AValue.FieldName, 'Code') then
  137. begin
  138. Allow := False;
  139. if VarIsNull(NewValue) then
  140. ErrorMessage('编号不可为空。')
  141. else if CheckSameCode(NewValue) then
  142. ErrorMessage('编号不可重复。')
  143. else
  144. Allow := True;
  145. end
  146. else if not(SameText(AValue.FieldName, 'ID') or
  147. SameText(AValue.FieldName, 'CreatePhaseID') or
  148. SameText(AValue.FieldName, 'CreateStageID')) then
  149. begin
  150. Allow := False;
  151. if (AValue.Owner.ValueByName('Code').AsString = '') then
  152. ErrorMessage('编号不可为空,请先填写编号,再填写其他信息。')
  153. else
  154. Allow := True;
  155. end;
  156. end;
  157. end.