CalcDecimal.pas 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. unit CalcDecimal;
  2. interface
  3. uses
  4. Classes, sdDB;
  5. type
  6. TDecimal = class
  7. private
  8. FDigit: Integer;
  9. FFormat: string;
  10. FLinkViewCols: TList;
  11. procedure SetDigit(const Value: Integer);
  12. function GetDisplayFormat(ADigit: Integer): string;
  13. public
  14. constructor Create;
  15. destructor Destroy; override;
  16. function RoundTo(AValue: Double): Double;
  17. function StrRoundTo(const AValue: string): string;
  18. procedure ClearLinkViewCols;
  19. procedure AddLinkViewCol(ACol: TObject);
  20. procedure RefreshLinkViewColsFormat;
  21. property Digit: Integer read FDigit write SetDigit;
  22. property Format: string read FFormat;
  23. end;
  24. TCalcDecimal = class
  25. private
  26. FQuantity: TDecimal;
  27. FTotalPrice: TDecimal;
  28. FPrice: TDecimal;
  29. public
  30. constructor Create;
  31. destructor Destroy; override;
  32. procedure RefreshLinkViewColumnsFormat;
  33. property Quantity: TDecimal read FQuantity;
  34. property TotalPrice: TDecimal read FTotalPrice;
  35. property Price: TDecimal read FPrice;
  36. end;
  37. TDecimalManager = class
  38. private
  39. FProjectData: TObject;
  40. FCommon: TCalcDecimal;
  41. FCompile:TCalcDecimal;
  42. FPriceMargin: TCalcDecimal;
  43. public
  44. constructor Create(AProjectData: TObject);
  45. destructor Destroy; override;
  46. procedure ResetLinkViewColumns;
  47. property Common: TCalcDecimal read FCommon;
  48. property Compile: TCalcDecimal read FCompile;
  49. property PriceMargin: TCalcDecimal read FPriceMargin;
  50. end;
  51. implementation
  52. uses
  53. ProjectData, ScUtils, SysUtils;
  54. { TDecimal }
  55. procedure TDecimal.AddLinkViewCol(ACol: TObject);
  56. begin
  57. FLinkViewCols.Add(ACol);
  58. end;
  59. procedure TDecimal.ClearLinkViewCols;
  60. begin
  61. FLinkViewCols.Clear;
  62. end;
  63. constructor TDecimal.Create;
  64. begin
  65. FLinkViewCols := TList.Create;
  66. FDigit := -1;
  67. end;
  68. destructor TDecimal.Destroy;
  69. begin
  70. FLinkViewCols.Free;
  71. inherited;
  72. end;
  73. function TDecimal.GetDisplayFormat(ADigit: Integer): string;
  74. begin
  75. case ADigit of
  76. 0: Result := '0';
  77. 1: Result := '0.#';
  78. 2: Result := '0.##';
  79. 3: Result := '0.###';
  80. 4: Result := '0.####';
  81. 5: Result := '0.#####';
  82. 6: Result := '0.######';
  83. 7: Result := '0.#######';
  84. 8: Result := '0.########';
  85. 9: Result := '0.#########';
  86. else
  87. Result := '0.##########';
  88. end;
  89. end;
  90. procedure TDecimal.RefreshLinkViewColsFormat;
  91. var
  92. i: Integer;
  93. ViewCol: TsdViewColumn;
  94. begin
  95. for i := 0 to FLinkViewCols.Count - 1 do
  96. begin
  97. ViewCol := TsdViewColumn(FLinkViewCols.Items[i]);
  98. if not Assigned(ViewCol) then Continue;
  99. ViewCol.DisplayFormat := FFormat;
  100. ViewCol.EditFormat := FFormat;
  101. end;
  102. end;
  103. function TDecimal.RoundTo(AValue: Double): Double;
  104. begin
  105. Result := ScRoundTo(AValue, -Digit);
  106. end;
  107. procedure TDecimal.SetDigit(const Value: Integer);
  108. begin
  109. if FDigit <> Value then
  110. begin
  111. FDigit := Value;
  112. FFormat := GetDisplayFormat(FDigit);
  113. RefreshLinkViewColsFormat;
  114. end;
  115. end;
  116. function TDecimal.StrRoundTo(const AValue: string): string;
  117. begin
  118. Result := FloatToStr(RoundTo(StrToFloatDef(AValue, 0)));
  119. end;
  120. { TCalcDecimal }
  121. constructor TCalcDecimal.Create;
  122. begin
  123. FQuantity := TDecimal.Create;
  124. FTotalPrice := TDecimal.Create;
  125. FPrice := TDecimal.Create;
  126. end;
  127. destructor TCalcDecimal.Destroy;
  128. begin
  129. FPrice.Free;
  130. FTotalPrice.Free;
  131. FQuantity.Free;
  132. inherited;
  133. end;
  134. procedure TCalcDecimal.RefreshLinkViewColumnsFormat;
  135. begin
  136. Quantity.RefreshLinkViewColsFormat;
  137. TotalPrice.RefreshLinkViewColsFormat;
  138. Price.RefreshLinkViewColsFormat;
  139. end;
  140. { TDecimalManager }
  141. constructor TDecimalManager.Create(AProjectData: TObject);
  142. begin
  143. FProjectData := AProjectData;
  144. FCommon := TCalcDecimal.Create;
  145. FCompile := TCalcDecimal.Create;
  146. FPriceMargin := TCalcDecimal.Create;
  147. end;
  148. destructor TDecimalManager.Destroy;
  149. begin
  150. FPriceMargin.Free;
  151. FCompile.Free;
  152. FCommon.Free;
  153. inherited;
  154. end;
  155. procedure TDecimalManager.ResetLinkViewColumns;
  156. procedure ResetCommonLink;
  157. begin
  158. FCommon.Quantity.ClearLinkViewCols;
  159. FCommon.TotalPrice.ClearLinkViewCols;
  160. FCommon.Price.ClearLinkViewCols;
  161. with TProjectData(FProjectData).BillsCompileData.sdvBillsCompile do
  162. begin
  163. // Quantity
  164. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('OrgQuantity'));
  165. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('MisQuantity'));
  166. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('OthQuantity'));
  167. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('Quantity'));
  168. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('DgnQuantity1'));
  169. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('DgnQuantity2'));
  170. // TotalPrice
  171. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('OrgTotalPrice'));
  172. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('MisTotalPrice'));
  173. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('OthTotalPrice'));
  174. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('TotalPrice'));
  175. // Price
  176. FCommon.Price.AddLinkViewCol(Columns.FindColumn('Price'));
  177. FCommon.Price.AddLinkViewCol(Columns.FindColumn('NewPrice'));
  178. end;
  179. with TProjectData(FProjectData).BillsMeasureData.sdvBillsMeasure do
  180. begin
  181. // Quantity
  182. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('Quantity'));
  183. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('CurDealQuantity'));
  184. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('CurQcQuantity'));
  185. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('CurPcQuantity'));
  186. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('CurGatherQuantity'));
  187. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('EndDealQuantity'));
  188. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('EndQcQuantity'));
  189. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('EndPcQuantity'));
  190. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('EndGahterQuantity'));
  191. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('AddDealQuantity'));
  192. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('AddQcQuantity'));
  193. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('AddPcQuantity'));
  194. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('AddGahterQuantity'));
  195. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('DealDgnQuantity1'));
  196. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('DealDgnQuantity2'));
  197. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('CDgnQuantity1'));
  198. FCommon.Quantity.AddLinkViewCol(Columns.FindColumn('CDgnQuantity2'));
  199. // TotalPrice
  200. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('TotalPrice'));
  201. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('CurDealTotalPrice'));
  202. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('CurQcTotalPrice'));
  203. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('CurPcTotalPrice'));
  204. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('CurGatherTotalPrice'));
  205. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('EndDealTotalPrice'));
  206. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('EndQcTotalPrice'));
  207. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('EndPcTotalPrice'));
  208. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('EndGahterTotalPrice'));
  209. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('AddDealTotalPrice'));
  210. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('AddQcTotalPrice'));
  211. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('AddPcTotalPrice'));
  212. FCommon.TotalPrice.AddLinkViewCol(Columns.FindColumn('AddGahterTotalPrice'));
  213. // Price
  214. FCommon.Price.AddLinkViewCol(Columns.FindColumn('Price'));
  215. FCommon.Price.AddLinkViewCol(Columns.FindColumn('NewPrice'));
  216. end;
  217. end;
  218. procedure ResetComplieLink;
  219. begin
  220. end;
  221. procedure ResetPriceMarginLink;
  222. begin
  223. FPriceMargin.Price.ClearLinkViewCols;
  224. with TProjectData(FProjectData).ProjectGLData.sdvProjectGL do
  225. begin
  226. FPriceMargin.Price.AddLinkViewCol(Columns.FindColumn('BasePrice'));
  227. FPriceMargin.Price.AddLinkViewCol(Columns.FindColumn('InfoPrice'));
  228. FPriceMargin.Price.AddLinkViewCol(Columns.FindColumn('DeltaPrice'));
  229. FPriceMargin.Price.AddLinkViewCol(Columns.FindColumn('ValidDeltaPrice'));
  230. FPriceMargin.Quantity.AddLinkViewCol(Columns.FindColumn('PM_Quantity'));
  231. FPriceMargin.Quantity.AddLinkViewCol(Columns.FindColumn('UsedQuantity'));
  232. FPriceMargin.Quantity.AddLinkViewCol(Columns.FindColumn('PAL_UsedQuantity'));
  233. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PM_TotalPrice'));
  234. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('UsedTotalPrice'));
  235. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PAL_UsedTotalPrice'));
  236. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PAL_UsedTotalPrice'));
  237. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PAL_DeltaPrice'));
  238. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PAL_Total'));
  239. end;
  240. with TProjectData(FProjectData).ProjectGLData.sdvGather do
  241. begin
  242. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('CurTotalPrice'));
  243. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PreTotalPrice'));
  244. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('EndTotalPrice'));
  245. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('AddTotalPrice'));
  246. end;
  247. with TProjectData(FProjectData).PriceMarginBillsData.sdvDetailGclBills do
  248. begin
  249. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PM_TotalPrice'));
  250. end;
  251. with TProjectData(FProjectData).PriceMarginBillsData.sdvDetailGL do
  252. begin
  253. FPriceMargin.Quantity.AddLinkViewCol(Columns.FindColumn('Quantity'));
  254. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PM_PreTotalPrice'));
  255. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PM_CurTotalPrice'));
  256. FPriceMargin.TotalPrice.AddLinkViewCol(Columns.FindColumn('PM_EndTotalPrice'));
  257. end;
  258. end;
  259. begin
  260. {ResetCommonLink;
  261. FCommon.RefreshLinkViewColumnsFormat;
  262. ResetComplieLink;
  263. FCompile.RefreshLinkViewColumnsFormat;}
  264. ResetPriceMarginLink;
  265. FPriceMargin.RefreshLinkViewColumnsFormat;
  266. end;
  267. end.