BillsGatherDm.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. unit BillsGatherDm;
  2. interface
  3. uses
  4. SysUtils, Classes, DB, DBClient, sdIDTree, sdDB;
  5. type
  6. TGclNode = class
  7. private
  8. FB_Code: string;
  9. FIndexCode: string;
  10. FName: string;
  11. FUnits: string;
  12. FPrice: Double;
  13. FNewPrice: Double;
  14. FDealQuantity: Double;
  15. FDealTotalPrice: Double;
  16. FQuantity: Double;
  17. FTotalPrice: Double;
  18. FBGLQuantity: Double;
  19. FBGLTotalPrice: Double;
  20. FCurDealQuantity: Double;
  21. FCurDealTotalPrice: Double;
  22. FCurQcQuantity: Double;
  23. FCurQcTotalPrice: Double;
  24. FCurPcQuantity: Double;
  25. FCurPcTotalPrice: Double;
  26. FCurGatherQuantity: Double;
  27. FCurGatherTotalPrice: Double;
  28. FEndDealQuantity: Double;
  29. FEndDealTotalPrice: Double;
  30. FEndQcQuantity: Double;
  31. FEndQcTotalPrice: Double;
  32. FEndPcQuantity: Double;
  33. FEndPcTotalPrice: Double;
  34. FEndGatherQuantity: Double;
  35. FEndGatherTotalPrice: Double;
  36. FAddDealQuantity: Double;
  37. FAddDealTotalPrice: Double;
  38. FAddQcQuantity: Double;
  39. FAddQcTotalPrice: Double;
  40. FAddPcQuantity: Double;
  41. FAddPcTotalPrice: Double;
  42. FAddGatherQuantity: Double;
  43. FAddGatherTotalPrice: Double;
  44. end;
  45. TBillsGatherData = class(TDataModule)
  46. cdsBillsGather: TClientDataSet;
  47. cdsBillsGatherB_Code: TStringField;
  48. cdsBillsGatherName: TWideStringField;
  49. cdsBillsGatherUnits: TWideStringField;
  50. cdsBillsGatherPrice: TFloatField;
  51. cdsBillsGatherNewPrice: TFloatField;
  52. cdsBillsGatherQuantity: TFloatField;
  53. cdsBillsGatherTotalPrice: TFloatField;
  54. cdsBillsGatherCurDealQuantity: TFloatField;
  55. cdsBillsGatherCurDealTotalPrice: TFloatField;
  56. cdsBillsGatherCurQcQuantity: TFloatField;
  57. cdsBillsGatherCurQcTotalPrice: TFloatField;
  58. cdsBillsGatherCurPcQuantity: TFloatField;
  59. cdsBillsGatherCurPcTotalPrice: TFloatField;
  60. cdsBillsGatherCurGatherQuantity: TFloatField;
  61. cdsBillsGatherCurGatherTotalPrice: TFloatField;
  62. cdsBillsGatherAddDealQuantity: TFloatField;
  63. cdsBillsGatherAddDealTotalPrice: TFloatField;
  64. cdsBillsGatherAddQcQuantity: TFloatField;
  65. cdsBillsGatherAddQcTotalPrice: TFloatField;
  66. cdsBillsGatherAddPcQuantity: TFloatField;
  67. cdsBillsGatherAddPcTotalPrice: TFloatField;
  68. cdsBillsGatherAddGatherQuantity: TFloatField;
  69. cdsBillsGatherAddGatherTotalPrice: TFloatField;
  70. cdsRelaXmj: TClientDataSet;
  71. cdsRelaXmjCode: TStringField;
  72. cdsRelaXmjName: TWideStringField;
  73. cdsRelaXmjUnits: TWideStringField;
  74. cdsRelaXmjQuantity: TFloatField;
  75. cdsRelaXmjNameFenBu: TWideStringField;
  76. cdsRelaXmjNameFenXiang: TWideStringField;
  77. cdsRelaXmjNameDanWei: TWideStringField;
  78. cdsRelaXmjPeg: TWideStringField;
  79. cdsRelaXmjNameUnit: TWideStringField;
  80. cdsRelaXmjDrawingCode: TWideStringField;
  81. cdsBillsGatherIndexCode: TStringField;
  82. cdsBillsGatherDealQuantity: TFloatField;
  83. cdsBillsGatherDealTotalPrice: TFloatField;
  84. cdsBillsGatherEndDealQuantity: TFloatField;
  85. cdsBillsGatherEndDealTotalPrice: TFloatField;
  86. cdsBillsGatherEndQcQuantity: TFloatField;
  87. cdsBillsGatherEndQcTotalPrice: TFloatField;
  88. cdsBillsGatherEndPcQuantity: TFloatField;
  89. cdsBillsGatherEndPcTotalPrice: TFloatField;
  90. cdsBillsGatherEndGatherQuantity: TFloatField;
  91. cdsBillsGatherEndGatherTotalPrice: TFloatField;
  92. cdsBillsGatherBGLQuantity: TFloatField;
  93. cdsBillsGatherBGLTotalPrice: TFloatField;
  94. cdsBillsGatherCompletionRate: TFloatField;
  95. cdsBillsGatherDeal_BGLQuantity: TFloatField;
  96. cdsBillsGatherDeal_BGLTotalPrice: TFloatField;
  97. procedure cdsBillsGatherQuantityGetText(Sender: TField;
  98. var Text: String; DisplayText: Boolean);
  99. procedure cdsBillsGatherAfterScroll(DataSet: TDataSet);
  100. private
  101. FProjectData: TObject;
  102. FGclList: TList;
  103. function GetGclNode(ARec: TsdDataRecord): TGclNode;
  104. procedure FilterGclBills(ANode: TsdIDTreeNode);
  105. procedure FilterBills(ANode: TsdIDTreeNode);
  106. procedure FilterDealBills;
  107. procedure WriteGclBills;
  108. procedure RefreshRelaXmj;
  109. procedure AddRelaXmjs(const AB_Code, AName, AUnits: string; APrice: Double);
  110. function GetMainBillsTree: TsdIDTree;
  111. public
  112. constructor Create(AProjectData: TObject);
  113. destructor Destroy; override;
  114. procedure RefreshBills;
  115. property MainBillsTree: TsdIDTree read GetMainBillsTree;
  116. end;
  117. implementation
  118. uses
  119. ProjectData, PhaseData, StageDm, BillsDm, UtilMethods,
  120. ZhAPI, BillsCompileDm, DealBillsDm, BGLDm, BillsTree, BillsMeasureDm;
  121. {$R *.dfm}
  122. { TBillsGatherData }
  123. procedure TBillsGatherData.FilterBills(ANode: TsdIDTreeNode);
  124. begin
  125. if not Assigned(ANode) then Exit;
  126. if ANode.HasChildren then
  127. FilterBills(ANode.FirstChild)
  128. else
  129. FilterGclBills(ANode);
  130. FilterBills(ANode.NextSibling);
  131. end;
  132. procedure TBillsGatherData.FilterGclBills(ANode: TsdIDTreeNode);
  133. procedure LoadPhaseData(AGclNode: TGclNode; AID: Integer);
  134. var
  135. Rec: TsdDataRecord;
  136. begin
  137. Rec := TBillsIDTreeNode(ANode).StageRec;
  138. if not Assigned(Rec) then Exit;
  139. AGclNode.FCurDealQuantity := AGclNode.FCurDealQuantity + Rec.ValueByName('DealQuantity').AsFloat;
  140. AGclNode.FCurDealTotalPrice := AGclNode.FCurDealTotalPrice + Rec.ValueByName('DealTotalPrice').AsFloat;
  141. AGclNode.FCurQcQuantity := AGclNode.FCurQcQuantity + Rec.ValueByName('QcQuantity').AsFloat;
  142. AGclNode.FCurQcTotalPrice := AGclNode.FCurQcTotalPrice + Rec.ValueByName('QcTotalPrice').AsFloat;
  143. AGclNode.FCurPcQuantity := AGclNode.FCurPcQuantity + Rec.ValueByName('PcQuantity').AsFloat;
  144. AGclNode.FCurPcTotalPrice := AGclNode.FCurPcTotalPrice + Rec.ValueByName('PcTotalPrice').AsFloat;
  145. AGclNode.FCurGatherQuantity := AGclNode.FCurGatherQuantity + Rec.ValueByName('GatherQuantity').AsFloat;
  146. AGclNode.FCurGatherTotalPrice := AGclNode.FCurGatherTotalPrice + Rec.ValueByName('GatherTotalPrice').AsFloat;
  147. AGclNode.FEndDealQuantity := AGclNode.FEndDealQuantity + Rec.ValueByName('EndDealQuantity').AsFloat;
  148. AGclNode.FEndDealTotalPrice := AGclNode.FEndDealTotalPrice + Rec.ValueByName('EndDealTotalPrice').AsFloat;
  149. AGclNode.FEndQcQuantity := AGclNode.FEndQcQuantity + Rec.ValueByName('EndQcQuantity').AsFloat;
  150. AGclNode.FEndQcTotalPrice := AGclNode.FEndQcTotalPrice + Rec.ValueByName('EndQcTotalPrice').AsFloat;
  151. AGclNode.FEndPcQuantity := AGclNode.FEndPcQuantity + Rec.ValueByName('EndPcQuantity').AsFloat;
  152. AGclNode.FEndPcTotalPrice := AGclNode.FEndPcTotalPrice + Rec.ValueByName('EndPcTotalPrice').AsFloat;
  153. AGclNode.FEndGatherQuantity := AGclNode.FEndGatherQuantity + Rec.ValueByName('EndGatherQuantity').AsFloat;
  154. AGclNode.FEndGatherTotalPrice := AGclNode.FEndGatherTotalPrice + Rec.ValueByName('EndGatherTotalPrice').AsFloat;
  155. end;
  156. procedure LoadMeasureData(AGclNode: TGclNode; ARec: TsdDataRecord);
  157. begin
  158. AGclNode.FQuantity := AGclNode.FQuantity + ARec.ValueByName('Quantity').AsFloat;
  159. AGclNode.FTotalPrice := AGclNode.FTotalPrice + ARec.ValueByName('TotalPrice').AsFloat;
  160. if TProjectData(FProjectData).ProjProperties.PhaseCount = 0 then Exit;
  161. LoadPhaseData(AGclNode, ARec.ValueByName('ID').AsInteger);
  162. AGclNode.FAddDealQuantity := AGclNode.FAddDealQuantity + ARec.ValueByName('AddDealQuantity').AsFloat;
  163. AGclNode.FAddDealTotalPrice := AGclNode.FAddDealTotalPrice + ARec.ValueByName('AddDealTotalPrice').AsFloat;
  164. AGclNode.FAddQcQuantity := AGclNode.FAddQcQuantity + ARec.ValueByName('AddQcQuantity').AsFloat;
  165. AGclNode.FAddQcTotalPrice := AGclNode.FAddQcTotalPrice + ARec.ValueByName('AddQcTotalPrice').AsFloat;
  166. AGclNode.FAddPcQuantity := AGclNode.FAddPcQuantity + ARec.ValueByName('AddPcQuantity').AsFloat;
  167. AGclNode.FAddPcTotalPrice := AGclNode.FAddPcTotalPrice + ARec.ValueByName('AddPcTotalPrice').AsFloat;
  168. AGclNode.FAddGatherQuantity := AGclNode.FAddGatherQuantity + ARec.ValueByName('AddGatherQuantity').AsFloat;
  169. AGclNode.FAddGatherTotalPrice := AGclNode.FAddGatherTotalPrice + ARec.ValueByName('AddGatherTotalPrice').AsFloat;
  170. end;
  171. var
  172. Rec: TsdDataRecord;
  173. GclNode: TGclNode;
  174. begin
  175. if not Assigned(ANode) then Exit;
  176. Rec := ANode.Rec;
  177. if Rec.ValueByName('B_Code').AsString = '' then Exit;
  178. GclNode := GetGclNode(Rec);
  179. LoadMeasureData(GclNode, Rec);
  180. end;
  181. constructor TBillsGatherData.Create(AProjectData: TObject);
  182. begin
  183. inherited Create(nil);
  184. FProjectData := AProjectData;
  185. cdsBillsGather.IndexFieldNames := 'IndexCode';
  186. end;
  187. destructor TBillsGatherData.Destroy;
  188. begin
  189. inherited;
  190. end;
  191. function TBillsGatherData.GetMainBillsTree: TsdIDTree;
  192. begin
  193. Result := TProjectData(FProjectData).BillsMeasureData.BillsMeasureTree;
  194. end;
  195. procedure TBillsGatherData.RefreshBills;
  196. begin
  197. cdsBillsGather.DisableControls;
  198. cdsBillsGather.AfterScroll := nil;
  199. try
  200. cdsBillsGather.EmptyDataSet;
  201. FGclList := TList.Create;
  202. FilterBills(MainBillsTree.FirstNode);
  203. FilterDealBills;
  204. WriteGclBills;
  205. finally
  206. ClearObjects(FGclList);
  207. FGclList.Free;
  208. cdsBillsGather.EnableControls;
  209. cdsBillsGather.AfterScroll := cdsBillsGatherAfterScroll;
  210. end;
  211. end;
  212. procedure TBillsGatherData.cdsBillsGatherQuantityGetText(Sender: TField;
  213. var Text: String; DisplayText: Boolean);
  214. begin
  215. if Sender.AsFloat <> 0 then
  216. Text := FormatFloat('0.###', Sender.AsFloat)
  217. else
  218. Text := '';
  219. end;
  220. procedure TBillsGatherData.cdsBillsGatherAfterScroll(DataSet: TDataSet);
  221. begin
  222. RefreshRelaXmj;
  223. end;
  224. procedure TBillsGatherData.RefreshRelaXmj;
  225. begin
  226. cdsRelaXmj.EmptyDataSet;
  227. AddRelaXmjs(cdsBillsGatherB_Code.AsString, cdsBillsGatherName.AsString,
  228. cdsBillsGatherUnits.AsString, cdsBillsGatherPrice.AsFloat);
  229. end;
  230. procedure TBillsGatherData.AddRelaXmjs(
  231. const AB_Code, AName, AUnits: string; APrice: Double);
  232. function GetFirstXmjParent(AID: Integer): TsdIDTreeNode;
  233. begin
  234. Result := MainBillsTree.FindNode(AID);
  235. while Assigned(Result) and (Result.Rec.ValueByName('B_Code').AsString <> '') do
  236. Result := Result.Parent;
  237. end;
  238. // 取树结构的第ALevel层节点的名称(level从0开始)
  239. function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;
  240. begin
  241. Result := '';
  242. if not Assigned(ANode) then Exit;
  243. if ANode.Level = ALevel then
  244. Result := ANode.Rec.ValueByName('Name').AsString
  245. else if ANode.Level > ALevel then
  246. Result := GetNameByLevel(ANode.Parent, ALevel);
  247. end;
  248. function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  249. begin
  250. Result := nil;
  251. if not Assigned(ANode) then Exit;
  252. if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then
  253. Result := ANode
  254. else
  255. Result := GetPegNode(ANode.Parent);
  256. end;
  257. function GetNameDanWei(ANode: TsdIDTreeNode): string;
  258. begin
  259. // 取树结构的第二层节点的名称
  260. Result := GetNameByLevel(ANode, 1);
  261. end;
  262. // ANode为计量单元节点,APegNode为桩号节点
  263. function GetNameFenBu(ANode, APegNode: TsdIDTreeNode): string;
  264. var
  265. vCurNode: TsdIDTreeNode;
  266. begin
  267. // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
  268. if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
  269. // 取树结构的第三层节点的名称
  270. Result := GetNameByLevel(ANode, 2)
  271. // 否则,取桩号节点的子节点的名称
  272. else
  273. begin
  274. vCurNode := ANode;
  275. while vCurNode.Level > APegNode.Level + 1 do
  276. vCurNode := vCurNode.Parent;
  277. Result := vCurNode.Rec.ValueByName('Name').AsString;
  278. end;
  279. end;
  280. function GetNameFenXiang(ANode, APegNode: TsdIDTreeNode): string;
  281. var
  282. iTopLevel: Integer;
  283. vCurNode: TsdIDTreeNode;
  284. begin
  285. if Assigned(APegNode) then
  286. begin
  287. iTopLevel := 3;
  288. if APegNode.ID <> ANode.ID then
  289. iTopLevel := APegNode.Level + 2;
  290. Result := '';
  291. vCurNode := ANode.Parent;
  292. while vCurNode.Level >= iTopLevel do
  293. begin
  294. Result := vCurNode.Rec.ValueByName('Name').AsString + ';' + Result;
  295. vCurNode := vCurNode.Parent;
  296. end;
  297. end
  298. else
  299. Result := GetNameByLevel(ANode, 3);
  300. end;
  301. function GetNameUnit(ANode: TsdIDTreeNode): string;
  302. begin
  303. Result := ANode.Rec.ValueByName('Name').AsString;
  304. end;
  305. function GetDrawingCode(ANode: TsdIDTreeNode): string;
  306. begin
  307. Result := '';
  308. if not Assigned(ANode) then Exit;
  309. Result := ANode.Rec.ValueByName('DrawingCode').AsString;
  310. if Result = '' then
  311. Result := GetDrawingCode(ANode.Parent);
  312. end;
  313. function GetPegName(APegNode: TsdIDTreeNode): string;
  314. begin
  315. if Assigned(APegNode) then
  316. Result := APegNode.Rec.ValueByName('Name').AsString
  317. else
  318. Result := '';
  319. end;
  320. procedure AddRelaXmj(ARec: TsdDataRecord);
  321. var
  322. vNode, vPeg: TsdIDTreeNode;
  323. begin
  324. vNode := GetFirstXmjParent(ARec.ValueByName('ID').AsInteger);
  325. if not Assigned(vNode) then Exit;
  326. cdsRelaXmj.Append;
  327. cdsRelaXmjQuantity.AsFloat := ARec.ValueByName('Quantity').AsFloat;
  328. cdsRelaXmjCode.AsString := vNode.Rec.ValueByName('Code').AsString;
  329. cdsRelaXmjName.AsString := vNode.Rec.ValueByName('Name').AsString;
  330. cdsRelaXmjUnits.AsString := vNode.Rec.ValueByName('Units').AsString;
  331. vPeg := GetPegNode(vNode);
  332. cdsRelaXmjPeg.AsString := GetPegName(vPeg);
  333. cdsRelaXmjNameDanWei.AsString := GetNameDanWei(vNode);
  334. cdsRelaXmjNameFenBu.AsString := GetNameFenBu(vNode, vPeg);
  335. cdsRelaXmjNameFenXiang.AsString := GetNameFenXiang(vNode, vPeg);
  336. cdsRelaXmjNameUnit.AsString := GetNameUnit(vNode);
  337. cdsRelaXmjDrawingCode.AsString := GetDrawingCode(vNode);
  338. cdsRelaXmj.Post;
  339. end;
  340. var
  341. I: Integer;
  342. Rec: TsdDataRecord;
  343. begin
  344. if AB_Code = '' then Exit;
  345. with TProjectData(FProjectData).BillsData do
  346. for I := 0 to sddBills.RecordCount - 1 do
  347. begin
  348. Rec := sddBills.Records[I];
  349. if SameText(AB_Code, Rec.ValueByName('B_Code').AsString) and
  350. SameText(AName, Trim(Rec.ValueByName('Name').AsString)) and
  351. SameText(AUnits, Rec.ValueByName('Units').AsString) and
  352. (APrice = Rec.ValueByName('Price').AsFloat) then
  353. AddRelaXmj(Rec);
  354. end;
  355. end;
  356. procedure TBillsGatherData.WriteGclBills;
  357. var
  358. I: Integer;
  359. GclNode: TGclNode;
  360. begin
  361. for I := 0 to FGclList.Count - 1 do
  362. begin
  363. GclNode := TGclNode(FGclList.Items[I]);
  364. cdsBillsGather.Append;
  365. cdsBillsGatherB_Code.AsString := GclNode.FB_Code;
  366. cdsBillsGatherIndexCode.AsString := GclNode.FIndexCode;
  367. cdsBillsGatherName.AsString := GclNode.FName;
  368. cdsBillsGatherUnits.AsString := GclNode.FUnits;
  369. cdsBillsGatherPrice.AsFloat := GclNode.FPrice;
  370. cdsBillsGatherNewPrice.AsFloat := GclNode.FNewPrice;
  371. cdsBillsGatherDealQuantity.AsFloat := GclNode.FDealQuantity;
  372. cdsBillsGatherDealTotalPrice.AsFloat := GclNode.FDealTotalPrice;
  373. cdsBillsGatherQuantity.AsFloat := GclNode.FQuantity;
  374. cdsBillsGatherTotalPrice.AsFloat := GclNode.FTotalPrice;
  375. cdsBillsGatherBGLQuantity.AsFloat := GclNode.FBGLQuantity;
  376. cdsBillsGatherBGLTotalPrice.AsFloat := GclNode.FBGLTotalPrice;
  377. cdsBillsGatherDeal_BGLQuantity.AsFloat := GclNode.FQuantity + GclNode.FBGLQuantity;
  378. cdsBillsGatherDeal_BGLTotalPrice.AsFloat := GclNode.FTotalPrice + GclNode.FBGLTotalPrice;
  379. cdsBillsGatherCurDealQuantity.AsFloat := GclNode.FCurDealQuantity;
  380. cdsBillsGatherCurDealTotalPrice.AsFloat := GclNode.FCurDealTotalPrice;
  381. cdsBillsGatherCurQcQuantity.AsFloat := GclNode.FCurQcQuantity;
  382. cdsBillsGatherCurQcTotalPrice.AsFloat := GclNode.FCurQcTotalPrice;
  383. cdsBillsGatherCurPcQuantity.AsFloat := GclNode.FCurPcQuantity;
  384. cdsBillsGatherCurPcTotalPrice.AsFloat := GclNode.FCurPcTotalPrice;
  385. cdsBillsGatherCurGatherQuantity.AsFloat := GclNode.FCurGatherQuantity;
  386. cdsBillsGatherCurGatherTotalPrice.AsFloat := GclNode.FCurGatherTotalPrice;
  387. cdsBillsGatherEndDealQuantity.AsFloat := GclNode.FEndDealQuantity;
  388. cdsBillsGatherEndDealTotalPrice.AsFloat := GclNode.FEndDealTotalPrice;
  389. cdsBillsGatherEndQcQuantity.AsFloat := GclNode.FEndQcQuantity;
  390. cdsBillsGatherEndQcTotalPrice.AsFloat := GclNode.FEndQcTotalPrice;
  391. cdsBillsGatherEndPcQuantity.AsFloat := GclNode.FEndPcQuantity;
  392. cdsBillsGatherEndPcTotalPrice.AsFloat := GclNode.FEndPcTotalPrice;
  393. cdsBillsGatherEndGatherQuantity.AsFloat := GclNode.FEndGatherQuantity;
  394. cdsBillsGatherEndGatherTotalPrice.AsFloat := GclNode.FEndGatherTotalPrice;
  395. cdsBillsGatherAddDealQuantity.AsFloat := GclNode.FAddDealQuantity;
  396. cdsBillsGatherAddDealTotalPrice.AsFloat := GclNode.FAddDealTotalPrice;
  397. cdsBillsGatherAddQcQuantity.AsFloat := GclNode.FAddQcQuantity;
  398. cdsBillsGatherAddQcTotalPrice.AsFloat := GclNode.FAddQcTotalPrice;
  399. cdsBillsGatherAddPcQuantity.AsFloat := GclNode.FAddPcQuantity;
  400. cdsBillsGatherAddPcTotalPrice.AsFloat := GclNode.FAddPcTotalPrice;
  401. cdsBillsGatherAddGatherQuantity.AsFloat := GclNode.FAddGatherQuantity;
  402. cdsBillsGatherAddGatherTotalPrice.AsFloat := GclNode.FAddGatherTotalPrice;
  403. if (GclNode.FTotalPrice + GclNode.FBGLTotalPrice) <> 0 then
  404. cdsBillsGatherCompletionRate.AsFloat := AdvRoundTo(
  405. GclNode.FEndGatherTotalPrice/(GclNode.FTotalPrice + GclNode.FBGLTotalPrice)*100);
  406. cdsBillsGather.Post;
  407. end;
  408. end;
  409. procedure TBillsGatherData.FilterDealBills;
  410. var
  411. iIndex: Integer;
  412. Rec: TsdDataRecord;
  413. GclNode: TGclNode;
  414. begin
  415. with TProjectData(FProjectData).DealBillsData do
  416. for iIndex := 0 to sddDealBills.RecordCount - 1 do
  417. begin
  418. Rec := sddDealBills.Records[iIndex];
  419. GclNode := GetGclNode(Rec);
  420. GclNode.FDealQuantity := GclNode.FDealQuantity + Rec.ValueByName('Quantity').AsFloat;
  421. GclNode.FDealTotalPrice := GclNode.FDealTotalPrice + Rec.ValueByName('TotalPrice').AsFloat;
  422. end;
  423. end;
  424. function TBillsGatherData.GetGclNode(ARec: TsdDataRecord): TGclNode;
  425. procedure LoadBGLData(AGclNode: TGclNode);
  426. begin
  427. with TProjectData(FProjectData).BGLData do
  428. begin
  429. cdsBGBills.First;
  430. while not cdsBGBills.Eof do
  431. begin
  432. if SameText(AGclNode.FB_Code, cdsBGBillsB_Code.AsString) and
  433. SameText(AGclNode.FName, Trim(cdsBGBillsName.AsString)) and
  434. SameText(AGclNode.FUnits, cdsBGBillsUnits.AsString) and
  435. (AGclNode.FPrice = cdsBGBillsPrice.AsFloat) then
  436. begin
  437. AGclNode.FBGLQuantity := AGclNode.FBGLQuantity + cdsBGBillsQuantity.AsFloat;
  438. AGclNode.FBGLTotalPrice := AGclNode.FBGLTotalPrice + cdsBGBillsTotalPrice.AsFloat;
  439. end;
  440. cdsBGBills.Next;
  441. end;
  442. end;
  443. end;
  444. function CreateGclNode: TGclNode;
  445. begin
  446. Result := TGclNode.Create;
  447. FGclList.Add(Result);
  448. Result.FB_Code := ARec.ValueByName('B_Code').AsString;
  449. Result.FIndexCode := B_CodeToIndexCode(ARec.ValueByName('B_Code').AsString);
  450. Result.FName := Trim(ARec.ValueByName('Name').AsString);
  451. Result.FUnits := ARec.ValueByName('Units').AsString;
  452. Result.FPrice := ARec.ValueByName('Price').AsFloat;
  453. if Assigned(ARec.ValueByName('NewPrice')) then
  454. Result.FNewPrice := ARec.ValueByName('NewPrice').AsFloat
  455. else
  456. Result.FNewPrice := 0;
  457. LoadBGLData(Result);
  458. end;
  459. var
  460. I: Integer;
  461. GclNode: TGclNode;
  462. begin
  463. Result := nil;
  464. for I := 0 to FGclList.Count - 1 do
  465. begin
  466. GclNode := TGclNode(FGclList.Items[I]);
  467. if SameText(GclNode.FB_Code, ARec.ValueByName('B_Code').AsString) and
  468. SameText(GclNode.FName, Trim(ARec.ValueByName('Name').AsString)) and
  469. SameText(GclNode.FUnits, ARec.ValueByName('Units').AsString) and
  470. (PriceRoundTo(GclNode.FPrice - ARec.ValueByName('Price').AsFloat) = 0) then
  471. begin
  472. Result := GclNode;
  473. Break;
  474. end;
  475. end;
  476. if not Assigned(Result) then
  477. Result := CreateGclNode;
  478. end;
  479. end.