OtherMeasureOnceDm.pas 4.4 KB

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