rmGcl_XmjBillsDm.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. unit rmGcl_XmjBillsDm;
  2. interface
  3. uses
  4. SysUtils, Classes, ProjectData, DB, DBClient, sdIDTree, sdDB;
  5. type
  6. {-----------------------------
  7. gxtTopGcl: 汇总方式默认,写入方式:工程量清单1&其所属全部项目节, 工程量清单2&其所属全部项目节, ...;
  8. 示例: 202-1 456
  9. 1-1 123
  10. 1-2 333
  11. 203-1 222
  12. 1-1 120
  13. 1-2 102
  14. gxtFlowGcl: 汇总方式默认,写入方式:工程量清单1所属全部项目节, 工程量清单2所属全部项目节, ...;
  15. 示例: 202-1 1-1 123
  16. 202-1 1-2 333
  17. 203-1 1-1 120
  18. 203-1 1-1 102
  19. gxtWithoutXmj: 同gxtTopGcl,完成后过滤所有清单编号为空的节点
  20. 示例: 202-1 456
  21. 203-1 222
  22. -----------------------------}
  23. TGXType = (gxtTopGcl, gxtFlowGcl, gxtWithoutXmj);
  24. TXmjNode = class
  25. private
  26. FCode: string;
  27. FName: string;
  28. FUnits: string;
  29. FOrgQuantity: Double;
  30. FOrgTotalPrice: Double;
  31. FMisQuantity: Double;
  32. FMisTotalPrice: Double;
  33. FOthQuantity: Double;
  34. FOthTotalPrice: Double;
  35. FQuantity: Double;
  36. FTotalPrice: Double;
  37. FDrawingCode: string;
  38. FPeg: string;
  39. FNameDanWei: string;
  40. FNameFenBu: string;
  41. FNameFenXiang: string;
  42. FNameUnit: string;
  43. FPosition: string;
  44. end;
  45. TGclNode = class
  46. private
  47. FB_Code: string;
  48. FIndexCode: string;
  49. FName: string;
  50. FUnits: string;
  51. FPrice: Double;
  52. FNewPrice: Double;
  53. FDealQuantity: Double;
  54. FDealTotalPrice: Double;
  55. FOrgQuantity: Double;
  56. FOrgTotalPrice: Double;
  57. FMisQuantity: Double;
  58. FMisTotalPrice: Double;
  59. FOthQuantity: Double;
  60. FOthTotalPrice: Double;
  61. FQuantity: Double;
  62. FTotalPrice: Double;
  63. FXmjList: TList;
  64. function FindXmjNode(ANode: TsdIDTreeNode): TXmjNode;
  65. function NewXmjNode(ANode, APeg: TsdIDTreeNode): TXmjNode;
  66. function GetXmjCount: Integer;
  67. function GetXmjNode(AIndex: Integer): TXmjNode;
  68. public
  69. constructor Create;
  70. destructor Destroy; override;
  71. function AddXmjNode(ANode, APeg: TsdIDTreeNode): TXmjNode;
  72. property XmjCount: Integer read GetXmjCount;
  73. property XmjNode[AIndex: Integer]: TXmjNode read GetXmjNode;
  74. end;
  75. TrmGcl_XmjBillsData = class(TDataModule)
  76. cdsGcl: TClientDataSet;
  77. cdsGclIndexCode: TStringField;
  78. cdsGclIndexID: TIntegerField;
  79. cdsGclB_Code: TStringField;
  80. cdsGclName: TWideStringField;
  81. cdsGclCode: TStringField;
  82. cdsGclPeg: TWideStringField;
  83. cdsGclNameDanWei: TWideStringField;
  84. cdsGclNameFenBu: TWideStringField;
  85. cdsGclNameFenXiang: TWideStringField;
  86. cdsGclNameUnit: TWideStringField;
  87. cdsGclDrawingCode: TWideStringField;
  88. cdsGclPrice: TFloatField;
  89. cdsGclQuantity: TFloatField;
  90. cdsGclTotalPrice: TFloatField;
  91. cdsGclDealQuantity: TFloatField;
  92. cdsGclDealTotalPrice: TFloatField;
  93. cdsGclDifferQuantity: TFloatField;
  94. cdsGclDifferTotalPrice: TFloatField;
  95. cdsGclUnits: TWideStringField;
  96. cdsGclNewPrice: TFloatField;
  97. cdsGclPosition: TWideStringField;
  98. cdsGclOrgQuantity: TFloatField;
  99. cdsGclOrgTotalPrice: TFloatField;
  100. cdsGclMisQuantity: TFloatField;
  101. cdsGclMisTotalPrice: TFloatField;
  102. cdsGclOthQuantity: TFloatField;
  103. cdsGclOthTotalPrice: TFloatField;
  104. private
  105. FProjectData: TProjectData;
  106. FGclList: TList;
  107. FIndex: Integer;
  108. FGXType: TGXType;
  109. procedure BeforeOperation;
  110. procedure AfterOperation;
  111. procedure AddRelaLeafXmj(AGclNode: TGclNode; ARec: TsdDataRecord);
  112. function GetGclNode(ARec: TsdDataRecord): TGclNode;
  113. procedure FilterGclBills(ANode: TsdIDTreeNode);
  114. procedure FilterBills(ANode: TsdIDTreeNode);
  115. procedure FilterDealBills;
  116. procedure WriteXmjNode(AGclNode: TGclNode);
  117. procedure WriteGclNode(AGclNode: TGclNode);
  118. procedure WriteTopGclTypeData;
  119. procedure WriteFlowGclNode(AGclNode: TGclNode);
  120. procedure WriteFlowGclTypeData;
  121. procedure WriteData;
  122. public
  123. function AssignData(AProjectData: TProjectData; AGXType: TGXType): TDataSet;
  124. end;
  125. implementation
  126. uses
  127. ZhAPI, UtilMethods;
  128. {$R *.dfm}
  129. { TGclNode }
  130. constructor TGclNode.Create;
  131. begin
  132. FXmjList := TList.Create;
  133. end;
  134. destructor TGclNode.Destroy;
  135. begin
  136. ClearObjects(FXmjList);
  137. FXmjList.Free;
  138. inherited;
  139. end;
  140. function TGclNode.FindXmjNode(ANode: TsdIDTreeNode): TXmjNode;
  141. var
  142. i: Integer;
  143. begin
  144. Result := nil;
  145. for i := 0 to XmjCount - 1 do
  146. begin
  147. if SameText(XmjNode[i].FCode, ANode.Rec.ValueByName('Code').AsString) and
  148. SameText(XmjNode[i].FName, ANode.Rec.ValueByName('Name').AsString) and
  149. SameText(XmjNode[i].FUnits, ANode.Rec.ValueByName('Units').AsString) then
  150. begin
  151. Result := XmjNode[i];
  152. Break;
  153. end;
  154. end;
  155. end;
  156. function TGclNode.AddXmjNode(
  157. ANode, APeg: TsdIDTreeNode): TXmjNode;
  158. begin
  159. Result := FindXmjNode(ANode);
  160. if not Assigned(Result) then
  161. Result := NewXmjNode(ANode, APeg);
  162. end;
  163. function TGclNode.GetXmjCount: Integer;
  164. begin
  165. Result := FXmjList.Count;
  166. end;
  167. function TGclNode.GetXmjNode(AIndex: Integer): TXmjNode;
  168. begin
  169. Result := TXmjNode(FXmjList.Items[AIndex]);
  170. end;
  171. function TGclNode.NewXmjNode(
  172. ANode, APeg: TsdIDTreeNode): TXmjNode;
  173. function GetPegName(APegNode: TsdIDTreeNode): string;
  174. begin
  175. if Assigned(APegNode) then
  176. Result := APegNode.Rec.ValueByName('Name').AsString
  177. else
  178. Result := '';
  179. end;
  180. // 取树结构的第ALevel层节点的名称(level从0开始)
  181. function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;
  182. begin
  183. Result := '';
  184. if not Assigned(ANode) then Exit;
  185. if ANode.Level = ALevel then
  186. Result := ANode.Rec.ValueByName('Name').AsString
  187. else if ANode.Level > ALevel then
  188. Result := GetNameByLevel(ANode.Parent, ALevel);
  189. end;
  190. function GetNameDanWei(ANode: TsdIDTreeNode): string;
  191. begin
  192. // 取树结构的第二层节点的名称
  193. Result := GetNameByLevel(ANode, 1);
  194. end;
  195. // ANode为计量单元节点,APegNode为桩号节点
  196. function GetNameFenBu(ANode, APegNode: TsdIDTreeNode): string;
  197. var
  198. vCurNode: TsdIDTreeNode;
  199. begin
  200. // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
  201. if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
  202. // 取树结构的第三层节点的名称
  203. Result := GetNameByLevel(ANode, 2)
  204. // 否则,取桩号节点的子节点的名称
  205. else
  206. begin
  207. vCurNode := ANode;
  208. while vCurNode.Level > APegNode.Level + 1 do
  209. vCurNode := vCurNode.Parent;
  210. Result := vCurNode.Rec.ValueByName('Name').AsString;
  211. end;
  212. end;
  213. function GetNameFenXiang(ANode, APegNode: TsdIDTreeNode): string;
  214. var
  215. iTopLevel: Integer;
  216. vCurNode: TsdIDTreeNode;
  217. begin
  218. if Assigned(APegNode) then
  219. begin
  220. iTopLevel := 3;
  221. if APegNode.ID <> ANode.ID then
  222. iTopLevel := APegNode.Level + 2;
  223. Result := '';
  224. vCurNode := ANode.Parent;
  225. while vCurNode.Level >= iTopLevel do
  226. begin
  227. Result := vCurNode.Rec.ValueByName('Name').AsString + ';' + Result;
  228. vCurNode := vCurNode.Parent;
  229. end;
  230. end
  231. else
  232. Result := GetNameByLevel(ANode, 3);
  233. end;
  234. function GetNameUnit(ANode: TsdIDTreeNode): string;
  235. begin
  236. Result := ANode.Rec.ValueByName('Name').AsString;
  237. end;
  238. function GetDrawingCode(ANode: TsdIDTreeNode): string;
  239. begin
  240. Result := '';
  241. if not Assigned(ANode) then Exit;
  242. Result := ANode.Rec.ValueByName('DrawingCode').AsString;
  243. if Result = '' then
  244. Result := GetDrawingCode(ANode.Parent);
  245. end;
  246. function GetPosition(ANode, APegNode: TsdIDTreeNode): string;
  247. begin
  248. // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
  249. if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
  250. // 取分部工程
  251. Result := GetNameFenXiang(ANode, APegNode)
  252. // 反之,取分项工程+计量单元
  253. else
  254. Result := GetNameFenXiang(ANode, APegNode) + GetNameUnit(ANode);
  255. end;
  256. begin
  257. Result := TXmjNode.Create;
  258. FXmjList.Add(Result);
  259. Result.FCode := ANode.Rec.ValueByName('Code').AsString;
  260. Result.FName := ANode.Rec.ValueByName('Name').AsString;
  261. Result.FUnits := ANode.Rec.ValueByName('Units').AsString;
  262. Result.FPeg := GetPegName(APeg);
  263. Result.FNameDanWei := GetNameDanWei(ANode);
  264. Result.FNameFenBu := GetNameFenBu(ANode, APeg);
  265. Result.FNameFenXiang := GetNameFenXiang(ANode, APeg);
  266. Result.FNameUnit := GetNameUnit(ANode);
  267. Result.FPosition := GetPosition(ANode, APeg);
  268. Result.FDrawingCode := GetDrawingCode(ANode);
  269. end;
  270. { TrmGclBillsData }
  271. procedure TrmGcl_XmjBillsData.AddRelaLeafXmj(AGclNode: TGclNode;
  272. ARec: TsdDataRecord);
  273. function GetFirstXmjParent(AID: Integer): TsdIDTreeNode;
  274. begin
  275. with TProjectData(FProjectData).BillsCompileData do
  276. Result := BillsCompileTree.FindNode(AID);
  277. while Assigned(Result) and (Result.Rec.ValueByName('B_Code').AsString <> '') do
  278. Result := Result.Parent;
  279. end;
  280. function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  281. begin
  282. Result := nil;
  283. if not Assigned(ANode) then Exit;
  284. if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then
  285. Result := ANode
  286. else
  287. Result := GetPegNode(ANode.Parent);
  288. end;
  289. var
  290. vNode, vPeg: TsdIDTreeNode;
  291. XmjNode: TXmjNode;
  292. begin
  293. vNode := GetFirstXmjParent(ARec.ValueByName('ID').AsInteger);
  294. if not Assigned(vNode) then Exit;
  295. vPeg := GetPegNode(vNode);
  296. XmjNode := AGclNode.AddXmjNode(vNode, vPeg);
  297. XmjNode.FOrgQuantity := XmjNode.FOrgQuantity + ARec.ValueByName('OrgQuantity').AsFloat;
  298. XmjNode.FOrgTotalPrice := XmjNode.FOrgTotalPrice + ARec.ValueByName('OrgTotalPrice').AsFloat;
  299. XmjNode.FMisQuantity := XmjNode.FMisQuantity + ARec.ValueByName('MisQuantity').AsFloat;
  300. XmjNode.FMisTotalPrice := XmjNode.FMisTotalPrice + ARec.ValueByName('MisTotalPrice').AsFloat;
  301. XmjNode.FOthQuantity := XmjNode.FOthQuantity + ARec.ValueByName('OthQuantity').AsFloat;
  302. XmjNode.FOthTotalPrice := XmjNode.FOthTotalPrice + ARec.ValueByName('OthTotalPrice').AsFloat;
  303. XmjNode.FQuantity := XmjNode.FQuantity + ARec.ValueByName('Quantity').AsFloat;
  304. XmjNode.FTotalPrice := XmjNode.FTotalPrice + ARec.ValueByName('TotalPrice').AsFloat;
  305. end;
  306. procedure TrmGcl_XmjBillsData.AfterOperation;
  307. begin
  308. ClearObjects(FGclList);
  309. FGclList.Free;
  310. if FGXType = gxtWithoutXmj then
  311. begin
  312. cdsGcl.Filter := 'B_Code <> ''''';
  313. cdsGcl.Filtered := True;
  314. end;
  315. cdsGcl.IndexFieldNames := 'IndexCode;IndexID';
  316. end;
  317. function TrmGcl_XmjBillsData.AssignData(
  318. AProjectData: TProjectData; AGXType: TGXType): TDataSet;
  319. begin
  320. FGXType := AGXType;
  321. BeforeOperation;
  322. try
  323. FProjectData := AProjectData;
  324. FilterBills(AProjectData.BillsCompileData.BillsCompileTree.FirstNode);
  325. FilterDealBills;
  326. WriteData;
  327. finally
  328. AfterOperation;
  329. Result := cdsGcl;
  330. end;
  331. end;
  332. procedure TrmGcl_XmjBillsData.BeforeOperation;
  333. begin
  334. FGclList := TList.Create;
  335. cdsGcl.Active := True;
  336. cdsGcl.Filtered := False;
  337. cdsGcl.EmptyDataSet;
  338. end;
  339. procedure TrmGcl_XmjBillsData.FilterBills(ANode: TsdIDTreeNode);
  340. begin
  341. if not Assigned(ANode) then Exit;
  342. if ANode.HasChildren then
  343. FilterBills(ANode.FirstChild)
  344. else
  345. FilterGclBills(ANode);
  346. FilterBills(ANode.NextSibling);
  347. end;
  348. procedure TrmGcl_XmjBillsData.FilterDealBills;
  349. var
  350. iIndex: Integer;
  351. Rec: TsdDataRecord;
  352. GclNode: TGclNode;
  353. begin
  354. with FProjectData.DealBillsData do
  355. for iIndex := 0 to sddDealBills.RecordCount - 1 do
  356. begin
  357. Rec := sddDealBills.Records[iIndex];
  358. GclNode := GetGclNode(Rec);
  359. GclNode.FDealQuantity := GclNode.FDealQuantity + Rec.ValueByName('Quantity').AsFloat;
  360. GclNode.FDealTotalPrice := GclNode.FDealTotalPrice + Rec.ValueByName('TotalPrice').AsFloat;
  361. end;
  362. end;
  363. procedure TrmGcl_XmjBillsData.FilterGclBills(ANode: TsdIDTreeNode);
  364. var
  365. Rec: TsdDataRecord;
  366. GclNode: TGclNode;
  367. begin
  368. if not Assigned(ANode) then Exit;
  369. Rec := ANode.Rec;
  370. if Rec.ValueByName('B_Code').AsString = '' then Exit;
  371. GclNode := GetGclNode(Rec);
  372. GclNode.FOrgQuantity := GclNode.FOrgQuantity + Rec.ValueByName('OrgQuantity').AsFloat;
  373. GclNode.FOrgTotalPrice := GclNode.FOrgTotalPrice + Rec.ValueByName('OrgTotalPrice').AsFloat;
  374. GclNode.FMisQuantity := GclNode.FMisQuantity + Rec.ValueByName('MisQuantity').AsFloat;
  375. GclNode.FMisTotalPrice := GclNode.FMisTotalPrice + Rec.ValueByName('MisTotalPrice').AsFloat;
  376. GclNode.FOthQuantity := GclNode.FOthQuantity + Rec.ValueByName('OthQuantity').AsFloat;
  377. GclNode.FOthTotalPrice := GclNode.FOthTotalPrice + Rec.ValueByName('OthTotalPrice').AsFloat;
  378. GclNode.FQuantity := GclNode.FQuantity + Rec.ValueByName('Quantity').AsFloat;
  379. GclNode.FTotalPrice := GclNode.FTotalPrice + Rec.ValueByName('TotalPrice').AsFloat;
  380. AddRelaLeafXmj(GclNode, Rec);
  381. end;
  382. function TrmGcl_XmjBillsData.GetGclNode(ARec: TsdDataRecord): TGclNode;
  383. function CreateGclNode: TGclNode;
  384. begin
  385. Result := TGclNode.Create;
  386. FGclList.Add(Result);
  387. Result.FB_Code := ARec.ValueByName('B_Code').AsString;
  388. Result.FIndexCode := B_CodeToIndexCode(ARec.ValueByName('B_Code').AsString);
  389. Result.FName := Trim(ARec.ValueByName('Name').AsString);
  390. Result.FUnits := ARec.ValueByName('Units').AsString;
  391. Result.FPrice := ARec.ValueByName('Price').AsFloat;
  392. if Assigned(ARec.ValueByName('NewPrice')) then
  393. Result.FNewPrice := ARec.ValueByName('NewPrice').AsFloat
  394. else
  395. Result.FNewPrice := 0;
  396. end;
  397. var
  398. I: Integer;
  399. GclNode: TGclNode;
  400. begin
  401. Result := nil;
  402. for I := 0 to FGclList.Count - 1 do
  403. begin
  404. GclNode := TGclNode(FGclList.Items[I]);
  405. if SameText(GclNode.FB_Code, ARec.ValueByName('B_Code').AsString) and
  406. SameText(GclNode.FName, Trim(ARec.ValueByName('Name').AsString)) and
  407. SameText(GclNode.FUnits, ARec.ValueByName('Units').AsString) and
  408. (GclNode.FPrice = ARec.ValueByName('Price').AsFloat) then
  409. begin
  410. Result := GclNode;
  411. Break;
  412. end;
  413. end;
  414. if not Assigned(Result) then
  415. Result := CreateGclNode;
  416. end;
  417. procedure TrmGcl_XmjBillsData.WriteData;
  418. begin
  419. case FGXType of
  420. gxtTopGcl, gxtWithoutXmj: WriteTopGclTypeData;
  421. gxtFlowGcl: WriteFlowGclTypeData;
  422. end;
  423. end;
  424. procedure TrmGcl_XmjBillsData.WriteFlowGclNode(AGclNode: TGclNode);
  425. var
  426. i: Integer;
  427. XmjNode: TXmjNode;
  428. begin
  429. for i := 0 to AGclNode.XmjCount - 1 do
  430. begin
  431. XmjNode := AGclNode.XmjNode[i];
  432. cdsGcl.Append;
  433. cdsGclIndexCode.AsString := AGclNode.FIndexCode;
  434. cdsGclIndexID.AsInteger := i+1;
  435. cdsGclB_Code.AsString := AGclNode.FB_Code;
  436. cdsGclName.AsString := AGclNode.FName;
  437. cdsGclUnits.AsString := AGclNode.FUnits;
  438. cdsGclPrice.AsFloat := AGclNode.FPrice;
  439. cdsGclNewPrice.AsFloat := AGclNode.FNewPrice;
  440. cdsGclCode.AsString := XmjNode.FCode;
  441. cdsGclPeg.AsString := XmjNode.FPeg;
  442. cdsGclNameDanWei.AsString := XmjNode.FNameDanWei;
  443. cdsGclNameFenBu.AsString := XmjNode.FNameFenBu;
  444. cdsGclNameFenXiang.AsString := XmjNode.FNameFenXiang;
  445. cdsGclNameUnit.AsString := XmjNode.FNameUnit;
  446. cdsGclDrawingCode.AsString := XmjNode.FDrawingCode;
  447. cdsGclPosition.AsString := XmjNode.FPosition;
  448. cdsGclOrgQuantity.AsFloat := XmjNode.FOrgQuantity;
  449. cdsGclOrgTotalPrice.AsFloat := XmjNode.FOrgTotalPrice;
  450. cdsGclMisQuantity.AsFloat := XmjNode.FMisQuantity;
  451. cdsGclMisTotalPrice.AsFloat := XmjNode.FMisTotalPrice;
  452. cdsGclOthQuantity.AsFloat := XmjNode.FOthQuantity;
  453. cdsGclOthTotalPrice.AsFloat := XmjNode.FOthTotalPrice;
  454. cdsGclQuantity.AsFloat := XmjNode.FQuantity;
  455. cdsGclTotalPrice.AsFloat := XmjNode.FTotalPrice;
  456. cdsGcl.Post;
  457. end;
  458. end;
  459. procedure TrmGcl_XmjBillsData.WriteFlowGclTypeData;
  460. var
  461. i: Integer;
  462. begin
  463. FIndex := 0;
  464. for i := 0 to FGclList.Count - 1 do
  465. WriteFlowGclNode(TGclNode(FGclList.Items[i]));
  466. end;
  467. procedure TrmGcl_XmjBillsData.WriteGclNode(
  468. AGclNode: TGclNode);
  469. var
  470. i: Integer;
  471. begin
  472. cdsGcl.Append;
  473. cdsGclIndexCode.AsString := AGclNode.FIndexCode;
  474. cdsGclIndexID.AsInteger := 0;
  475. cdsGclB_Code.AsString := AGclNode.FB_Code;
  476. cdsGclName.AsString := AGclNode.FName;
  477. cdsGclUnits.AsString := AGclNode.FUnits;
  478. cdsGclPrice.AsFloat := AGclNode.FPrice;
  479. cdsGclNewPrice.AsFloat := AGclNode.FNewPrice;
  480. cdsGclQuantity.AsFloat := AGclNode.FQuantity;
  481. cdsGclTotalPrice.AsFloat := AGclNode.FTotalPrice;
  482. cdsGclDealQuantity.AsFloat := AGclNode.FDealQuantity;
  483. cdsGclDealTotalPrice.AsFloat := AGclNode.FDealTotalPrice;
  484. cdsGclDifferQuantity.AsFloat := AGclNode.FDealQuantity - AGclNode.FQuantity;
  485. cdsGclDifferTotalPrice.AsFloat := AGclNode.FDealTotalPrice - AGclNode.FTotalPrice;
  486. cdsGclOrgQuantity.AsFloat := AGclNode.FOrgQuantity;
  487. cdsGclOrgTotalPrice.AsFloat := AGclNode.FOrgTotalPrice;
  488. cdsGclMisQuantity.AsFloat := AGclNode.FMisQuantity;
  489. cdsGclMisTotalPrice.AsFloat := AGclNode.FMisTotalPrice;
  490. cdsGclOthQuantity.AsFloat := AGclNode.FOthQuantity;
  491. cdsGclOthTotalPrice.AsFloat := AGclNode.FOthTotalPrice;
  492. cdsGcl.Post;
  493. WriteXmjNode(AGclNode);
  494. end;
  495. procedure TrmGcl_XmjBillsData.WriteTopGclTypeData;
  496. var
  497. i: Integer;
  498. begin
  499. FIndex := 0;
  500. for i := 0 to FGclList.Count - 1 do
  501. WriteGclNode(TGclNode(FGclList.Items[i]));
  502. end;
  503. procedure TrmGcl_XmjBillsData.WriteXmjNode(
  504. AGclNode: TGclNode);
  505. var
  506. i: Integer;
  507. XmjNode: TXmjNode;
  508. begin
  509. for i := 0 to AGclNode.XmjCount - 1 do
  510. begin
  511. XmjNode := AGclNode.XmjNode[i];
  512. cdsGcl.Append;
  513. cdsGclIndexCode.AsString := AGclNode.FIndexCode;
  514. cdsGclIndexID.AsInteger := FIndex;
  515. cdsGclCode.AsString := XmjNode.FCode;
  516. cdsGclPeg.AsString := XmjNode.FPeg;
  517. cdsGclNameDanWei.AsString := XmjNode.FNameDanWei;
  518. cdsGclNameFenBu.AsString := XmjNode.FNameFenBu;
  519. cdsGclNameFenXiang.AsString := XmjNode.FNameFenXiang;
  520. cdsGclNameUnit.AsString := XmjNode.FNameUnit;
  521. cdsGclPosition.AsString := XmjNode.FPosition;
  522. cdsGclDrawingCode.AsString := XmjNode.FDrawingCode;
  523. cdsGclOrgQuantity.AsFloat := XmjNode.FOrgQuantity;
  524. cdsGclOrgTotalPrice.AsFloat := XmjNode.FOrgTotalPrice;
  525. cdsGclMisQuantity.AsFloat := XmjNode.FMisQuantity;
  526. cdsGclMisTotalPrice.AsFloat := XmjNode.FMisTotalPrice;
  527. cdsGclOthQuantity.AsFloat := XmjNode.FOthQuantity;
  528. cdsGclOthTotalPrice.AsFloat := XmjNode.FOthTotalPrice;
  529. cdsGclQuantity.AsFloat := XmjNode.FQuantity;
  530. cdsGclTotalPrice.AsFloat := XmjNode.FTotalPrice;
  531. cdsGcl.Post;
  532. Inc(FIndex);
  533. end;
  534. end;
  535. end.