BillsMeasureDm.pas 35 KB

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