OtherMeasureOnceDm.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. unit OtherMeasureOnceDm;
  2. interface
  3. uses
  4. CalcDecimal,
  5. SysUtils, Classes, sdDB, sdProvider, ADODB;
  6. type
  7. TOtherMeasureOnceData = class(TDataModule)
  8. sdpOnce: TsdADOProvider;
  9. sddOnce: TsdDataSet;
  10. sdvOnce: TsdDataView;
  11. procedure sddOnceAfterAddRecord(ARecord: TsdDataRecord);
  12. procedure sdvOnceSetText(var Text: String; ARecord: TsdDataRecord;
  13. AValue: TsdValue; AColumn: TsdViewColumn; var Allow: Boolean);
  14. procedure sdvOnceGetText(var Text: String; ARecord: TsdDataRecord;
  15. AValue: TsdValue; AColumn: TsdViewColumn; DisplayText: Boolean);
  16. procedure sddOnceBeforeDeleteRecord(ARecord: TsdDataRecord;
  17. var Allow: Boolean);
  18. private
  19. FProjectData: TObject;
  20. function GetNewID: Integer;
  21. function GetNewSerialNo: Integer;
  22. function GetDecimal: TCalcDecimal;
  23. public
  24. constructor Create(AProjectData: TObject);
  25. destructor Destroy; override;
  26. procedure Open(AConnection: TADOConnection);
  27. procedure Close;
  28. procedure Save;
  29. property Decimal: TCalcDecimal read GetDecimal;
  30. end;
  31. implementation
  32. uses
  33. ProjectData, UtilMethods, Variants, DB;
  34. {$R *.dfm}
  35. { TOtherMeasureOnceData }
  36. procedure TOtherMeasureOnceData.Close;
  37. begin
  38. sddOnce.Close;
  39. end;
  40. constructor TOtherMeasureOnceData.Create(AProjectData: TObject);
  41. begin
  42. inherited Create(nil);
  43. FProjectData := AProjectData;
  44. end;
  45. destructor TOtherMeasureOnceData.Destroy;
  46. begin
  47. inherited;
  48. end;
  49. function TOtherMeasureOnceData.GetNewID: Integer;
  50. var
  51. idx: TsdIndex;
  52. begin
  53. idx := sddOnce.FindIndex('idxID');
  54. if idx.RecordCount > 0 then
  55. Result := idx.Records[idx.RecordCount - 1].ValueByName('ID').AsInteger + 1
  56. else
  57. Result := 1;
  58. end;
  59. function TOtherMeasureOnceData.GetNewSerialNo: Integer;
  60. var
  61. idx: TsdIndex;
  62. begin
  63. idx := sddOnce.FindIndex('idxSerial');
  64. if idx.RecordCount > 0 then
  65. Result := idx.Records[idx.RecordCount - 1].ValueByName('SerialNo').AsInteger + 1
  66. else
  67. Result := 1;
  68. end;
  69. procedure TOtherMeasureOnceData.Open(AConnection: TADOConnection);
  70. begin
  71. sdpOnce.Connection := AConnection;
  72. sddOnce.Open;
  73. if not Assigned(sddOnce.FindIndex('idxID')) then
  74. sddOnce.AddIndex('idxID', 'ID');
  75. if not Assigned(sddOnce.FindIndex('idxSerial')) then
  76. sddOnce.AddIndex('idxSerial', 'SerialNo');
  77. sdvOnce.Open;
  78. sdvOnce.IndexName := 'idxSerial';
  79. end;
  80. procedure TOtherMeasureOnceData.Save;
  81. begin
  82. sddOnce.Save;
  83. end;
  84. procedure TOtherMeasureOnceData.sddOnceAfterAddRecord(
  85. ARecord: TsdDataRecord);
  86. begin
  87. ARecord.ValueByName('ID').AsInteger := GetNewID;
  88. ARecord.ValueByName('SerialNo').AsInteger := GetNewSerialNo;
  89. ARecord.ValueByName('CreatePhaseID').AsInteger := TProjectData(FProjectData).PhaseIndex;
  90. ARecord.ValueByName('CreateStageID').AsInteger := TProjectData(FProjectData).StageIndex;
  91. end;
  92. procedure TOtherMeasureOnceData.sdvOnceSetText(var Text: String;
  93. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  94. var Allow: Boolean);
  95. begin
  96. if SameText(AColumn.FieldName, 'Code') then
  97. begin
  98. if (Text = '') then
  99. begin
  100. if (ARecord.ValueByName('Name').AsString = '') then
  101. DataSetErrorMessage(Allow, '编号和名称不可同时为空。');
  102. if (ARecord.ValueByName('Code').AsString = '') and (ARecord.ValueByName('Name').AsString = '') then
  103. sddOnce.Remove(ARecord);
  104. end;
  105. end
  106. else if SameText(AColumn.FieldName, 'Name') then
  107. begin
  108. if (Text = '') then
  109. begin
  110. if (ARecord.ValueByName('Code').AsString = '') then
  111. DataSetErrorMessage(Allow, '编号和名称不可同时为空。');
  112. if(ARecord.ValueByName('Code').AsString = '') and (ARecord.ValueByName('Name').AsString = '') then
  113. sddOnce.Remove(ARecord);
  114. end;
  115. end
  116. else
  117. begin
  118. if (ARecord.ValueByName('Code').AsString = '') and (ARecord.ValueByName('Name').AsString = '') then
  119. begin
  120. DataSetErrorMessage(Allow, '编号、名称不可同时为空,请先填写编号或名称,再填写其他信息。');
  121. sddOnce.Remove(AValue.Owner);
  122. end
  123. else if Pos('TotalPrice', AColumn.FieldName) > 0 then
  124. Text := FloatToStr(Decimal.TotalPrice.RoundTo(StrToFloatDef(Text, 0)));
  125. end;
  126. end;
  127. procedure TOtherMeasureOnceData.sdvOnceGetText(var Text: String;
  128. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  129. DisplayText: Boolean);
  130. procedure GetDisplayText;
  131. begin
  132. if AValue.DataType = ftFloat then
  133. if AValue.AsFloat = 0 then
  134. Text := '';
  135. end;
  136. begin
  137. if DisplayText then
  138. GetDisplayText;
  139. end;
  140. function TOtherMeasureOnceData.GetDecimal: TCalcDecimal;
  141. begin
  142. Result := TProjectData(FProjectData).ProjProperties.DecimalManager.Common;
  143. end;
  144. procedure TOtherMeasureOnceData.sddOnceBeforeDeleteRecord(
  145. ARecord: TsdDataRecord; var Allow: Boolean);
  146. begin
  147. if (ARecord.ValueByName('TotalPrice').AsFloat <> 0) and
  148. (ARecord.ValueByName('CreatePhaseID').AsInteger < TProjectData(FProjectData).ProjProperties.PhaseCount) then
  149. DataSetErrorMessage(Allow, '往期已计量,不允许删除');
  150. end;
  151. end.