| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281 |
- unit ScProjGLJGatherDM;
- interface
- uses
- Windows, SysUtils, Classes, ProjectsDM, ScProjBaseDM, ScProjList, DB, ADODB,
- DBClient, ScProjectCompare, sdDB, sdProvider, ScProjManagerTree;
- type
- TReportType = (rtNone, rtTable_02_1, rtTable_ZYZ4);
- TProjGLJSum = record
- ID: Integer;
- Name: string;
- FileName: string;
- Selected: Boolean;
- ProjType: Integer;
- BuildProjName: string;
- Author: string;
- Auditor: string;
- end;
- PProjGLJSum = ^TProjGLJSum;
-
- TScProjGLJGather = class(TDataModule)
- aqProjGLJ: TADOQuery;
- cdsProjData: TClientDataSet;
- cdsProjDataBuildProjName: TWideStringField;
- cdsProjDataAuthor: TWideStringField;
- cdsProjDataAuditor: TWideStringField;
- aqProjGLJAName: TWideStringField;
- aqProjGLJAUnit: TWideStringField;
- aqProjGLJUAmount: TFloatField;
- aqProjGLJAType: TIntegerField;
- aqProjGLJPrice: TCurrencyField;
- aqMateBuildFee: TADOQuery;
- aqMateBuildFeeMateFee: TBCDField;
- aqMateBuildFeeBuildFee: TFloatField;
- aqMateBuildFeeFileName: TStringField;
- aqMateBuildFeeTenderMateFee: TBCDField;
- aqMateBuildFeeTenderBuildFee: TFloatField;
- aqProjGLJUTenderAmount: TFloatField;
- aqProjGLJTenderPrice: TCurrencyField;
- sdmpGLJGather: TsdMemoryProvider;
- sdsGLJGather: TsdDataSet;
- sdvGLJGather: TsdDataView;
- sdmpGLJGatherD: TsdMemoryProvider;
- sdsGLJGatherD: TsdDataSet;
- sdvGLJGatherD: TsdDataView;
- sdmpGLJForReport: TsdMemoryProvider;
- sdsGLJForReport: TsdDataSet;
- sdvGLJForReport: TsdDataView;
- sdmpProjData: TsdMemoryProvider;
- sdsProjData: TsdDataSet;
- sdvProjData: TsdDataView;
- aqProjGLJMain: TBooleanField;
- aqProjGLJACode: TWideStringField;
- aqProjGLJASpecs: TStringField;
- procedure DataModuleCreate(Sender: TObject);
- procedure DataModuleDestroy(Sender: TObject);
- private
- { Private declarations }
- FProjects: TList;
- FReportType: TReportType;
- FBuildProj: TScProjManagerTreeNode;
- FSilence: Boolean;
- FCompareDM: TScProjectCompareDM;
- FIsCompareGather: Boolean;
- FAggregator: TsdAggregator;
- FIsTender: Boolean;
- procedure AddProjRecord(AConnection: TADOConnection; AProjID: Integer;
- AProjName: string);
- procedure CheckProjects(ABuildProjName: string);
- procedure DoSumAmount;
- procedure ClearProjList;
- procedure MakeProjList(ABuildProj: TScProjManagerTreeNode);
- procedure MakeProjListForCompareGather(AProjList: TList);
- procedure CopyGatherDataForCompare(ACompareData: TsdDataView);
- public
- { Public declarations }
- function GatherProjs(ABuildProjName: string): Boolean;
- function GatherGLJ(ABuildProjName: string;
- AIsCompareGather: Boolean = False; AIsCompareProj: Boolean = False;
- AProjList: TList = nil): Boolean;
- function GatherGLJForReport(ABuildProjName: string;
- AIsCompareGather: Boolean = False; AIsCompareProj: Boolean = False;
- AProjList: TList = nil): Boolean;
- property ReportType: TReportType read FReportType write FReportType;
- property Silence: Boolean read FSilence write FSilence;
- property IsTender: Boolean read FIsTender write FIsTender;
- // 同步907 Task514 核备规程编审对比表
- property CompareDM: TScProjectCompareDM read FCompareDM;
- end;
- var
- ScProjGLJGather: TScProjGLJGather;
- implementation
- uses
- ScIDTree, ScUtils, Math, ScProjectsGather, ScSelectGatherForm, ScFileArchiver,
- ScConsts, Variants;
- {$R *.dfm}
- const
- sql_GLJGather = 'SELECT Code As ACode, Name As AName, Unit As AUnit, Specs As ASpecs, '
- + ' Amount AS UAmount, Type As AType, BudgetPrice As Price, '
- + ' TenderAmount AS UTenderAmount, TenderPrice As TenderPrice, '
- + ' Main AS Main '
- + 'FROM ProjectGLJ '
- + 'WHERE Amount <> 0';
- sql_GLJGatherTender = 'SELECT Code As ACode, Name As AName, Unit As AUnit, Specs As ASpecs, '
- + ' TenderAmount AS UAmount, Type As AType, TenderPrice As Price, '
- + ' TenderAmount AS UTenderAmount, TenderPrice As TenderPrice, '
- + ' Main AS Main '
- + 'FROM ProjectGLJ '
- + 'WHERE TenderAmount <> 0';
- { TScProjGLJGather }
- procedure TScProjGLJGather.AddProjRecord(AConnection: TADOConnection;
- AProjID: Integer; AProjName: string);
- var
- fMachineAmount: Currency;
- bIsEstimate: Boolean;
- Rec: TsdDataRecord;
- begin
- bIsEstimate := False;
- {$IFDEF _ScEstimate}
- bIsEstimate := True;
- {$ENDIF}
- fMachineAmount := 0;
- aqProjGLJ.Close;
- if not IsTender then
- aqProjGLJ.SQL.Text := sql_GLJGather
- else
- aqProjGLJ.SQL.Text := sql_GLJGatherTender;
- aqProjGLJ.Connection := AConnection;
- aqProjGLJ.Open;
- aqProjGLJ.First;
- sdsGLJGather.BeginUpdate;
- try
- while not aqProjGLJ.Eof do
- begin
- if aqProjGLJACode.AsString = SJiJiaCode then
- begin
- aqProjGLJ.Next;
- Continue;
- end;
- (* if bIsEstimate then
- begin
- if ((aqProjGLJACode.AsInteger <> 400) {$IFDEF _ScGanSu}and (aqProjGLJACode.AsInteger <> 998){$ENDIF}) and (aqProjGLJAType.AsInteger = 4) then
- begin
- // fMachineAmount := fMachineAmount + aqProjGLJUAmount.AsFloat * aqProjGLJPrice.AsCurrency;
- aqProjGLJ.Next;
- Continue;
- end;
- end; *)
- {如果是02—1表,并且是混凝土,则不添加。 李涛 2010.4.29}
- if (FReportType = rtNone) or
- (((FReportType = rtTable_02_1) or (FReportType = rtTable_ZYZ4)) and (aqProjGLJAType.AsInteger <> 2)) then
- begin
- Rec := sdsGLJGather.Add(True);
- try
- Rec.ValueByName('Code').AsString := aqProjGLJACode.AsString;
- Rec.ValueByName('Name').AsString := aqProjGLJAName.AsString;
- Rec.ValueByName('Unit').AsString := aqProjGLJAUnit.AsString;
- Rec.ValueByName('Specs').AsString := aqProjGLJASpecs.AsString;
- Rec.ValueByName('ProjectName').AsString := AProjName;
- Rec.ValueByName('Price').AsCurrency := aqProjGLJPrice.AsCurrency;
- Rec.ValueByName('Amount').AsFloat := aqProjGLJUAmount.AsFloat;
- Rec.ValueByName('ProjectID').AsInteger := AProjID;
- Rec.ValueByName('LibID').AsInteger := 0;
- Rec.ValueByName('Type').AsInteger := aqProjGLJAType.AsInteger;
- finally
- Rec.EndUpdate;
- end;
- end;
- aqProjGLJ.Next;
- end;
- finally
- sdsGLJGather.EndUpdate;
- end;
- { if bIsEstimate then
- begin
- if cdsGLJGather.Locate('Code', 400, []) then
- begin
- cdsGLJGather.Edit;
- cdsGLJGatherAmount.Value := cdsGLJGatherAmount.Value + fMachineAmount;
- cdsGLJGather.Post;
- end
- else
- begin
- cdsGLJGather.Append;
- cdsGLJGatherCode.AsInteger := 400;
- cdsGLJGatherName.AsString := '机械使用费';
- cdsGLJGatherUnit.AsString := '元';
- cdsGLJGatherProjectName.AsString := AProjName;
- cdsGLJGatherPrice.AsCurrency := 1;
- cdsGLJGatherAmount.Value := fMachineAmount;
- cdsGLJGatherProjectID.AsInteger := AProjID;
- cdsGLJGatherLibID.AsInteger := 0;
- cdsGLJGatherType.AsInteger := 3;
- cdsGLJGather.Post;
- end;
- end;}
- end;
- procedure TScProjGLJGather.MakeProjList(ABuildProj: TScProjManagerTreeNode);
- procedure LoadTenders(ATenderInfos: TList);
- var
- Tenders: TList;
- i: Integer;
- Rec: TsdDataRecord;
- sFileName, strName: string;
- pProjSum: PProjGLJSum;
- begin
- if not Assigned(ATenderInfos) then Exit;
- Tenders := TList.Create;
- try
- ProjectManager.LoadBuildProjectTenders(ABuildProj.ID, Tenders);
- for i := 0 to Tenders.Count - 1 do
- begin
- Rec := TsdDataRecord(Tenders.Items[i]);
- sFileName := Rec.ValueByName('FileName').AsString;
- strName := Rec.ValueByName('Name').AsString;
- if FileExists(sFileName) then
- begin
- // 固化清单 汇总项目识别固化清单
- if IsSmartCostProjectFile(sFileName) or IsStaticBillsFile(sFileName) then
- begin
- New(pProjSum);
- ZeroMemory(pProjSum, Sizeof(TProjChapterSum));
- pProjSum^.ID := Rec.ValueByName('ID').AsInteger;
- pProjSum^.Name := strName;
- pProjSum^.FileName := sFileName;
- pProjSum^.Selected := Rec.ValueByName('Selected').AsBoolean;
- pProjSum^.ProjType := Rec.ValueByName('ProjectType').AsInteger;
- ATenderInfos.Add(pProjSum);
- end
- else
- MessageWarning(0, Format('所选建设项目中,项目文件[%s]不是有效的SmartCost预算项目文件。'#13#10 +
- '请进入“建设项目管理”进行管理。', [strName]));
- end
- else
- MessageWarning(0, Format('所选建设项目中,项目文件[%s]不存在。'#13#10 +
- '请进入“建设项目管理”重新查找该项目。', [strName]));
- end;
- finally
- Tenders.Free;
- end;
- end;
- var
- pProjSum: PProjGLJSum;
- I, BaseFile: Integer;
- vProjList: TList;
- begin
- vProjList := TList.Create;
- try
- ClearProjList;
- LoadTenders(vProjList);
- // *汇总表类型
- if SelectProjects(vProjList, BaseFile, 2, FSilence) then
- begin
- for I := 0 to vProjList.Count - 1 do
- begin
- pProjSum := PProjGLJSum(vProjList[I]);
- if pProjSum^.Selected then
- FProjects.Add(pProjSum)
- else
- Dispose(pProjSum);
- end;
- end
- else
- if SelectProjects(vProjList, BaseFile, 1, FSilence) then
- begin
- for I := 0 to vProjList.Count - 1 do
- begin
- pProjSum := PProjGLJSum(vProjList[I]);
- if pProjSum^.Selected then
- FProjects.Add(pProjSum)
- else
- Dispose(pProjSum);
- end;
- end;
- finally
- vProjList.Free;
- end;
- end;
- procedure TScProjGLJGather.CheckProjects(ABuildProjName: string);
- var
- I: Integer;
- Proj: TScProjManagerTreeNode;
- begin
- Proj := ProjectManager.FindBuildProjectWithFull(ABuildProjName);
- MakeProjList(Proj);
- { if (Proj <> nil) and (Proj.FirstChild <> nil) then
- begin
- Proj := TScProjectItem(Proj.FirstChild);
- while Proj <> nil do
- begin
- ProjData := ProjList.IndexByName(Proj.FileName);
- if ProjData = nil then
- ProjData := ProjList.AddProj(Proj.FileName);
- if not ProjData.IsOpened then
- ProjData.Open;
- if Proj.PrevSibling = nil then
- begin
- cdsProjData.Active := True;
- cdsProjData.EmptyDataSet;
- cdsProjData.Append;
- cdsProjDataBuildProjName.Value := ProjData.BuildProjectName;
- cdsProjDataAuthor.Value := ProjData.Author;
- cdsProjDataAuditor.Value := ProjData.Auditor;
- cdsProjData.Post;
- cdsProjData.First;
- end;
- FProjects.Add(ProjList.IndexByName(Proj.FileName));
- Proj := TScProjectItem(Proj.NextSibling);
- end;
- end;}
- end;
- function TScProjGLJGather.GatherProjs(ABuildProjName: string): Boolean;
- var
- I: Integer;
- ProjData: TScProjBaseData;
- pProjSum: PProjGLJSum;
- Rec: TsdDataRecord;
- bIsOpened: Boolean;
- begin
- sdvGLJGather.Open;
- sdsGLJGather.DeleteAll;
- sdvGLJGather.IndexName := 'idxSort';
- if ABuildProjName = '' then
- ABuildProjName := strUnTypeProj;
- CheckProjects(ABuildProjName);
- for I := 0 to FProjects.Count - 1 do
- begin
- try
- pProjSum := PProjGLJSum(FProjects[I]);
- ProjData := ProjList.IndexByName(pProjSum^.FileName);
- bIsOpened := ProjData <> nil;
- if ProjData = nil then
- ProjData := ProjList.AddProj(pProjSum^.FileName);
- if not ProjData.IsOpened then ProjData.Open;
- AddProjRecord(ProjData.Connection.Connection, I, ProjData.Alias);
- if I = 0 then
- begin
- sdvProjData.Active := True;
- sdsProjData.DeleteAll;
- Rec := sdsProjData.Add;
- Rec.ValueByName('BuildProjName').AsString := ProjData.BuildProjectName;
- Rec.ValueByName('Author').AsString := ProjData.Author;
- Rec.ValueByName('Auditor').AsString := ProjData.Auditor;
- end;
- finally
- if not bIsOpened then
- FreeAndNil(ProjData);
- end;
- end;
- DoSumAmount;
- ScProgress(100);
- end;
- procedure TScProjGLJGather.DataModuleCreate(Sender: TObject);
- begin
- FProjects := TList.Create;
- FReportType := rtNone;
- FCompareDM := TScProjectCompareDM.Create(nil);
- FIsCompareGather := False;
- FAggregator := TsdAggregator.Create(nil);
- FAggregator.DataSet := sdsGLJGather;
- FAggregator.IndexName := 'idxSort';
- end;
- procedure TScProjGLJGather.DataModuleDestroy(Sender: TObject);
- begin
- FAggregator.Free;
- FCompareDM.Free;
- ClearProjList;
- FProjects.Free;
- end;
- procedure TScProjGLJGather.ClearProjList;
- var
- I: Integer;
- begin
- if not FIsCompareGather then
- begin
- for I := 0 to FProjects.Count - 1 do
- begin
- Dispose(PProjGLJSum(FProjects[I]));
- end;
- FProjects.Clear;
- end
- else
- FProjects.Clear;
- end;
- // 因为改为直接从ProjectGLJ表中取数据,所以不需要汇总,这里只清除消耗为0的工料机
- procedure TScProjGLJGather.DoSumAmount;
- var
- I: Integer;
- Rec: TsdDataRecord;
- fSumAmount: Double;
- begin
- I := 0;
- while I <= sdsGLJGather.RecordCount - 1 do
- begin
- Rec := sdsGLJGather[I];
- if FReportType = rtTable_ZYZ4 then
- fSumAmount := FAggregator.Aggregate(VarArrayOf(
- [Rec.ValueByName('Code').AsString, Rec.ValueByName('Name').AsString,
- Rec.ValueByName('Specs').AsString, Rec.ValueByName('Unit').AsString,
- Rec.ValueByName('Price').AsCurrency]), 'Amount')
- else
- fSumAmount := FAggregator.Aggregate(VarArrayOf(
- [Rec.ValueByName('Code').AsString, Rec.ValueByName('Name').AsString,
- Rec.ValueByName('Specs').AsString, Rec.ValueByName('Unit').AsString]), 'Amount');
- // lsm 2010-1-21删除消耗为0的工料机
- if fSumAmount = 0 then
- sdsGLJGather.Remove(Rec)
- else
- begin
- Rec.ValueByName('SumAmount').AsFloat := fSumAmount;
- Inc(I);
- end;
- end;
- end;
- {aqProjGLJ的SQL
- SELECT ACode, AName, AUnit, Sum(AAmount) AS UAmount, AType
- FROM
- (
- SELECT P.Code AS ACode, P.Name AS AName, P.Unit AS AUnit,
- Sum(G.Quantity*G.RationItemQuantity) AS AAmount, P.Type AS AType, P.LibID
- FROM ProjectGLJ AS P, GLJList AS G
- WHERE (P.Code=G.Code) AND (G.Type<>2) AND (P.LibID=G.LibID) AND
- ((SELECT Sum(G9.Quantity*G9.RationItemQuantity)
- FROM GLJList AS G9, ProjectGLJ AS P9
- WHERE (P9.Code=G9.Code) AND (G9.Type<>2) AND (P9.LibID=G9.LibID)
- )>0 )
- GROUP BY P.Code, P.Name, P.Unit, P.Type, P.LibID
- UNION ALL
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.RG*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=3) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.RG*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=3) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- UNION ALL
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.ZY*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=263) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.ZY*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=263) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- UNION ALL
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.QY*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=264) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.QY*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=264) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- UNION ALL
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.CY*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=265) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.CY*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=265) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- UNION ALL
-
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.Mei*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=266) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.Mei*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=266) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- UNION ALL
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.Dian*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=267) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.Dian*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=267) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- UNION ALL
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.Shui*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=268) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.Shui*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=268) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- UNION ALL
- SELECT P1.Code AS ACode, P1.Name AS AName, P1.Unit AS AUnit,
- SUM(M1.MC*G1.Quantity*G1.RationItemQuantity) AS AAmount, P1.Type AS AType, P1.LibID
- FROM GLJList AS G1, MachinePrice AS M1, ProjectGLJ AS P1
- WHERE (P1.Code=269) AND (G1.Code=M1.Code) AND (P1.LibID=G1.LibID) AND
- ((SELECT SUM(M8.MC*G8.Quantity*G8.RationItemQuantity)
- FROM GLJList AS G8, MachinePrice AS M8, ProjectGLJ AS P8
- WHERE (P8.Code=269) AND (G8.Code=M8.Code) AND (P8.LibID=G8.LibID)
- )>0 )
- GROUP BY P1.Code, P1.Name, P1.Unit, P1.Type, P1.LibID
- )
- GROUP BY ACode, AName, AUnit, AType
- }
- function TScProjGLJGather.GatherGLJ(ABuildProjName: string;
- AIsCompareGather: Boolean = False; AIsCompareProj: Boolean = False;
- AProjList: TList = nil): Boolean;
- procedure AddGLJFieldDef(ABuildProj: TScProjManagerTreeNode; AIsCompareGather: Boolean = False; AProjList: TList = nil);
- var
- I: Integer;
- begin
- // *生成汇总造价文件的列表
- if AIsCompareGather then
- MakeProjListForCompareGather(AProjList)
- else
- MakeProjList(ABuildProj);
- // *添加cdsGLJGatherD的需要的字段
- with sdsGLJGatherD.Fields do
- begin
- Clear;
- //Add(gfID, ftInteger);
- Add(gfCodeSN, ftString, 12);
- Add(gfCodeDis, ftString, 12);
- Add(gfName, ftString, 50);
- Add(gfUnits, ftString, 12);
- Add(gfSumAmount, ftFloat);
- Add(gfTenderSumAmount, ftFloat);
- //Add(gfSumAmount, ftString, 50);
- Add(gfType, ftInteger);
- for I := 0 to FProjects.Count - 1 do
- begin
- Add(gfAmountPreFix + IntToStr(I), ftFloat);
- //Add(gfAmountPreFix + IntToStr(I), ftString, 50);
- Add(gfBudgetPricePrefix + IntToStr(I), ftFloat);
- Add(gfSumPricePrefix + IntToStr(I), ftFloat);
- Add(gfMateFeePrefix + IntToStr(I), ftFloat);
- Add(gfBuildFeePrefix + IntToStr(I), ftFloat);
- Add(gfFileNamePrefix + IntToStr(I), ftString, 50);
- Add(gfMatePercentPrefix + IntToStr(I), ftFloat);
- Add(gfBuildPercentPrefix + IntToStr(I), ftFloat);
- // lengshumei 2011-2-10 重庆成渝复线加调价后字段
- Add(gfTenderAmountPreFix + IntToStr(I), ftFloat);
- Add(gfTenderPricePrefix + IntToStr(I), ftFloat);
- Add(gfTenderSumPricePrefix + IntToStr(I), ftFloat);
- Add(gfTenderMateFeePrefix + IntToStr(I), ftFloat);
- Add(gfTenderBuildFeePrefix + IntToStr(I), ftFloat);
- Add(gfTenderMatePercentPrefix + IntToStr(I), ftFloat);
- Add(gfTenderBuildPercentPrefix + IntToStr(I), ftFloat);
- end;
- Add(gfAvgBudgetPrice, ftFloat);
- Add(gfBuildSumPrice, ftFloat);
- Add(gfTenderAvgBudgetPrice, ftFloat);
- Add(gfTenderBuildSumPrice, ftFloat);
- // lengshumei 2013-12-17广东工程比较表中需要先汇总建设项目数据再比较
- Add(gfMain, ftBoolean);
- Add(gfSpecs, ftString, 50);
- end;
- end;
- function LocateMaterial(ACode, AName: string; var ARecord: TsdDataRecord): Boolean;
- var
- (*CodeLocated, NameLocated: Boolean;
- CodeCode, NameCode: string;*)
- vCode, vName: Variant;
- begin
- if ACode = '' then
- vCode := Null
- else
- vCode := ACode;
- if AName = '' then
- vName := Null
- else
- vName := AName;
- ARecord := sdsGLJGatherD.Locate('CodeDis;Name', VarArrayOf([vCode, vName]));
- Result := ARecord <> nil;
- end;
- procedure AddGLJRecords;
- var
- L: Integer;
- //TempMateFee, TempBuildFee, TempSumPrice: Double;
- TempMateFee, TempBuildFee: Double;
- TempTenderMateFee, TempTenderBuildFee: Double;
- ProjData: TScProjBaseData;
- AmountFieldName, BudgetPriceFieldName, PriceFieldName, MatePercentFieldName,
- BuildPercentFieldName, MateFeeFieldName, BuildFeeFieldName, FileNameFieldName, TempFileName: string;
- TenderAmountFieldName, TenderBudgetPriceFieldName, TenderPriceFieldName, TenderMatePercentFieldName,
- TenderBuildPercentFieldName, TenderMateFeeFieldName, TenderBuildFeeFieldName: string;
- BPSumMateFee, BPSumBuildFee, BPSumTenderMateFee, BPSumTenderBuildFee: Double;
- pProjSum: PProjGLJSum;
- Rec: TsdDataRecord;
- bIsOpened: Boolean;
- begin
- BPSumMateFee := 0;
- BPSumBuildFee := 0;
- BPSumTenderMateFee := 0;
- BPSumTenderBuildFee := 0;
- for L := 0 to FProjects.Count - 1 do
- begin
- AmountFieldName := gfAmountPrefix + IntToStr(L);
- BudgetPriceFieldName := gfBudgetPricePrefix + IntToStr(L);
- PriceFieldName := gfSumPricePrefix + IntToStr(L);
- MatePercentFieldName := gfMatePercentPrefix + IntToStr(L);
- BuildPercentFieldName := gfBuildPercentPrefix + IntToStr(L);
- MateFeeFieldName := gfMateFeePrefix + IntToStr(L);
- BuildFeeFieldName := gfBuildFeePrefix + IntToStr(L);
- FileNameFieldName := gfFileNamePrefix + IntToStr(L);
- // lengshumei 2011-2-10 重庆成渝复线加调价后字段
- TenderAmountFieldName := gfTenderAmountPrefix + IntToStr(L);
- TenderBudgetPriceFieldName := gfTenderPricePrefix + IntToStr(L);
- TenderPriceFieldName := gfTenderSumPricePrefix + IntToStr(L);
- TenderMatePercentFieldName := gfTenderMatePercentPrefix + IntToStr(L);
- TenderBuildPercentFieldName := gfTenderBuildPercentPrefix + IntToStr(L);
- TenderMateFeeFieldName := gfTenderMateFeePrefix + IntToStr(L);
- TenderBuildFeeFieldName := gfTenderBuildFeePrefix + IntToStr(L);
- try
- //TempSumPrice := 0;
- // 前面AddFileDef已经判断了文件是否存在,这里不用再判断
- pProjSum := PProjGLJSum(FProjects[L]);
- ProjData := ProjList.IndexByName(pProjSum^.FileName);
- bIsOpened := ProjData <> nil;
- if ProjData = nil then
- ProjData := ProjList.AddProj(pProjSum^.FileName);
- if not ProjData.IsOpened then ProjData.Open;
- aqMateBuildFee.Close;
- aqMateBuildFee.Connection := ProjData.Connection.Connection;
- aqMateBuildFee.Open;
- aqMateBuildFee.First;
- TempMateFee := 0;
- TempBuildFee := ScRoundTo(aqMateBuildFeeBuildFee.AsFloat, 0);
- if AIsCompareGather then
- TempFileName := ''
- else
- TempFileName := pProjSum.Name;
- TempTenderMateFee := 0;
- TempTenderBuildFee := ScRoundTo(aqMateBuildFeeTenderBuildFee.AsFloat, 0);
- ProjData.Open;
- aqProjGLJ.Close;
- aqProjGLJ.Connection := ProjData.Connection.Connection;
- aqProjGLJ.Open;
- aqProjGLJ.First;
- // *将第一个项目的材料放到cdsGLJGatherD中
- if L = 0 then
- begin
- sdsGLJGatherD.BeginUpdate;
- try
- while not aqProjGLJ.Eof do
- begin
- if ((aqProjGLJAType.AsInteger = 1) or (aqProjGLJAType.AsInteger = 4) or (aqProjGLJAType.AsInteger = 8))
- and (ScRoundTo(aqProjGLJUAmount.AsFloat, -3) <> 0) then
- begin
- Rec := sdsGLJGatherD.Add(True);
- try
- Rec.ValueByName('CodeSN').AsString := aqProjGLJACode.AsString;
- Rec.ValueByName('CodeDis').AsString := aqProjGLJACode.AsString;
- Rec.ValueByName('Name').AsString := aqProjGLJAName.AsString;
- Rec.ValueByName('Units').AsString := aqProjGLJAUnit.AsString;
- Rec.ValueByName('Type').AsInteger := aqProjGLJAType.AsInteger;
- Rec.ValueByName('Specs').AsString := aqProjGLJASpecs.AsString;
- Rec.ValueByName(AmountFieldName).AsFloat := ScRoundTo(aqProjGLJUAmount.AsFloat, -3);
- Rec.ValueByName(BudgetPriceFieldName).AsFloat := ScRoundTo(aqProjGLJPrice.AsFloat, -2);
- Rec.ValueByName(PriceFieldName).AsFloat := ScRoundTo(aqProjGLJUAmount.AsFloat * aqProjGLJPrice.AsFloat, 0);
- //Rec.ValueByName(MateFeeFieldName).AsFloat := TempMateFee + Rec.ValueByName(PriceFieldName).AsFloat;
- if aqProjGLJAType.AsInteger = 4 then
- TempMateFee := TempMateFee + Rec.ValueByName(PriceFieldName).AsFloat;
- Rec.ValueByName(BuildFeeFieldName).AsFloat := TempBuildFee;
- Rec.ValueByName(FileNameFieldName).AsString := TempFileName;
- Rec.ValueByName(TenderAmountFieldName).AsFloat := ScRoundTo(aqProjGLJUTenderAmount.AsFloat, -3);
- Rec.ValueByName(TenderBudgetPriceFieldName).AsFloat := ScRoundTo(aqProjGLJTenderPrice.AsFloat, -2);
- Rec.ValueByName(TenderPriceFieldName).AsFloat := ScRoundTo(aqProjGLJUTenderAmount.AsFloat * aqProjGLJTenderPrice.AsFloat, 0);
- //Rec.ValueByName(TenderMateFeeFieldName).AsFloat := TempTenderMateFee;
- if aqProjGLJAType.AsInteger = 4 then
- TempTenderMateFee := TempTenderMateFee + Rec.ValueByName(TenderPriceFieldName).AsFloat;
- Rec.ValueByName(TenderBuildFeeFieldName).AsFloat := TempTenderBuildFee;
- if TempMateFee = 0 then
- Rec.ValueByName(MatePercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(MatePercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(PriceFieldName).AsFloat * 100/ TempMateFee, -2);
- if TempBuildFee = 0 then
- Rec.ValueByName(BuildPercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(BuildPercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(PriceFieldName).AsFloat * 100/ TempBuildFee, -2);
- if TempTenderMateFee = 0 then
- Rec.ValueByName(TenderMatePercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(TenderMatePercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(TenderPriceFieldName).AsFloat * 100/ TempTenderMateFee, -2);
- if TempTenderBuildFee = 0 then
- Rec.ValueByName(TenderBuildPercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(TenderBuildPercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(TenderPriceFieldName).AsFloat * 100/ TempTenderBuildFee, -2);
- //TempSumPrice := TempSumPrice + cdscdsGLJGatherD.FieldByName(PriceFieldName).AsFloat;
- Rec.ValueByName(gfMain).AsBoolean := aqProjGLJMain.AsBoolean;
- finally
- Rec.EndUpdate;
- end;
- aqProjGLJ.Next;
- end
- else
- aqProjGLJ.Next;
- end;
- finally
- sdsGLJGatherD.EndUpdate;
- end;
- BPSumMateFee := BPSumMateFee + TempMateFee;
- BPSumBuildFee := BPSumBuildFee + TempBuildFee;
- BPSumTenderMateFee := BPSumTenderMateFee + TempTenderMateFee;
- BPSumTenderBuildFee := BPSumTenderBuildFee + TempTenderBuildFee;
- // 第一个项目获取建设项目信息
- sdvProjData.Open;
- sdsProjData.DeleteAll;
- Rec := sdvProjData.Append(True);
- if ProjData <> nil then
- begin
- Rec.ValueByName('BuildProjName').Value := ProjData.BuildProjectName;
- Rec.ValueByName('Author').Value := ProjData.Author;
- Rec.ValueByName('Auditor').Value := ProjData.Auditor;
- end
- else
- begin
- Rec.ValueByName('BuildProjName').Value := '';
- Rec.ValueByName('Author').Value := '';
- Rec.ValueByName('Auditor').Value := '';
- end;
- Rec.EndUpdate;
- end
- else
- begin
- while not aqProjGLJ.Eof do
- begin
- if ((aqProjGLJAType.AsInteger = 1) or (aqProjGLJAType.AsInteger = 4) or (aqProjGLJAType.AsInteger = 8))
- and (ScRoundTo(aqProjGLJUAmount.AsFloat, -3) <> 0) then
- begin
- Rec := nil;
- if LocateMaterial(aqProjGLJACode.AsString, aqProjGLJAName.AsString, Rec) then
- begin
- Rec.BeginUpdate;
- try
- Rec.ValueByName(AmountFieldName).AsFloat := ScRoundTo(aqProjGLJUAmount.AsFloat, -3);
- Rec.ValueByName(BudgetPriceFieldName).AsFloat := ScRoundTo(aqProjGLJPrice.AsFloat, -2);
- Rec.ValueByName(PriceFieldName).AsFloat := ScRoundTo(aqProjGLJUAmount.AsFloat * aqProjGLJPrice.AsFloat, 0);
- Rec.ValueByName(MateFeeFieldName).AsFloat := TempMateFee + Rec.ValueByName(PriceFieldName).AsFloat;
- if aqProjGLJAType.AsInteger = 4 then
- TempMateFee := TempMateFee + Rec.ValueByName(PriceFieldName).AsFloat;
- Rec.ValueByName(BuildFeeFieldName).AsFloat := TempBuildFee;
- Rec.ValueByName(FileNameFieldName).AsString := TempFileName;
- Rec.ValueByName(TenderAmountFieldName).AsFloat := ScRoundTo(aqProjGLJUTenderAmount.AsFloat, -3);
- Rec.ValueByName(TenderBudgetPriceFieldName).AsFloat := ScRoundTo(aqProjGLJTenderPrice.AsFloat, -2);
- Rec.ValueByName(TenderPriceFieldName).AsFloat := ScRoundTo(aqProjGLJUTenderAmount.AsFloat * aqProjGLJTenderPrice.AsFloat, 0);
- Rec.ValueByName(TenderMateFeeFieldName).AsFloat := TempTenderMateFee;
- if aqProjGLJAType.AsInteger = 4 then
- TempTenderMateFee := TempTenderMateFee + Rec.ValueByName(TenderPriceFieldName).AsFloat;
- Rec.ValueByName(TenderBuildFeeFieldName).AsFloat := TempTenderBuildFee;
- if TempMateFee = 0 then
- Rec.ValueByName(MatePercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(MatePercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(PriceFieldName).AsFloat * 100/ TempMateFee, -2);
- if TempBuildFee = 0 then
- Rec.ValueByName(BuildPercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(BuildPercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(PriceFieldName).AsFloat * 100/ TempBuildFee, -2);
- if TempTenderMateFee = 0 then
- Rec.ValueByName(TenderMatePercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(TenderMatePercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(TenderPriceFieldName).AsFloat * 100/ TempTenderMateFee, -2);
- if TempTenderBuildFee = 0 then
- Rec.ValueByName(TenderBuildPercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(TenderBuildPercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(TenderPriceFieldName).AsFloat * 100/ TempTenderBuildFee, -2);
- Rec.ValueByName(gfMain).AsBoolean := aqProjGLJMain.AsBoolean;
- finally
- Rec.EndUpdate;
- end;
- aqProjGLJ.Next;
- end
- else
- // *前面项目中没有的材料
- begin
- Rec := sdsGLJGatherD.Add(True);
- try
- Rec.ValueByName('CodeSN').AsString := aqProjGLJACode.AsString;
- Rec.ValueByName('CodeDis').AsString := aqProjGLJACode.AsString;
- Rec.ValueByName('Name').AsString := aqProjGLJAName.AsString;
- Rec.ValueByName('Units').AsString := aqProjGLJAUnit.AsString;
- Rec.ValueByName('Type').AsInteger := aqProjGLJAType.AsInteger;
- Rec.ValueByName('Specs').AsString := aqProjGLJASpecs.AsString;
- Rec.ValueByName(AmountFieldName).AsFloat := ScRoundTo(aqProjGLJUAmount.AsFloat, -3);
- Rec.ValueByName(BudgetPriceFieldName).AsFloat := ScRoundTo(aqProjGLJPrice.AsFloat, -2);
- Rec.ValueByName(PriceFieldName).AsFloat := ScRoundTo(aqProjGLJUAmount.AsFloat * aqProjGLJPrice.AsFloat, 0);
- Rec.ValueByName(MateFeeFieldName).AsFloat := TempMateFee + Rec.ValueByName(PriceFieldName).AsFloat;
- if aqProjGLJAType.AsInteger = 4 then
- TempMateFee := TempMateFee + Rec.ValueByName(PriceFieldName).AsFloat;
- Rec.ValueByName(BuildFeeFieldName).AsFloat := TempBuildFee;
- Rec.ValueByName(FileNameFieldName).AsString := TempFileName;
- Rec.ValueByName(TenderAmountFieldName).AsFloat := ScRoundTo(aqProjGLJUTenderAmount.AsFloat, -3);
- Rec.ValueByName(TenderBudgetPriceFieldName).AsFloat := ScRoundTo(aqProjGLJTenderPrice.AsFloat, -2);
- Rec.ValueByName(TenderPriceFieldName).AsFloat := ScRoundTo(aqProjGLJUTenderAmount.AsFloat * aqProjGLJTenderPrice.AsFloat, 0);
- Rec.ValueByName(TenderMateFeeFieldName).AsFloat := TempTenderMateFee;
- if aqProjGLJAType.AsInteger = 4 then
- TempTenderMateFee := TempTenderMateFee + Rec.ValueByName(TenderPriceFieldName).AsFloat;
- Rec.ValueByName(TenderBuildFeeFieldName).AsFloat := TempTenderBuildFee;
- if TempMateFee = 0 then
- Rec.ValueByName(MatePercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(MatePercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(PriceFieldName).AsFloat * 100/ TempMateFee, -2);
- if TempBuildFee = 0 then
- Rec.ValueByName(BuildPercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(BuildPercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(PriceFieldName).AsFloat * 100/ TempBuildFee, -2);
- if TempTenderMateFee = 0 then
- Rec.ValueByName(TenderMatePercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(TenderMatePercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(TenderPriceFieldName).AsFloat * 100/ TempTenderMateFee, -2);
- if TempTenderBuildFee = 0 then
- Rec.ValueByName(TenderBuildPercentFieldName).AsFloat := 0
- else
- Rec.ValueByName(TenderBuildPercentFieldName).AsFloat := ScRoundTo(Rec.ValueByName(TenderPriceFieldName).AsFloat * 100/ TempTenderBuildFee, -2);
- Rec.ValueByName(gfMain).AsBoolean := aqProjGLJMain.AsBoolean;
- finally
- Rec.EndUpdate;
- end;
- aqProjGLJ.Next;
- end;
- end
- else
- aqProjGLJ.Next;
- end;
- BPSumMateFee := BPSumMateFee + TempMateFee;
- BPSumBuildFee := BPSumBuildFee + TempBuildFee;
- BPSumTenderMateFee := BPSumTenderMateFee + TempTenderMateFee;
- BPSumTenderBuildFee := BPSumTenderBuildFee + TempTenderBuildFee;
- end;
- finally
- if not bIsOpened then
- FreeAndNil(ProjData);
- end;
- end;
- // lengshumei 2013-12-17 用于广东版的编审对比工程表
- if AIsCompareGather then
- begin
- FCompareDM.sdvProjFees.Active := True;
- if AIsCompareProj then
- begin
- FCompareDM.sdsProjFees.DeleteAll;
- Rec := FCompareDM.sdsProjFees.Add;
- Rec.ValueByName('CompareMateFee').AsFloat := ScRoundTo(BPSumMateFee, 0 );
- Rec.ValueByName('CompareBuildFee').AsFloat := ScRoundTo(BPSumBuildFee, 0 );
- Rec.ValueByName('TenderCompareMateFee').AsFloat := ScRoundTo(BPSumTenderMateFee, 0 );
- Rec.ValueByName('TenderCompareBuildFee').AsFloat := ScRoundTo(BPSumTenderBuildFee, 0 );
- end
- else
- begin
- Rec := FCompareDM.sdvProjFees[0];
- Rec.ValueByName('SourceMateFee').AsFloat := ScRoundTo(BPSumMateFee, 0 );
- Rec.ValueByName('SourceBuildFee').AsFloat := ScRoundTo(BPSumBuildFee, 0 );
- Rec.ValueByName('TenderSourceMateFee').AsFloat := ScRoundTo(BPSumTenderMateFee, 0 );
- Rec.ValueByName('TenderSourceBuildFee').AsFloat := ScRoundTo(BPSumTenderBuildFee, 0 );
- end;
- end;
- end;
- // *计算总数量 和 总金额 和平均预算价
- procedure CalcSumAmount;
- var
- I, J: Integer;
- AmountFieldName, PriceFieldName, MateFeeFieldName, BuildFeeFieldName,
- MatePercentFieldName, BuildPercentFieldName: string;
- TenderAmountFieldName, TenderPriceFieldName, TenderMateFeeFieldName, TenderBuildFeeFieldName,
- TenderMatePercentFieldName, TenderBuildPercentFieldName: string;
- TempMateFee, TempBuildFee, TempSumPrice: Double;
- TempTenderMateFee, TempTenderBuildFee, TempTenderSumPrice: Double;
- Rec: TsdDataRecord;
- begin
- sdsGLJGatherD.BeginUpdate;
- try
- for I := 0 to sdvGLJGatherD.RecordCount - 1 do
- begin
- Rec := sdvGLJGatherD[I];
- try
- Rec.ValueByName(gfSumAmount).AsFloat := 0;
- // lengshumei 2010-12-1 重庆定制报表加字段
- Rec.ValueByName(gfAvgBudgetPrice).AsFloat := 0;
- Rec.ValueByName(gfBuildSumPrice).AsFloat := 0;
- Rec.ValueByName(gfTenderAvgBudgetPrice).AsFloat := 0;
- Rec.ValueByName(gfTenderBuildSumPrice).AsFloat := 0;
- for J := 0 to FProjects.Count - 1 do
- begin
- AmountFieldName := gfAmountPrefix + IntToStr(J);
- Rec.ValueByName(gfSumAmount).AsFloat := ScRoundTo(Rec.ValueByName(gfSumAmount).AsFloat
- + Rec.ValueByName(AmountFieldName).AsFloat, -3);
- Rec.ValueByName(gfBuildSumPrice).AsFloat := ScRoundTo(Rec.ValueByName(gfBuildSumPrice).AsFloat
- + Rec.ValueByName(gfSumPricePrefix + IntToStr(J)).AsFloat, -2);
- TenderAmountFieldName := gfTenderAmountPrefix + IntToStr(J);
- Rec.ValueByName(gfTenderSumAmount).AsFloat := ScRoundTo(Rec.ValueByName(gfTenderSumAmount).AsFloat
- + Rec.ValueByName(TenderAmountFieldName).AsFloat, -3);
- Rec.ValueByName(gfTenderBuildSumPrice).AsFloat := ScRoundTo(Rec.ValueByName(gfTenderBuildSumPrice).AsFloat
- + Rec.ValueByName(gfTenderSumPricePrefix + IntToStr(J)).AsFloat, -2);
- end;
- if Rec.ValueByName(gfSumAmount).AsFloat = 0 then
- Rec.ValueByName(gfAvgBudgetPrice).AsFloat := 0
- else
- Rec.ValueByName(gfAvgBudgetPrice).AsFloat := ScRoundTo(Rec.ValueByName(gfBuildSumPrice).AsFloat
- / Rec.ValueByName(gfSumAmount).AsFloat, -2);
- if Rec.ValueByName(gfTenderSumAmount).AsFloat = 0 then
- Rec.ValueByName(gfTenderAvgBudgetPrice).AsFloat := 0
- else
- Rec.ValueByName(gfTenderAvgBudgetPrice).AsFloat := ScRoundTo(Rec.ValueByName(gfTenderBuildSumPrice).AsFloat
- / Rec.ValueByName(gfTenderSumAmount).AsFloat, -2);
- finally
- Rec.EndUpdate;
- end;
- end;
- finally
- sdsGLJGatherD.EndUpdate;
- end;
- // 如果工料机总消耗量为0 ,则删除
- I := 0;
- while I <= sdvGLJGatherD.RecordCount - 1 do
- begin
- Rec := sdvGLJGatherD[I];
- for J := 0 to FProjects.Count - 1 do
- begin
- AmountFieldName := gfAmountPrefix + IntToStr(J);
- if Rec.ValueByName(AmountFieldName).AsFloat = 0 then
- Continue
- else if (Rec.ValueByName(AmountFieldName).AsFloat = 0) and (J = FProjects.Count - 1) then
- sdvGLJGatherD.Delete(I);
- end;
- Inc(I);
- end;
- (*
- // 计算并添加合计行
- for I := 0 to FProjects.Count - 1 do
- begin
- cdsGLJGatherD.First;
- TempMateFee := 0;
- TempBuildFee := 0;
- TempSumPrice := 0;
- PriceFieldName := gfSumPricePrefix + IntToStr(I);
- MateFeeFieldName := gfMateFeePrefix + IntToStr(I);
- BuildFeeFieldName := gfBuildFeePrefix + IntToStr(I);
- MatePercentFieldName := gfMatePercentPrefix + IntToStr(I);
- BuildPercentFieldName := gfBuildPercentPrefix + IntToStr(I);
- while not cdsGLJGatherD.Eof do
- begin
- if cdsGLJGatherD.FieldByName('Name').AsString <> '合计' then
- begin
- TempSumPrice := TempSumPrice + cdsGLJGatherD.FieldByName(PriceFieldName).AsFloat;
- TempMateFee := cdsGLJGatherD.FieldByName(MateFeeFieldName).AsFloat;
- if TempBuildFee = 0 then
- TempBuildFee := cdsGLJGatherD.FieldByName(BuildFeeFieldName).AsFloat;
- end;
- cdsGLJGatherD.Next;
- end;
- if I = 0 then
- begin
- cdsGLJGatherD.Append;
- cdsGLJGatherD.FieldByName('CodeSN').AsInteger := 999999999;
- cdsGLJGatherD.FieldByName('Name').AsString := '合计';
- cdsGLJGatherD.FieldByName('Type').AsInteger := 5;
- cdsGLJGatherD.FieldByName(PriceFieldName).AsFloat := ScRoundTo(TempSumPrice, 0);
- if TempMateFee = 0 then
- cdsGLJGatherD.FieldByName(MatePercentFieldName).AsFloat := 0
- else
- cdsGLJGatherD.FieldByName(MatePercentFieldName).AsFloat := ScRoundTo(cdsGLJGatherD.FieldByName(PriceFieldName).AsFloat * 100/ TempMateFee, -2);
- if TempBuildFee = 0 then
- cdsGLJGatherD.FieldByName(BuildPercentFieldName).AsFloat := 0
- else
- cdsGLJGatherD.FieldByName(BuildPercentFieldName).AsFloat := ScRoundTo(cdsGLJGatherD.FieldByName(PriceFieldName).AsFloat * 100/ TempBuildFee, -2);
- cdsGLJGatherD.Post;
- end
- else
- begin
- cdsGLJGatherD.First;
- while not cdsGLJGatherD.Eof do
- begin
- if cdsGLJGatherD.FieldByName('Name').AsString = '合计' then
- begin
- cdsGLJGatherD.Edit;
- cdsGLJGatherD.FieldByName(PriceFieldName).AsFloat := ScRoundTo(TempSumPrice, 0);
- if TempMateFee = 0 then
- cdsGLJGatherD.FieldByName(MatePercentFieldName).AsFloat := 0
- else
- cdsGLJGatherD.FieldByName(MatePercentFieldName).AsFloat := ScRoundTo(cdsGLJGatherD.FieldByName(PriceFieldName).AsFloat * 100/ TempMateFee, -2);
- if TempBuildFee = 0 then
- cdsGLJGatherD.FieldByName(BuildPercentFieldName).AsFloat := 0
- else
- cdsGLJGatherD.FieldByName(BuildPercentFieldName).AsFloat := ScRoundTo(cdsGLJGatherD.FieldByName(PriceFieldName).AsFloat * 100/ TempBuildFee, -2);
- cdsGLJGatherD.Post;
- end;
- cdsGLJGatherD.Next;
- end;
- end;
- end;*)
- end;
- begin
- Result := False;
- // *如果已经初始化过,先清空cds
- sdvGLJGatherD.Open;
- sdsGLJGatherD.DeleteAll;
- sdsGLJGatherD.Close;
- FBuildProj := ProjectManager.FindBuildProjectWithFull(ABuildProjName);
- // *添加cds中的字段
- AddGLJFieldDef(FBuildProj, AIsCompareGather, AProjList);
- sdsGLJGatherD.IndexList.Clear;
- sdsGLJGatherD.AddIndex('idxSortByType', 'Type;CodeSN');
- sdvGLJGatherD.IndexName := 'idxSortByType';
- sdvGLJGatherD.Open;
- AddGLJRecords;
- CalcSumAmount;
- if AIsCompareGather then
- begin
- if AIsCompareProj then
- CopyGatherDataForCompare(FCompareDM.sdvMtlGatherCompare)
- else
- CopyGatherDataForCompare(FCompareDM.sdvMtlGatherSource);
- end;
- ScProgress(100);
- Result := True;
- end;
- function TScProjGLJGather.GatherGLJForReport(
- ABuildProjName: string;
- AIsCompareGather: Boolean = False; AIsCompareProj: Boolean = False;
- AProjList: TList = nil): Boolean;
- procedure AddGLJFieldDef;
- begin
- // *添加cdsGLJGatherD的需要的字段
- sdvGLJForReport.Open;
- sdsGLJForReport.DeleteAll;
- sdsGLJForReport.Close;
- with sdsGLJForReport.Fields do
- begin
- Clear;
- Add(gfCodeSN, ftString, 12);
- Add(gfCodeDis, ftString, 12);
- Add(gfName, ftString, 50);
- Add(gfUnits, ftString, 12);
- Add(gfSumAmount, ftFloat);
- Add(gfType, ftInteger);
- Add(gfAmountPreFix, ftFloat);
- Add(gfBudgetPricePrefix, ftFloat);
- Add(gfSumPricePrefix, ftFloat);
- //Add(gfMateFeePrefix, ftFloat);
- //Add(gfBuildFeePrefix, ftFloat);
- //Add(gfFileNamePrefix, ftString, 50);
- Add(gfMatePercentPrefix, ftFloat);
- Add(gfBuildPercentPrefix, ftFloat);
- Add(gfProjectID, ftInteger);
- Add(gfProjectName, ftString, 255);
- // lengshumei 2010-12-1 重庆定制报表需加字段
- Add(gfAvgBudgetPrice, ftFloat);
- Add(gfBuildSumPrice, ftFloat);
- // lengshumei 2010-2-10 重庆成渝复线加调价后字段
- Add(gfTenderSumAmount, ftFloat);
- Add(gfTenderAmountPreFix, ftFloat);
- Add(gfTenderPricePrefix, ftFloat);
- Add(gfTenderSumPricePrefix, ftFloat);
- Add(gfTenderMatePercentPrefix, ftFloat);
- Add(gfTenderBuildPercentPrefix, ftFloat);
- Add(gfTenderAvgBudgetPrice, ftFloat);
- Add(gfTenderBuildSumPrice, ftFloat);
- Add(gfSpecs, ftString, 50);
- end;
- sdsGLJForReport.IndexList.Clear;
- sdsGLJForReport.AddIndex('idxSortBySN', gfCodeSN);
- sdvGLJForReport.IndexName := 'idxSortBySN';
- end;
- procedure AddReportRecords;
- var
- I, J: Integer;
- ProjectID: Integer;
- ProjectName: string;
- DRec, RRec: TsdDataRecord;
- begin
- sdvGLJForReport.Open;
- sdsGLJForReport.BeginUpdate;
- try
- for I := 0 to FProjects.Count - 1 do
- begin
- ProjectID := I;
- ProjectName := PProjGLJSum(FProjects[I]).Name;
- for J := 0 to sdvGLJGatherD.RecordCount - 1 do
- begin
- DRec := sdvGLJGatherD[J];
- RRec := sdsGLJForReport.Add(True);
- try
- RRec.ValueByName(gfCodeSN).AsString := DRec.ValueByName(gfCodeSN).AsString;
- RRec.ValueByName(gfCodeDis).AsString := DRec.ValueByName(gfCodeDis).AsString;
- RRec.ValueByName(gfName).AsString := DRec.ValueByName(gfName).AsString;
- RRec.ValueByName(gfUnits).AsString := DRec.ValueByName(gfUnits).AsString;
- RRec.ValueByName(gfSumAmount).AsFloat := DRec.ValueByName(gfSumAmount).AsFloat;
- RRec.ValueByName(gfType).AsInteger := DRec.ValueByName(gfType).AsInteger;
- RRec.ValueByName(gfAmountPreFix).AsFloat := DRec.ValueByName(gfAmountPreFix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfBudgetPricePrefix).AsFloat := DRec.ValueByName(gfBudgetPricePrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfSumPricePrefix).AsFloat := DRec.ValueByName(gfSumPricePrefix + IntToStr(I)).AsFloat;
- //RRec.ValueByName(gfMateFeePrefix).AsFloat := DRec.ValueByName(gfMateFeePrefix + IntToStr(I)).AsFloat;
- //RRec.ValueByName(gfBuildFeePrefix).AsFloat := DRec.ValueByName(gfBuildFeePrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfMatePercentPrefix).AsFloat := DRec.ValueByName(gfMatePercentPrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfBuildPercentPrefix).AsFloat := DRec.ValueByName(gfBuildPercentPrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfProjectID).AsInteger := I;
- // litao
- RRec.ValueByName(gfProjectName).AsString := ProjectName; //RRec.ValueByName(gfFileNamePrefix + IntToStr(I)).AsString;
- // lengshumei 2010-12-1 重庆定制报表加字段
- RRec.ValueByName(gfAvgBudgetPrice).AsFloat := DRec.ValueByName(gfAvgBudgetPrice).AsFloat;
- RRec.ValueByName(gfBuildSumPrice).AsFloat := DRec.ValueByName(gfBuildSumPrice).AsFloat;
- // lengshumei 2010-2-10 重庆成渝复线加调价后字段
- RRec.ValueByName(gfTenderSumAmount).AsFloat := DRec.ValueByName(gfTenderSumAmount).AsFloat;
- RRec.ValueByName(gfTenderAmountPreFix).AsFloat := DRec.ValueByName(gfTenderAmountPreFix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfTenderPricePrefix).AsFloat := DRec.ValueByName(gfTenderPricePrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfTenderSumPricePrefix).AsFloat := DRec.ValueByName(gfTenderSumPricePrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfTenderMatePercentPrefix).AsFloat := DRec.ValueByName(gfTenderMatePercentPrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfTenderBuildPercentPrefix).AsFloat := DRec.ValueByName(gfTenderBuildPercentPrefix + IntToStr(I)).AsFloat;
- RRec.ValueByName(gfTenderAvgBudgetPrice).AsFloat := DRec.ValueByName(gfTenderAvgBudgetPrice).AsFloat;
- RRec.ValueByName(gfTenderBuildSumPrice).AsFloat := DRec.ValueByName(gfTenderBuildSumPrice).AsFloat;
- RRec.ValueByName(gfSpecs).AsString := DRec.ValueByName(gfSpecs).AsString;
- finally
- RRec.EndUpdate;
- end;
- end;
- end;
- finally
- sdsGLJForReport.EndUpdate;
- end;
- end;
- var
- Rec: TsdDataRecord;
- begin
- FIsCompareGather := AIsCompareGather;
- Result := GatherGLJ(ABuildProjName, AIsCompareGather, AIsCompareProj, AProjList);
- if Result then
- begin
- if not AIsCompareGather then
- begin
- AddGLJFieldDef;
- AddReportRecords;
- end;
- end;
- end;
- procedure TScProjGLJGather.MakeProjListForCompareGather(AProjList: TList);
- var
- pProjSum: PProjGLJSum;
- I: Integer;
- begin
- ClearProjList;
- //FProjects.Clear;
- for I := 0 to AProjList.Count - 1 do
- begin
- pProjSum := PProjGLJSum(AProjList[I]);
- {if pProjSum^.Selected then
- FProjects.Add(pProjSum)
- else
- Dispose(pProjSum); }
- FProjects.Add(pProjSum);
- end;
- end;
- procedure TScProjGLJGather.CopyGatherDataForCompare(
- ACompareData: TsdDataView);
- var
- I: Integer;
- Rec, CRec: TsdDataRecord;
- begin
- ACompareData.Active := True;
- ACompareData.DataSet.DeleteAll;
- ACompareData.DataSet.BeginUpdate;
- try
- for I := 0 to sdvGLJGatherD.RecordCount - 1 do
- begin
- Rec := sdvGLJGatherD[I];
- if Rec.ValueByName(gfMain).AsBoolean and (Rec.ValueByName(gfType).AsInteger = 4) then
- begin
- CRec := ACompareData.Append(True);
- try
- CRec.ValueByName(gfMain).AsBoolean := Rec.ValueByName(gfMain).AsBoolean;
- CRec.ValueByName(gfCodeSN).AsString := Rec.ValueByName(gfCodeSN).AsString;
- CRec.ValueByName(gfCodeDis).AsString := Rec.ValueByName(gfCodeDis).AsString;
- CRec.ValueByName(gfName).AsString := Rec.ValueByName(gfName).AsString;
- CRec.ValueByName(gfUnit).AsString := Rec.ValueByName(gfUnits).AsString;
- CRec.ValueByName(gfSumAmount).AsFloat := Rec.ValueByName(gfSumAmount).AsFloat;
- CRec.ValueByName(gfAvgBudgetPrice).AsFloat := Rec.ValueByName(gfAvgBudgetPrice).AsFloat;
- CRec.ValueByName(gfBuildSumPrice).AsFloat := Rec.ValueByName(gfBuildSumPrice).AsFloat;
- CRec.ValueByName(gfTenderSumAmount).AsFloat := Rec.ValueByName(gfTenderSumAmount).AsFloat;
- CRec.ValueByName(gfTenderAvgBudgetPrice).AsFloat := Rec.ValueByName(gfTenderAvgBudgetPrice).AsFloat;
- CRec.ValueByName(gfTenderBuildSumPrice).AsFloat := Rec.ValueByName(gfTenderBuildSumPrice).AsFloat;
- finally
- CRec.EndUpdate;
- end;
- end;
- end;
- finally
- ACompareData.DataSet.EndUpdate;
- end;
- end;
- end.
|