BillsMeasureDm.pas 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. unit BillsMeasureDm;
  2. interface
  3. uses
  4. BillsDm, BillsTree, FormulaCalc, sdIDTree, StageDm,
  5. SysUtils, Classes, sdDB, DB;
  6. type
  7. TBillsMeasureData = class(TDataModule)
  8. sdvBillsMeasure: TsdDataView;
  9. procedure sdvBillsMeasureAfterOpen(Sender: TObject);
  10. procedure sdvBillsMeasureAfterAddRecord(ARecord: TsdDataRecord);
  11. procedure sdvBillsMeasureGetText(var Text: String;
  12. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  13. DisplayText: Boolean);
  14. procedure sdvBillsMeasureSetText(var Text: String;
  15. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  16. var Allow: Boolean);
  17. procedure sdvBillsMeasureNeedLookupRecord(ARecord: TsdDataRecord;
  18. AColumn: TsdViewColumn; ANewText: String);
  19. procedure sdvBillsMeasureAfterClose(Sender: TObject);
  20. procedure sdvBillsMeasureAfterValueChanged(AValue: TsdValue);
  21. procedure sdvBillsMeasureCurrentChanged(ARecord: TsdDataRecord);
  22. private
  23. FProjectData: TObject;
  24. FBillsData: TBillsData;
  25. FBillsMeasureTree: TMeasureBillsIDTree;
  26. FFormulaCalc: TFormulaCalc;
  27. FShowParentData: Boolean;
  28. FOnRecChange: TRecChangeEvent;
  29. function OnGetCardinalNum(const ACardinalNum: string): Double;
  30. procedure CalcAddCompleteRate(ANode: TsdIDTreeNode);
  31. procedure CalcAddDgnPrice(ANode: TsdIDTreeNode);
  32. function SelectAndUpdateBGL(ABillsID: Integer; ARec: TsdDataRecord;
  33. ANewValue: Double; const AType: string): Boolean;
  34. procedure CalculateNode(ANode: TMeasureBillsIDTreeNode);
  35. procedure UpdateRecordGather(ANode: TsdIDTreeNode; AQuantity, ATotalPrice: Double);
  36. function GetStageData: TStageData;
  37. procedure SetOnRecChange(const Value: TRecChangeEvent);
  38. public
  39. constructor Create(AProjectData: TObject);
  40. destructor Destroy; override;
  41. procedure Open;
  42. procedure Close;
  43. procedure ReConnectTree;
  44. procedure CalculateAll;
  45. procedure ResetPhaseStageLink;
  46. procedure ResetTreeNodeStageRec;
  47. procedure FreeTreeNodeStageRec;
  48. procedure ExpandNodeTo(ALevel: Integer);
  49. procedure ExpandXmjNode;
  50. procedure ExpandCurPhase;
  51. function GatherRelaBGL(ANode: TsdIDTreeNode): string;
  52. // 计算 修改各期原报审核数据时,需对累计数据做增量
  53. procedure UpdateRecordDeal(ABillsID: Integer; AQuantity, ATotalPrice: Double);
  54. procedure UpdateRecordQc(ABillsID: Integer; AQuantity, ATotalPrice: Double);
  55. procedure UpdateRecordPc(ABillsID: Integer; AQuantity, ATotalPrice: Double);
  56. procedure UpdateRecordPM(ABillsID: Integer; ADiffer: Double);
  57. procedure UpdateGather(ABillsID: Integer; ADiffer: Double);
  58. procedure UpdateBGLInfo(ABillsID: Integer; ARec: TsdDataRecord; const AType: string);
  59. property ProjectData: TObject read FProjectData;
  60. property BillsData: TBillsData read FBillsData;
  61. property BillsMeasureTree: TMeasureBillsIDTree read FBillsMeasureTree;
  62. property StageData: TStageData read GetStageData;
  63. property ShowParentData: Boolean read FShowParentData write FShowParentData;
  64. property OnRecChange: TRecChangeEvent read FOnRecChange write SetOnRecChange;
  65. end;
  66. implementation
  67. uses
  68. ProjectData, PhaseData, Math, ZhAPI, BillsCommand, BGLSelectFrm,
  69. BGLDm, UtilMethods, mDataRecord, ConstUnit, Variants;
  70. {$R *.dfm}
  71. { TBillsMeasureData }
  72. constructor TBillsMeasureData.Create(AProjectData: TObject);
  73. begin
  74. inherited Create(nil);
  75. FProjectData := AProjectData;
  76. FBillsData := TProjectData(FProjectData).BillsData;
  77. FBillsMeasureTree := TMeasureBillsIDTree.Create;
  78. FBillsMeasureTree.KeyFieldName := 'ID';
  79. FBillsMeasureTree.ParentFieldName := 'ParentID';
  80. FBillsMeasureTree.NextSiblingFieldName := 'NextSiblingID';
  81. FBillsMeasureTree.AutoCreateKeyID := True;
  82. FBillsMeasureTree.AutoExpand := True;
  83. FBillsMeasureTree.DataView := sdvBillsMeasure;
  84. FBillsMeasureTree.SeedID := Max(FBillsMeasureTree.SeedID, 100);
  85. FBillsMeasureTree.Link(TProjectData(FProjectData).BillsCompileData.BillsCompileTree, True);
  86. FBillsMeasureTree.CompileTree := TProjectData(FProjectData).BillsCompileData.BillsCompileTree;
  87. FFormulaCalc := TFormulaCalc.Create(FBillsMeasureTree);
  88. FFormulaCalc.OnGetValue := OnGetCardinalNum;
  89. end;
  90. destructor TBillsMeasureData.Destroy;
  91. begin
  92. FFormulaCalc.Free;
  93. FBillsMeasureTree.Free;
  94. inherited;
  95. end;
  96. procedure TBillsMeasureData.Open;
  97. begin
  98. sdvBillsMeasure.DataSet := TProjectData(FProjectData).BillsData.sddBills;
  99. sdvBillsMeasure.Open;
  100. end;
  101. procedure TBillsMeasureData.ReConnectTree;
  102. begin
  103. FBillsMeasureTree.DataView := nil;
  104. FBillsMeasureTree.DataView := sdvBillsMeasure;
  105. FBillsMeasureTree.Link(TProjectData(FProjectData).BillsCompileData.BillsCompileTree, True);
  106. end;
  107. procedure TBillsMeasureData.ResetPhaseStageLink;
  108. begin
  109. with TProjectData(FProjectData).PhaseData do
  110. begin
  111. sdvBillsMeasure.Columns.FindColumn('CurDealQuantity').LookupDataSet := StageData.sddStage;
  112. sdvBillsMeasure.Columns.FindColumn('CurDealTotalPrice').LookupDataSet := StageData.sddStage;
  113. sdvBillsMeasure.Columns.FindColumn('CurQcQuantity').LookupDataSet := StageData.sddStage;
  114. sdvBillsMeasure.Columns.FindColumn('CurQcTotalPrice').LookupDataSet := StageData.sddStage;
  115. sdvBillsMeasure.Columns.FindColumn('CurQcBGLCode').LookupDataSet := StageData.sddStage;
  116. sdvBillsMeasure.Columns.FindColumn('CurPcQuantity').LookupDataSet := StageData.sddStage;
  117. sdvBillsMeasure.Columns.FindColumn('CurPcTotalPrice').LookupDataSet := StageData.sddStage;
  118. sdvBillsMeasure.Columns.FindColumn('CurPcBGLCode').LookupDataSet := StageData.sddStage;
  119. sdvBillsMeasure.Columns.FindColumn('CurGatherQuantity').LookupDataSet := StageData.sddStage;
  120. sdvBillsMeasure.Columns.FindColumn('CurGatherTotalPrice').LookupDataSet := StageData.sddStage;
  121. sdvBillsMeasure.Columns.FindColumn('EndDealQuantity').LookupDataSet := StageData.sddStage;
  122. sdvBillsMeasure.Columns.FindColumn('EndDealTotalPrice').LookupDataSet := StageData.sddStage;
  123. sdvBillsMeasure.Columns.FindColumn('EndQcQuantity').LookupDataSet := StageData.sddStage;
  124. sdvBillsMeasure.Columns.FindColumn('EndQcTotalPrice').LookupDataSet := StageData.sddStage;
  125. sdvBillsMeasure.Columns.FindColumn('EndPcQuantity').LookupDataSet := StageData.sddStage;
  126. sdvBillsMeasure.Columns.FindColumn('EndPcTotalPrice').LookupDataSet := StageData.sddStage;
  127. sdvBillsMeasure.Columns.FindColumn('EndGatherQuantity').LookupDataSet := StageData.sddStage;
  128. sdvBillsMeasure.Columns.FindColumn('EndGatherTotalPrice').LookupDataSet := StageData.sddStage;
  129. sdvBillsMeasure.Columns.FindColumn('PM_PreTotalPrice').LookupDataSet := StageData.sddStage;
  130. sdvBillsMeasure.Columns.FindColumn('PM_TotalPrice').LookupDataSet := StageData.sddStage;
  131. end;
  132. end;
  133. procedure TBillsMeasureData.sdvBillsMeasureAfterOpen(Sender: TObject);
  134. begin
  135. FBillsMeasureTree.Active := True;
  136. end;
  137. procedure TBillsMeasureData.sdvBillsMeasureAfterAddRecord(
  138. ARecord: TsdDataRecord);
  139. begin
  140. if TProjectData(FProjectData).PhaseData.Active then
  141. ARecord.ValueByName('IsMeasureAdd').AsBoolean := True;
  142. end;
  143. procedure TBillsMeasureData.sdvBillsMeasureGetText(var Text: String;
  144. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  145. DisplayText: Boolean);
  146. function GetQuantityValueOrFormula(const AQtyType: string): string;
  147. begin
  148. with AValue.Owner do
  149. begin
  150. if ValueByName(AQtyType + 'Flag').AsInteger = 1 then
  151. Result := ValueByName(AQtyType + 'Formula').AsString
  152. else
  153. Result := Text;
  154. end;
  155. end;
  156. function GetTotalPriceValueOrFormula(const AQtyType: string): string;
  157. begin
  158. with AValue.Owner do
  159. begin
  160. if ValueByName(AQtyType + 'Formula').AsString <> '' then
  161. Result := ValueByName(AQtyType + 'Formula').AsString
  162. else
  163. Result := Text;
  164. end;
  165. end;
  166. procedure GetDisplayText(var AText: string; AValue: TsdValue;
  167. AColumn: TsdViewColumn);
  168. var
  169. stnNode: TsdIDTreeNode;
  170. begin
  171. if Assigned(AValue) and (AValue.DataType = ftFloat) and (AValue.AsFloat = 0) then
  172. begin
  173. Text := '';
  174. Exit;
  175. end;
  176. // 所有本期数据,当节点为父节点时,不显示值(实际上需要计算其中的金额值,但又不能显示)
  177. // 有病。每天都在变。
  178. if not ShowParentData and (Pos('Cur', AColumn.FieldName) > 0) and (Pos('Gather', AColumn.FieldName) = 0) then
  179. begin
  180. stnNode := BillsMeasureTree.FindNode(AValue.Owner.ValueByName('BillsID').AsInteger);
  181. if stnNode.HasChildren then
  182. Text := '';
  183. end;
  184. end;
  185. procedure GetEditText(var AText: string; AValue: TsdValue;
  186. AColumn: TsdViewColumn);
  187. begin
  188. if SameText(AColumn.FieldName, 'Quantity') then
  189. Text := GetQuantityValueOrFormula('Qty')
  190. else if SameText(AColumn.FieldName, 'CurDealQuantity') then
  191. Text := GetQuantityValueOrFormula('Deal')
  192. else if SameText(AColumn.FieldName, 'CurQcQuantity') then
  193. Text := GetQuantityValueOrFormula('Qc')
  194. else if SameText(AColumn.FieldName, 'CurPcQuantity') then
  195. Text := GetQuantityValueOrFormula('Pc')
  196. else if SameText(AColumn.FieldName, 'CurDealTotalPrice') then
  197. Text := GetTotalPriceValueOrFormula('Deal')
  198. else if SameText(AColumn.FieldName, 'CurQcTotalPrice') then
  199. Text := GetTotalPriceValueOrFormula('Qc')
  200. else if SameText(AColumn.FieldName, 'CurPcTotalPrice') then
  201. Text := GetTotalPriceValueOrFormula('Pc');
  202. end;
  203. var
  204. fPercent: Double;
  205. begin
  206. if not Assigned(AValue) then Exit;
  207. if DisplayText then
  208. GetDisplayText(Text, AValue, AColumn)
  209. else
  210. GetEditText(Text, AValue, AColumn);
  211. end;
  212. procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
  213. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  214. var Allow: Boolean);
  215. function GetBillsID: Integer;
  216. begin
  217. if Pos('Cur', AColumn.FieldName) = 1 then
  218. Result := AValue.Owner.ValueByName('BillsID').AsInteger
  219. else
  220. Result := ARecord.ValueByName('ID').AsInteger;
  221. end;
  222. procedure CheckLockedData;
  223. begin
  224. if SameText(AColumn.FieldName, 'Code') or
  225. SameText(AColumn.FieldName, 'B_Code') or
  226. SameText(AColumn.FieldName, 'Name') or
  227. SameText(AColumn.FieldName, 'Units') or
  228. SameText(AColumn.FieldName, 'Price') then
  229. if ARecord.ValueByName('LockedInfo').AsBoolean then
  230. DataSetErrorMessage(Allow, '清单信息已被锁定,不允许修改编号、名称、单位、清单单价!');
  231. if not Allow then Exit;
  232. if SameText(AColumn.FieldName, 'NewPrice') then
  233. if ARecord.ValueByName('LockedNewPrice').AsBoolean then
  234. DataSetErrorMessage(Allow, '变更单价已被锁定,不允许修改!');
  235. end;
  236. procedure CheckNodeWritable(ANode: TBillsIDTreeNode);
  237. var
  238. iCreatePhase: Integer;
  239. begin
  240. iCreatePhase := ANode.Rec.ValueByName('CreatePhaseID').AsInteger;
  241. {if ANode.ID = iPriceMarginID then
  242. DataSetErrorMessage(Allow, sBills_PMHint);}
  243. if SameText('B_Code', AColumn.FieldName) or
  244. SameText('Name', AColumn.FieldName) or
  245. SameText('Units', AColumn.FieldName) then
  246. if ANode.Rec.ValueByName('AddQcQuantity').AsFloat <> 0 then
  247. DataSetErrorMessage(Allow, '该清单已进行过变更,不可修改清单编号、名称、单位!');
  248. if not Allow then Exit;
  249. if SameText('Price', AColumn.FieldName) then
  250. if ANode.Rec.ValueByName('AddGatherTotalPrice').AsFloat <> 0 then
  251. DataSetErrorMessage(Allow, '该清单已经计量,不可修改清单单价!');
  252. if not Allow then Exit;
  253. if SameText('NewPrice', AColumn.FieldName) then
  254. if ANode.Rec.ValueByName('AddPcTotalPrice').AsFloat <> 0 then
  255. DataSetErrorMessage(Allow, '该清单已经计量,不可修改清单变更单价!');
  256. if not Allow then Exit;
  257. if ANode.HasChildren then
  258. begin
  259. if Text = '' then
  260. Exit
  261. else if ((Pos('Quantity', AColumn.FieldName) > 0) and (Pos('Dgn', AColumn.FieldName) <=0)) or
  262. (Pos('TotalPrice', AColumn.FieldName) > 0) then
  263. DataSetErrorMessage(Allow, '该清单有子计算项,不能直接修改!')
  264. else if (Pos('Price', AColumn.FieldName) > 0) then
  265. DataSetErrorMessage(Allow, '仅最底层清单可输入单价!');
  266. end
  267. else
  268. begin
  269. // 目前仅允许本期合同计量,可直接输入金额
  270. if SameText('CurDealTotalPrice', AColumn.FieldName) then
  271. begin
  272. if not ANode.TotalPriceEnable then
  273. DataSetErrorMessage(Allow, '该清单不可直接输入金额,如需直接输入金额,请先清空所有数量、单价!');
  274. end
  275. else if SameText('CurDealQuantity', AColumn.FieldName) or
  276. SameText('CurQcQuantity', AColumn.FieldName) or
  277. SameText('CurPcQuantity', AColumn.FieldName) or
  278. SameText('Price', AColumn.FieldName) then
  279. begin
  280. if not ANode.CountPriceEnable then
  281. DataSetErrorMessage(Allow, '该清单不可输入数量单价,如需使用数量×单价计算,请先清空所有直接输入的金额!');
  282. end;
  283. end;
  284. if not Allow then Exit;
  285. // 变更清单允许填写本期合同计量,按超计论
  286. {if vNode.Rec.ValueByName('IsMeasureAdd').AsBoolean and (iCreatePhase > 0) and
  287. (SameText('CurDealQuantity', AColumn.FieldName) or
  288. SameText('CurDealTotalPrice', AColumn.FieldName)) then
  289. DataSetErrorMessage(Allow, Format('该清单为第%d期新增清单,不可填写本期合同计量数据!', [iCreatePhase]));}
  290. end;
  291. procedure SetQuantity(ANode: TBillsIDTreeNode; const AField: string);
  292. var
  293. vNode: TBillsIDTreeNode;
  294. begin
  295. // 变更应选择变更令
  296. if SameText(AField , 'Qc') or SameText(AField , 'Pc') then
  297. Allow := SelectAndUpdateBGL(GetBillsID, AValue.Owner, StrToFloatDef(Text, 0), AField);
  298. if not Allow then Exit;
  299. if CheckStringNull(Text) or CheckNumeric(Text) then
  300. begin
  301. AValue.Owner.ValueByName(AField + 'Flag').AsInteger := 0;
  302. AValue.Owner.ValueByName(AField + 'Formula').AsString := '';
  303. Text := FloatToStr(QuantityRoundTo(StrToFloatDef(Text, 0)));
  304. end
  305. else
  306. begin
  307. AValue.Owner.ValueByName(AField + 'Flag').AsInteger := 1;
  308. AValue.Owner.ValueByName(AField + 'Formula').AsString := Text;
  309. Text := FloatToStr(QuantityRoundTo(EvaluateExprs(Text)));
  310. end;
  311. ANode.Rec.SetIntValue(ANode.Rec.CalcType, 0);
  312. end;
  313. procedure SetTotalPrice(ANode: TBillsIDTreeNode; const AField: string);
  314. begin
  315. // 变更应选择变更令
  316. if SameText(AField , 'Qc') or SameText(AField , 'Pc') then
  317. Allow := SelectAndUpdateBGL(GetBillsID, AValue.Owner, StrToFloatDef(Text, 0), AField);
  318. if not Allow then Exit;
  319. AValue.Owner.ValueByName(AField + 'Flag').AsInteger := 2;
  320. AValue.Owner.ValueByName(AField + 'Quantity').AsString := '';
  321. if CheckStringNull(Text) or CheckNumeric(Text) then
  322. begin
  323. AValue.Owner.ValueByName(AField + 'Formula').AsString := '';
  324. Text := FloatToStr(TotalPriceRoundTo(StrToFloatDef(Text, 0)));
  325. end
  326. else
  327. begin
  328. AValue.Owner.ValueByName(AField + 'Formula').AsString := Text;
  329. Text := FloatToStr(TotalPriceRoundTo(EvaluateExprs(Text)));
  330. end;
  331. ANode.Rec.SetIntValue(ANode.Rec.CalcType, 1);
  332. end;
  333. procedure DoCurChanged(ANode: TBillsIDTreeNode);
  334. begin
  335. if SameText(AColumn.FieldName, 'CurDealQuantity') then
  336. SetQuantity(ANode, 'Deal')
  337. else if SameText(AColumn.FieldName, 'CurQcQuantity') then
  338. SetQuantity(ANode, 'Qc')
  339. else if SameText(AColumn.FieldName, 'CurPcQuantity') then
  340. SetQuantity(ANode, 'Pc')
  341. else if SameText(AColumn.FieldName, 'CurDealTotalPrice') then
  342. SetTotalPrice(ANode, 'Deal')
  343. else if SameText(AColumn.FieldName, 'CurQcTotalPrice') then
  344. SetTotalPrice(ANode, 'Qc')
  345. else if SameText(AColumn.FieldName, 'CurPcTotalPrice') then
  346. SetTotalPrice(ANode, 'Pc')
  347. else if (Pos('DgnQuantity', AColumn.FieldName) > 0) or
  348. SameText(AColumn.FieldName, 'Quantity') then
  349. Text := FloatToStr(QuantityRoundTo(StrToFloatDef(Text, 0)))
  350. else if SameText(AColumn.FieldName, 'NewPrice') or
  351. SameText(AColumn.FieldName, 'Price') then
  352. Text := FloatToStr(PriceRoundTo(StrToFloatDef(Text, 0)))
  353. else if SameText(AColumn.FieldName, 'Code') then
  354. BillsMeasureTree.RecodeChildrenCode(ANode, AValue.AsString, Text)
  355. else if SameText(AColumn.FieldName, 'B_Code') then
  356. BillsMeasureTree.RecodeChildrenB_Code(ANode, AValue.AsString, Text);
  357. end;
  358. function CheckValidData: Boolean;
  359. begin
  360. Result := (AValue.AsString <> Text);
  361. if (Pos('Quantity', AColumn.FieldName) > 0) or
  362. (Pos('Price', AColumn.FieldName) > 0) then
  363. begin
  364. if (AValue.AsFloat = 0) and (Text = '') then
  365. Result := False;
  366. end;
  367. end;
  368. var
  369. vNode: TBillsIDTreeNode;
  370. begin
  371. if not Assigned(AValue) then Exit;
  372. // 修改后数据与原数据相同则不提交
  373. if not CheckValidData then
  374. Allow := False;
  375. if not Allow then Exit;
  376. vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GetBillsID));
  377. CheckLockedData;
  378. if not Allow then Exit;
  379. CheckNodeWritable(vNode);
  380. if not Allow then Exit;
  381. Text := Trim(Text);
  382. if Pos('=', Text) = 1 then
  383. Text := Copy(Text, 2, Length(Text) - 1);
  384. DoCurChanged(vNode);
  385. end;
  386. procedure TBillsMeasureData.sdvBillsMeasureNeedLookupRecord(
  387. ARecord: TsdDataRecord; AColumn: TsdViewColumn; ANewText: String);
  388. function CheckNeedAddPhaseRecord(ANode: TMeasureBillsIDTreeNode): Boolean;
  389. begin
  390. Result := SameText(AColumn.FieldName, 'CurDealQuantity') or
  391. SameText(AColumn.FieldName, 'CurQcQuantity') or
  392. SameText(AColumn.FieldName, 'CurPcQuantity') or
  393. SameText(AColumn.FieldName, 'CurDealTotalPrice') or
  394. SameText(AColumn.FieldName, 'CurQcTotalPrice') or
  395. SameText(AColumn.FieldName, 'CurPcTotalPrice');
  396. Result := Result and not ANode.HasChildren;
  397. Result := Result and not Assigned(ANode.StageRec);
  398. end;
  399. function HasCardinalNum(AFormula: string): Boolean;
  400. var
  401. iCharIndex: Integer;
  402. begin
  403. Result := False;
  404. iCharIndex := 1;
  405. while ((iCharIndex <= Length(AFormula)) and not Result) do
  406. begin
  407. if AFormula[iCharIndex] in ['A'..'D', 'a'..'d'] then
  408. Result := True;
  409. Inc(iCharIndex);
  410. end;
  411. end;
  412. procedure SetQuantityRec(ANode: TBillsIDTreeNode; APhaseRec: TsdDataRecord; const AType: string);
  413. var
  414. bAllow: Boolean;
  415. begin
  416. bAllow := True;
  417. // 变更应选择变更令
  418. if SameText(AType , 'Qc') or SameText(AType , 'Pc') then
  419. bAllow := SelectAndUpdateBGL(ARecord.ValueByName('ID').AsInteger,
  420. APhaseRec, StrToFloatDef(ANewText, 0), AType);
  421. if bAllow then
  422. begin
  423. if ANode.Rec.CalcType.AsInteger <> 0 then
  424. ANode.Rec.CalcType.AsInteger := 0;
  425. if CheckNumeric(ANewText) then
  426. APhaseRec.ValueByName(AType + 'Quantity').AsFloat := QuantityRoundTo(StrToFloatDef(ANewText, 0))
  427. else
  428. begin
  429. APhaseRec.ValueByName(AType + 'Flag').AsInteger := 1;
  430. APhaseRec.ValueByName(AType + 'Quantity').AsFloat := QuantityRoundTo(EvaluateExprs(ANewText));
  431. APhaseRec.ValueByName(AType + 'Formula').AsString := ANewText;
  432. end;
  433. end;
  434. end;
  435. procedure SetTotalPriceRec(ANode: TBillsIDTreeNode; APhaseRec: TsdDataRecord; const AType: string);
  436. begin
  437. if ANode.Rec.CalcType.AsInteger <> 1 then
  438. ANode.Rec.CalcType.AsInteger := 1;
  439. APhaseRec.ValueByName(AType + 'Flag').AsInteger := 2;
  440. if CheckNumeric(ANewText) then
  441. APhaseRec.ValueByName(AType + 'TotalPrice').AsFloat := TotalPriceRoundTo(StrToFloatDef(ANewText, 0))
  442. else
  443. begin
  444. APhaseRec.ValueByName(AType + 'TotalPrice').AsFloat := TotalPriceRoundTo(EvaluateExprs(ANewText));
  445. APhaseRec.ValueByName(AType + 'Formula').AsString := ANewText;
  446. end;
  447. end;
  448. procedure SetNewRecValue(ANode: TBillsIDTreeNode; APhaseRec: TsdDataRecord);
  449. begin
  450. if SameText(AColumn.FieldName, 'CurDealQuantity') then
  451. SetQuantityRec(ANode, APhaseRec, 'Deal')
  452. else if SameText(AColumn.FieldName, 'CurQcQuantity') then
  453. SetQuantityRec(ANode, APhaseRec, 'Qc')
  454. else if SameText(AColumn.FieldName, 'CurPcQuantity') then
  455. SetQuantityRec(ANode, APhaseRec, 'Pc')
  456. else if SameText(AColumn.FieldName, 'CurDealTotalPrice') then
  457. SetTotalPriceRec(ANode, APhaseRec, 'Deal')
  458. else if SameText(AColumn.FieldName, 'CurQcTotalPrice') then
  459. SetTotalPriceRec(ANode, APhaseRec, 'Qc')
  460. else if SameText(AColumn.FieldName, 'CurPcTotalPrice') then
  461. SetTotalPriceRec(ANode, APhaseRec, 'Pc');
  462. end;
  463. function CheckNodeWritable(ANode: TBillsIDTreeNode): Boolean;
  464. var
  465. iCreatePhase: Integer;
  466. begin
  467. Result := True;
  468. {if ANode.ID = iPriceMarginID then
  469. DataSetErrorMessage(Result, sBills_PMHint);}
  470. if ANode.HasChildren then
  471. begin
  472. if ANewText = '' then
  473. Result := False
  474. else
  475. DataSetErrorMessage(Result, '该清单有子计算项,不能直接修改!');
  476. end
  477. else
  478. begin
  479. // 目前仅允许本期合同计量,可直接输入金额
  480. if SameText('CurDealTotalPrice', AColumn.FieldName) then
  481. begin
  482. if not ANode.TotalPriceEnable then
  483. DataSetErrorMessage(Result, '该清单不可直接输入金额,如需直接输入金额,请先清空所有数量、单价!');
  484. end
  485. else if SameText('CurDealQuantity', AColumn.FieldName) or
  486. SameText('CurQcQuantity', AColumn.FieldName) or
  487. SameText('CurPcQuantity', AColumn.FieldName) then
  488. begin
  489. if not ANode.CountPriceEnable then
  490. DataSetErrorMessage(Result, '该清单不可输入数量单价,如需使用数量×单价计算,请先清空所有直接输入的金额!');
  491. end;
  492. end;
  493. // 变更清单允许填写本期合同计量,按超计论
  494. {iCreatePhase := ANode.Rec.ValueByName('CreatePhaseID').AsInteger;
  495. if ANode.Rec.ValueByName('IsMeasureAdd').AsBoolean and (iCreatePhase > 0) and
  496. (SameText('CurDealQuantity', AColumn.FieldName) or
  497. SameText('CurDealTotalPrice', AColumn.FieldName)) then
  498. begin
  499. ErrorMessage(Format('该清单为第%d期新增清单,不可填写本期合同计量数据!', [iCreatePhase]));
  500. Exit;
  501. end; }
  502. end;
  503. var
  504. NewRec: TStageRecord;
  505. vNode: TMeasureBillsIDTreeNode;
  506. begin
  507. vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.FindNode(ARecord.ValueByName('ID').AsInteger));
  508. if not CheckNodeWritable(vNode) then
  509. Exit;
  510. if CheckNeedAddPhaseRecord(vNode) then
  511. begin
  512. if (Pos('Quantity', AColumn.FieldName) > 0) or (Pos('TotalPrice', AColumn.FieldName) > 0) then
  513. if HasCardinalNum(ANewText) then
  514. raise Exception.Create('公式不可输入参数');
  515. NewRec := StageData.AddStageRecord(ARecord.ValueByName('ID').AsInteger);
  516. vNode.StageRec := NewRec;
  517. SetNewRecValue(vNode, NewRec);
  518. end;
  519. end;
  520. procedure TBillsMeasureData.sdvBillsMeasureAfterClose(Sender: TObject);
  521. begin
  522. FBillsMeasureTree.Active := False;
  523. end;
  524. function TBillsMeasureData.OnGetCardinalNum(
  525. const ACardinalNum: string): Double;
  526. {
  527. function GetTotalPrice(ABillsID: Integer): Double;
  528. var
  529. stnNode: TsdIDTreeNode;
  530. begin
  531. stnNode := FBillsTree.FindNode(ABillsID);
  532. if Assigned(stnNode) then
  533. Result := stnNode.Rec.ValueByName('TotalPrice').AsFloat;
  534. end;
  535. function GetPhaseTotalPrice(ABillsID: Integer; const AType: string): Double;
  536. var
  537. Rec: TsdDataRecord;
  538. begin
  539. Rec := CurPhaseData.PhaseRecord(ABillsID);
  540. if Assigned(Rec) then
  541. Result := Rec.ValueByName(AType + 'TotalPrice').AsFloat;
  542. end;
  543. }
  544. function GetTotalPrice(ANode: TsdIDTreeNode): Double;
  545. var
  546. iChild: Integer;
  547. begin
  548. Result := 0;
  549. if not Assigned(ANode) then Exit;
  550. if ANode.HasChildren then
  551. for iChild := 0 to ANode.ChildCount - 1 do
  552. Result := Result + GetTotalPrice(ANode.ChildNodes[iChild])
  553. else
  554. Result := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  555. end;
  556. function GetPhaseTotalPrice(ANode: TsdIDTreeNode; const AType: string): Double;
  557. var
  558. iChild: Integer;
  559. Rec: TsdDataRecord;
  560. begin
  561. Result := 0;
  562. if not Assigned(ANode) then Exit;
  563. if ANode.HasChildren then
  564. for iChild := 0 to ANode.ChildCount - 1 do
  565. Result := Result + GetPhaseTotalPrice(ANode.ChildNodes[iChild], AType)
  566. else
  567. begin
  568. Rec := StageData.StageRecord(ANode.ID);
  569. if Assigned(Rec) then
  570. Result := Rec.ValueByName(AType + 'TotalPrice').AsFloat;
  571. end;
  572. end;
  573. var
  574. iNodeID: Integer;
  575. begin
  576. Result := 0;
  577. iNodeID := StrToIntDef(Copy(ACardinalNum, 2, Length(ACardinalNum) - 1), -1);
  578. case ACardinalNum[1] of
  579. 'A','a': Result := GetTotalPrice(BillsMeasureTree.FindNode(iNodeID));
  580. 'B','b': Result := GetPhaseTotalPrice(BillsMeasureTree.FindNode(iNodeID), 'Deal');
  581. 'C','c': Result := GetPhaseTotalPrice(BillsMeasureTree.FindNode(iNodeID), 'Qc');
  582. 'D','d': Result := GetPhaseTotalPrice(BillsMeasureTree.FindNode(iNodeID), 'Pc');
  583. {'A','a': Result := GetTotalPrice(iNodeID);
  584. 'B','b': Result := GetPhaseTotalPrice(iNodeID, 'Deal');
  585. 'C','c': Result := GetPhaseTotalPrice(iNodeID, 'Qc');
  586. 'D','d': Result := GetPhaseTotalPrice(iNodeID, 'Pc');}
  587. end;
  588. end;
  589. function TBillsMeasureData.GetStageData: TStageData;
  590. begin
  591. Result := TProjectData(FProjectData).PhaseData.StageData;
  592. end;
  593. procedure TBillsMeasureData.ExpandNodeTo(ALevel: Integer);
  594. begin
  595. BillsMeasureTree.ExpandLevel := ALevel;
  596. end;
  597. procedure TBillsMeasureData.ExpandXmjNode;
  598. var
  599. iIndex: Integer;
  600. stnNode: TBillsIDTreeNode;
  601. begin
  602. for iIndex := 0 to BillsMeasureTree.Count - 1 do
  603. begin
  604. stnNode := TBillsIDTreeNode(BillsMeasureTree.Items[iIndex]);
  605. if (stnNode.ParentID <> -1) then
  606. stnNode.Parent.Expanded := stnNode.Rec.B_Code.AsString = '';
  607. end;
  608. end;
  609. procedure TBillsMeasureData.CalculateAll;
  610. var
  611. //Cacl: TBillsCalculate;
  612. i: Integer;
  613. begin
  614. if not TProjectData(FProjectData).StageDataReadOnly then
  615. for i := 0 to BillsMeasureTree.Count - 1 do
  616. CalculateNode(TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]));
  617. {Cacl := TBillsCalculate.Create(Self);
  618. try
  619. Cacl.Execute;
  620. finally
  621. Cacl.Free;
  622. end;}
  623. end;
  624. procedure TBillsMeasureData.UpdateRecordDeal(ABillsID: Integer; AQuantity,
  625. ATotalPrice: Double);
  626. var
  627. stnNode: TsdIDTreeNode;
  628. begin
  629. stnNode := BillsMeasureTree.FindNode(ABillsID);
  630. if not Assigned(stnNode) then Exit;
  631. with stnNode.Rec do
  632. begin
  633. if not stnNode.HasChildren then
  634. ValueByName('AddDealQuantity').AsFloat := QuantityRoundTo(
  635. ValueByName('AddDealQuantity').AsFloat + AQuantity);
  636. ValueByName('AddDealTotalPrice').AsFloat := TotalPriceRoundTo(
  637. ValueByName('AddDealTotalPrice').AsFloat + ATotalPrice);
  638. end;
  639. UpdateRecordGather(stnNode, AQuantity, ATotalPrice);
  640. UpdateRecordDeal(stnNode.ParentID, AQuantity, ATotalPrice);
  641. end;
  642. procedure TBillsMeasureData.UpdateRecordPc(ABillsID: Integer; AQuantity,
  643. ATotalPrice: Double);
  644. var
  645. stnNode: TsdIDTreeNode;
  646. begin
  647. stnNode := BillsMeasureTree.FindNode(ABillsID);
  648. if not Assigned(stnNode) then Exit;
  649. with stnNode.Rec do
  650. begin
  651. if not stnNode.HasChildren then
  652. ValueByName('AddPcQuantity').AsFloat := QuantityRoundTo(
  653. ValueByName('AddPcQuantity').AsFloat + AQuantity);
  654. ValueByName('AddPcTotalPrice').AsFloat := TotalPriceRoundTo(
  655. ValueByName('AddPcTotalPrice').AsFloat + ATotalPrice);
  656. end;
  657. UpdateRecordGather(stnNode, 0, ATotalPrice);
  658. UpdateRecordPc(stnNode.ParentID, AQuantity, ATotalPrice);
  659. end;
  660. procedure TBillsMeasureData.UpdateRecordQc(ABillsID: Integer; AQuantity,
  661. ATotalPrice: Double);
  662. var
  663. stnNode: TsdIDTreeNode;
  664. begin
  665. stnNode := BillsMeasureTree.FindNode(ABillsID);
  666. if not Assigned(stnNode) then Exit;
  667. with stnNode.Rec do
  668. begin
  669. if not stnNode.HasChildren then
  670. ValueByName('AddQcQuantity').AsFloat := QuantityRoundTo(
  671. ValueByName('AddQcQuantity').AsFloat + AQuantity);
  672. ValueByName('AddQcTotalPrice').AsFloat := TotalPriceRoundTo(
  673. ValueByName('AddQcTotalPrice').AsFloat + ATotalPrice);
  674. end;
  675. UpdateRecordGather(stnNode, AQuantity, ATotalPrice);
  676. UpdateRecordQc(stnNode.ParentID, AQuantity, ATotalPrice);
  677. end;
  678. procedure TBillsMeasureData.UpdateRecordGather(ANode: TsdIDTreeNode;
  679. AQuantity, ATotalPrice: Double);
  680. begin
  681. with ANode.Rec do
  682. begin
  683. if not ANode.HasChildren then
  684. ValueByName('AddGatherQuantity').AsFloat := QuantityRoundTo(
  685. ValueByName('AddGatherQuantity').AsFloat + AQuantity);
  686. ValueByName('AddGatherTotalPrice').AsFloat := TotalPriceRoundTo(
  687. ValueByName('AddGatherTotalPrice').AsFloat + ATotalPrice);
  688. end;
  689. CalcAddDgnPrice(ANode);
  690. CalcAddCompleteRate(ANode);
  691. end;
  692. function TBillsMeasureData.GatherRelaBGL(ANode: TsdIDTreeNode): string;
  693. var
  694. iChild: Integer;
  695. Rec: TsdDataRecord;
  696. begin
  697. Result := '';
  698. if not Assigned(ANode) then Exit;
  699. if ANode.HasChildren then
  700. begin
  701. for iChild := 0 to ANode.ChildCount - 1 do
  702. Result := MergeRelaBGL(Result, GatherRelaBGL(ANode.ChildNodes[iChild]));
  703. end
  704. else
  705. begin
  706. with TProjectData(FProjectData).PhaseData.StageData do
  707. Rec := StageRecord(ANode.ID);
  708. if Assigned(Rec) then
  709. Result := MergeRelaBGL(Rec.ValueByName('QcBGLCode').AsString, Rec.ValueByName('PcBGLCode').AsString);
  710. end;
  711. end;
  712. procedure TBillsMeasureData.sdvBillsMeasureAfterValueChanged(
  713. AValue: TsdValue);
  714. var
  715. iID: Integer;
  716. vNode: TBillsIDTreeNode;
  717. begin
  718. if AValue.Owner.Owner.Name = 'sddBills' then
  719. begin
  720. iID := AValue.Owner.ValueByName('ID').AsInteger;
  721. vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(iID));
  722. if SameText(AValue.FieldName, 'Price') then
  723. TProjectData(FProjectData).BillsCompileData.Calculate(iID);
  724. if TProjectData(FProjectData).PhaseData.Active then
  725. begin
  726. if AValue.FieldName = 'Price' then
  727. StageData.ReCalculate(iID);
  728. if AValue.FieldName = 'NewPrice' then
  729. StageData.ReCalculate(iID);
  730. end;
  731. if Pos('DgnQuantity1', AValue.FieldName) > 0 then
  732. CalcAddDgnPrice(vNode);
  733. if (AValue.FieldName = 'Code') then
  734. BillsMeasureTree.RecodeChildrenCode(vNode, VarToStrDef(AValue.OldValue, ''), AValue.AsString)
  735. else if (AValue.FieldName = 'B_Code') then
  736. BillsMeasureTree.RecodeChildrenB_Code(vNode, VarToStrDef(AValue.OldValue, ''), AValue.AsString);
  737. end;
  738. end;
  739. procedure TBillsMeasureData.ExpandCurPhase;
  740. var
  741. iIndex: Integer;
  742. stnNode: TsdIDTreeNode;
  743. StageRec: TStageRecord;
  744. begin
  745. for iIndex := 0 to BillsMeasureTree.Count - 1 do
  746. begin
  747. stnNode := BillsMeasureTree.Items[iIndex];
  748. StageRec := TMeasureBillsIDTreeNode(stnNode).StageRec;
  749. if (stnNode.ParentID <> -1) then
  750. if Assigned(StageRec) then
  751. stnNode.Expanded := StageRec.GatherTotalPrice.AsFloat <> 0
  752. else
  753. stnNode.Expanded := False;
  754. end;
  755. end;
  756. procedure TBillsMeasureData.UpdateBGLInfo(ABillsID: Integer;
  757. ARec: TsdDataRecord; const AType: string);
  758. var
  759. stnNode: TsdIDTreeNode;
  760. begin
  761. stnNode := BillsMeasureTree.FindNode(ABillsID);
  762. if not Assigned(stnNode) then Exit;
  763. stnNode.Rec.ValueByName('Add' + AType + 'BGLCode').AsString :=
  764. ARec.ValueByName('End' + AType + 'BGLCode').AsString;
  765. stnNode.Rec.ValueByName('Add' + AType + 'BGLNum').AsString :=
  766. ARec.ValueByName('End' + AType + 'BGLNum').AsString;
  767. end;
  768. function TBillsMeasureData.SelectAndUpdateBGL(ABillsID: Integer;
  769. ARec: TsdDataRecord; ANewValue: Double; const AType: string): Boolean;
  770. var
  771. AOrgBGL, ANewBGL: TBGLSelectInfo;
  772. ACurNode: TsdIDTreeNode;
  773. procedure UpdateBGL;
  774. begin
  775. ARec.ValueByName(AType + 'BGLCode').AsString := ANewBGL.MergedCode;
  776. ARec.ValueByName(AType + 'BGLNum').AsString := ANewBGL.MergedNum;
  777. TProjectData(ProjectData).BGLData.ApplyBGL(AOrgBGL, ANewBGL);
  778. end;
  779. begin
  780. Result := True;
  781. ACurNode := BillsMeasureTree.FindNode(ABillsID);
  782. AOrgBGL := TBGLSelectInfo.Create(ACurNode.Rec,
  783. ARec.ValueByName(AType + 'Quantity').AsFloat, True);
  784. AOrgBGL.MergedCode := ARec.ValueByName(AType + 'BGLCode').AsString;
  785. AOrgBGL.MergedNum := ARec.ValueByName(AType + 'BGLNum').AsString;
  786. ANewBGL := TBGLSelectInfo.Create(ACurNode.Rec, ANewValue, False);
  787. try
  788. if ANewBGL.TotalNum <> 0 then
  789. begin
  790. Result := SelectBGL(AOrgBGL, ANewBGL, ProjectData);
  791. if Result then
  792. UpdateBGL;
  793. end
  794. else
  795. UpdateBGL;
  796. StageData.UpdateBGLInfo(ARec, AType);
  797. UpdateBGLInfo(ABillsID, ARec, AType);
  798. finally
  799. AOrgBGL.Free;
  800. ANewBGL.Free;
  801. end;
  802. end;
  803. procedure TBillsMeasureData.Close;
  804. begin
  805. sdvBillsMeasure.Close;
  806. end;
  807. procedure TBillsMeasureData.CalcAddCompleteRate(ANode: TsdIDTreeNode);
  808. var
  809. fDividend, fDivisor: Double;
  810. begin
  811. with ANode.Rec do
  812. begin
  813. fDividend := ValueByName('AddGatherTotalPrice').AsFloat;
  814. fDivisor := ValueByName('TotalPrice').AsFloat + ValueByName('AddQcTotalPrice').AsFloat
  815. + ValueByName('AddPcTotalPrice').AsFloat;
  816. if fDivisor <> 0 then
  817. ValueByName('AddCompleteRate').AsFloat := AdvRoundTo(fDividend/fDivisor*100)
  818. else
  819. ValueByName('AddCompleteRate').Clear;
  820. end;
  821. end;
  822. procedure TBillsMeasureData.CalcAddDgnPrice(ANode: TsdIDTreeNode);
  823. var
  824. fDividend, fDivisor: Double;
  825. begin
  826. with ANode.Rec do
  827. begin
  828. fDividend := ValueByName('AddGatherTotalPrice').AsFloat;
  829. fDivisor := ValueByName('DealDgnQuantity1').AsFloat + ValueByName('CDgnQuantity1').AsFloat;
  830. if fDivisor <> 0 then
  831. ValueByName('AddDgnPrice').AsFloat := AdvRoundTo(fDividend/fDivisor);
  832. end;
  833. end;
  834. procedure TBillsMeasureData.SetOnRecChange(const Value: TRecChangeEvent);
  835. begin
  836. FOnRecChange := Value;
  837. end;
  838. procedure TBillsMeasureData.sdvBillsMeasureCurrentChanged(
  839. ARecord: TsdDataRecord);
  840. begin
  841. if Assigned(FOnRecChange) then
  842. FOnRecChange(ARecord);
  843. end;
  844. procedure TBillsMeasureData.ResetTreeNodeStageRec;
  845. var
  846. i: Integer;
  847. vNode: TMeasureBillsIDTreeNode;
  848. begin
  849. if not StageData.Active then Exit;
  850. for i := 0 to BillsMeasureTree.Count - 1 do
  851. begin
  852. vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
  853. vNode.StageRec := StageData.StageRecord(vNode.ID);
  854. end;
  855. end;
  856. procedure TBillsMeasureData.UpdateRecordPM(ABillsID: Integer;
  857. ADiffer: Double);
  858. var
  859. stnNode: TBillsIDTreeNode;
  860. begin
  861. stnNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(ABillsID));
  862. if not Assigned(stnNode) then Exit;
  863. stnNode.Rec.PM_AddTotalPrice.AsFloat := stnNode.Rec.PM_AddTotalPrice.AsFloat + ADiffer;
  864. UpdateRecordPM(stnNode.ParentID, ADiffer);
  865. end;
  866. procedure TBillsMeasureData.CalculateNode(ANode: TMeasureBillsIDTreeNode);
  867. begin
  868. if Assigned(ANode.StageRec) then
  869. begin
  870. if not ANode.HasChildren then
  871. begin
  872. ANode.Rec.AddDealQuantity.AsFloat := ANode.StageRec.EndDealQuantity.AsFloat;
  873. ANode.Rec.AddQcQuantity.AsFloat := ANode.StageRec.EndQcQuantity.AsFloat;
  874. ANode.Rec.AddQcBGLCode.AsString := ANode.StageRec.EndQcBGLCode.AsString;
  875. ANode.Rec.AddQcBGLNum.AsString := ANode.StageRec.EndQcBGLNum.AsString;
  876. ANode.Rec.AddPcQuantity.AsFloat := ANode.StageRec.EndPcQuantity.AsFloat;
  877. ANode.Rec.AddPcBGLCode.AsString := ANode.StageRec.EndPcBGLCode.AsString;
  878. ANode.Rec.AddPcBGLNum.AsString := ANode.StageRec.EndPcBGLNum.AsString;
  879. ANode.Rec.AddGatherQuantity.AsFloat := ANode.StageRec.EndGatherQuantity.AsFloat;
  880. end;
  881. ANode.Rec.AddDealTotalPrice.AsFloat := ANode.StageRec.EndDealTotalPrice.AsFloat;
  882. ANode.Rec.AddQcTotalPrice.AsFloat := ANode.StageRec.EndQcTotalPrice.AsFloat;
  883. ANode.Rec.AddPcTotalPrice.AsFloat := ANode.StageRec.EndPcTotalPrice.AsFloat;
  884. ANode.Rec.AddGatherTotalPrice.AsFloat := ANode.StageRec.EndGatherTotalPrice.AsFloat;
  885. ANode.Rec.PM_AddTotalPrice.AsFloat := ANode.StageRec.PM_PreTotalPrice.AsFloat + ANode.StageRec.PM_TotalPrice.AsFloat;
  886. end;
  887. end;
  888. procedure TBillsMeasureData.UpdateGather(ABillsID: Integer;
  889. ADiffer: Double);
  890. var
  891. stnNode: TBillsIDTreeNode;
  892. begin
  893. stnNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(ABillsID));
  894. if not Assigned(stnNode) then Exit;
  895. with stnNode.Rec do
  896. AddDifferValue(AddGatherTotalPrice, ADiffer);
  897. UpdateGather(stnNode.ParentID, ADiffer);
  898. end;
  899. procedure TBillsMeasureData.FreeTreeNodeStageRec;
  900. var
  901. i: Integer;
  902. vNode: TMeasureBillsIDTreeNode;
  903. begin
  904. for i := 0 to BillsMeasureTree.Count - 1 do
  905. begin
  906. vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
  907. vNode.StageRec := nil;
  908. end;
  909. end;
  910. end.