1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192 |
- unit rmZhongKaiDm;
- // 中开定制报表
- interface
- uses
- SysUtils, Classes, DB, DBClient, ProjectData, mDataRecord, sdDB,
- rmSelectProjectFrm, BillsTree;
- type
- TGclNode = class
- private
- FB_Code: string;
- FIndexCode: string;
- FName: string;
- FUnits: string;
- FPrice: Double;
- FCalcType: Integer;
- FCTotalPrice: Double;
- FCurGatherQuantity: Double;
- FCurGatherTotalPrice: Double;
- FEndGatherQuantity: Double;
- FEndGatherTotalPrice: Double;
- FPreGatherQuantity: Double;
- FPreGatherTotalPrice: Double;
- FEndPqcQuantity: Double;
- FEndPqcTotalPrice: Double;
- FEndPqcaTotalPrice: Double;
- FEndMqcQuantity: Double;
- FEndMqcTotalPrice: Double;
- FEndMqcaTotalPrice: Double;
- FEndQcQuantity: Double;
- FEndQcTotalPrice: Double;
- FEndQcaTotalPrice: Double;
- FDealQuantity: Double;
- FDealTotalPrice: Double;
- procedure SetB_Code(const Value: string);
- public
- property B_Code: string read FB_Code write SetB_Code;
- property IndexCode: string read FIndexCode;
- property Name: string read FName write FName;
- property Units: string read FUnits write FUnits;
- property Price: Double read FPrice write FPrice;
- property CalcType: Integer read FCalcType write FCalcType;
- property CurGatherQuantity: Double read FCurGatherQuantity write FCurGatherQuantity;
- property CurGatherTotalPrice: Double read FCurGatherTotalPrice write FCurGatherTotalPrice;
- property EndGatherQuantity: Double read FEndGatherQuantity write FEndGatherQuantity;
- property EndGatherTotalPrice: Double read FEndGatherTotalPrice write FEndGatherTotalPrice;
- property PreGatherQuantity: Double read FPreGatherQuantity write FPreGatherQuantity;
- property PreGatherTotalPrice: Double read FPreGatherTotalPrice write FPreGatherTotalPrice;
- property EndPqcQuantity: Double read FEndPqcQuantity write FEndPqcQuantity;
- property EndPqcTotalPrice: Double read FEndPqcTotalPrice write FEndPqcTotalPrice;
- property EndPqcaTotalPrice: Double read FEndPqcaTotalPrice write FEndPqcaTotalPrice;
-
- property EndMqcQuantity: Double read FEndMqcQuantity write FEndMqcQuantity;
- property EndMqcTotalPrice: Double read FEndMqcTotalPrice write FEndMqcTotalPrice;
- property EndMqcaTotalPrice: Double read FEndMqcaTotalPrice write FEndMqcaTotalPrice;
- property EndQcQuantity: Double read FEndQcQuantity write FEndQcQuantity;
- property EndQcTotalPrice: Double read FEndQcTotalPrice write FEndQcTotalPrice;
- property EndQcaTotalPrice: Double read FEndQcaTotalPrice write FEndQcaTotalPrice;
- property DealQuantity: Double read FDealQuantity write FDealQuantity;
- property DealTotalPrice: Double read FDealTotalPrice write FDealTotalPrice;
- end;
- TGclChapter = class
- private
- FGclNodes: TList;
- FChapterID: Integer;
- FChapterBegin: Integer;
- FChapterEnd: Integer;
- FChapterName: string;
- FName: string;
- FTotalPrice: Double;
- FCTotalPrice: Double;
- FGTotalPrice: Double;
- FCurGatherTotalPrice: Double;
- FEndGatherTotalPrice: Double;
- FPreGatherTotalPrice: Double;
- FEndPqcTotalPrice: Double;
- FEndPqcaTotalPrice: Double;
- FEndMqcTotalPrice: Double;
- FEndMqcaTotalPrice: Double;
- FEndQcTotalPrice: Double;
- FEndQcaTotalPrice: Double;
- FDealTotalPrice: Double;
- function GetCurPercent: Double;
- function GetEndPercent: Double;
- function GetPrePercent: Double;
- function GetGclNodeCount: Integer;
- function GetGclNode(AIndex: Integer): TGclNode;
- public
- constructor Create(AID: Integer; AName: string);
- destructor Destroy; override;
- procedure AddGclNode(AGclNode: TGclNode);
- procedure CalculateChapter;
- property ChapterID: Integer read FChapterID;
- property ChapterBegin: Integer read FChapterBegin;
- property ChapterEnd: Integer read FChapterEnd;
- property ChapterName: string read FChapterName;
- property Name: string read FName;
- property TotalPrice: Double read FTotalPrice write FTotalPrice;
- property CTotalPrice: Double read FCTotalPrice write FCTotalPrice;
- property GTotalPrice: Double read FGTotalPrice write FGTotalPrice;
- property CurGatherTotalPrice: Double read FCurGatherTotalPrice write FCurGatherTotalPrice;
- property EndGatherTotalPrice: Double read FEndGatherTotalPrice write FEndGatherTotalPrice;
- property PreGatherTotalPrice: Double read FPreGatherTotalPrice write FPreGatherTotalPrice;
- property CurPercent: Double read GetCurPercent;
- property EndPercent: Double read GetEndPercent;
- property PrePercent: Double read GetPrePercent;
- property EndPqcTotalPrice: Double read FEndPqcTotalPrice write FEndPqcTotalPrice;
- property EndPqcaTotalPrice: Double read FEndPqcaTotalPrice write FEndPqcaTotalPrice;
- property EndMqcTotalPrice: Double read FEndMqcTotalPrice write FEndMqcTotalPrice;
- property EndMqcaTotalPrice: Double read FEndMqcaTotalPrice write FEndMqcaTotalPrice;
- property EndQcTotalPrice: Double read FEndQcTotalPrice write FEndQcTotalPrice;
- property EndQcaTotalPrice: Double read FEndQcaTotalPrice write FEndQcaTotalPrice;
- property DealTotalPrice: Double read FDealTotalPrice write FDealTotalPrice;
- property GclNodeCount: Integer read GetGclNodeCount;
- property GclNode[AIndex: Integer]: TGclNode read GetGclNode;
- end;
- TGclControl = class
- private
- FGclNodes: TList;
- FGclChapters: TList;
- FOtherGcl: TGclChapter;
- FGclChapterGather: TGclChapter;
- function FindGclChapter(const AB_Code: string): TGclChapter;
- procedure LinkGclChapter(AGclNode: TGclNode);
- procedure CalculateChapterGather;
- function FindGclNode(ARec: TBillsRecord): TGclNode;
- function NewGclNode(ARec: TBillsRecord): TGclNode;
- function FindDealGclNode(ADealRec: TsdDataRecord): TGclNode;
- function NewDealGclNode(ADealRec: TsdDataRecord): TGclNode;
- function GetGclChapterCount: Integer;
- function GetGclChapter(AIndex: Integer): TGclChapter;
- public
- constructor Create;
- destructor Destroy; override;
- function AddGclNode(ARec: TBillsRecord; AStageRec: TStageRecord): TGclNode;
- procedure AddDealData(ARec: TsdDataRecord);
- procedure Calculate;
- property GclChapterCount: Integer read GetGclChapterCount;
- property GclChapter[AIndex: Integer]: TGclChapter read GetGclChapter;
- property OtherGcl: TGclChapter read FOtherGcl;
- property GclChapterGather: TGclChapter read FGclChapterGather;
- end;
- TPayNode = class
- private
- FName: string;
- FTotalPrice: Double;
- FCurTotalPrice: Double;
- FEndTotalPrice: Double;
- FPreTotalPrice: Double;
- function GetCurPercent: Double;
- function GetEndPercent: Double;
- function GetPrePercent: Double;
- public
- constructor Create(const AName: string);
- property Name: string read FName;
- property TotalPrice: Double read FTotalPrice write FTotalPrice;
- property CurTotalPrice: Double read FCurTotalPrice write FCurTotalPrice;
- property EndTotalPrice: Double read FEndTotalPrice write FEndTotalPrice;
- property PreTotalPrice: Double read FPreTotalPrice write FPreTotalPrice;
- property CurPercent: Double read GetCurPercent;
- property EndPercent: Double read GetEndPercent;
- property PrePercent: Double read GetPrePercent;
- end;
- TDealPayControl = class
- private
- FPreCalc: TPayNode;
- FTiaoPeiJin: TPayNode;
- FHeJi: TPayNode;
- FJiaGeTiaoZheng: TPayNode;
- FSuoPeiJinE: TPayNode;
- FLinShiYongDi: TPayNode;
- FBaoXianFei: TPayNode;
- FZongJi: TPayNode;
- FOtherPays: TList;
- FZhiFu: TPayNode;
- function FindOtherPayNode(const AName: string): TPayNode;
- function NewOtherPayNode(const AName: string): TPayNode;
- function GetOtherPay(AIndex: Integer): TPayNode;
- function GetOtherPayCount: Integer;
- public
- constructor Create;
- destructor Destroy; override;
- function FindPayNode(const AName: string): TPayNode;
- procedure CalculateAll;
- property PreCalc: TPayNode read FPreCalc;
- property TiaoPeiJin: TPayNode read FTiaoPeiJin;
- property HeJi: TPayNode read FHeJi;
- property JiaGeTiaoZheng: TPayNode read FJiaGeTiaoZheng;
- property SuoPeiJinE: TPayNode read FSuoPeiJinE;
- property LinShiYongDi: TPayNode read FLinShiYongDi;
- property BaoXianFei: TPayNode read FBaoXianFei;
- property ZongJi: TPayNode read FZongJi;
- property OtherPay[AIndex: Integer]: TPayNode read GetOtherPay;
- property OtherPayCount: Integer read GetOtherPayCount;
- property ZhiFu: TPayNode read FZhiFu;
- end;
- TZhongKaiGatherType = (zkgt2, zkgt3);
- TrmZhongKaiData = class(TDataModule)
- cdsCustom2: TClientDataSet;
- cdsCustom2ChapterID: TIntegerField;
- cdsCustom2Chapter: TWideStringField;
- cdsCustom2Name: TWideStringField;
- cdsCustom2TotalPrice: TFloatField;
- cdsCustom2CTotalPrice: TFloatField;
- cdsCustom2GTotalPrice: TFloatField;
- cdsCustom2EndGatherTotalPrice: TFloatField;
- cdsCustom2EndPercent: TFloatField;
- cdsCustom2PreGatherTotalPrice: TFloatField;
- cdsCustom2PrePercent: TFloatField;
- cdsCustom2CurGatherTotalPrice: TFloatField;
- cdsCustom2CurPercent: TFloatField;
- cdsCustom3: TClientDataSet;
- cdsCustom3ChapterID: TIntegerField;
- cdsCustom3IndexCode: TWideStringField;
- cdsCustom3B_Code: TWideStringField;
- cdsCustom3Name: TWideStringField;
- cdsCustom3Units: TWideStringField;
- cdsCustom3Price: TFloatField;
- cdsCustom3DealQuantity: TFloatField;
- cdsCustom3DealTotalPrice: TFloatField;
- cdsCustom3EndMqcQuantity: TFloatField;
- cdsCustom3EndMqcTotalPrice: TFloatField;
- cdsCustom3EndMqcaTotalPrice: TFloatField;
- cdsCustom3EndPqcQuantity: TFloatField;
- cdsCustom3EndPqcTotalPrice: TFloatField;
- cdsCustom3EndPqcaTotalPrice: TFloatField;
- cdsCustom3EndQcQuantity: TFloatField;
- cdsCustom3EndQcTotalPrice: TFloatField;
- cdsCustom3EndQcaTotalPrice: TFloatField;
- cdsCustom3GQuantity: TFloatField;
- cdsCustom3GTotalPrice: TFloatField;
- cdsCustom3EndGatherQuantity: TFloatField;
- cdsCustom3EndGatherTotalPrice: TFloatField;
- cdsCustom3PreGatherQuantity: TFloatField;
- cdsCustom3PreGatherTotalPrice: TFloatField;
- cdsCustom3CurGatherQuantity: TFloatField;
- cdsCustom3CurGatherTotalPrice: TFloatField;
- private
- FzkGatherType: TZhongKaiGatherType;
- FIsNewOpen: Boolean;
- FProjectData: TProjectData;
- FGclControl: TGclControl;
- FDealPayControl: TDealPayControl;
- procedure BeforeGather(AProjectCount: Integer);
- procedure AfterGather;
- procedure OpenProjectData(AProject: TSelectProject);
- procedure FreeProjectData;
- procedure FilterGcl;
- procedure FilterDealPay;
- procedure FilterDealBills;
- procedure GatherProject(AProject: TSelectProject);
- procedure WriteReport2;
- procedure WriteReport3;
- procedure WriteData;
- public
- function AssignData(AProjects: TList; AzkGatherType: TZhongKaiGatherType): TDataSet;
- end;
- implementation
- uses
- UtilMethods, ZhAPI, Globals, DealBillsDm;
- {$R *.dfm}
- { TGclControl }
- procedure TGclControl.AddDealData(ARec: TsdDataRecord);
- var
- vGclNode: TGclNode;
- begin
- vGclNode := FindDealGclNode(ARec);
- if not Assigned(vGclNode) then
- vGclNode := NewDealGclNode(ARec);
- vGclNode.DealQuantity := vGclNode.DealQuantity + ARec.ValueByName('Quantity').AsFloat;
- vGclNode.DealTotalPrice := vGclNode.DealTotalPrice + ARec.ValueByName('TotalPrice').AsFloat;
- end;
- function TGclControl.AddGclNode(ARec: TBillsRecord;
- AStageRec: TStageRecord): TGclNode;
- begin
- Result := FindGclNode(ARec);
- if not Assigned(Result) then
- Result := NewGclNode(ARec);
- if Assigned(AStageRec) then
- begin
- Result.CurGatherQuantity := Result.CurGatherQuantity + AStageRec.GatherQuantity.AsFloat;
- Result.CurGatherTotalPrice := Result.CurGatherTotalPrice + AStageRec.GatherTotalPrice.AsFloat;
- Result.EndGatherQuantity := Result.EndGatherQuantity + AStageRec.EndGatherQuantity.AsFloat;
- Result.EndGatherTotalPrice := Result.EndGatherTotalPrice + AStageRec.EndGatherTotalPrice.AsFloat;
- Result.PreGatherQuantity := Result.PreGatherQuantity + AStageRec.PreGatherQuantity.AsFloat;
- Result.PreGatherTotalPrice := Result.PreGatherTotalPrice + AStageRec.PreGatherTotalPrice.AsFloat;
- end;
- end;
- procedure TGclControl.Calculate;
- var
- i: Integer;
- begin
- for i := 0 to FGclChapters.Count - 1 do
- GclChapter[i].CalculateChapter;
- OtherGcl.CalculateChapter;
- CalculateChapterGather;
- end;
- procedure TGclControl.CalculateChapterGather;
- var
- iIndex, iProject: Integer;
- vGclChapter: TGclChapter;
- begin
- FGclChapterGather.TotalPrice := 0;
- FGclChapterGather.CurGatherTotalPrice := 0;
- FGclChapterGather.EndGatherTotalPrice := 0;
- FGclChapterGather.PreGatherTotalPrice := 0;
- for iIndex := 0 to FGclChapters.Count - 1 do
- begin
- vGclChapter := TGclChapter(FGclChapters.Items[iIndex]);
- with FGclChapterGather do
- begin
- TotalPrice := TotalPrice + vGclChapter.TotalPrice;
- CTotalPrice := CTotalPrice + vGclChapter.CTotalPrice;
- CurGatherTotalPrice := CurGatherTotalPrice + vGclChapter.CurGatherTotalPrice;
- EndGatherTotalPrice := EndGatherTotalPrice + vGclChapter.EndGatherTotalPrice;
- PreGatherTotalPrice := PreGatherTotalPrice + vGclChapter.PreGatherTotalPrice;
- end;
- end;
- with FGclChapterGather do
- begin
- TotalPrice := TotalPrice + OtherGcl.TotalPrice;
- CTotalPrice := CTotalPrice + OtherGcl.CTotalPrice;
- CurGatherTotalPrice := CurGatherTotalPrice + OtherGcl.CurGatherTotalPrice;
- EndGatherTotalPrice := EndGatherTotalPrice + OtherGcl.EndGatherTotalPrice;
- PreGatherTotalPrice := PreGatherTotalPrice + OtherGcl.PreGatherTotalPrice;
- end;
- end;
- constructor TGclControl.Create;
- function CreateGclChapter(AChapterID: Integer; const AName: string; ATotalPrice: Double): TGclChapter;
- begin
- Result := TGclChapter.Create(AChapterID, AName);
- Result.TotalPrice := ATotalPrice;
- FGclChapters.Add(Result);
- end;
- begin
- FGclNodes := TList.Create;
- FGclChapters := TList.Create;
- CreateGclChapter(1, '总则', 381525229);
- CreateGclChapter(2, '路基工程', 1514953910);
- CreateGclChapter(3, '路面工程', 796118656);
- CreateGclChapter(4, '桥梁、涵洞工程', 4912677553);
- CreateGclChapter(5, '隧道工程', 0);
- CreateGclChapter(6, '安全设施及预埋管线', 165165432);
- CreateGclChapter(7, '绿化及环境保护工程', 163726129);
- CreateGclChapter(8, '机电工程', 273752856);
- CreateGclChapter(9, '附属区房建工程', 160025390);
- FOtherGcl := TGclChapter.Create(19, '未计入章节清单合计');
- FOtherGcl.TotalPrice := 0;
- FGclChapterGather := TGclChapter.Create(20, '小计');
- FGclChapterGather.TotalPrice := 8367944755;
- end;
- destructor TGclControl.Destroy;
- begin
- FGclChapterGather.Free;
- FOtherGcl.Free;
- ClearObjects(FGclChapters);
- FGclChapters.Free;
- ClearObjects(FGclNodes);
- FGclNodes.Free;
- inherited;
- end;
- function TGclControl.FindDealGclNode(ADealRec: TsdDataRecord): TGclNode;
- var
- iIndex: Integer;
- vGclNode: TGclNode;
- begin
- Result := nil;
- for iIndex := 0 to FGclNodes.Count - 1 do
- begin
- vGclNode := TGclNode(FGclNodes.Items[iIndex]);
- if (vGclNode.B_Code = ADealRec.ValueByName('B_Code').AsString) and
- (vGclNode.Name = ADealRec.ValueByName('Name').AsString) and
- (vGclNode.Units = ADealRec.ValueByName('Units').AsString) and
- (vGclNode.Price = ADealRec.ValueByName('Price').AsFloat) then
- begin
- Result := vGclNode;
- Break;
- end;
- end;
- end;
- function TGclControl.FindGclChapter(const AB_Code: string): TGclChapter;
- function GetFirstLevelCode: string;
- var
- sgs: TStrings;
- begin
- sgs := TStringList.Create;
- sgs.Delimiter := '-';
- sgs.DelimitedText := AB_Code;
- if sgs.Count > 0 then
- Result := sgs.Strings[0]
- else
- Result := '';
- sgs.Free;
- end;
- var
- iFirst, iIndex: Integer;
- vChapter: TGclChapter;
- begin
- iFirst := StrToIntDef(GetFirstLevelCode, 0);
- Result := nil;
- for iIndex := 0 to FGclChapters.Count - 1 do
- begin
- vChapter := TGclChapter(FGclChapters.Items[iIndex]);
- if (iFirst >= vChapter.ChapterBegin) and (iFirst <= vChapter.ChapterEnd) then
- begin
- Result := vChapter;
- Break;
- end;
- end;
- end;
- function TGclControl.FindGclNode(ARec: TBillsRecord): TGclNode;
- var
- iIndex: Integer;
- vGclNode: TGclNode;
- bSameCode, bSameName, bSameUnits, bSamePrice: Boolean;
- begin
- Result := nil;
- for iIndex := 0 to FGclNodes.Count - 1 do
- begin
- vGclNode := TGclNode(FGclNodes.Items[iIndex]);
- if (vGclNode.B_Code = ARec.B_Code.AsString) and
- (vGclNode.Name = ARec.Name.AsString) and
- (vGclNode.Units = ARec.Units.AsString) and
- (vGclNode.Price = ARec.Price.AsFloat) then
- begin
- Result := vGclNode;
- Break;
- end;
- end;
- end;
- function TGclControl.GetGclChapter(AIndex: Integer): TGclChapter;
- begin
- Result := TGclChapter(FGclChapters.Items[AIndex]);
- end;
- function TGclControl.GetGclChapterCount: Integer;
- begin
- Result := FGclChapters.Count;
- end;
- procedure TGclControl.LinkGclChapter(AGclNode: TGclNode);
- var
- vChapter: TGclChapter;
- begin
- vChapter := FindGclChapter(AGclNode.B_Code);
- if Assigned(vChapter) then
- vChapter.AddGclNode(AGclNode)
- else
- FOtherGcl.AddGclNode(AGclNode);
- end;
- function TGclControl.NewDealGclNode(ADealRec: TsdDataRecord): TGclNode;
- begin
- Result := TGclNode.Create;
- FGclNodes.Add(Result);
- Result.B_Code := ADealRec.ValueByName('B_Code').AsString;
- Result.Name := ADealRec.ValueByName('Name').AsString;
- Result.Units := ADealRec.ValueByName('Units').AsString;
- Result.Price := ADealRec.ValueByName('Price').AsFloat;
- LinkGclChapter(Result);
- end;
- function TGclControl.NewGclNode(ARec: TBillsRecord): TGclNode;
- begin
- Result := TGclNode.Create;
- FGclNodes.Add(Result);
- Result.B_Code := ARec.B_Code.AsString;
- Result.Name := ARec.Name.AsString;
- Result.Units := ARec.Units.AsString;
- Result.Price := ARec.Price.AsFloat;
- Result.CalcType := ARec.CalcType.AsInteger;
- LinkGclChapter(Result);
- end;
- { TGclChapter }
- procedure TGclChapter.AddGclNode(AGclNode: TGclNode);
- begin
- FGclNodes.Add(AGclNode);
- end;
- procedure TGclChapter.CalculateChapter;
- var
- iIndex: Integer;
- vGclNode: TGclNode;
- begin
- FCTotalPrice := 0;
- FCurGatherTotalPrice := 0;
- FEndGatherTotalPrice := 0;
- FPreGatherTotalPrice := 0;
- FEndPqcTotalPrice := 0;
- FEndPqcaTotalPrice := 0;
- FEndMqcTotalPrice := 0;
- FEndMqcaTotalPrice := 0;
- FEndQcTotalPrice := 0;
- FEndQcaTotalPrice := 0;
- FDealTotalPrice := 0;
- for iIndex := 0 to FGclNodes.Count - 1 do
- begin
- vGclNode := TGclNode(FGclNodes.Items[iIndex]);
- FCTotalPrice := FCTotalPrice + vGclNode.EndQcTotalPrice;
- FCurGatherTotalPrice := FCurGatherTotalPrice + vGclNode.FCurGatherTotalPrice;
- FEndGatherTotalPrice := FEndGatherTotalPrice + vGclNode.FEndGatherTotalPrice;
- FPreGatherTotalPrice := FPreGatherTotalPrice + vGclNode.FPreGatherTotalPrice;
- FEndPqcTotalPrice := FEndPqcTotalPrice + vGclNode.FEndPqcTotalPrice;
- FEndPqcaTotalPrice := FEndPqcaTotalPrice + vGclNode.FEndPqcaTotalPrice;
- FEndMqcTotalPrice := FEndMqcTotalPrice + vGclNode.FEndMqcTotalPrice;
- FEndMqcaTotalPrice := FEndMqcaTotalPrice + vGclNode.FEndMqcaTotalPrice;
- FEndQcTotalPrice := FEndQcTotalPrice + vGclNode.FEndQcTotalPrice;
- FEndQcaTotalPrice := FEndQcaTotalPrice + vGclNode.FEndQcaTotalPrice;
- FDealTotalPrice := FDealTotalPrice + vGclNode.FDealTotalPrice;
- end;
- FGTotalPrice := FTotalPrice + FCTotalPrice;
- end;
- constructor TGclChapter.Create(AID: Integer; AName: string);
- begin
- FChapterID := AID;
- FName := AName;
- if FChapterID < 19 then
- begin
- FChapterBegin := FChapterID * 100;
- FChapterEnd := FChapterBegin + 99;
- FChapterName := IntToStr(FChapterBegin);
- end;
- FGclNodes := TList.Create;
- end;
- destructor TGclChapter.Destroy;
- begin
- FGclNodes.Free;
- inherited;
- end;
- function TGclChapter.GetCurPercent: Double;
- begin
- if FGTotalPrice = 0 then
- Result := 0
- else
- Result := FCurGatherTotalPrice / FGTotalPrice * 100;
- end;
- function TGclChapter.GetEndPercent: Double;
- begin
- if FGTotalPrice = 0 then
- Result := 0
- else
- Result := FEndGatherTotalPrice / FGTotalPrice * 100;
- end;
- function TGclChapter.GetGclNode(AIndex: Integer): TGclNode;
- begin
- Result := TGclNode(FGclNodes.Items[AIndex]);
- end;
- function TGclChapter.GetGclNodeCount: Integer;
- begin
- Result := FGclNodes.Count;
- end;
- function TGclChapter.GetPrePercent: Double;
- begin
- if FGTotalPrice = 0 then
- Result := 0
- else
- Result := FPreGatherTotalPrice / FGTotalPrice * 100;
- end;
- { TrmZhongKaiData }
- procedure TrmZhongKaiData.AfterGather;
- begin
- FDealPayControl.Free;
- FGclControl.Free;
- end;
- function TrmZhongKaiData.AssignData(AProjects: TList;
- AzkGatherType: TZhongKaiGatherType): TDataSet;
- var
- iProject: Integer;
- begin
- FzkGatherType := AzkGatherType;
- BeforeGather(AProjects.Count);
- try
- for iProject := 0 to AProjects.Count - 1 do
- GatherProject(TSelectProject(AProjects.Items[iProject]));
- FGclControl.Calculate;
- WriteData;
- finally
- AfterGather;
- case FzkGatherType of
- zkgt2: Result := cdsCustom2;
- zkgt3: Result := cdsCustom3;
- end;
- end;
- end;
- procedure TrmZhongKaiData.BeforeGather(AProjectCount: Integer);
- begin
- cdsCustom2.DisableControls;
- cdsCustom2.Active := True;
- cdsCustom2.EmptyDataSet;
- cdsCustom3.DisableControls;
- cdsCustom3.Active := True;
- cdsCustom3.EmptyDataSet;
- FGclControl := TGclControl.Create;
- FDealPayControl := TDealPayControl.Create;
- end;
- procedure TrmZhongKaiData.FilterGcl;
- function FindStage(AID: Integer; AList: TList): TStageRecord;
- var
- i: Integer;
- Rec: TStageRecord;
- begin
- Result := nil;
- for i := 0 to AList.Count - 1 do
- begin
- Rec := TStageRecord(AList.Items[i]);
- if Rec.BillsID.AsInteger = AID then
- begin
- Result := Rec;
- Break;
- end;
- end;
- end;
- procedure FilterNewOpened;
- var
- vList: TList;
- i: Integer;
- GclNode: TGclNode;
- Rec: TBillsRecord;
- StageRec: TStageRecord;
- begin
- vList := TList.Create;
- try
- with FProjectData.PhaseData.StageData do
- begin
- for i := 0 to sddStage.RecordCount - 1 do
- vList.Add(sddStage.Records[i]);
- end;
- FProjectData.BillsData.sddBills.DisableControls;
- FProjectData.PhaseData.StageData.sddStage.DisableControls;
- with FProjectData.BillsData do
- begin
- for i := 0 to sddBills.RecordCount - 1 do
- begin
- Rec := TBillsRecord(sddBills.Records[i]);
- if Rec.IsLeaf.AsBoolean and (Rec.B_Code.AsString <> '') then
- begin
- StageRec := FindStage(Rec.ID.AsInteger, vList);
- GclNode := FGclControl.AddGclNode(Rec, StageRec);
- vList.Remove(StageRec);
- end;
- end;
- end;
- finally
- vList.Free;
- end;
- end;
- procedure FilterOrg;
- var
- i: Integer;
- vNode: TMeasureBillsIDTreeNode;
- GclNode: TGclNode;
- StageRec: TStageRecord;
- begin
- with FProjectData.BillsMeasureData do
- begin
- for i := 0 to BillsMeasureTree.Count - 1 do
- begin
- vNode := TMeasureBillsIDTreeNode(BillsMeasureTree.Items[i]);
- if not vNode.HasChildren and (vNode.Rec.B_Code.AsString <> '') then
- GclNode := FGclControl.AddGclNode(vNode.Rec, vNode.StageRec);
- end;
- end;
- end;
- begin
- if FIsNewOpen then
- FilterNewOpened
- else
- FilterOrg;
- end;
- procedure TrmZhongKaiData.FilterDealPay;
- var
- sCurField, sPreField, sEndField: string;
- procedure GatherCommonDealPay;
- var
- iRec: Integer;
- Rec, StageRec: TsdDataRecord;
- DealPay: TPayNode;
- begin
- with FProjectData.DealPaymentData do
- begin
- for iRec := 0 to sddDealPayment.RecordCount - 1 do
- begin
- Rec := sddDealPayment.Records[iRec];
- if SameText(Rec.ValueByName('Name').AsString, '本期完成计量') or
- SameText(Rec.ValueByName('Name').AsString, '本期应付') or
- SameText(Rec.ValueByName('Name').AsString, '本期实付') then
- Continue;
- if FProjectData.PhaseData.Active then
- StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger)
- else
- StageRec := nil;
- DealPay := FDealPayControl.FindPayNode(Rec.ValueByName('Name').AsString);
- if Assigned(StageRec) then
- begin
- DealPay.CurTotalPrice := DealPay.CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
- DealPay.PreTotalPrice := DealPay.PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;
- DealPay.EndTotalPrice := DealPay.EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;
- end;
- end;
- end;
- end;
- procedure GatherZhiFu;
- var
- Rec, StageRec: TsdDataRecord;
- begin
- Rec := FProjectData.DealPaymentData.DealPayRecord('本期应付');
- if FProjectData.PhaseData.Active then
- StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger)
- else
- StageRec := nil;
- if not Assigned(StageRec) then Exit;
- with FDealPayControl.ZhiFu do
- begin
- CurTotalPrice := CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
- PreTotalPrice := PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;
- EndTotalPrice := EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;
- end;
- end;
- begin
- sCurField := 'TotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
- sPreField := 'PreTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
- sEndField := 'EndTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
- GatherCommonDealPay;
- GatherZhiFu;
- FDealPayControl.CalculateAll;
- end;
- procedure TrmZhongKaiData.FreeProjectData;
- begin
- if FIsNewOpen then
- FProjectData.Free;
- end;
- procedure TrmZhongKaiData.GatherProject(AProject: TSelectProject);
- begin
- OpenProjectData(AProject);
- try
- if FzkGatherType in [zkgt2, zkgt3] then
- FilterGcl;
- if FzkGatherType = zkgt2 then
- FilterDealPay;
- if FzkGatherType = zkgt3 then
- FilterDealBills;
- finally
- FreeProjectData;
- end;
- end;
- procedure TrmZhongKaiData.OpenProjectData(AProject: TSelectProject);
- var
- Rec: TsdDataRecord;
- begin
- FIsNewOpen := False;
- FProjectData := OpenProjectManager.FindProjectData(AProject.ProjectID);
- Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProject.ProjectID);
- if not Assigned(FProjectData) then
- begin
- FProjectData := TProjectData.Create;
- FProjectData.OpenForReport4(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);
- FIsNewOpen := True;
- end;
- end;
- procedure TrmZhongKaiData.WriteData;
- begin
- case FzkGatherType of
- zkgt2: WriteReport2;
- zkgt3: WriteReport3;
- end;
- end;
- procedure TrmZhongKaiData.WriteReport2;
- procedure WriteGclChapter(AGclChapter: TGclChapter);
- begin
- cdsCustom2.Append;
- cdsCustom2ChapterID.AsInteger := AGclChapter.ChapterID;
- cdsCustom2Chapter.AsString := AGclChapter.ChapterName;
- cdsCustom2Name.AsString := AGclChapter.Name;
- cdsCustom2TotalPrice.AsFloat := AGclChapter.TotalPrice;
- cdsCustom2CTotalPrice.AsFloat := AGclChapter.CTotalPrice;
- cdsCustom2GTotalPrice.AsFloat := AGclChapter.GTotalPrice;
- cdsCustom2EndGatherTotalPrice.AsFloat := AGclChapter.EndGatherTotalPrice;
- cdsCustom2EndPercent.AsFloat := AGclChapter.EndPercent;
- cdsCustom2PreGatherTotalPrice.AsFloat := AGclChapter.PreGatherTotalPrice;
- cdsCustom2PrePercent.AsFloat := AGclChapter.PrePercent;
- cdsCustom2CurGatherTotalPrice.AsFloat := AGclChapter.CurGatherTotalPrice;
- cdsCustom2CurPercent.AsFloat := AGclChapter.CurPercent;
- cdsCustom2.Post;
- end;
- procedure WritePayNode(APayNode: TPayNode);
- begin
- cdsCustom2.Append;
- cdsCustom2Name.AsString := APayNode.Name;
- cdsCustom2TotalPrice.AsFloat := APayNode.TotalPrice;
- cdsCustom2CurGatherTotalPrice.AsFloat := APayNode.CurTotalPrice;
- cdsCustom2PreGatherTotalPrice.AsFloat := APayNode.PreTotalPrice;
- cdsCustom2EndGatherTotalPrice.AsFloat := APayNode.EndTotalPrice;
- cdsCustom2.Post;
- end;
- var
- iIndex: Integer;
- begin
- for iIndex := 0 to FGclControl.GclChapterCount - 1 do
- WriteGclChapter(FGclControl.GclChapter[iIndex]);
- if FGclControl.OtherGcl.GclNodeCount > 0 then
- WriteGclChapter(FGclControl.OtherGcl);
- WriteGclChapter(FGclControl.GclChapterGather);
- WritePayNode(FDealPayControl.TiaoPeiJin);
- WritePayNode(FDealPayControl.HeJi);
- WritePayNode(FDealPayControl.JiaGeTiaoZheng);
- WritePayNode(FDealPayControl.SuoPeiJinE);
- WritePayNode(FDealPayControl.LinShiYongDi);
- WritePayNode(FDealPayControl.BaoXianFei);
- WritePayNode(FDealPayControl.ZongJi);
- for iIndex := 0 to FDealPayControl.OtherPayCount - 1 do
- WritePayNode(FDealPayControl.OtherPay[iIndex]);
- WritePayNode(FDealPayControl.ZhiFu);
- end;
- procedure TrmZhongKaiData.WriteReport3;
- procedure WriteGclNode(AGclNode: TGclNode; AChapterID: Integer);
- begin
- cdsCustom3.Append;
- cdsCustom3ChapterID.AsInteger := AChapterID;
- cdsCustom3IndexCode.AsString := AGclNode.IndexCode;
- cdsCustom3B_Code.AsString := AGclNode.B_Code;
- cdsCustom3Name.AsString := AGclNode.Name;
- cdsCustom3Units.AsString := AGclNode.Units;
- cdsCustom3Price.AsFloat := AGclNode.Price;
- cdsCustom3DealQuantity.AsFloat := AGclNode.DealQuantity;
- cdsCustom3DealTotalPrice.AsFloat := AGclNode.DealTotalPrice;
- cdsCustom3EndMqcQuantity.AsFloat := AGclNode.EndMqcQuantity;
- cdsCustom3EndMqcTotalPrice.AsFloat := AGclNode.EndMqcTotalPrice;
- cdsCustom3EndMqcaTotalPrice.AsFloat := AGclNode.EndMqcaTotalPrice;
- cdsCustom3EndPqcQuantity.AsFloat := AGclNode.EndPqcQuantity;
- cdsCustom3EndPqcTotalPrice.AsFloat := AGclNode.EndPqcTotalPrice;
- cdsCustom3EndPqcaTotalPrice.AsFloat := AGclNode.EndPqcaTotalPrice;
- cdsCustom3EndQcQuantity.AsFloat := AGclNode.EndQcQuantity;
- cdsCustom3EndQcTotalPrice.AsFloat := AGclNode.EndQcTotalPrice;
- cdsCustom3EndQcaTotalPrice.AsFloat := AGclNode.EndQcaTotalPrice;
- cdsCustom3GQuantity.AsFloat := cdsCustom3DealQuantity.AsFloat + cdsCustom3EndQcQuantity.AsFloat;
- cdsCustom3GTotalPrice.AsFloat := cdsCustom3DealTotalPrice.AsFloat + cdsCustom3EndQcaTotalPrice.AsFloat;
- cdsCustom3EndGatherQuantity.AsFloat := AGclNode.EndGatherQuantity;
- cdsCustom3EndGatherTotalPrice.AsFloat := AGclNode.EndGatherTotalPrice;
- cdsCustom3PreGatherQuantity.AsFloat := AGclNode.PreGatherQuantity;
- cdsCustom3PreGatherTotalPrice.AsFloat := AGclNode.PreGatherTotalPrice;
- cdsCustom3CurGatherQuantity.AsFloat := AGclNode.CurGatherQuantity;
- cdsCustom3CurGatherTotalPrice.AsFloat := AGclNode.CurGatherTotalPrice;
- cdsCustom3.Post;
- end;
- procedure WriteChapter(AGclChapter: TGclChapter; const AName: string = '');
- var
- i: Integer;
- begin
- cdsCustom3.Append;
- cdsCustom3ChapterID.AsInteger := AGclChapter.ChapterID;
- if AGclChapter.ChapterName <> '' then
- cdsCustom3B_Code.AsString := AGclChapter.ChapterName + '章';
- if AName = '' then
- cdsCustom3Name.AsString := AGclChapter.Name
- else
- cdsCustom3Name.AsString := AName;
- cdsCustom3DealTotalPrice.AsFloat := AGclChapter.DealTotalPrice;
- cdsCustom3EndMqcTotalPrice.AsFloat := AGclChapter.EndMqcTotalPrice;
- cdsCustom3EndMqcaTotalPrice.AsFloat := AGclChapter.EndMqcaTotalPrice;
- cdsCustom3EndPqcTotalPrice.AsFloat := AGclChapter.EndPqcTotalPrice;
- cdsCustom3EndPqcaTotalPrice.AsFloat := AGclChapter.EndPqcaTotalPrice;
- cdsCustom3EndQcTotalPrice.AsFloat := AGclChapter.EndQcTotalPrice;
- cdsCustom3EndQcaTotalPrice.AsFloat := AGclChapter.EndQcaTotalPrice;
- cdsCustom3GTotalPrice.AsFloat := cdsCustom3DealTotalPrice.AsFloat + cdsCustom3EndQcaTotalPrice.AsFloat;
- cdsCustom3EndGatherTotalPrice.AsFloat := AGclChapter.EndGatherTotalPrice;
- cdsCustom3PreGatherTotalPrice.AsFloat := AGclChapter.PreGatherTotalPrice;
- cdsCustom3CurGatherTotalPrice.AsFloat := AGclChapter.CurGatherTotalPrice;
- cdsCustom3.Post;
- for i := 0 to AGclChapter.GclNodeCount - 1 do
- WriteGclNode(AGclChapter.GclNode[i], AGclChapter.ChapterID);
- end;
- var
- iIndex: Integer;
- begin
- for iIndex := 0 to FGclControl.GclChapterCount - 1 do
- WriteChapter(FGclControl.GclChapter[iIndex]);
- if FGclControl.OtherGcl.GclNodeCount > 0 then
- WriteChapter(FGclControl.OtherGcl);
- WriteChapter(FGclControl.GclChapterGather, '合计');
- end;
- procedure TrmZhongKaiData.FilterDealBills;
- var
- i: Integer;
- Rec: TsdDataRecord;
- begin
- with FProjectData.DealBillsData do
- begin
- for i := 0 to sddDealBills.RecordCount - 1 do
- begin
- Rec := sddDealBills.Records[i];
-
- end;
- end;
- end;
- { TGclNode }
- procedure TGclNode.SetB_Code(const Value: string);
- begin
- FB_Code := Value;
- FIndexCode := B_CodeToIndexCode(FB_Code);
- end;
- { TPayNode }
- constructor TPayNode.Create(const AName: string);
- begin
- FName := AName;
- end;
- function TPayNode.GetCurPercent: Double;
- begin
- if TotalPrice = 0 then
- Result := 0
- else
- Result := CurTotalPrice / TotalPrice * 100;
- end;
- function TPayNode.GetEndPercent: Double;
- begin
- if TotalPrice = 0 then
- Result := 0
- else
- Result := EndTotalPrice / TotalPrice * 100;
- end;
- function TPayNode.GetPrePercent: Double;
- begin
- if TotalPrice = 0 then
- Result := 0
- else
- Result := PreTotalPrice / TotalPrice * 100;
- end;
- { TDealPayControl }
- function TDealPayControl.FindPayNode(const AName: string): TPayNode;
- begin
- if Pos(FTiaoPeiJin.Name, AName) > 0 then
- Result := FTiaoPeiJin
- else if Pos(FJiaGeTiaoZheng.Name, AName) > 0 then
- Result := FJiaGeTiaoZheng
- else if Pos(FSuoPeiJinE.Name, AName) > 0 then
- Result := FSuoPeiJinE
- else if Pos(FLinShiYongDi.Name, AName) > 0 then
- Result := FLinShiYongDi
- else if Pos(FBaoXianFei.Name, AName) > 0 then
- Result := FBaoXianFei
- else
- Result := FindOtherPayNode(AName);
- if not Assigned(Result) then
- Result := NewOtherPayNode(AName);
- end;
- procedure TDealPayControl.CalculateAll;
- procedure CalculateHeJi;
- begin
- FHeJi.TotalPrice := FPreCalc.TotalPrice + FTiaoPeiJin.TotalPrice;
- FHeJi.CurTotalPrice := FPreCalc.CurTotalPrice + FTiaoPeiJin.CurTotalPrice;
- FHeJi.EndTotalPrice := FPreCalc.EndTotalPrice + FTiaoPeiJin.EndTotalPrice;
- FHeJi.PreTotalPrice := FPreCalc.PreTotalPrice + FTiaoPeiJin.PreTotalPrice;
- end;
- procedure CalculateZongJi;
- begin
- FZongJi.TotalPrice := FHeJi.TotalPrice + FJiaGeTiaoZheng.TotalPrice +
- FSuoPeiJinE.TotalPrice + FLinShiYongDi.TotalPrice + FBaoXianFei.TotalPrice;
- FZongJi.CurTotalPrice := FHeJi.CurTotalPrice + FJiaGeTiaoZheng.CurTotalPrice +
- FSuoPeiJinE.CurTotalPrice + FLinShiYongDi.CurTotalPrice + FBaoXianFei.CurTotalPrice;
- FZongJi.EndTotalPrice := FHeJi.EndTotalPrice + FJiaGeTiaoZheng.EndTotalPrice +
- FSuoPeiJinE.EndTotalPrice + FLinShiYongDi.EndTotalPrice + FBaoXianFei.EndTotalPrice;
- FZongJi.PreTotalPrice := FHeJi.PreTotalPrice + FJiaGeTiaoZheng.PreTotalPrice +
- FSuoPeiJinE.PreTotalPrice + FLinShiYongDi.PreTotalPrice + FBaoXianFei.PreTotalPrice;
- end;
- begin
- CalculateHeJi;
- CalculateZongJi;
- end;
- constructor TDealPayControl.Create;
- begin
- FPreCalc := TPayNode.Create('小计');
- FTiaoPeiJin := TPayNode.Create('调配金');
- FHeJi := TPayNode.Create('合计');
- FJiaGeTiaoZheng := TPayNode.Create('价格调整');
- FSuoPeiJinE := TPayNode.Create('索赔金额');
- FLinShiYongDi := TPayNode.Create('临时用地');
- FBaoXianFei := TPayNode.Create('保险费');
- FZongJi := TPayNode.Create('总计');
- FOtherPays := TList.Create;
- FZhiFu := TPayNode.Create('支付');
- end;
- destructor TDealPayControl.Destroy;
- begin
- FZhiFu.Free;
- ClearObjects(FOtherPays);
- FOtherPays.Free;
- FZongJi.Free;
- FBaoXianFei.Free;
- FLinShiYongDi.Free;
- FSuoPeiJinE.Free;
- FJiaGeTiaoZheng.Free;
- FHeJi.Free;
- FTiaoPeiJin.Free;
- FPreCalc.Free;
- inherited;
- end;
- function TDealPayControl.FindOtherPayNode(const AName: string): TPayNode;
- var
- i: Integer;
- vPayNode: TPayNode;
- begin
- Result := nil;
- for i := 0 to FOtherPays.Count - 1 do
- begin
- vPayNode := TPayNode(FOtherPays.Items[i]);
- if (vPayNode.Name = AName) then
- begin
- Result := vPayNode;
- Break;
- end;
- end;
- end;
- function TDealPayControl.GetOtherPay(AIndex: Integer): TPayNode;
- begin
- Result := TPayNode(FOtherPays.Items[AIndex]);
- end;
- function TDealPayControl.GetOtherPayCount: Integer;
- begin
- Result := FOtherPays.Count;
- end;
- function TDealPayControl.NewOtherPayNode(const AName: string): TPayNode;
- begin
- Result := TPayNode.Create(AName);
- FOtherPays.Add(Result);
- end;
- end.
|