CalcDecimal.pas 10.0 KB

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