rmMentalCustomized1Dm.pas 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. unit rmMentalCustomized1Dm;
  2. // 工程量清单章级汇总表 -- 交叉表
  3. // 先统计各项目中,各章级清单的金额,然后汇总
  4. // 甘肃--高管局定制 -- 严禁任何其他项目使用该单元结果。
  5. interface
  6. uses
  7. SysUtils, Classes, DB, DBClient, ZhAPI, rmSelectProjectFrm,
  8. ProjectData, sdDB, UtilMethods, sdIDTree;
  9. type
  10. {Custom1}
  11. TTP_Record = record
  12. FTotalPrice: Double;
  13. FAddQcTotalPrice: Double;
  14. FAddGatherTotalPrice: Double;
  15. end;
  16. TChapterGcl = array [1..9] of Double;
  17. TProjectChapterGcl = class
  18. private
  19. FProjectName: string;
  20. FTotalPrice: TChapterGcl;
  21. FAddQcTotalPrice: TChapterGcl;
  22. FAddGatherTotalPrice: TChapterGcl;
  23. function GetTotalPrice(AIndex: Integer): Double;
  24. procedure SetTotalPrice(AIndex: Integer; const Value: Double);
  25. function GetAddGatherTotalPrice(AIndex: Integer): Double;
  26. function GetAddQcTotalPrice(AIndex: Integer): Double;
  27. procedure SetAddGatherTotalPrice(AIndex: Integer; const Value: Double);
  28. procedure SetAddQcTotalPrice(AIndex: Integer; const Value: Double);
  29. function GetCompletePercent(AIndex: Integer): Double;
  30. function GetChapterTotal: Double;
  31. function GetTempTotal: Double;
  32. function GetBidPrice: Double;
  33. function GetAG_ChapterTotal: Double;
  34. function GetAG_TempTotal: Double;
  35. function GetAG_BidPrice: Double;
  36. function GetAQ_ChapterTotal: Double;
  37. function GetAQ_TempTotal: Double;
  38. function GetAQ_BidPrice: Double;
  39. function GetCT_CompletePercent: Double;
  40. function GetBP_CompletePercent: Double;
  41. function GetTT_CompletePercent: Double;
  42. public
  43. constructor Create(const AProjectName: string);
  44. property ProjectName: string read FProjectName;
  45. property TotalPrice[AIndex: Integer]: Double read GetTotalPrice write SetTotalPrice;
  46. property AddQcTotalPrice[AIndex: Integer]: Double read GetAddQcTotalPrice write SetAddQcTotalPrice;
  47. property AddGatherTotalPrice[AIndex: Integer]: Double read GetAddGatherTotalPrice write SetAddGatherTotalPrice;
  48. property CompletePercent[AIndex: Integer]: Double read GetCompletePercent;
  49. property ChapterTotal: Double read GetChapterTotal;
  50. property TempTotal: Double read GetTempTotal;
  51. property BidPrice: Double read GetBidPrice;
  52. property AQ_ChapterTotal: Double read GetAQ_ChapterTotal;
  53. property AQ_TempTotal: Double read GetAQ_TempTotal;
  54. property AQ_BidPrice: Double read GetAQ_BidPrice;
  55. property AG_ChapterTotal: Double read GetAG_ChapterTotal;
  56. property AG_TempTotal: Double read GetAG_TempTotal;
  57. property AG_BidPrice: Double read GetAG_BidPrice;
  58. property CT_CompletePercent: Double read GetCT_CompletePercent;
  59. property TT_CompletePercent: Double read GetTT_CompletePercent;
  60. property BP_CompletePercent: Double read GetBP_CompletePercent;
  61. end;
  62. TChapterGather = class
  63. private
  64. FProjectsChapter: TList;
  65. FTotalChapter: TProjectChapterGcl;
  66. public
  67. constructor Create;
  68. destructor Destroy; override;
  69. function AddProjectChapterGcl(const AProjectName: string): TProjectChapterGcl;
  70. procedure CalcTotal;
  71. end;
  72. {Custom2}
  73. TTender = class
  74. private
  75. FTenderName: string;
  76. FTotalPrice: Double;
  77. FEndGatherTotalPrice: Double;
  78. function GetPercent: Double;
  79. public
  80. constructor Create(ATenderName: string);
  81. property TenderName: string read FTenderName;
  82. property TotalPrice: Double read FTotalPrice write FTotalPrice;
  83. property EndGatherTotalPrice: Double read FEndGatherTotalPrice write FEndGatherTotalPrice;
  84. property Percent: Double read GetPercent;
  85. end;
  86. TTenderClass = class
  87. private
  88. FClassName: string;
  89. FTenders: TList;
  90. function GetPercent: Double;
  91. function GetTotalPrice: Double;
  92. function GetEndGatherTotalPrice: Double;
  93. public
  94. constructor Create(const AClassName: string);
  95. destructor Destroy; override;
  96. function AddTender(const ATenderName: string): TTender;
  97. property TotalPrice: Double read GetTotalPrice;
  98. property EndGatherTotalPrice: Double read GetEndGatherTotalPrice;
  99. property Percent: Double read GetPercent;
  100. end;
  101. TTenderClassList = class
  102. private
  103. FClassList: TList;
  104. function FindTenderClass(const AClassName: string): TTenderClass;
  105. function AddTenderClass(const AClassName: string): TTenderClass;
  106. public
  107. constructor Create;
  108. destructor Destroy; override;
  109. function TenderClass(const AClassName: string): TTenderClass;
  110. end;
  111. TrmMentalCustomized1Data = class(TDataModule)
  112. // 格式1
  113. cdsCustom1: TClientDataSet;
  114. cdsCustom1ProjectID: TIntegerField;
  115. cdsCustom1ProjectName: TWideStringField;
  116. cdsCustom1SerialNo: TIntegerField;
  117. cdsCustom1ChapterID: TWideStringField;
  118. cdsCustom1ChapterName: TWideStringField;
  119. cdsCustom1P_TotalPrice: TFloatField;
  120. cdsCustom1P_AddQcTotalPrice: TFloatField;
  121. cdsCustom1P_AddGatherTotalPrice: TFloatField;
  122. cdsCustom1P_Percent: TFloatField;
  123. cdsCustom1TotalPrice: TFloatField;
  124. cdsCustom1AddQcTotalPrice: TFloatField;
  125. cdsCustom1AddGatherTotalPrice: TFloatField;
  126. cdsCustom1Percent: TFloatField;
  127. // 格式2
  128. cdsCustom2: TClientDataSet;
  129. cdsCustom2ClassID: TIntegerField;
  130. cdsCustom2SerialNo: TFloatField;
  131. cdsCustom2ClassName: TWideStringField;
  132. cdsCustom2TenderName: TWideStringField;
  133. cdsCustom2TotalPrice: TFloatField;
  134. cdsCustom2EndGatherTotalPrice: TFloatField;
  135. cdsCustom2Percent: TFloatField;
  136. private
  137. FMentalType: Integer;
  138. // Custom1
  139. FChapterGather: TChapterGather;
  140. FProjectData: TProjectData;
  141. // Custom2
  142. FClasses: TTenderClassList;
  143. FWriteSerilaNo: Integer;
  144. procedure BeforeGather(AProjects: TList);
  145. procedure AfterGather;
  146. function OpenProjectData(AProject: TSelectProject): TProjectChapterGcl;
  147. procedure FreeProjectData;
  148. function XmjNode(const ACode: string): TsdIDTreeNode;
  149. // 汇总项目节ACode下的所有起始编号为AChapterID的清单金额
  150. function ChapterTotalPrice(const ACode: string; AChapterID: string = ''): TTP_Record;
  151. function B_CodeToChapter(const AB_Code: string): Integer;
  152. procedure GatherGclChapter(AProjectChapter: TProjectChapterGcl);
  153. procedure GatherProject(AProject: TSelectProject);
  154. function TenderClassName(AProjectID: Integer): string;
  155. procedure GatherTenderMainData(AProject: TSelectProject);
  156. procedure CalcuateGather;
  157. procedure GatherData(AProjects: TList);
  158. procedure WriteProjectChapter(AProjectID: Integer; AProject, ATotal: TProjectChapterGcl);
  159. procedure WriteCustomized0;
  160. procedure WriteTenderClass(AClassID: Integer; ATenderClass: TTenderClass);
  161. procedure WriteCustomized1;
  162. procedure WriteData;
  163. public
  164. function AssignData(AProjects: TList): TDataSet;
  165. property MentalType: Integer read FMentalType write FMentalType;
  166. end;
  167. implementation
  168. uses
  169. BillsDm, mDataRecord, Globals, Windows;
  170. {$R *.dfm}
  171. { TrmGclChapterGatherData }
  172. procedure TrmMentalCustomized1Data.AfterGather;
  173. begin
  174. FChapterGather.Free;
  175. cdsCustom1.EnableControls;
  176. cdsCustom1.IndexFieldNames := 'ProjectID;SerialNo';
  177. FClasses.Free;
  178. cdsCustom2.EnableControls;
  179. end;
  180. function TrmMentalCustomized1Data.AssignData(AProjects: TList): TDataSet;
  181. var
  182. iProject: Integer;
  183. SelectProject: TSelectProject;
  184. begin
  185. BeforeGather(AProjects);
  186. try
  187. GatherData(AProjects);
  188. WriteData;
  189. finally
  190. case FMentalType of
  191. 0: Result := cdsCustom1;
  192. 1: Result := cdsCustom2;
  193. end;
  194. AfterGather;
  195. end;
  196. end;
  197. procedure TrmMentalCustomized1Data.BeforeGather(AProjects: TList);
  198. begin
  199. cdsCustom1.DisableControls;
  200. cdsCustom1.Active := True;
  201. cdsCustom1.EmptyDataSet;
  202. FChapterGather := TChapterGather.Create;
  203. cdsCustom2.DisableControls;
  204. cdsCustom2.Active := True;
  205. cdsCustom2.EmptyDataSet;
  206. FClasses := TTenderClassList.Create;
  207. end;
  208. function TrmMentalCustomized1Data.B_CodeToChapter(
  209. const AB_Code: string): Integer;
  210. var
  211. sgs: TStrings;
  212. iFirst, iSecond: Integer;
  213. begin
  214. Result := 0;
  215. sgs := TStringList.Create;
  216. try
  217. sgs.Delimiter := '-';
  218. sgs.DelimitedText := AB_Code;
  219. iFirst := StrToIntDef(sgs.Strings[0], 0);
  220. // X,M表示1-9,其中XMM-M与M-XMM-M同属X章级
  221. if (iFirst < 99) and (sgs.Count > 1) then
  222. begin
  223. iSecond := StrToIntDef(sgs.Strings[1], 0);
  224. Result := Trunc(iSecond/100);
  225. end
  226. else
  227. Result := Trunc(iFirst/100);
  228. finally
  229. sgs.Free;
  230. end;
  231. end;
  232. procedure TrmMentalCustomized1Data.CalcuateGather;
  233. begin
  234. if FMentalType = 0 then
  235. FChapterGather.CalcTotal;
  236. end;
  237. function TrmMentalCustomized1Data.ChapterTotalPrice(const ACode: string;
  238. AChapterID: string): TTP_Record;
  239. var
  240. stnNode, stnChild: TsdIDTreeNode;
  241. iNext, iTotal: Integer;
  242. begin
  243. Result.FTotalPrice := 0;
  244. Result.FAddQcTotalPrice := 0;
  245. Result.FAddGatherTotalPrice := 0;
  246. stnNode := XmjNode(ACode);
  247. if not Assigned(stnNode) then Exit;
  248. stnChild := stnNode.FirstChild;
  249. iNext := 1;
  250. iTotal := stnNode.PosterityCount;
  251. while iNext <= iTotal do
  252. begin
  253. with TBillsRecord(stnChild.Rec) do
  254. if not stnChild.HasChildren and (B_Code.AsString <> '') then
  255. if (AChapterID = '') or (Pos(AChapterID, Trim(B_Code.AsString)) = 1) then
  256. begin
  257. Result.FTotalPrice := Result.FTotalPrice + TotalPrice.AsFloat;
  258. Result.FAddQcTotalPrice := Result.FAddQcTotalPrice + AddQcTotalPrice.AsFloat;
  259. Result.FAddGatherTotalPrice := Result.FAddGatherTotalPrice + AddGatherTotalPrice.AsFloat;
  260. end;
  261. Inc(iNext);
  262. stnChild := stnChild.NextNode;
  263. end;
  264. end;
  265. procedure TrmMentalCustomized1Data.FreeProjectData;
  266. begin
  267. if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then
  268. FProjectData.Free;
  269. end;
  270. procedure TrmMentalCustomized1Data.GatherData(AProjects: TList);
  271. var
  272. iProject: Integer;
  273. begin
  274. for iProject := 0 to AProjects.Count - 1 do
  275. if MentalType = 0 then
  276. GatherProject(TSelectProject(AProjects.Items[iProject]))
  277. else
  278. GatherTenderMainData(TSelectProject(AProjects.Items[iProject]));
  279. CalcuateGather;
  280. end;
  281. procedure TrmMentalCustomized1Data.GatherGclChapter(
  282. AProjectChapter: TProjectChapterGcl);
  283. procedure GatherChapter(AChapterID: Integer; const ACode: string; ASearchChapter: string = '');
  284. var
  285. CalcRecord: TTP_Record;
  286. begin
  287. CalcRecord := ChapterTotalPrice(ACode, ASearchChapter);
  288. AProjectChapter.TotalPrice[AChapterID] :=
  289. AProjectChapter.TotalPrice[AChapterID] + CalcRecord.FTotalPrice;
  290. AProjectChapter.AddQcTotalPrice[AChapterID] :=
  291. AProjectChapter.AddQcTotalPrice[AChapterID] + CalcRecord.FAddQcTotalPrice;
  292. AProjectChapter.AddGatherTotalPrice[AChapterID] :=
  293. AProjectChapter.AddGatherTotalPrice[AChapterID] + CalcRecord.FAddGatherTotalPrice;
  294. end;
  295. begin
  296. // 1-1下的全部清单为100章
  297. GatherChapter(1, '1-1', '');
  298. // 1-2下的全部清单为200章
  299. GatherChapter(2, '1-2', '');
  300. // 1-3下的全部清单为300章
  301. GatherChapter(3, '1-3', '');
  302. // 1-4下的全部清单为400章
  303. GatherChapter(4, '1-4', '');
  304. // 1-5、1-6下的全部清单为500章
  305. GatherChapter(5, '1-5', '');
  306. GatherChapter(5, '1-6', '');
  307. // 1-7下【清单编号以6开头】的全部清单为600章
  308. GatherChapter(6, '1-7', '6');
  309. // 1-7下【清单编号以2、8开头】的全部清单为600章
  310. GatherChapter(8, '1-7', '2');
  311. GatherChapter(8, '1-7', '8');
  312. // 1-8下的全部清单为800章
  313. GatherChapter(7, '1-8', '');
  314. // 1-9下的全部清单为900章
  315. GatherChapter(9, '1-9', '');
  316. end;
  317. procedure TrmMentalCustomized1Data.GatherProject(AProject: TSelectProject);
  318. var
  319. ProjectChapter: TProjectChapterGcl;
  320. begin
  321. ProjectChapter := OpenProjectData(AProject);
  322. try
  323. GatherGclChapter(ProjectChapter);
  324. finally
  325. FreeProjectData;
  326. end;
  327. end;
  328. procedure TrmMentalCustomized1Data.GatherTenderMainData(
  329. AProject: TSelectProject);
  330. var
  331. TenderClass: TTenderClass;
  332. Rec: TsdDataRecord;
  333. Tender: TTender;
  334. begin
  335. TenderClass := FClasses.TenderClass(TenderClassName(AProject.ProjectID));
  336. Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProject.ProjectID);
  337. Tender := TenderClass.AddTender(Rec.ValueByName('Name').AsString);
  338. Tender.TotalPrice := Rec.ValueByName('DealTotalPrice').AsFloat;
  339. Tender.EndGatherTotalPrice := Rec.ValueByName('EndTotalPrice').AsFloat;
  340. end;
  341. function TrmMentalCustomized1Data.OpenProjectData(
  342. AProject: TSelectProject): TProjectChapterGcl;
  343. var
  344. Rec: TsdDataRecord;
  345. begin
  346. FProjectData := OpenProjectManager.FindProjectData(AProject.ProjectID);
  347. Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProject.ProjectID);
  348. if not Assigned(FProjectData) then
  349. begin
  350. FProjectData := TProjectData.Create;
  351. FProjectData.OpenForReport(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);
  352. end;
  353. Result := FChapterGather.AddProjectChapterGcl(Rec.ValueByName('Name').AsString);
  354. end;
  355. function TrmMentalCustomized1Data.TenderClassName(
  356. AProjectID: Integer): string;
  357. var
  358. vNode: TsdIDTreeNode;
  359. begin
  360. Result := '';
  361. vNode := ProjectManager.ProjectsTree.FindNode(AProjectID);
  362. if not Assigned(vNode) then Exit;
  363. while Assigned(vNode.Parent) do
  364. vNode := vNode.Parent;
  365. Result := vNode.Rec.ValueByName('Name').AsString;
  366. end;
  367. procedure TrmMentalCustomized1Data.WriteCustomized0;
  368. var
  369. iProject: Integer;
  370. ProjectChapter: TProjectChapterGcl;
  371. begin
  372. for iProject := 0 to FChapterGather.FProjectsChapter.Count - 1 do
  373. begin
  374. ProjectChapter := TProjectChapterGcl(FChapterGather.FProjectsChapter.Items[iProject]);
  375. WriteProjectChapter(iProject, ProjectChapter, FChapterGather.FTotalChapter);
  376. end;
  377. end;
  378. procedure TrmMentalCustomized1Data.WriteCustomized1;
  379. var
  380. iClass: Integer;
  381. begin
  382. FWriteSerilaNo := 1;
  383. for iClass := 0 to FClasses.FClassList.Count - 1 do
  384. WriteTenderClass(iClass, TTenderClass(FClasses.FClassList.Items[iClass]));
  385. end;
  386. procedure TrmMentalCustomized1Data.WriteData;
  387. begin
  388. case FMentalType of
  389. 0: WriteCustomized0;
  390. 1: WriteCustomized1;
  391. end;
  392. end;
  393. procedure TrmMentalCustomized1Data.WriteProjectChapter(
  394. AProjectID: Integer; AProject, ATotal: TProjectChapterGcl);
  395. const
  396. SChapterID: array [1..12] of string = ('100', '200', '300', '400',
  397. '500', '600', '700', '800', '900', '', '', '');
  398. SChapterName: array [1..12] of string = ('总则', '路基', '路面', '桥梁、涵洞',
  399. '隧道', '安全设施及预埋管线', '绿化及环境保护', '机电工程', '房建', '100章至900章清单合计 A', '暂列金额 B=A*10%', '投标价 C=A+B');
  400. procedure AddProjectChapter(AIndex: Integer);
  401. begin
  402. cdsCustom1.Append;
  403. cdsCustom1ProjectID.AsInteger := AProjectID;
  404. cdsCustom1ProjectName.AsString := AProject.FProjectName;
  405. cdsCustom1SerialNo.AsInteger := AIndex;
  406. cdsCustom1ChapterID.AsString := SChapterID[AIndex];
  407. cdsCustom1ChapterName.AsString := SChapterName[AIndex];
  408. cdsCustom1P_TotalPrice.AsFloat := AProject.TotalPrice[AIndex];
  409. cdsCustom1P_AddQcTotalPrice.AsFloat := AProject.AddQcTotalPrice[AIndex];
  410. cdsCustom1P_AddGatherTotalPrice.AsFloat := AProject.AddGatherTotalPrice[AIndex];
  411. cdsCustom1P_Percent.AsFloat := AProject.CompletePercent[AIndex];
  412. cdsCustom1TotalPrice.AsFloat := ATotal.TotalPrice[AIndex];
  413. cdsCustom1AddQcTotalPrice.AsFloat := ATotal.AddQcTotalPrice[AIndex];
  414. cdsCustom1AddGatherTotalPrice.AsFloat := ATotal.AddGatherTotalPrice[AIndex];
  415. cdsCustom1Percent.AsFloat := ATotal.CompletePercent[AIndex];
  416. cdsCustom1.Post;
  417. end;
  418. procedure AddProjectChapterTotal(AIndex: Integer);
  419. begin
  420. cdsCustom1.Append;
  421. cdsCustom1ProjectID.AsInteger := AProjectID;
  422. cdsCustom1ProjectName.AsString := AProject.FProjectName;
  423. cdsCustom1SerialNo.AsInteger := AIndex;
  424. cdsCustom1ChapterID.AsString := SChapterID[AIndex];
  425. cdsCustom1ChapterName.AsString := SChapterName[AIndex];
  426. cdsCustom1P_TotalPrice.AsFloat := AProject.ChapterTotal;
  427. cdsCustom1P_AddQcTotalPrice.AsFloat := AProject.AQ_ChapterTotal;
  428. cdsCustom1P_AddGatherTotalPrice.AsFloat := AProject.AG_ChapterTotal;
  429. cdsCustom1P_Percent.AsFloat := AProject.CT_CompletePercent;
  430. cdsCustom1TotalPrice.AsFloat := ATotal.ChapterTotal;
  431. cdsCustom1AddQcTotalPrice.AsFloat := ATotal.AQ_ChapterTotal;
  432. cdsCustom1AddGatherTotalPrice.AsFloat := ATotal.AG_ChapterTotal;
  433. cdsCustom1Percent.AsFloat := ATotal.CT_CompletePercent;
  434. cdsCustom1.Post;
  435. end;
  436. procedure AddProjectTempTotal(AIndex: Integer);
  437. begin
  438. cdsCustom1.Append;
  439. cdsCustom1ProjectID.AsInteger := AProjectID;
  440. cdsCustom1ProjectName.AsString := AProject.FProjectName;
  441. cdsCustom1SerialNo.AsInteger := AIndex;
  442. cdsCustom1ChapterID.AsString := SChapterID[AIndex];
  443. cdsCustom1ChapterName.AsString := SChapterName[AIndex];
  444. cdsCustom1P_TotalPrice.AsFloat := AProject.TempTotal;
  445. cdsCustom1P_AddQcTotalPrice.AsFloat := AProject.AQ_TempTotal;
  446. cdsCustom1P_AddGatherTotalPrice.AsFloat := AProject.AG_TempTotal;
  447. cdsCustom1P_Percent.AsFloat := AProject.TT_CompletePercent;
  448. cdsCustom1TotalPrice.AsFloat := ATotal.TempTotal;
  449. cdsCustom1AddQcTotalPrice.AsFloat := ATotal.AQ_TempTotal;
  450. cdsCustom1AddGatherTotalPrice.AsFloat := ATotal.AG_TempTotal;
  451. cdsCustom1Percent.AsFloat := ATotal.TT_CompletePercent;
  452. cdsCustom1.Post;
  453. end;
  454. procedure AddProjectBidPrice(AIndex: Integer);
  455. begin
  456. cdsCustom1.Append;
  457. cdsCustom1ProjectID.AsInteger := AProjectID;
  458. cdsCustom1ProjectName.AsString := AProject.FProjectName;
  459. cdsCustom1SerialNo.AsInteger := AIndex;
  460. cdsCustom1ChapterID.AsString := SChapterID[AIndex];
  461. cdsCustom1ChapterName.AsString := SChapterName[AIndex];
  462. cdsCustom1P_TotalPrice.AsFloat := AProject.BidPrice;
  463. cdsCustom1P_AddQcTotalPrice.AsFloat := AProject.AQ_BidPrice;
  464. cdsCustom1P_AddGatherTotalPrice.AsFloat := AProject.AG_BidPrice;
  465. cdsCustom1P_Percent.AsFloat := AProject.BP_CompletePercent;
  466. cdsCustom1TotalPrice.AsFloat := ATotal.BidPrice;
  467. cdsCustom1AddQcTotalPrice.AsFloat := ATotal.AQ_BidPrice;
  468. cdsCustom1AddGatherTotalPrice.AsFloat := ATotal.AG_BidPrice;
  469. cdsCustom1Percent.AsFloat := ATotal.BP_CompletePercent;
  470. cdsCustom1.Post;
  471. end;
  472. var
  473. iIndex: Integer;
  474. begin
  475. for iIndex := Low(TChapterGcl) to High(TChapterGcl) do
  476. AddProjectChapter(iIndex);
  477. AddProjectChapterTotal(10);
  478. AddProjectTempTotal(11);
  479. AddProjectBidPrice(12);
  480. end;
  481. { TProjectChapterGcl }
  482. constructor TProjectChapterGcl.Create(const AProjectName: string);
  483. begin
  484. FProjectName := AProjectName;
  485. ZeroMemory(@FTotalPrice, SizeOf(TChapterGcl));
  486. ZeroMemory(@FAddQcTotalPrice, SizeOf(TChapterGcl));
  487. ZeroMemory(@FAddGatherTotalPrice, SizeOf(TChapterGcl));
  488. end;
  489. function TProjectChapterGcl.GetAddGatherTotalPrice(
  490. AIndex: Integer): Double;
  491. begin
  492. Result := FAddGatherTotalPrice[AIndex];
  493. end;
  494. function TProjectChapterGcl.GetAddQcTotalPrice(AIndex: Integer): Double;
  495. begin
  496. Result := FAddQcTotalPrice[AIndex];
  497. end;
  498. function TProjectChapterGcl.GetAG_BidPrice: Double;
  499. begin
  500. Result := AG_ChapterTotal + AG_TempTotal;
  501. end;
  502. function TProjectChapterGcl.GetAG_ChapterTotal: Double;
  503. var
  504. i: Integer;
  505. begin
  506. Result := 0;
  507. for i := Low(TChapterGcl) to High(TChapterGcl) do
  508. Result := Result + FAddGatherTotalPrice[i];
  509. end;
  510. function TProjectChapterGcl.GetAG_TempTotal: Double;
  511. begin
  512. Result := AG_ChapterTotal * 0.1;
  513. end;
  514. function TProjectChapterGcl.GetAQ_BidPrice: Double;
  515. begin
  516. Result := AQ_ChapterTotal + AQ_TempTotal;
  517. end;
  518. function TProjectChapterGcl.GetAQ_ChapterTotal: Double;
  519. var
  520. i: Integer;
  521. begin
  522. Result := 0;
  523. for i := Low(TChapterGcl) to High(TChapterGcl) do
  524. Result := Result + FAddQcTotalPrice[i];
  525. end;
  526. function TProjectChapterGcl.GetAQ_TempTotal: Double;
  527. begin
  528. Result := AQ_ChapterTotal * 0.1;
  529. end;
  530. function TProjectChapterGcl.GetBidPrice: Double;
  531. begin
  532. Result := ChapterTotal + TempTotal;
  533. end;
  534. function TProjectChapterGcl.GetBP_CompletePercent: Double;
  535. begin
  536. if (BidPrice + AQ_BidPrice) <> 0 then
  537. Result := AG_BidPrice/(BidPrice + AQ_BidPrice)*100
  538. else
  539. Result := 0;
  540. end;
  541. function TProjectChapterGcl.GetChapterTotal: Double;
  542. var
  543. i: Integer;
  544. begin
  545. Result := 0;
  546. for i := Low(TChapterGcl) to High(TChapterGcl) do
  547. Result := Result + FTotalPrice[i];
  548. end;
  549. function TProjectChapterGcl.GetCompletePercent(AIndex: Integer): Double;
  550. begin
  551. if (FTotalPrice[AIndex] + FAddQcTotalPrice[AIndex]) <> 0 then
  552. Result := FAddGatherTotalPrice[AIndex]/(FTotalPrice[AIndex] + FAddQcTotalPrice[AIndex])*100
  553. else
  554. Result := 0;
  555. end;
  556. function TProjectChapterGcl.GetCT_CompletePercent: Double;
  557. begin
  558. if (ChapterTotal + AQ_ChapterTotal) <> 0 then
  559. Result := AG_ChapterTotal/(ChapterTotal + AQ_ChapterTotal)*100
  560. else
  561. Result := 0;
  562. end;
  563. function TProjectChapterGcl.GetTempTotal: Double;
  564. begin
  565. Result := ChapterTotal * 0.1;
  566. end;
  567. function TProjectChapterGcl.GetTotalPrice(AIndex: Integer): Double;
  568. begin
  569. Result := FTotalPrice[AIndex];
  570. end;
  571. function TProjectChapterGcl.GetTT_CompletePercent: Double;
  572. begin
  573. if (TempTotal + AQ_TempTotal) <> 0 then
  574. Result := AG_TempTotal/(TempTotal + AQ_TempTotal)*100
  575. else
  576. Result := 0;
  577. end;
  578. procedure TProjectChapterGcl.SetAddGatherTotalPrice(AIndex: Integer;
  579. const Value: Double);
  580. begin
  581. FAddGatherTotalPrice[AIndex] := Value;
  582. end;
  583. procedure TProjectChapterGcl.SetAddQcTotalPrice(AIndex: Integer;
  584. const Value: Double);
  585. begin
  586. FAddQcTotalPrice[AIndex] := Value;
  587. end;
  588. procedure TProjectChapterGcl.SetTotalPrice(AIndex: Integer;
  589. const Value: Double);
  590. begin
  591. FTotalPrice[AIndex] := Value;
  592. end;
  593. { TChapterGather }
  594. function TChapterGather.AddProjectChapterGcl(
  595. const AProjectName: string): TProjectChapterGcl;
  596. begin
  597. Result := TProjectChapterGcl.Create(AProjectName);
  598. FProjectsChapter.Add(Result);
  599. end;
  600. procedure TChapterGather.CalcTotal;
  601. var
  602. iProject, iChapter: Integer;
  603. ProjectChapter: TProjectChapterGcl;
  604. begin
  605. for iProject := 0 to FProjectsChapter.Count - 1 do
  606. begin
  607. ProjectChapter := TProjectChapterGcl(FProjectsChapter.Items[iProject]);
  608. for iChapter := Low(TChapterGcl) to High(TChapterGcl) do
  609. begin
  610. FTotalChapter.TotalPrice[iChapter] := FTotalChapter.TotalPrice[iChapter] + ProjectChapter.TotalPrice[iChapter];
  611. FTotalChapter.AddQcTotalPrice[iChapter] := FTotalChapter.AddQcTotalPrice[iChapter] + ProjectChapter.AddQcTotalPrice[iChapter];
  612. FTotalChapter.AddGatherTotalPrice[iChapter] := FTotalChapter.AddGatherTotalPrice[iChapter] + ProjectChapter.AddGatherTotalPrice[iChapter];
  613. end;
  614. end;
  615. end;
  616. constructor TChapterGather.Create;
  617. begin
  618. FProjectsChapter := TList.Create;
  619. FTotalChapter := TProjectChapterGcl.Create('合计');
  620. end;
  621. destructor TChapterGather.Destroy;
  622. begin
  623. FTotalChapter.Free;
  624. ClearObjects(FProjectsChapter);
  625. FProjectsChapter.Free;
  626. inherited;
  627. end;
  628. { TTender }
  629. constructor TTender.Create(ATenderName: string);
  630. begin
  631. FTenderName := ATenderName;
  632. end;
  633. function TTender.GetPercent: Double;
  634. begin
  635. if FTotalPrice <> 0 then
  636. Result := FEndGatherTotalPrice/FTotalPrice*100
  637. else
  638. Result := 0;
  639. end;
  640. { TTenderClass }
  641. function TTenderClass.AddTender(const ATenderName: string): TTender;
  642. begin
  643. Result := TTender.Create(ATenderName);
  644. FTenders.Add(Result);
  645. end;
  646. constructor TTenderClass.Create(const AClassName: string);
  647. begin
  648. FClassName := AClassName;
  649. FTenders := TList.Create;
  650. end;
  651. destructor TTenderClass.Destroy;
  652. begin
  653. ClearObjects(FTenders);
  654. FTenders.Free;
  655. inherited;
  656. end;
  657. function TTenderClass.GetEndGatherTotalPrice: Double;
  658. var
  659. i: Integer;
  660. begin
  661. Result := 0;
  662. for i := 0 to FTenders.Count - 1 do
  663. Result := Result + TTender(FTenders.Items[i]).EndGatherTotalPrice;
  664. end;
  665. function TTenderClass.GetPercent: Double;
  666. begin
  667. if TotalPrice <> 0 then
  668. Result := EndGatherTotalPrice/TotalPrice*100
  669. else
  670. Result := 0;
  671. end;
  672. function TTenderClass.GetTotalPrice: Double;
  673. var
  674. i: Integer;
  675. begin
  676. Result := 0;
  677. for i := 0 to FTenders.Count - 1 do
  678. Result := Result + TTender(FTenders.Items[i]).TotalPrice;
  679. end;
  680. { TTenderClassList }
  681. function TTenderClassList.AddTenderClass(
  682. const AClassName: string): TTenderClass;
  683. begin
  684. Result := TTenderClass.Create(AClassName);
  685. FClassList.Add(Result);
  686. end;
  687. constructor TTenderClassList.Create;
  688. begin
  689. FClassList := TList.Create;
  690. end;
  691. destructor TTenderClassList.Destroy;
  692. begin
  693. ClearObjects(FClassList);
  694. FClassList.Free;
  695. inherited;
  696. end;
  697. function TTenderClassList.FindTenderClass(
  698. const AClassName: string): TTenderClass;
  699. var
  700. iClass: Integer;
  701. TenderClass: TTenderClass;
  702. begin
  703. Result := nil;
  704. for iClass := 0 to FClassList.Count - 1 do
  705. begin
  706. TenderClass := TTenderClass(FClassList.Items[iClass]);
  707. if SameText(AClassName, TenderClass.FClassName) then
  708. begin
  709. Result := TenderClass;
  710. Break;
  711. end;
  712. end;
  713. end;
  714. function TTenderClassList.TenderClass(
  715. const AClassName: string): TTenderClass;
  716. begin
  717. Result := FindTenderClass(AClassName);
  718. if not Assigned(Result) then
  719. Result := AddTenderClass(AClassName);
  720. end;
  721. procedure TrmMentalCustomized1Data.WriteTenderClass(AClassID: Integer;
  722. ATenderClass: TTenderClass);
  723. procedure AddTenderRecord(ATender: TTender);
  724. begin
  725. cdsCustom2.Append;
  726. cdsCustom2ClassID.AsInteger := AClassID;
  727. cdsCustom2SerialNo.AsInteger := FWriteSerilaNo;
  728. cdsCustom2ClassName.AsString := ATenderClass.FClassName;
  729. cdsCustom2TenderName.AsString := ATender.TenderName;
  730. cdsCustom2TotalPrice.AsFloat := ATender.TotalPrice;
  731. cdsCustom2EndGatherTotalPrice.AsFloat := ATender.EndGatherTotalPrice;
  732. cdsCustom2Percent.AsFloat := ATender.Percent;
  733. cdsCustom2.Post;
  734. Inc(FWriteSerilaNo);
  735. end;
  736. procedure AddTotalRecord;
  737. begin
  738. cdsCustom2.Append;
  739. cdsCustom2ClassID.AsInteger := AClassID;
  740. cdsCustom2ClassName.AsString := '小计';
  741. cdsCustom2TotalPrice.AsFloat := ATenderClass.TotalPrice;
  742. cdsCustom2EndGatherTotalPrice.AsFloat := ATenderClass.EndGatherTotalPrice;
  743. cdsCustom2Percent.AsFloat := ATenderClass.Percent;
  744. cdsCustom2.Post;
  745. end;
  746. var
  747. iTender: Integer;
  748. begin
  749. for iTender := 0 to ATenderClass.FTenders.Count - 1 do
  750. AddTenderRecord(TTender(ATenderClass.FTenders.Items[iTender]));
  751. AddTotalRecord;
  752. end;
  753. function TrmMentalCustomized1Data.XmjNode(
  754. const ACode: string): TsdIDTreeNode;
  755. var
  756. iID: Integer;
  757. Rec: TsdDataRecord;
  758. begin
  759. Result := nil;
  760. Rec := FProjectData.BillsData.sddBills.Locate('Code', ACode);
  761. if Assigned(Rec) then
  762. Result := FProjectData.BillsCompileData.BillsCompileTree.FindNode(Rec.ValueByName('ID').AsInteger);
  763. end;
  764. end.