| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404 | 
unit rmBillsGatherDm;interfaceuses  SysUtils, Classes, DB, DBClient, MCacheTree, ProjectData,  sdDB, sdIDTree, rmCacheData, rmSelectProjectFrm;type  {---------------------------------    bgtFx: 分项汇总模式,按树结构汇总所选项目,汇总后结果写入cdsFxBills    bgtXmj: 项目节汇总模式,按树结构汇总所选项目的项目节节点,汇总后结果写入cdsFxBills    bgtGcl: 工程量清单汇总模式,汇总后结果写入cdsGclBills    bgtMultiXmj: bgtXmj模式的扩展,汇总展示多项目数据模式,与bgtXmj的差异在于记录了每个项目的数据,而不是单纯累加                 汇总结果写入cdsProjectBills    bgtEstimate: 决算02表,bgtXmj模式的扩展,                 分别汇总前两个项目的0号台账为初步设计、施工图设计,其后为所有项目按bgtXmj方式汇总。                 汇总结果写入cdsEstimateBills    bgtEstimate1: 决算02表(部颁格式),bgtXmj模式的扩展,                  汇总第一个项目的0号台账为批准的概(预)算,其后为所有项目按bgtXmj方式汇总。汇总结果写入cdsEstimateBills    bgtFinal07: 决算07表,bgtGcl模式的扩展,汇总暂时多项目数据及合计数据模式                与bgtGcl的差异在于,记录了每个项目的数据,且汇总了某些固定id节点的数据在最后。汇总结果写入cdsProjectGclBills    bgtFinal08: 决算08表,bgtXmj的特殊情况,仅汇总第二部分下的所有项目节节点,而非全部项目节。汇总结果写入cdsFxBills    bgtFinal09: 决算09表,bgtXmj的特殊情况,汇总第三部分及气候所有项目节节点,而非全部项目节。汇总结果写入cdsFxBills    bgtFinal11: 决算11表,与bgtFinal07极度相似,仅汇总固定id节点的数据处不同。汇总结果写入cdsProjectGclBills    bgtFinal12: 决算12表,流水式写入每个项目的变更令数据。汇总结果写入cdsBGLFlow    bgtFinal16: 决算16表,bgtMultiXmj的基础上增加了工程量清单数据,且仅汇总计日工部分(固定id40)。汇总结果写入cdsProjectBills    bgtFinal17: 决算17表,bgtFx的特殊情况,仅汇总收尾工程部分(固定id47),汇总结果写入cdsFxBills    bgtFinal18: 决算18表,bgtFx的特殊情况,仅汇总报废工程部分(固定id48),汇总结果吸入cdsFxBills    bgtFinal19: 决算19表,bgtFinal07和bgtFinal11中去除后面的固定id节点数据,汇总结果写入cdsProjectGclBills    bgtG_Final06_1: 粤竣06-1表,bgtEstimate的特殊情况,仅汇总土地(固定id21),且汇总初步设计、施工图设计                    可理解为bgtEstimate扩展为Fx,然后再限制为汇总固定id下的数据,汇总后的结果写入cdsEstimateBills    bgtG_Final04: 粤竣04表,在bgtXmj的基础上增加了设计数量、经济指标等数据,且增加了一行公路基本造价汇总行    bgtQgcZj: 在bgtEstimate的基础上,汇总工程可行性研究数据,结果写入cdsEstimateBills  ----------------------------------}  TbgType = (bgtFx, bgtXmj, bgtGcl, bgtMultiXmj, bgtEstimate,    bgtEstimate1, bgtFinal07, bgtFinal08, bgtFinal09, bgtFinal11,    bgtFinal12, bgtFinal16, bgtFinal17, bgtFinal18, bgtFinal19,    bgtG_Final06_1, bgtG_Final04, bgtQgcZj);  TrmBillsGatherData = class(TDataModule)    // 决算04, 05[竣04]    cdsFxBills: TClientDataSet;    cdsFxBillsXiangCode: TStringField;    cdsFxBillsMuCode: TStringField;    cdsFxBillsJieCode: TStringField;    cdsFxBillsXiMuCode: TStringField;    cdsFxBillsCode: TStringField;    cdsFxBillsB_Code: TStringField;    cdsFxBillsName: TWideStringField;    cdsFxBillsUnits: TWideStringField;    cdsFxBillsAddDealQuantity: TFloatField;    cdsFxBillsAddDealTotalPrice: TFloatField;    cdsFxBillsAddQcQuantity: TFloatField;    cdsFxBillsAddPcQuantity: TFloatField;    cdsFxBillsAddQcTotalPrice: TFloatField;    cdsFxBillsAddPcTotalPrice: TFloatField;    cdsFxBillsPrice: TFloatField;    cdsFxBillsAddGatherQuantity: TFloatField;    cdsFxBillsAddGatherTotalPrice: TFloatField;    cdsFxBillsMemoStr: TWideStringField;    cdsFxBillsPercent: TFloatField;    cdsFxBillsQuantity: TFloatField;    cdsFxBillsTotalPrice: TFloatField;    cdsFxBillsDgnQuantity1: TFloatField;    cdsFxBillsDgnQuantity2: TFloatField;    cdsFxBillsDgnQuantity: TStringField;    cdsFxBillsDgnPrice1: TFloatField;    cdsFxBillsDgnPrice2: TFloatField;    cdsFxBillsDgnPrice: TStringField;    cdsFxBillsRatioPercent: TFloatField;    cdsFxBillsAddRatioPercent: TFloatField;    cdsFxBillsDealDgnQuantity1: TFloatField;    cdsFxBillsDealDgnQuantity2: TFloatField;    cdsFxBillsDealDgnQuantity: TStringField;    cdsFxBillsDealDgnPrice1: TFloatField;    cdsFxBillsDealDgnPrice2: TFloatField;    cdsFxBillsDealDgnPrice: TStringField;    cdsFxBillsCDgnQuantity1: TFloatField;    cdsFxBillsCDgnQuantity2: TFloatField;    cdsFxBillsCDgnQuantity: TStringField;    cdsFxBillsCDgnPrice1: TFloatField;    cdsFxBillsCDgnPrice2: TFloatField;    cdsFxBillsCDgnPrice: TStringField;    cdsFxBillsFinalDgnQuantity1: TFloatField;    cdsFxBillsFinalDgnQuantity2: TFloatField;    cdsFxBillsFinalDgnQuantity: TStringField;    cdsFxBillsFinalDgnPrice1: TFloatField;    cdsFxBillsFinalDgnPrice2: TFloatField;    cdsFxBillsFinalDgnPrice: TStringField;    // 决算05-2    cdsGclBills: TClientDataSet;    cdsGclBillsB_Code: TStringField;    cdsGclBillsIndexCode: TStringField;    cdsGclBillsName: TWideStringField;    cdsGclBillsUnits: TWideStringField;    cdsGclBillsPrice: TFloatField;    cdsGclBillsAddDealQuantity: TFloatField;    cdsGclBillsAddDealTotalPrice: TFloatField;    cdsGclBillsAddQcQuantity: TFloatField;    cdsGclBillsAddQcTotalPrice: TFloatField;    cdsGclBillsAddPcQuantity: TFloatField;    cdsGclBillsAddPcTotalPrice: TFloatField;    cdsGclBillsAddGatherQuantity: TFloatField;    cdsGclBillsAddGatherTotalPrice: TFloatField;    cdsGclBillsPrecent: TFloatField;    cdsGclBillsMemoStr: TWideStringField;    // 决算04-1, 决算部颁12    cdsProjectBills: TClientDataSet;    cdsProjectBillsXiangCode: TStringField;    cdsProjectBillsMuCode: TStringField;    cdsProjectBillsJieCode: TStringField;    cdsProjectBillsXiMuCode: TStringField;    cdsProjectBillsCode: TStringField;    cdsProjectBillsName: TWideStringField;    cdsProjectBillsUnits: TWideStringField;    cdsProjectBillsQuantity: TFloatField;    cdsProjectBillsProjectID: TIntegerField;    cdsProjectBillsTotalPrice: TFloatField;    cdsProjectBillsP_Quantity: TFloatField;    cdsProjectBillsP_TotalPrice: TFloatField;    cdsProjectBillsEcoIndex: TFloatField;    cdsProjectBillsPercent: TFloatField;    cdsProjectBillsMemoStr: TWideStringField;    cdsProjectBillsProjectName: TWideStringField;    cdsProjectBillsSerialNo: TIntegerField;    cdsProjectBillsB_Code: TStringField;    cdsProjectBillsP_Price: TFloatField;    // 决算02    cdsEstimateBills: TClientDataSet;    cdsEstimateBillsXiangCode: TStringField;    cdsEstimateBillsMuCode: TStringField;    cdsEstimateBillsJieCode: TStringField;    cdsEstimateBillsXiMuCode: TStringField;    cdsEstimateBillsCode: TStringField;    cdsEstimateBillsName: TWideStringField;    cdsEstimateBillsUnits: TWideStringField;    cdsEstimateBillsPDQuantity: TFloatField;    cdsEstimateBillsPDTotalPrice: TFloatField;    cdsEstimateBillsCDDQuantity: TFloatField;    cdsEstimateBillsCDDTotalPrice: TFloatField;    cdsEstimateBillsAddDealQuantity: TFloatField;    cdsEstimateBillsAddDealTotalPrice: TFloatField;    cdsEstimateBillsAddCQuantity: TFloatField;    cdsEstimateBillsAddCTotalPrice: TFloatField;    cdsEstimateBillsAddGatherQuantity: TFloatField;    cdsEstimateBillsAddGatherTotalPrice: TFloatField;    cdsEstimateBillsQuantityAdjust: TFloatField;    cdsEstimateBillsTotalPriceAdjust: TFloatField;    cdsEstimateBillsMemoStr: TWideStringField;    cdsEstimateBillsABQuantity: TFloatField;               // 批准概算 - 数量    cdsEstimateBillsABTotalPrice: TFloatField;             // 批准概算 - 金额    cdsEstimateBillsQuantity: TFloatField;                 // 0号台账 - 数量    cdsEstimateBillsTotalPrice: TFloatField;               // 0号台账 - 金额    cdsEstimateBillsQuantityCompare1: TFloatField;         // 数量比较 - (台账-批准)/批准    cdsEstimateBillsTotalPriceCompare1: TFloatField;       // 金额比较 - (台账-批准)/批准    cdsEstimateBillsQuantityCompare2: TFloatField;         // 数量比较 - (决算-批准)/批准    cdsEstimateBillsQuantityCompare3: TFloatField;         // 金额比较 - (决算-批准)/批准    cdsEstimateBillsTotalPriceCompare2: TFloatField;       // 数量比较 - (决算-合同)/合同    cdsEstimateBillsTotalPriceCompare3: TFloatField;       // 金额比较 - (决算-合同)/合同    cdsEstimateBillsPDDgnQuantity: TStringField;    cdsEstimateBillsPDDgnQuantity1: TFloatField;    cdsEstimateBillsPDDgnQuantity2: TFloatField;    cdsEstimateBillsCDDDgnQuantity: TStringField;    cdsEstimateBillsCDDDgnQuantity1: TFloatField;    cdsEstimateBillsCDDDgnQuantity2: TFloatField;    cdsEstimateBillsDealDgnQuantity: TStringField;    cdsEstimateBillsDealDgnQuantity1: TFloatField;    cdsEstimateBillsDealDgnQuantity2: TFloatField;    cdsEstimateBillsCDgnQuantity: TStringField;    cdsEstimateBillsCDgnQuantity1: TFloatField;    cdsEstimateBillsCDgnQuantity2: TFloatField;    cdsEstimateBillsGatherDgnQuantity: TStringField;    cdsEstimateBillsGatherDgnQuantity1: TFloatField;    cdsEstimateBillsGatherDgnQuantity2: TFloatField;    cdsEstimateBillsABDgnQuantity: TStringField;    cdsEstimateBillsABDgnQuantity1: TFloatField;    cdsEstimateBillsABDgnQuantity2: TFloatField;    cdsEstimateBillsDgnQuantity: TStringField;    cdsEstimateBillsDgnQuantity1: TFloatField;    cdsEstimateBillsDgnQuantity2: TFloatField;    cdsEstimateBillsDgnQuantityCompare1: TStringField;    cdsEstimateBillsDgnQuantityCompare2: TStringField;    cdsEstimateBillsDgnQuantityCompare3: TStringField;    cdsEstimateBillsDgnQuantity1Compare1: TFloatField;    cdsEstimateBillsDgnQuantity2Compare1: TFloatField;    cdsEstimateBillsDgnQuantity1Compare2: TFloatField;    cdsEstimateBillsDgnQuantity1Compare3: TFloatField;    cdsEstimateBillsDgnQuantity2Compare2: TFloatField;    cdsEstimateBillsDgnQuantity2Compare3: TFloatField;    cdsEstimateBillsB_Code: TStringField;    cdsEstimateBillsPrice: TFloatField;    cdsEstimateBillsPDDgnPrice: TFloatField;    cdsEstimateBillsCDDDgnPrice: TFloatField;    cdsEstimateBillsABDgnPrice: TFloatField;    cdsEstimateBillsFinalDgnQty: TStringField;    cdsEstimateBillsFinalDgnQty1: TFloatField;    cdsEstimateBillsFinalDgnQty2: TFloatField;    // 决算部颁07, 11    cdsProjectGclBills: TClientDataSet;    cdsProjectGclBillsProjectID: TIntegerField;    cdsProjectGclBillsProjectName: TWideStringField;    cdsProjectGclBillsB_Code: TStringField;    cdsProjectGclBillsIndexCode: TStringField;    cdsProjectGclBillsName: TWideStringField;    cdsProjectGclBillsUnits: TWideStringField;    cdsProjectGclBillsQuantity: TFloatField;    cdsProjectGclBillsPrice: TFloatField;    cdsProjectGclBillsTotalPrice: TFloatField;    cdsProjectGclBillsP_Price: TFloatField;    cdsProjectGclBillsP_Quantity: TFloatField;    cdsProjectGclBillsP_TotalPrice: TFloatField;    cdsProjectGclBillsSerialNo: TIntegerField;    cdsProjectGclBillsP_AddGatherQuantity: TFloatField;    cdsProjectGclBillsP_AddGatherTotalPrice: TFloatField;    cdsProjectGclBillsAddGatherQuantity: TFloatField;    cdsProjectGclBillsAddGatherTotalPrice: TFloatField;    // 决算部颁12    cdsBGLFlow: TClientDataSet;    cdsBGLFlowMergeBGLCode: TWideStringField;    cdsBGLFlowBGLName: TWideStringField;    cdsBGLFlowApprovalCode: TWideStringField;    cdsBGLFlowSuggestion: TWideStringField;    cdsBGLFlowBGReason: TWideStringField;    cdsBGLFlowB_Code: TStringField;    cdsBGLFlowName: TWideStringField;    cdsBGLFlowUnits: TWideStringField;    cdsBGLFlowQuantity: TFloatField;    cdsBGLFlowPrice: TFloatField;    cdsBGLFlowTotalPrice: TFloatField;    cdsBGLFlowBGTotalPrice: TFloatField;    cdsEstimateBillsPASQuantity: TFloatField;    cdsEstimateBillsPASTotalPrice: TFloatField;    cdsEstimateBillsPASDgnQuantity1: TFloatField;    cdsEstimateBillsPASDgnQuantity2: TFloatField;    cdsEstimateBillsPASDgnQuantity: TStringField;    cdsEstimateBillsPASDgnPrice: TFloatField;    cdsEstimateBillsDgnPrice: TFloatField;    cdsEstimateBillsFinalDgnPriceA: TFloatField;    cdsEstimateBillsDifferPercent1: TFloatField;    cdsEstimateBillsFinalDgnQtyA: TStringField;    cdsEstimateBillsFinalDgnQtyA1: TFloatField;    cdsEstimateBillsFinalDgnQtyA2: TFloatField;  private    FCacheTree: TReportCacheTree;    FGclList: TGclGatherList;    FFixedIDList: TFixedIDBillsList;    FProjectData: TProjectData;    FProjectName: string;    FGatherType: TbgType;    FSerialNo: Integer;    procedure OpenProjectData(AProject: TSelectProject; AProjectIndex: Integer);    procedure FreeProjectData;    function GetDgnQuantity(ANum1, ANum2: Double): string;    function GetDgnPrice(ATotalPrice, ADgnQuantity: Double): Double;    function GetCompare(ANum1, ANum2: Double): Double;    {汇总树结构}    function AddBillsNode(ANode: TsdIDTreeNode; AParent:      TReportCacheNode; AProjectIndex: Integer;      ASelectProject: TSelectProject): TReportCacheNode;    // 递归模式(当前节点、子节点、后兄弟节点)    procedure AddBills(ANode: TsdIDTreeNode; AParent: TReportCacheNode;      AProjectIndex: Integer; ASelectProject: TSelectProject);    // 遍历模式(当前节点、子节点)    procedure AddBillsList(ANode: TsdIDTreeNode; AParent: TReportCacheNode;      AProjectIndex: Integer; ASelectProject: TSelectProject);    {汇总工程量清单}    procedure FilterBillsNode(ANode: TsdIDTreeNode; AProjectIndex: Integer);    procedure FilterBills(ANode: TsdIDTreeNode; AProjectIndex: Integer);    {汇总固定ID项}    procedure FilterFixedIDBills(ATree: TsdIDTree; AProjectIndex: Integer);    procedure FilterSettlement(AProjectData: TProjectData; AProjectIndex: Integer);    {写入流水数据}    procedure WriteBGLFlowData(AProjectData: TProjectData);    procedure WriteFlowData(AProjectData: TProjectData);    procedure GatherProject(AProject: TSelectProject; AProjectIndex: Integer);    procedure CalculateGatherData;    procedure CalculateRatioPercent; // 计算各项费用所占比例,金额/总造价    procedure WriteGatherCacheNode(const AGatherName: string);    procedure WriteNode(ANode: TReportCacheNode);    procedure WriteBillsData;    procedure WriteGclNode;    procedure WriteProjectsData;    procedure WriteEstimateGatherNode;    procedure WriteENodeData(ANode: TReportCacheNode);    procedure ReWriteENodeDataAsGather(ANode: TReportCacheNode; AName: string);    procedure WriteEstimateNode(ANode: TReportCacheNode);    procedure WriteEstimateData;    procedure WriteProjectsGclData;    procedure WriteData;    procedure BeforeGather(AProjects: TList);    procedure AfterGather;  public    function AssignData(AProjects: TList): TDataSet;    property GatherType: TbgType read FGatherType write FGatherType;  end;implementationuses  Globals, UtilMethods, Math, BGLDm;{$R *.dfm}{ TrmBillsGatherData }procedure TrmBillsGatherData.AddBills(ANode: TsdIDTreeNode;  AParent: TReportCacheNode; AProjectIndex: Integer; ASelectProject: TSelectProject);var  ACur: TReportCacheNode;begin  if not Assigned(ANode) then Exit;  // 按设置的层次汇总(Level从0开始取值)  case ReportConfig.GatherLevel of    // 项    0: if ANode.Level > 1 then Exit;    // 目    1: if ANode.Level > 2 then Exit;    // 节    2: if ANode.Level > 3 then Exit;    // 细目    3: if ANode.Level > 4 then Exit;    // 项目节    4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;  end;  if GatherType in [bgtXmj, bgtMultiXmj, bgtEstimate, bgtEstimate1, bgtFinal08, bgtFinal09, bgtQgcZj] then    if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit; // 仅汇总项目节  ACur := AddBillsNode(ANode, AParent, AProjectIndex, ASelectProject);  AddBills(ANode.FirstChild, ACur, AProjectIndex, ASelectProject);  AddBills(ANode.NextSibling, AParent, AProjectIndex, ASelectProject);end;function TrmBillsGatherData.AddBillsNode(ANode: TsdIDTreeNode;  AParent: TReportCacheNode; AProjectIndex: Integer;  ASelectProject: TSelectProject): TReportCacheNode;var  iGatherCompare: Integer;  ANextSibling: TReportCacheNode;begin  with ANode.Rec do  begin    if ANode.Rec.ValueByName('B_Code').AsString <> '' then      iGatherCompare := ReportConfig.GclCompare    else      iGatherCompare := ReportConfig.XmjCompare;    case iGatherCompare of      // 按编号      0: if (ValueByName('Code').asString <> '') or (ValueByName('B_Code').asString <> '') then           Result := FCacheTree.FindNode(AParent,               ValueByName('Code').AsString, ValueByName('B_Code').AsString)         else           Result := FCacheTree.FindNode(AParent, ValueByName('Name').AsString);      // 按名称      1: Result := FCacheTree.FindNode(AParent, ValueByName('Name').AsString);      // 按编号+名称      2: Result := FCacheTree.FindNode(AParent, ValueByName('Code').AsString,             ValueByName('B_Code').AsString, ValueByName('Name').AsString);    end;    if not Assigned(Result) then    begin      ANextSibling := FCacheTree.FindNextSibling(AParent,          ValueByName('Code').AsString, ValueByName('B_Code').AsString);      Result := FCacheTree.AddNode(AParent, ANextSibling);      Result.Code := ValueByName('Code').AsString;      Result.B_Code := ValueByName('B_Code').AsString;      Result.Name := ValueByName('Name').AsString;      Result.Units := ValueByName('Units').AsString;    end;    if (GatherType in [bgtEstimate, bgtG_Final06_1, bgtQgcZj]) and (ASelectProject.IsPD or ASelectProject.IsCDD or ASelectProject.IsPAS) then    begin      if ASelectProject.IsPD then      begin        Result.PDQuantity := ValueByName('Quantity').AsFloat;        Result.PDTotalPrice := ValueByName('TotalPrice').AsFloat;        Result.PDDesignQuantity1 := ValueByName('DgnQuantity1').AsFloat;        Result.PDDesignQuantity2 := ValueByName('DgnQuantity2').AsFloat;        Result.PDDesignPrice := ValueByName('DgnPrice').AsFloat;      end      else if ASelectProject.IsCDD then      begin        Result.CDDQuantity := ValueByName('Quantity').AsFloat;        Result.CDDTotalPrice := ValueByName('TotalPrice').AsFloat;        Result.CDDDesignQuantity1 := ValueByName('DgnQuantity1').AsFloat;        Result.CDDDesignQuantity2 := ValueByName('DgnQuantity2').AsFloat;        Result.CDDDesignPrice := ValueByName('DgnPrice').AsFloat;      end      else if ASelectProject.IsPAS then      begin        Result.PASQuantity := ValueByName('Quantity').AsFloat;        Result.PASTotalPrice := ValueByName('TotalPrice').AsFloat;        Result.PASDesignQuantity1 := ValueByName('DgnQuantity1').AsFloat;        Result.PASDesignQuantity2 := ValueByName('DgnQuantity2').AsFloat;        Result.PASDesignPrice := ValueByName('DgnPrice').AsFloat;      end;    end    else if (GatherType = bgtEstimate1) and ASelectProject.IsAB then    begin      Result.ABQuantity := ValueByName('Quantity').AsFloat;      Result.ABTotalPrice := ValueByName('TotalPrice').AsFloat;      Result.ABDesignQuantity1 := ValueByName('DgnQuantity1').AsFloat;      Result.ABDesignQuantity2 := ValueByName('DgnQuantity2').AsFloat;      Result.ABDesignPrice := ValueByName('DgnPrice').AsFloat;    end    else    begin      Result.Price := ValueByName('Price').AsFloat;      // 汇总的经济指标只能在汇总后计算得到      Result.Quantity := Result.Quantity + ValueByName('Quantity').AsFloat;      Result.TotalPrice := Result.TotalPrice + ValueByName('TotalPrice').AsFloat;      Result.DesignQuantity1 := Result.DesignQuantity1 + ValueByName('DgnQuantity1').AsFloat;      Result.DesignQuantity2 := Result.DesignQuantity2 + ValueByName('DgnQuantity2').AsFloat;      Result.AddDealQuantity := Result.AddDealQuantity + ValueByName('AddDealQuantity').AsFloat;      Result.AddDealTotalPrice := Result.AddDealTotalPrice + ValueByName('AddDealTotalPrice').AsFloat;      Result.AddQcQuantity := Result.AddQcQuantity + ValueByName('AddQcQuantity').AsFloat;      Result.AddQcTotalPrice := Result.AddQcTotalPrice + ValueByName('AddQcTotalPrice').AsFloat;      Result.AddPcQuantity := Result.AddPcQuantity + ValueByName('AddPcQuantity').AsFloat;      Result.AddPcTotalPrice := Result.AddPcTotalPrice + ValueByName('AddPcTotalPrice').AsFloat;      Result.DealDesignQuantity1 := Result.DealDesignQuantity1 + ValueByName('DealDgnQuantity1').AsFloat;      Result.DealDesignQuantity2 := Result.DealDesignQuantity2 + ValueByName('DealDgnQuantity2').AsFloat;      Result.CDesignQuantity1 := Result.CDesignQuantity1 + ValueByName('CDgnQuantity1').AsFloat;      Result.CDesignQuantity2 := Result.CDesignQuantity2 + ValueByName('CDgnQuantity2').AsFloat;      Result.P_Price[AProjectIndex] := ValueByName('Price').AsFloat;      Result.P_Quantity[AProjectIndex] := ValueByName('AddGatherQuantity').AsFloat;      Result.P_TotalPrice[AProjectIndex] := ValueByName('AddGatherTotalPrice').AsFloat;    end;  end;end;procedure TrmBillsGatherData.AfterGather;begin  cdsProjectBills.EnableControls;  FGclList.Free;  cdsGclBills.EnableControls;  FCacheTree.Free;  cdsFxBills.EnableControls;  cdsEstimateBills.EnableControls;  FFixedIDList.Free;  cdsProjectGclBills.EnableControls;  cdsBGLFlow.EnableControls;end;function TrmBillsGatherData.AssignData(AProjects: TList): TDataSet;var  iProject: Integer;  SelectProject: TSelectProject;begin  BeforeGather(AProjects);  try    for iProject := 0 to AProjects.Count - 1 do      GatherProject(TSelectProject(AProjects.Items[iProject]), iProject);    CalculateGatherData;    CalculateRatioPercent;    WriteData;  finally    case GatherType of      bgtFx, bgtXmj, bgtFinal08, bgtFinal09, bgtFinal17, bgtFinal18, bgtG_Final04:        Result := cdsFxBills;      bgtGcl: Result := cdsGclBills;      bgtMultiXmj, bgtFinal16: Result := cdsProjectBills;      bgtEstimate, bgtEstimate1, bgtG_Final06_1, bgtQgcZj: Result := cdsEstimateBills;      bgtFinal07, bgtFinal11, bgtFinal19: Result := cdsProjectGclBills;      bgtFinal12: Result := cdsBGLFlow;    end;    AfterGather;  end;end;procedure TrmBillsGatherData.BeforeGather(AProjects: TList);begin  cdsFxBills.DisableControls;  cdsFxBills.Active := True;  cdsFxBills.EmptyDataSet;  FCacheTree := TReportCacheTree.Create(AProjects.Count);  cdsGclBills.DisableControls;  cdsGclBills.Active := True;  cdsGclBills.EmptyDataSet;  if GatherType in [bgtFinal07, bgtFinal11, bgtFinal19] then    FGclList := TGclGatherList.Create(AProjects.Count, False)  else    FGclList := TGclGatherList.Create(AProjects.Count);  cdsProjectBills.DisableControls;  cdsProjectBills.Active := True;  cdsProjectBills.EmptyDataSet;  cdsEstimateBills.DisableControls;  cdsEstimateBills.Active := True;  cdsEstimateBills.EmptyDataSet;  cdsProjectGclBills.DisableControls;  cdsProjectGclBills.Active := True;  cdsProjectGclBills.EmptyDataSet;  FFixedIDList := TFixedIDBillsList.Create(AProjects.Count);  cdsBGLFlow.DisableControls;  cdsBGLFlow.Active := True;  cdsBGLFlow.EmptyDataSet;end;procedure TrmBillsGatherData.FilterBills(ANode: TsdIDTreeNode;  AProjectIndex: Integer);begin  if not Assigned(ANode) then Exit;  if (not ANode.HasChildren) and (ANode.Rec.ValueByName('B_Code').AsString <> '') then    FilterBillsNode(ANode, AProjectIndex);  FilterBills(ANode.FirstChild, AProjectIndex);  FilterBills(ANode.NextSibling, AProjectIndex);end;procedure TrmBillsGatherData.FilterBillsNode(ANode: TsdIDTreeNode;  AProjectIndex: Integer);  function CanGatherNode: Boolean;  begin    case GatherType of      bgtFinal11: Result := ANode.Rec.ValueByName('TotalPrice').AsFloat <> 0;      else Result := True;    end;  end;var  GclNode: TGclGatherNode;begin  if not Assigned(ANode) or not CanGatherNode then Exit;  GclNode := FGclList.GetGclGatherNode(ANode.Rec);  with ANode.Rec do  begin    GclNode.Quantity := GclNode.Quantity + ValueByName('Quantity').AsFloat;    GclNode.TotalPrice := GclNode.TotalPrice + ValueByName('TotalPrice').AsFloat;    GclNode.AddDealQuantity := GclNode.AddDealQuantity + ValueByName('AddDealQuantity').AsFloat;    GclNode.AddDealTotalPrice := GclNode.AddDealTotalPrice + ValueByName('AddDealTotalPrice').AsFloat;    GclNode.AddQcQuantity := GclNode.AddQcQuantity + ValueByName('AddQcQuantity').AsFloat;    GclNode.AddQcTotalPrice := GclNode.AddQcTotalPrice + ValueByName('AddQcTotalPrice').AsFloat;    GclNode.AddPcQuantity := GclNode.AddPcQuantity + ValueByName('AddPcQuantity').AsFloat;    GclNode.AddPcTotalPrice := GclNode.AddPcTotalPrice + ValueByName('AddPcTotalPrice').AsFloat;    GclNode.P_Price[AProjectIndex] := ValueByName('Price').AsFloat;    GclNode.P_Quantity[AProjectIndex] := GclNode.P_Quantity[AProjectIndex] + ValueByName('Quantity').AsFloat;    GclNode.P_TotalPrice[AProjectIndex] := GclNode.P_TotalPrice[AProjectIndex] + ValueByName('TotalPrice').AsFloat;    GclNode.P_AddGatherQuantity[AProjectIndex] :=        GclNode.P_AddGatherQuantity[AProjectIndex] + ValueByName('AddGatherQuantity').AsFloat;    GclNode.P_AddGatherTotalPrice[AProjectIndex] :=        GclNode.P_AddGatherTotalPrice[AProjectIndex] + ValueByName('AddGatherTotalPrice').AsFloat;  end;end;procedure TrmBillsGatherData.FreeProjectData;begin  if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then    FProjectData.Free;end;procedure TrmBillsGatherData.GatherProject(AProject: TSelectProject;  AProjectIndex: Integer);begin  OpenProjectData(AProject, AProjectIndex);  try    case GatherType of      bgtFinal08: // 08表 取第二部分下所有项目节        AddBills(FProjectData.BillsCompileData.BillsCompileTree.FindNode(2).FirstChild, nil, AProjectIndex, AProject);      bgtFinal09: // 09表 取第三部分及其后所有项目节        AddBills(FProjectData.BillsCompileData.BillsCompileTree.FindNode(3), nil, AProjectIndex, AProject);      bgtGcl, bgtFinal07, bgtFinal11, bgtFinal19: // 汇总工程量清单        FilterBills(FProjectData.BillsCompileData.BillsCompileTree.FirstNode, AProjectIndex);      bgtFinal12: // 不做数据汇总,直接流水式写入数据        WriteFlowData(FProjectData);      bgtFinal16: // 16表 仅汇总计日工及其子节点        AddBillsList(FProjectData.BillsCompileData.BillsCompileTree.FindNode(40), nil, AProjectIndex, AProject);      bgtFinal17: // 17表 仅汇总收尾工程及其子节点        AddBillsList(FProjectData.BillsCompileData.BillsCompileTree.FindNode(47), nil, AProjectIndex, AProject);      bgtFinal18: // 18表 仅汇总报废工程及其子节点        AddBillsList(FProjectData.BillsCompileData.BillsCompileTree.FindNode(48), nil, AProjectIndex, AProject);      bgtG_Final06_1: // 粤竣06-1表 仅汇总土地及其子节点        AddBillsList(FProjectData.BillsCompileData.BillsCompileTree.FindNode(21), nil, AProjectIndex, AProject);      else // 标准汇总方式,分项清单        AddBills(FProjectData.BillsCompileData.BillsCompileTree.FirstNode, nil, AProjectIndex, AProject)    end;    if GatherType in [bgtFinal07, bgtFinal11, bgtFinal19] then      FilterFixedIDBills(FProjectData.BillsCompileData.BillsCompileTree, AProjectIndex);    if GatherType = bgtFinal11 then      FilterSettlement(FProjectData, AProjectIndex);  finally    FreeProjectData;  end;end;procedure TrmBillsGatherData.OpenProjectData(AProject: TSelectProject;  AProjectIndex: Integer);var  Rec: TsdDataRecord;begin  FProjectData := OpenProjectManager.FindProjectData(AProject.ProjectID);  Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProject.ProjectID);  if not Assigned(FProjectData) then  begin    FProjectData := TProjectData.Create;    FProjectData.OpenForReport(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);  end;  FProjectName := Rec.ValueByName('Name').AsString;  FCacheTree.ProjectName[AProjectIndex] := Rec.ValueByName('Name').AsString;  FGclList.ProjectName[AProjectIndex] := Rec.ValueByName('Name').AsString;end;procedure TrmBillsGatherData.WriteData;begin  case GatherType of    bgtFx, bgtXmj, bgtFinal08, bgtFinal09, bgtFinal17, bgtFinal18, bgtG_Final04:      WriteBillsData;    bgtGcl:      WriteGclNode;    bgtMultiXmj, bgtFinal16:      WriteProjectsData;    bgtEstimate, bgtEstimate1, bgtG_Final06_1, bgtQgcZj:      WriteEstimateData;    bgtFinal07, bgtFinal11, bgtFinal19: // 07&11特别的,其中还写入了部分固定ID节点  !!丧心病狂的报表!!      WriteProjectsGclData;  end;end;procedure TrmBillsGatherData.WriteNode(ANode: TReportCacheNode);begin  if not Assigned(ANode) then Exit;  cdsFxBills.Append;  cdsFxBillsXiangCode.AsString := ANode.XiangCode;  cdsFxBillsMuCode.AsString := ANode.MuCode;  cdsFxBillsJieCode.AsString := ANode.JieCode;  cdsFxBillsXiMuCode.AsString := ANode.XiMuCode;  cdsFxBillsCode.AsString := ANode.Code;  cdsFxBillsB_Code.AsString := ANode.B_Code;  cdsFxBillsName.AsString := ANode.Name;  cdsFxBillsUnits.AsString := ANode.Units;  cdsFxBillsPrice.AsFloat := ANode.Price;  cdsFxBillsAddDealQuantity.AsFloat := ANode.AddDealQuantity;  cdsFxBillsAddDealTotalPrice.AsFloat := ANode.AddDealTotalPrice;  cdsFxBillsAddQcQuantity.AsFloat := ANode.AddQcQuantity;  cdsFxBillsAddQcTotalPrice.AsFloat := ANode.AddQcTotalPrice;  cdsFxBillsAddPcQuantity.AsFloat := ANode.AddPcQuantity;  cdsFxBillsAddPcTotalPrice.AsFloat := ANode.AddPcTotalPrice;  cdsFxBillsAddGatherQuantity.AsFloat := ANode.AddDealQuantity + ANode.AddQcQuantity;  cdsFxBillsAddGatherTotalPrice.AsFloat := ANode.AddDealTotalPrice +      ANode.AddQcTotalPrice + ANode.AddPcTotalPrice;  cdsFxBillsAddRatioPercent.AsFloat := ANode.AddRatioPercent;  cdsFxBillsQuantity.AsFloat := ANode.Quantity;  cdsFxBillsTotalPrice.AsFloat := ANode.TotalPrice;  cdsFxBillsRatioPercent.AsFloat := ANode.RatioPercent;  cdsFxBillsDgnQuantity1.AsFloat := ANode.DesignQuantity1;  cdsFxBillsDgnQuantity2.AsFloat := ANode.DesignQuantity2;  cdsFxBillsDgnQuantity.AsString := GetDgnQuantity(ANode.DesignQuantity1, ANode.DesignQuantity2);  if ANode.DesignQuantity1 <> 0 then    cdsFxBillsDgnPrice1.AsFloat := PriceRoundTo(ANode.TotalPrice/ANode.DesignQuantity1);  if ANode.DesignQuantity2 <> 0 then    cdsFxBillsDgnPrice2.AsFloat := PriceRoundTo(ANode.TotalPrice/ANode.DesignQuantity2);  if cdsFxBillsDgnPrice1.AsFloat <> 0 then    cdsFxBillsDgnPrice.AsString := GetDgnQuantity(cdsFxBillsDgnPrice1.AsFloat, cdsFxBillsDgnPrice2.AsFloat);  cdsFxBillsDealDgnQuantity1.AsFloat := ANode.DealDesignQuantity1;  cdsFxBillsDealDgnQuantity2.AsFloat := ANode.DealDesignQuantity2;  cdsFxBillsDealDgnQuantity.AsString := GetDgnQuantity(ANode.DealDesignQuantity1, ANode.DesignQuantity2);  cdsFxBillsDealDgnPrice1.AsFloat := GetDgnPrice(cdsFxBillsAddDealTotalPrice.AsFloat, cdsFxBillsDealDgnQuantity1.AsFloat);  cdsFxBillsDealDgnPrice2.AsFloat := GetDgnPrice(cdsFxBillsAddDealTotalPrice.AsFloat, cdsFxBillsDealDgnQuantity2.AsFloat);  cdsFxBillsDealDgnPrice.AsString := GetDgnQuantity(cdsFxBillsDealDgnPrice1.AsFloat, cdsFxBillsDealDgnPrice2.AsFloat);  cdsFxBillsCDgnQuantity1.AsFloat := ANode.CDesignQuantity1;  cdsFxBillsCDgnQuantity2.AsFloat := ANode.CDesignQuantity2;  cdsFxBillsCDgnQuantity.AsString := GetDgnQuantity(ANode.CDesignQuantity1, ANode.CDesignQuantity2);  cdsFxBillsCDgnPrice1.AsFloat := GetDgnPrice(cdsFxBillsAddQcTotalPrice.AsFloat, cdsFxBillsCDgnQuantity1.AsFloat);  cdsFxBillsCDgnPrice2.AsFloat := GetDgnPrice(cdsFxBillsAddQcTotalPrice.AsFloat, cdsFxBillsCDgnQuantity2.AsFloat);  cdsFxBillsCDgnPrice.AsString := GetDgnQuantity(cdsFxBillsCDgnPrice1.AsFloat, cdsFxBillsCDgnPrice2.AsFloat);  cdsFxBillsFinalDgnQuantity1.AsFloat := ANode.DealDesignQuantity1 + ANode.CDesignQuantity1;  cdsFxBillsFinalDgnQuantity2.AsFloat := ANode.DealDesignQuantity2 + ANode.CDesignQuantity2;  cdsFxBillsFinalDgnQuantity.AsString := GetDgnQuantity(cdsFxBillsFinalDgnQuantity1.AsFloat, cdsFxBillsFinalDgnQuantity2.AsFloat);  cdsFxBillsFinalDgnPrice1.AsFloat := GetDgnPrice(cdsFxBillsAddGatherTotalPrice.AsFloat, cdsFxBillsFinalDgnQuantity1.AsFloat);  cdsFxBillsFinalDgnPrice2.AsFloat := GetDgnPrice(cdsFxBillsAddGatherTotalPrice.AsFloat, cdsFxBillsFinalDgnQuantity2.AsFloat);  cdsFxBillsFinalDgnPrice.AsString := GetDgnQuantity(cdsFxBillsFinalDgnPrice1.AsFloat, cdsFxBillsFinalDgnPrice2.AsFloat);  cdsFxBills.Post;  WriteNode(TReportCacheNode(ANode.FirstChild));  WriteNode(TReportCacheNode(ANode.NextSibling));end;procedure TrmBillsGatherData.WriteGclNode;var  i: Integer;  GclNode: TGclGatherNode;begin  for i := 0 to FGclList.Count - 1 do  begin    GclNode := FGclList.Node[i];    cdsGclBills.Append;    cdsGclBillsB_Code.AsString := GclNode.B_Code;    cdsGclBillsIndexCode.AsString := GclNode.IndexCode;    cdsGclBillsName.AsString := GclNode.Name;    cdsGclBillsUnits.AsString := GclNode.Units;    cdsGclBillsPrice.AsFloat := GclNode.Price;    cdsGclBillsAddDealQuantity.AsFloat := GclNode.AddDealQuantity;    cdsGclBillsAddDealTotalPrice.AsFloat := GclNode.AddDealTotalPrice;    cdsGclBillsAddQcQuantity.AsFloat := GclNode.AddQcQuantity;    cdsGclBillsAddQcTotalPrice.AsFloat := GclNode.AddQcTotalPrice;    cdsGclBillsAddPcQuantity.AsFloat := GclNode.AddPcQuantity;    cdsGclBillsAddPcTotalPrice.AsFloat := GclNode.AddPcTotalPrice;    cdsGclBillsAddGatherQuantity.AsFloat := GclNode.AddDealQuantity + GclNode.AddQcQuantity;    cdsGclBillsAddDealTotalPrice.AsFloat := GclNode.AddDealTotalPrice +        GclNode.AddQcTotalPrice + GclNode.AddPcTotalPrice;    cdsGclBillsPrecent.AsFloat := 0;    cdsGclBillsMemoStr.AsString := '';    cdsGclBills.Post;  end;end;procedure TrmBillsGatherData.WriteProjectsData;  procedure WriteProjectData(ANode: TReportCacheNode; AProjectIndex: Integer);  begin    if not Assigned(ANode) then Exit;    cdsProjectBills.Append;    cdsProjectBillsProjectID.AsInteger := AProjectIndex;    cdsProjectBillsProjectName.AsString := FCacheTree.ProjectName[AProjectIndex];    cdsProjectBillsXiangCode.AsString := ANode.XiangCode;    cdsProjectBillsMuCode.AsString := ANode.MuCode;    cdsProjectBillsJieCode.AsString := ANode.JieCode;    cdsProjectBillsXiMuCode.AsString := ANode.XiMuCode;    cdsProjectBillsCode.AsString := ANode.Code;    cdsProjectBillsB_Code.AsString := ANode.B_Code;    cdsProjectBillsName.AsString := ANode.Name;    cdsProjectBillsUnits.AsString := ANode.Units;    // 此处数量与金额特指所有项目的累计完成数量与金额汇总。    cdsProjectBillsQuantity.AsFloat := ANode.AddDealQuantity + ANode.AddQcQuantity;    cdsProjectBillsTotalPrice.AsFloat := ANode.AddDealTotalPrice + ANode.AddQcTotalPrice + ANode.AddPcTotalPrice;    cdsProjectBillsP_Quantity.AsFloat := ANode.P_Quantity[AProjectIndex];    cdsProjectBillsP_TotalPrice.AsFloat := ANode.P_TotalPrice[AProjectIndex];    cdsProjectBillsP_Price.AsFloat := ANode.P_Price[AProjectIndex];    cdsProjectBillsSerialNo.AsInteger := FSerialNo;    cdsProjectBills.Post;    Inc(FSerialNo);    WriteProjectData(TReportCacheNode(ANode.FirstChild), AProjectIndex);    WriteProjectData(TReportCacheNode(ANode.NextSibling), AProjectIndex);  end;  procedure WriteProjectGatherData(AProjectIndex: Integer);  begin    cdsProjectBills.Append;    cdsProjectBillsProjectID.AsInteger := AProjectIndex;    cdsProjectBillsProjectName.AsString := FCacheTree.ProjectName[AProjectIndex];    cdsProjectBillsName.AsString := '金额合计';    with FCacheTree.GatherCacheNode do    begin      cdsProjectBillsTotalPrice.AsFloat := AddDealTotalPrice + AddQcTotalPrice + AddPcTotalPrice;      cdsProjectBillsP_TotalPrice.AsFloat := P_TotalPrice[AProjectIndex];    end;    cdsProjectBillsSerialNo.AsInteger := FSerialNo;    cdsProjectBills.Post;    Inc(FSerialNo);    cdsProjectBills.Append;    cdsProjectBillsProjectID.AsInteger := AProjectIndex;    cdsProjectBillsProjectName.AsString := FCacheTree.ProjectName[AProjectIndex];    cdsProjectBillsName.AsString := Format('金额总计:%f', [FCacheTree.GatherCacheNode.GatherP_TotalPrice]);    cdsProjectBillsSerialNo.AsInteger := FSerialNo;    cdsProjectBills.Post;    Inc(FSerialNo);  end;var  i: Integer;begin  for i := 0 to FCacheTree.ProjectCount - 1 do  begin    FSerialNo := 0;    WriteProjectData(TReportCacheNode(FCacheTree.FirstNode), i);    if GatherType = bgtFinal16 then      WriteProjectGatherData(i);  end;end;procedure TrmBillsGatherData.WriteEstimateNode(ANode: TReportCacheNode);begin  if not Assigned(ANode) then Exit;  WriteENodeData(ANode);  WriteEstimateNode(TReportCacheNode(ANode.FirstChild));  WriteEstimateNode(TReportCacheNode(ANode.NextSibling));end;procedure TrmBillsGatherData.FilterFixedIDBills(ATree: TsdIDTree;  AProjectIndex: Integer);var  iIndex: Integer;  stnNode: TsdIDTreeNode;  FixedIDNode: TFixedIDBillsNode;begin  for iIndex := 0 to ATree.Count - 1 do  begin    stnNode := ATree.Items[iIndex];    if stnNode.ID >= 100 then Continue;    FixedIDNode := FFixedIDList.GetFixedIDBillsNode(stnNode.ID);    FixedIDNode.TotalPrice := FixedIDNode.TotalPrice      + stnNode.Rec.ValueByName('TotalPrice').AsFloat;    FixedIDNode.TotalPrice :=      + stnNode.Rec.ValueByName('TotalPrice').AsFloat;    FixedIDNode.AddGatherTotalPrice := FixedIDNode.AddGatherTotalPrice      + stnNode.Rec.ValueByName('AddGatherTotalPrice').AsFloat;    FixedIDNode.P_AddGatherTotalPrice[AProjectIndex] :=      stnNode.Rec.ValueByName('AddGatherTotalPrice').AsFloat;  end;end;procedure TrmBillsGatherData.WriteProjectsGclData;  procedure WriteProjectGclData(AProjectIndex: Integer);  var    i: Integer;    GclNode: TGclGatherNode;  begin    for i := 0 to FGclList.Count - 1 do    begin      GclNode := FGclList.Node[i];      cdsProjectGclBills.Append;      cdsProjectGclBillsProjectID.AsInteger := AProjectIndex;      cdsProjectGclBillsProjectName.AsString := FGclList.ProjectName[AProjectIndex];      cdsProjectGclBillsB_Code.AsString := GclNode.B_Code;      cdsProjectGclBillsIndexCode.AsString := GclNode.IndexCode;      cdsProjectGclBillsName.AsString := GclNode.Name;      cdsProjectGclBillsUnits.AsString := GclNode.Units;      cdsProjectGclBillsQuantity.AsFloat := GclNode.Quantity;      cdsProjectGclBillsTotalPrice.AsFloat := GclNode.TotalPrice;      // Price须填写合计平均单价      if cdsProjectGclBillsQuantity.AsFloat <> 0 then        cdsProjectGclBillsPrice.AsFloat := cdsProjectGclBillsTotalPrice.AsFloat/cdsProjectGclBillsQuantity.AsFloat;      cdsProjectGclBillsP_Price.AsFloat := GclNode.P_Price[AProjectIndex];      cdsProjectGclBillsP_Quantity.AsFloat := GclNode.P_Quantity[AProjectIndex];      cdsProjectGclBillsP_TotalPrice.AsFloat := GclNode.P_TotalPrice[AProjectIndex];      cdsProjectGclBillsP_AddGatherQuantity.AsFloat := GclNode.P_AddGatherQuantity[AProjectIndex];      cdsProjectGclBillsP_AddGatherTotalPrice.AsFloat := GclNode.P_AddGatherTotalPrice[AProjectIndex];      cdsProjectGclBillsAddGatherQuantity.AsFloat := GclNode.AddDealQuantity + GclNode.AddQcQuantity;      cdsProjectGclBillsAddGatherTotalPrice.AsFloat := GclNode.AddDealTotalPrice          + GclNode.AddQcTotalPrice + GclNode.AddPcTotalPrice;      cdsProjectGclBillsSerialNo.AsInteger := FSerialNo;      cdsProjectGclBills.Post;    end;    Inc(FSerialNo);  end;  procedure WriteGatherNodeData(AProjectIndex: Integer);  begin    cdsProjectGclBills.Append;    cdsProjectGclBillsProjectID.AsInteger := AProjectIndex;    cdsProjectGclBillsProjectName.AsString := FGclList.ProjectName[AProjectIndex];    case GatherType of      bgtFinal07: cdsProjectGclBillsName.AsString := '小计';      bgtFinal11: cdsProjectGclBillsName.AsString := '第100章至900章清单合计';      bgtFinal19: cdsProjectGclBillsName.AsString := '合计';    end;    cdsProjectGclBillsTotalPrice.AsFloat := FGclList.GatherNode.TotalPrice;    cdsProjectGclBillsP_TotalPrice.AsFloat := FGclList.GatherNode.P_TotalPrice[AProjectIndex];    cdsProjectGclBillsAddGatherTotalPrice.AsFloat := FGclList.GatherNode.AddDealTotalPrice        + FGclList.GatherNode.AddQcTotalPrice + FGclList.GatherNode.AddPcTotalPrice;    cdsProjectGclBillsP_AddGatherTotalPrice.AsFloat := FGclList.GatherNode.P_AddGatherTotalPrice[AProjectIndex];    cdsProjectGclBillsSerialNo.AsInteger := FSerialNo;    cdsProjectGclBills.Post;    Inc(FSerialNo);  end;  procedure WriteFixedIDData(AProjectIndex: Integer; ANode: TFixedIDBillsNode; const AName: string);  begin    cdsProjectGclBills.Append;    cdsProjectGclBillsProjectID.AsInteger := AProjectIndex;    cdsProjectGclBillsProjectName.AsString := FGclList.ProjectName[AProjectIndex];    cdsProjectGclBillsName.AsString := AName;    if Assigned(ANode) then    begin      cdsProjectGclBillsTotalPrice.AsFloat := ANode.TotalPrice;      cdsProjectGclBillsP_TotalPrice.AsFloat := ANode.P_TotalPrice[AProjectIndex];      cdsProjectGclBillsAddGatherTotalPrice.AsFloat := ANode.AddGatherTotalPrice;      cdsProjectGclBillsP_AddGatherTotalPrice.AsFloat := ANode.P_AddGatherTotalPrice[AProjectIndex];    end;    cdsProjectGclBillsSerialNo.AsInteger := FSerialNo;    cdsProjectGclBills.Post;  end;  procedure WriteFixedIDBillsData07(AProjectIndex: Integer);  var    fTotalPrice, fP_TotalPrice, fAddGatherTotalPrice, fP_AddGatherTotalPrice: Double;    Node54, Node45, Node40, Node51: TFixedIDBillsNode;  begin    fTotalPrice := FGclList.GatherNode.TotalPrice;    fP_TotalPrice := FGclList.GatherNode.P_TotalPrice[AProjectIndex];    fAddGatherTotalPrice := FGclList.GatherNode.AddDealTotalPrice        + FGclList.GatherNode.AddQcTotalPrice + FGclList.GatherNode.AddPcTotalPrice;    fP_AddGatherTotalPrice := FGclList.GatherNode.P_AddGatherTotalPrice[AProjectIndex];    // 变更引起调整合计 全部取0    cdsProjectGclBills.Append;    cdsProjectGclBillsProjectID.AsInteger := AProjectIndex;    cdsProjectGclBillsProjectName.AsString := FGclList.ProjectName[AProjectIndex];    cdsProjectGclBillsName.AsString := '变更引起调整合计';    cdsProjectGclBillsSerialNo.AsInteger := FSerialNo;    cdsProjectGclBills.Post;    Inc(FSerialNo);    // 工程项目调价合计    Node54 := FFixedIDList.FixedIDBillsNode(54);    WriteFixedIDData(AProjectIndex, Node54, '工程项目调价合计');    if Assigned(Node54) then    begin      fTotalPrice := fTotalPrice + Node54.TotalPrice;      fP_TotalPrice := fP_TotalPrice + Node54.P_TotalPrice[AProjectIndex];      fAddGatherTotalPrice := fAddGatherTotalPrice + Node54.AddGatherTotalPrice;      fP_AddGatherTotalPrice := fP_AddGatherTotalPrice + Node54.P_AddGatherTotalPrice[AProjectIndex];    end;    // 工程项目索赔合计    Node45 := FFixedIDList.FixedIDBillsNode(45);    WriteFixedIDData(AProjectIndex, Node45, '工程项目索赔合计');    if Assigned(Node45) then    begin      fTotalPrice := fTotalPrice + Node45.TotalPrice;      fP_TotalPrice := fP_TotalPrice + Node45.P_TotalPrice[AProjectIndex];      fAddGatherTotalPrice := fAddGatherTotalPrice + Node45.AddGatherTotalPrice;      fP_AddGatherTotalPrice := fP_AddGatherTotalPrice + Node45.P_AddGatherTotalPrice[AProjectIndex];    end;    // 计日工支出合计    Node40 := FFixedIDList.FixedIDBillsNode(40);    WriteFixedIDData(AProjectIndex, Node40, '计日工支出合计');    if Assigned(Node40) then    begin      fTotalPrice := fTotalPrice + Node40.TotalPrice;      fP_TotalPrice := fP_TotalPrice + Node40.P_TotalPrice[AProjectIndex];      fAddGatherTotalPrice := fAddGatherTotalPrice + Node40.AddGatherTotalPrice;      fP_AddGatherTotalPrice := fP_AddGatherTotalPrice + Node40.P_AddGatherTotalPrice[AProjectIndex];    end;    // 金额合计    cdsProjectGclBills.Append;    cdsProjectGclBillsProjectID.AsInteger := AProjectIndex;    cdsProjectGclBillsProjectName.AsString := FGclList.ProjectName[AProjectIndex];    cdsProjectGclBillsName.AsString := '金额合计';    cdsProjectGclBillsTotalPrice.AsFloat := fTotalPrice;    cdsProjectGclBillsP_TotalPrice.AsFloat := fP_TotalPrice;    cdsProjectGclBillsAddGatherTotalPrice.AsFloat := fAddGatherTotalPrice;    cdsProjectGclBillsP_AddGatherTotalPrice.AsFloat := fP_AddGatherTotalPrice;    cdsProjectGclBillsSerialNo.AsInteger := FSerialNo;    cdsProjectGclBills.Post;    Inc(FSerialNo);    // 设备费    Node51 := FFixedIDList.FixedIDBillsNode(51);    WriteFixedIDData(AProjectIndex, Node51, '设备费');  end;  procedure WriteFixedIDBillsData11(AProjectIndex: Integer);  var    fTotalPrice, fP_TotalPrice, fAddGatherTotalPrice, fP_AddGatherTotalPrice: Double;    Node19, Node40, NodeTotal: TFixedIDBillsNode;  begin    fTotalPrice := FGclList.GatherNode.TotalPrice;    fP_TotalPrice := FGclList.GatherNode.P_TotalPrice[AProjectIndex];    fAddGatherTotalPrice := FGclList.GatherNode.AddDealTotalPrice        + FGclList.GatherNode.AddQcTotalPrice + FGclList.GatherNode.AddPcTotalPrice;    fP_AddGatherTotalPrice := FGclList.GatherNode.P_AddGatherTotalPrice[AProjectIndex];    // 计日工合计    Node40 := FFixedIDList.FixedIDBillsNode(40);    WriteFixedIDData(AProjectIndex, Node40, '计日工合计');    if Assigned(Node40) then    begin      fTotalPrice := fTotalPrice + Node40.TotalPrice;      fP_TotalPrice := fP_TotalPrice + Node40.P_TotalPrice[AProjectIndex];      fAddGatherTotalPrice := fTotalPrice + Node40.AddGatherTotalPrice;      fP_AddGatherTotalPrice := fP_TotalPrice + Node40.P_AddGatherTotalPrice[AProjectIndex];    end;    // 暂列金额合计    Node19 := FFixedIDList.FixedIDBillsNode(19);    WriteFixedIDData(AProjectIndex, Node19, '暂列金额合计');    if Assigned(Node19) then    begin      fTotalPrice := fTotalPrice + Node19.TotalPrice;      fP_TotalPrice := fP_TotalPrice + Node19.P_TotalPrice[AProjectIndex];      fAddGatherTotalPrice := fTotalPrice + Node19.AddGatherTotalPrice;      fP_AddGatherTotalPrice := fP_TotalPrice + Node19.P_AddGatherTotalPrice[AProjectIndex];    end;    // 其他类别费用合计&金额合计    NodeTotal := FFixedIDList.FixedIDBillsNode(-1);    // 其他类别费用 = 金额合计 - 第100章至900章合计 - 计日工合计 - 暂列金额合计    if Assigned(NodeTotal) then    begin      fTotalPrice := NodeTotal.TotalPrice - fTotalPrice;      fP_TotalPrice := NodeTotal.P_TotalPrice[AProjectIndex] - fP_TotalPrice;      fAddGatherTotalPrice := NodeTotal.AddGatherTotalPrice - fAddGatherTotalPrice;      fP_AddGatherTotalPrice := NodeTotal.P_AddGatherTotalPrice[AProjectIndex] - fP_AddGatherTotalPrice;    end;    cdsProjectGclBills.Append;    cdsProjectGclBillsProjectID.AsInteger := AProjectIndex;    cdsProjectGclBillsProjectName.AsString := FGclList.ProjectName[AProjectIndex];    cdsProjectGclBillsName.AsString := '其他类别费用合计';    cdsProjectGclBillsTotalPrice.AsFloat := fTotalPrice;    cdsProjectGclBillsP_TotalPrice.AsFloat := fP_TotalPrice;    cdsProjectGclBillsAddGatherTotalPrice.AsFloat := fAddGatherTotalPrice;    cdsProjectGclBillsP_AddGatherTotalPrice.AsFloat := fP_AddGatherTotalPrice;    cdsProjectGclBillsSerialNo.AsInteger := FSerialNo;    cdsProjectGclBills.Post;    Inc(FSerialNo);    WriteFixedIDData(AProjectIndex, NodeTotal, '金额合计');  end;var  iProject: Integer;begin  for iProject := 0 to FGclList.ProjectCount - 1 do  begin    FSerialNo := 0;    WriteProjectGclData(iProject);    WriteGatherNodeData(iProject);    case GatherType of      bgtFinal07: WriteFixedIDBillsData07(iProject);      bgtFinal11: WriteFixedIDBillsData11(iProject);    end;  end;end;procedure TrmBillsGatherData.FilterSettlement(AProjectData: TProjectData;  AProjectIndex: Integer);var  FixedIDNode: TFixedIDBillsNode;begin  // -1表示项目结算价  FixedIDNode := FFixedIDList.GetFixedIDBillsNode(-1);  FixedIDNode.TotalPrice := FixedIDNode.TotalPrice + AProjectData.BillsData.Settlement[0];  FixedIDNode.P_TotalPrice[AProjectIndex] := AProjectData.BillsData.Settlement[0];  FixedIDNode.AddGatherTotalPrice := FixedIDNode.AddGatherTotalPrice    + AProjectData.BillsData.Settlement[4];  FixedIDNode.P_AddGatherTotalPrice[AProjectIndex] :=    AProjectData.BillsData.Settlement[4];end;procedure TrmBillsGatherData.WriteFlowData(AProjectData: TProjectData);begin  case GatherType of    bgtFinal12: WriteBGLFlowData(AProjectData);  end;end;procedure TrmBillsGatherData.WriteBGLFlowData(AProjectData: TProjectData);  procedure WriteBGLData(ABGLID: Integer);  begin    with AProjectData.BGLData do    begin      cdsBGBills.Filter := 'BGID = ' + IntToStr(ABGLID);      cdsBGBills.Filtered := True;      try        if cdsBGBills.RecordCount = 0 then        begin          cdsBGLFlow.Append;          cdsBGLFlowMergeBGLCode.AsString := cdsBGLCode.AsString;          cdsBGLFlowBGLName.AsString := cdsBGLName.AsString;          cdsBGLFlowApprovalCode.AsString := cdsBGLApprovalCode.AsString;          cdsBGLFlowSuggestion.AsString := '同意';          cdsBGLFlowBGReason.AsString := cdsBGLPos_Reason.AsString;          cdsBGLFlowBGTotalPrice.AsFloat := cdsBGLTotalPrice.AsFloat;          cdsBGLFlow.Post;          Exit;        end;        cdsBGBills.First;        while not cdsBGBills.Eof do        begin          cdsBGLFlow.Append;          cdsBGLFlowMergeBGLCode.AsString := cdsBGLCode.AsString;          cdsBGLFlowBGLName.AsString := cdsBGLName.AsString;          cdsBGLFlowApprovalCode.AsString := cdsBGLApprovalCode.AsString;          cdsBGLFlowSuggestion.AsString := '同意';          cdsBGLFlowBGReason.AsString := cdsBGLPos_Reason.AsString;          cdsBGLFlowBGTotalPrice.AsFloat := cdsBGLTotalPrice.AsFloat;          cdsBGLFlowB_Code.AsString := cdsBGBillsB_Code.AsString;          cdsBGLFlowName.AsString := cdsBGBillsName.AsString;          cdsBGLFlowUnits.AsString := cdsBGBillsUnits.AsString;          cdsBGLFlowQuantity.AsFloat := cdsBGBillsQuantity.AsFloat;          cdsBGLFlowPrice.AsFloat := cdsBGBillsPrice.AsFloat;          cdsBGLFlowTotalPrice.AsFloat := cdsBGBillsTotalPrice.AsFloat;          cdsBGLFlow.Post;          cdsBGBills.Next;        end;      finally        cdsBGBills.Filtered := False;      end;    end;  end;begin  cdsBGLFlow.Append;  cdsBGLFlowMergeBGLCode.AsString := AProjectData.ProjProperties.DealIndex;  cdsBGLFlow.Post;  with AProjectData.BGLData do  begin    cdsBGL.First;    while not cdsBGL.Eof do    begin      WriteBGLData(cdsBGLID.AsInteger);      cdsBGL.Next;    end;  end;end;procedure TrmBillsGatherData.AddBillsList(ANode: TsdIDTreeNode;  AParent: TReportCacheNode; AProjectIndex: Integer;  ASelectProject: TSelectProject);var  ACur: TReportCacheNode;begin  if not Assigned(ANode) then Exit;  // 按设置的层次汇总  case ReportConfig.GatherLevel of    // 项    0: if ANode.Level > 2 then Exit;    // 目    1: if ANode.Level > 3 then Exit;    // 节    2: if ANode.Level > 4 then Exit;    // 细目    3: if ANode.Level > 5 then Exit;    // 项目节    4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;  end;  if GatherType in [bgtXmj, bgtMultiXmj, bgtEstimate, bgtEstimate1, bgtQgcZj] then    if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;  ACur := AddBillsNode(ANode, AParent, AProjectIndex, ASelectProject);  AddBills(ANode.FirstChild, ACur, AProjectIndex, ASelectProject);end;procedure TrmBillsGatherData.WriteGatherCacheNode(const AGatherName: string);begin  cdsFxBills.Append;  cdsFxBillsName.AsString := AGatherName;  with FCacheTree.GatherCacheNode do  begin    cdsFxBillsAddDealTotalPrice.AsFloat := AddDealTotalPrice;    cdsFxBillsAddQcTotalPrice.AsFloat := AddQcTotalPrice;    cdsFxBillsAddPcTotalPrice.AsFloat := AddPcTotalPrice;    cdsFxBillsAddGatherTotalPrice.AsFloat := AddDealTotalPrice +        AddQcTotalPrice + AddPcTotalPrice;    cdsFxBillsTotalPrice.AsFloat := TotalPrice;  end;  cdsFxBills.Post;end;procedure TrmBillsGatherData.CalculateGatherData;begin  if GatherType in [bgtFinal08, bgtFinal16, bgtEstimate, bgtEstimate1, bgtG_Final04, bgtQgcZj] then    FCacheTree.ReCalcGatherData;  if GatherType in [bgtFinal07, bgtFinal11, bgtFinal19] then    FGclList.ReCalcualteGatherNode;end;procedure TrmBillsGatherData.WriteBillsData;begin  WriteNode(TReportCacheNode(FCacheTree.FirstNode));  case GatherType of    bgtFinal08: WriteGatherCacheNode('金额合计');    bgtG_Final04: WriteGatherCacheNode('公路基本造价');  end;end;procedure TrmBillsGatherData.WriteEstimateGatherNode;begin  cdsEstimateBills.Append;  cdsEstimateBillsName.AsString := '公路基本造价';  with FCacheTree.GatherCacheNode do  begin    cdsEstimateBillsTotalPrice.AsFloat := TotalPrice;    cdsEstimateBillsAddDealTotalPrice.AsFloat := AddDealTotalPrice;    cdsEstimateBillsAddCTotalPrice.AsFloat := AddQcTotalPrice + AddPcTotalPrice;    cdsEstimateBillsAddGatherTotalPrice.AsFloat :=        cdsEstimateBillsAddDealTotalPrice.AsFloat + cdsEstimateBillsAddCTotalPrice.AsFloat;    cdsEstimateBillsTotalPriceAdjust.AsFloat :=        cdsEstimateBillsAddGatherTotalPrice.AsFloat - cdsEstimateBillsPDTotalPrice.AsFloat;    cdsEstimateBillsPDTotalPrice.AsFloat := PDTotalPrice;    cdsEstimateBillsCDDTotalPrice.AsFloat := CDDTotalPrice;    cdsEstimateBillsABTotalPrice.AsFloat := ABTotalPrice;    cdsEstimateBillsTotalPriceCompare1.AsFloat := GetCompare(ABTotalPrice, TotalPrice);    cdsEstimateBillsTotalPriceCompare2.AsFloat :=        GetCompare(ABTotalPrice, cdsEstimateBillsAddGatherTotalPrice.AsFloat);    cdsEstimateBillsTotalPriceCompare3.AsFloat :=        GetCompare(TotalPrice, cdsEstimateBillsAddGatherTotalPrice.AsFloat);  end;  cdsEstimateBills.Post;end;procedure TrmBillsGatherData.WriteEstimateData;begin  WriteEstimateNode(TReportCacheNode(FCacheTree.FirstNode));  if GatherType = bgtG_Final06_1 then    ReWriteENodeDataAsGather(TReportCacheNode(FCacheTree.FirstNode), '土地征用及拆迁补偿费用合计');  if GatherType in [bgtEstimate, bgtEstimate1] then    WriteEstimateGatherNode;end;function TrmBillsGatherData.GetCompare(ANum1, ANum2: Double): Double;begin  Result := 0;  if ANum1 <> 0 then    Result := (ANum2 - ANum1)/ANum1*100;end;procedure TrmBillsGatherData.WriteENodeData(ANode: TReportCacheNode);begin  cdsEstimateBills.Append;  cdsEstimateBillsXiangCode.AsString := ANode.XiangCode;  cdsEstimateBillsMuCode.AsString := ANode.MuCode;  cdsEstimateBillsJieCode.AsString := ANode.JieCode;  cdsEstimateBillsXiMuCode.AsString := ANode.XiMuCode;  cdsEstimateBillsCode.AsString := ANode.Code;  cdsEstimateBillsB_Code.AsString := ANode.B_Code;  cdsEstimateBillsName.AsString := ANode.Name;  cdsEstimateBillsUnits.AsString := ANode.Units;  cdsEstimateBillsPrice.AsFloat := ANode.Price;  cdsEstimateBillsQuantity.AsFloat := ANode.Quantity;  cdsEstimateBillsTotalPrice.AsFloat := ANode.TotalPrice;  cdsEstimateBillsDgnQuantity1.AsFloat := ANode.DesignQuantity1;  cdsEstimateBillsDgnQuantity2.AsFloat := ANode.DesignQuantity2;  cdsEstimateBillsDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsDgnQuantity1.AsFloat, cdsEstimateBillsDgnQuantity2.AsFloat);  cdsEstimateBillsDgnPrice.AsFloat := ANode.DesignPrice;  cdsEstimateBillsAddDealQuantity.AsFloat := ANode.AddDealQuantity;  cdsEstimateBillsAddDealTotalPrice.AsFloat := ANode.AddDealTotalPrice;  cdsEstimateBillsAddCQuantity.AsFloat := ANode.AddQcQuantity;  cdsEstimateBillsAddCTotalPrice.AsFloat := ANode.AddQcTotalPrice + ANode.AddPcTotalPrice;  cdsEstimateBillsAddGatherQuantity.AsFloat :=      cdsEstimateBillsAddDealQuantity.AsFloat + cdsEstimateBillsAddCQuantity.AsFloat;  cdsEstimateBillsAddGatherTotalPrice.AsFloat :=      cdsEstimateBillsAddDealTotalPrice.AsFloat + cdsEstimateBillsAddCTotalPrice.AsFloat;  cdsEstimateBillsQuantityAdjust.AsFloat :=      cdsEstimateBillsAddGatherQuantity.AsFloat - cdsEstimateBillsPDQuantity.AsFloat;  cdsEstimateBillsTotalPriceAdjust.AsFloat :=      cdsEstimateBillsAddGatherTotalPrice.AsFloat - cdsEstimateBillsPDTotalPrice.AsFloat;  cdsEstimateBillsDifferPercent1.AsFloat := ANode.DifferPercent1;  cdsEstimateBillsDealDgnQuantity1.AsFloat := ANode.DealDesignQuantity1;  cdsEstimateBillsDealDgnQuantity2.AsFloat := ANode.DealDesignQuantity2;  cdsEstimateBillsDealDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsDealDgnQuantity1.AsFloat, cdsEstimateBillsDealDgnQuantity2.AsFloat);  cdsEstimateBillsCDgnQuantity1.AsFloat := ANode.CDesignQuantity1;  cdsEstimateBillsCDgnQuantity2.AsFloat := ANode.CDesignQuantity2;  cdsEstimateBillsCDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsCDgnQuantity1.AsFloat, cdsEstimateBillsCDgnQuantity2.AsFloat);  cdsEstimateBillsGatherDgnQuantity1.AsFloat :=      cdsEstimateBillsDealDgnQuantity1.AsFloat + cdsEstimateBillsCDgnQuantity1.AsFloat;  cdsEstimateBillsGatherDgnQuantity2.AsFloat :=      cdsEstimateBillsDealDgnQuantity2.AsFloat + cdsEstimateBillsCDgnQuantity2.AsFloat;;  cdsEstimateBillsGatherDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsGatherDgnQuantity1.AsFloat, cdsEstimateBillsGatherDgnQuantity2.AsFloat);  cdsEstimateBillsFinalDgnQty1.AsFloat := cdsEstimateBillsDgnQuantity1.AsFloat + cdsEstimateBillsCDgnQuantity1.AsFloat;  cdsEstimateBillsFinalDgnQty2.AsFloat := cdsEstimateBillsDgnQuantity2.AsFloat + cdsEstimateBillsCDgnQuantity2.AsFloat;  cdsEstimateBillsFinalDgnQty.AsString := GetDgnQuantity(      cdsEstimateBillsFinalDgnQty1.AsFloat, cdsEstimateBillsFinalDgnQty2.AsFloat);  cdsEstimateBillsFinalDgnQtyA1.AsFloat := cdsEstimateBillsDealDgnQuantity1.AsFloat + cdsEstimateBillsCDgnQuantity1.AsFloat;  cdsEstimateBillsFinalDgnQtyA2.AsFloat := cdsEstimateBillsDealDgnQuantity2.AsFloat + cdsEstimateBillsCDgnQuantity2.AsFloat;  cdsEstimateBillsFinalDgnQtyA.AsString := GetDgnQuantity(      cdsEstimateBillsFinalDgnQtyA1.AsFloat, cdsEstimateBillsFinalDgnQtyA2.AsFloat);  cdsEstimateBillsFinalDgnPriceA.AsFloat := ANode.FinalDesignPrice;  cdsEstimateBillsPASQuantity.AsFloat := ANode.PASQuantity;  cdsEstimateBillsPASTotalPrice.AsFloat := ANode.PASTotalPrice;  cdsEstimateBillsPASDgnQuantity1.AsFloat := ANode.PASDesignQuantity1;  cdsEstimateBillsPASDgnQuantity2.AsFloat := ANode.PASDesignQuantity2;  cdsEstimateBillsPASDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsPASDgnQuantity1.AsFloat, cdsEstimateBillsPASDgnQuantity2.AsFloat);  cdsEstimateBillsPASDgnPrice.AsFloat := ANode.PASDesignPrice;  cdsEstimateBillsPDQuantity.AsFloat := ANode.PDQuantity;  cdsEstimateBillsPDTotalPrice.AsFloat := ANode.PDTotalPrice;  cdsEstimateBillsPDDgnQuantity1.AsFloat := ANode.PDDesignQuantity1;  cdsEstimateBillsPDDgnQuantity2.AsFloat := ANode.PDDesignQuantity2;  cdsEstimateBillsPDDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsPDDgnQuantity1.AsFloat, cdsEstimateBillsPDDgnQuantity2.AsFloat);  cdsEstimateBillsPDDgnPrice.AsFloat := ANode.PDDesignPrice;  cdsEstimateBillsCDDQuantity.AsFloat := ANode.CDDQuantity;  cdsEstimateBillsCDDTotalPrice.AsFloat := ANode.CDDTotalPrice;  cdsEstimateBillsCDDDgnQuantity1.AsFloat := ANode.CDDDesignQuantity1;  cdsEstimateBillsCDDDgnQuantity2.AsFloat := ANode.CDDDesignQuantity2;  cdsEstimateBillsCDDDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsCDDDgnQuantity1.AsFloat, cdsEstimateBillsCDDDgnQuantity2.AsFloat);  cdsEstimateBillsCDDDgnPrice.AsFloat := ANode.CDDDesignPrice;  cdsEstimateBillsABQuantity.AsFloat := ANode.ABQuantity;  cdsEstimateBillsABTotalPrice.AsFloat := ANode.ABTotalPrice;  cdsEstimateBillsABDgnQuantity1.AsFloat := ANode.ABDesignQuantity1;  cdsEstimateBillsABDgnQuantity2.AsFloat := ANode.ABDesignQuantity2;  cdsEstimateBillsABDgnQuantity.AsString :=      GetDgnQuantity(cdsEstimateBillsABDgnQuantity1.AsFloat, cdsEstimateBillsABDgnQuantity2.AsFloat);  cdsEstimateBillsABDgnPrice.AsFloat := ANode.ABDesignPrice;      cdsEstimateBillsQuantityCompare1.AsFloat := GetCompare(ANode.ABQuantity, ANode.Quantity);  cdsEstimateBillsTotalPriceCompare1.AsFloat := GetCompare(ANode.ABTotalPrice, ANode.TotalPrice);  cdsEstimateBillsDgnQuantity1Compare1.AsFloat := GetCompare(      cdsEstimateBillsABDgnQuantity1.AsFloat, cdsEstimateBillsDgnQuantity1.AsFloat);  cdsEstimateBillsDgnQuantity2Compare1.AsFloat := GetCompare(      cdsEstimateBillsABDgnQuantity2.AsFloat, cdsEstimateBillsDgnQuantity2.AsFloat);  cdsEstimateBillsDgnQuantityCompare1.AsString := GetDgnQuantity(      cdsEstimateBillsDgnQuantity1Compare1.AsFloat, cdsEstimateBillsDgnQuantity2Compare1.AsFloat);  cdsEstimateBillsQuantityCompare2.AsFloat :=      GetCompare(ANode.ABQuantity, cdsEstimateBillsAddGatherQuantity.AsFloat);  cdsEstimateBillsTotalPriceCompare2.AsFloat :=      GetCompare(ANode.ABTotalPrice, cdsEstimateBillsAddGatherTotalPrice.AsFloat);  cdsEstimateBillsDgnQuantity1Compare2.AsFloat := GetCompare(      cdsEstimateBillsABDgnQuantity1.AsFloat, cdsEstimateBillsGatherDgnQuantity1.AsFloat);  cdsEstimateBillsDgnQuantity2Compare2.AsFloat := GetCompare(      cdsEstimateBillsABDgnQuantity2.AsFloat, cdsEstimateBillsGatherDgnQuantity2.AsFloat);  cdsEstimateBillsDgnQuantityCompare2.AsString := GetDgnQuantity(      cdsEstimateBillsDgnQuantity1Compare2.AsFloat, cdsEstimateBillsDgnQuantity2Compare2.AsFloat);  cdsEstimateBillsQuantityCompare3.AsFloat :=      GetCompare(ANode.Quantity, cdsEstimateBillsAddGatherQuantity.AsFloat);  cdsEstimateBillsTotalPriceCompare3.AsFloat :=      GetCompare(ANode.TotalPrice, cdsEstimateBillsAddGatherTotalPrice.AsFloat);  cdsEstimateBillsDgnQuantity1Compare3.AsFloat := GetCompare(      cdsEstimateBillsDgnQuantity1.AsFloat, cdsEstimateBillsGatherDgnQuantity1.AsFloat);  cdsEstimateBillsDgnQuantity2Compare3.AsFloat := GetCompare(      cdsEstimateBillsDgnQuantity2.AsFloat, cdsEstimateBillsGatherDgnQuantity2.AsFloat);  cdsEstimateBillsDgnQuantityCompare3.AsString := GetDgnQuantity(      cdsEstimateBillsDgnQuantity1Compare3.AsFloat, cdsEstimateBillsDgnQuantity2Compare3.AsFloat);  cdsEstimateBills.Post;end;procedure TrmBillsGatherData.ReWriteENodeDataAsGather(  ANode: TReportCacheNode; AName: string);begin  WriteENodeData(ANode);  cdsEstimateBills.Edit;  cdsEstimateBillsXiangCode.AsString := '';  cdsEstimateBillsMuCode.AsString := '';  cdsEstimateBillsJieCode.AsString := '';  cdsEstimateBillsXiMuCode.AsString := '';  cdsEstimateBillsCode.AsString := '';  cdsEstimateBillsName.AsString := AName;  cdsEstimateBillsUnits.AsString := '';  cdsEstimateBills.Post;end;function TrmBillsGatherData.GetDgnQuantity(ANum1, ANum2: Double): string;begin  Result := '';  if ANum1 <> 0 then  begin    Result := FloatToStr(ANum1);    if ANum2 <> 0 then      Result := Result + '/' + FloatToStr(ANum2);  end;end;procedure TrmBillsGatherData.CalculateRatioPercent;begin  if GatherType = bgtG_Final04 then    FCacheTree.ReCalcGatherData;end;function TrmBillsGatherData.GetDgnPrice(ATotalPrice,  ADgnQuantity: Double): Double;begin  if ADgnQuantity <> 0 then    Result := PriceRoundTo(ATotalPrice/ADgnQuantity)  else    Result := 0;end;end.
 |