| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 | unit rmCustomized2Dm;// 广东肇庆定制 -- 汇总表(计量汇总表)// 严禁任何其他项目使用该单元interfaceuses  SysUtils, Classes, ZhAPI, DB, ProjectData, DBClient,  rmSelectProjectFrm, sdDB;type  TTenderBaseData = class  private    FTenderName: string;    FTotalPrice: Double;    FEndCTotalPrice: Double;    FCurDealTotalPrice: Double;    FPreDealTotalPrice: Double;    FEndDealTotalPrice: Double;    function GetEndGatherTotalPrice: Double;    function GetPrecent: Double;  public    constructor Create(const ATenderName: string);    property TenderName: string read FTenderName;    property TotalPrice: Double read FTotalPrice write FTotalPrice;    property EndCTotalPrice: Double read FEndCTotalPrice write FEndCTotalPrice;    property EndGatherTotalPrice: Double read GetEndGatherTotalPrice;    property CurDealTotalPrice: Double read FCurDealTotalPrice write FCurDealTotalPrice;    property PreDealTotalPrice: Double read FPreDealTotalPrice write FPreDealTotalPrice;    property EndDealTotalPrice: Double read FEndDealTotalPrice write FEndDealTotalPrice;    property Precent: Double read GetPrecent;  end;  TDealPayData = class  private    FName: string;    FCurTotalPrice: Double;    FPreTotalPrice: Double;    FEndTotalPrice: Double;  public    constructor Create(const AName: string);    property Name: string read FName;    property CurTotalPrice: Double read FCurTotalPrice write FCurTotalPrice;    property PreTotalPrice: Double read FPreTotalPrice write FPreTotalPrice;    property EndTotalPrice: Double read FEndTotalPrice write FEndTotalPrice;  end;  TGatherData = class  private    FTenders: TList;    FTenderGather: TTenderBaseData;    FDealPays: TList;    FPayGather: TDealPayData;    function FindDealPay(const AName: string): TDealPayData;    function GetTenderCount: Integer;    function GetTenders(AIndex: Integer): TTenderBaseData;    function GetDealPay(AIndex: Integer): TDealPayData;    function GetDealPayCount: Integer;  public    constructor Create;    destructor Destroy; override;    function AddTender(const ATenderName: string): TTenderBaseData;    procedure GatherTender;    function AddDealPay(const AName: string): TDealPayData;    property TenderCount: Integer read GetTenderCount;    property Tenders[AIndex: Integer]: TTenderBaseData read GetTenders;    property TenderGather: TTenderBaseData read FTenderGather;    property DealPayCount: Integer read GetDealPayCount;    property DealPay[AIndex: Integer]: TDealPayData read GetDealPay;    property PayGather: TDealPayData read FPayGather;  end;  TrmCustomized2Data = class(TDataModule)    cdsCustom: TClientDataSet;    cdsCustomSerialNo: TIntegerField;    cdsCustomName: TWideStringField;    cdsCustomTotalPrice: TFloatField;    cdsCustomEndCTotalPrice: TFloatField;    cdsCustomEndGatherTotalPrice: TFloatField;    cdsCustomCurDealTotalPrice: TFloatField;    cdsCustomPreDealTotalPrice: TFloatField;    cdsCustomEndDealTotalPrice: TFloatField;    cdsCustomPrecent: TFloatField;  private    FProjectData: TProjectData;    FProjectName: string;    FGatherData: TGatherData;    FSerialNo: Integer;    procedure BeforeGather;    procedure AfterGather;    procedure OpenProjectData(AProject: TSelectProject);    procedure FreeProjectData;    procedure GatherProject(AProject: TSelectProject);    procedure WriteData;  public    function AssignData(AProjects: TList): TDataSet;  end;implementationuses  DealPaymentDm, PhasePayDm, Globals, UtilMethods;{$R *.dfm}{ TTenderBaseData }constructor TTenderBaseData.Create(const ATenderName: string);begin  FTenderName := ATenderName;  FTotalPrice := 0;  FEndCTotalPrice := 0;  FCurDealTotalPrice := 0;  FPreDealTotalPrice := 0;  FEndDealTotalPrice := 0;end;function TTenderBaseData.GetEndGatherTotalPrice: Double;begin  Result := TotalPrice + EndCTotalPrice;end;function TTenderBaseData.GetPrecent: Double;begin  if EndGatherTotalPrice <> 0 then    Result := EndDealTotalPrice/EndGatherTotalPrice*100  else    Result := 0;end;{ TGatherData }function TGatherData.AddDealPay(const AName: string): TDealPayData;begin  Result := FindDealPay(AName);  if not Assigned(Result) then  begin    Result := TDealPayData.Create(AName);    FDealPays.Add(Result);  end;end;function TGatherData.AddTender(const ATenderName: string): TTenderBaseData;begin  Result := TTenderBaseData.Create(ATenderName);  FTenders.Add(Result);end;constructor TGatherData.Create;begin  FTenders := TList.Create;  FTenderGather := TTenderBaseData.Create('合计');  FDealPays := TList.Create;  FPayGather := TDealPayData.Create('支付');end;destructor TGatherData.Destroy;begin  FPayGather.Free;  ClearObjects(FDealPays);  FDealPays.Free;  FTenderGather.Free;  ClearObjects(FTenders);  FTenders.Free;  inherited;end;function TGatherData.FindDealPay(const AName: string): TDealPayData;var  iIndex: Integer;begin  Result := nil;  for iIndex := 0 to DealPayCount - 1 do  begin    if SameText(AName, DealPay[iIndex].Name) then    begin      Result := DealPay[iIndex];      Break;    end;  end;end;procedure TGatherData.GatherTender;var  iIndex: Integer;  Tender: TTenderBaseData;begin  FTenderGather.TotalPrice := 0;  FTenderGather.EndCTotalPrice := 0;  FTenderGather.CurDealTotalPrice := 0;  FTenderGather.PreDealTotalPrice := 0;  FTenderGather.EndDealTotalPrice := 0;  for iIndex := 0 to FTenders.Count - 1 do  begin    Tender := Tenders[iIndex];    FTenderGather.TotalPrice := FTenderGather.TotalPrice + Tender.TotalPrice;    FTenderGather.EndCTotalPrice := FTenderGather.EndCTotalPrice + Tender.FEndCTotalPrice;    FTenderGather.CurDealTotalPrice := FTenderGather.CurDealTotalPrice + Tender.CurDealTotalPrice;    FTenderGather.PreDealTotalPrice := FTenderGather.PreDealTotalPrice + Tender.PreDealTotalPrice;    FTenderGather.EndDealTotalPrice := FTenderGather.EndDealTotalPrice + Tender.EndDealTotalPrice;  end;end;function TGatherData.GetDealPay(AIndex: Integer): TDealPayData;begin  Result := TDealPayData(FDealPays.Items[AIndex]);end;function TGatherData.GetDealPayCount: Integer;begin  Result := FDealPays.Count;end;function TGatherData.GetTenderCount: Integer;begin  Result := FTenders.Count;end;function TGatherData.GetTenders(AIndex: Integer): TTenderBaseData;begin  Result := TTenderBaseData(FTenders.Items[AIndex]);end;{ TDealPayData }constructor TDealPayData.Create(const AName: string);begin  FName := AName;  FCurTotalPrice := 0;  FPreTotalPrice := 0;  FEndTotalPrice := 0;end;{ TrmCustomized2Data }procedure TrmCustomized2Data.AfterGather;begin  FGatherData.Free;end;function TrmCustomized2Data.AssignData(AProjects: TList): TDataSet;var  iProject: Integer;begin  BeforeGather;  try    for iProject := 0 to AProjects.Count - 1 do      GatherProject(TSelectProject(AProjects.Items[iProject]));    FGatherData.GatherTender;    WriteData;  finally    Result := cdsCustom;    AfterGather;  end;end;procedure TrmCustomized2Data.BeforeGather;begin  cdsCustom.Active := True;  cdsCustom.EmptyDataSet;  FGatherData := TGatherData.Create;end;procedure TrmCustomized2Data.FreeProjectData;begin  if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then    FProjectData.Free;end;procedure TrmCustomized2Data.GatherProject(AProject: TSelectProject);var  sCurField, sPreField, sEndField: string;  function DealPayRecord(const AName: string): TsdDataRecord;  var    iRec: Integer;    Rec: TsdDataRecord;  begin    Result := nil;    with FProjectData.DealPaymentData do    begin      for iRec := 0 to sddDealPayment.RecordCount - 1 do      begin        Rec := sddDealPayment.Records[iRec];        if SameText(AName, Rec.ValueByName('Name').AsString) then        begin          Result := Rec;          Break;        end;      end;    end;  end;  procedure GatherBaseData;  var    TenderBase: TTenderBaseData;    Rec, StageRec: TsdDataRecord;  begin    TenderBase := FGatherData.AddTender(FProjectName);    TenderBase.TotalPrice := FProjectData.BillsData.Settlement[0];    TenderBase.EndCTotalPrice := FProjectData.BillsData.Settlement[2];    Rec := DealPayRecord('本期完成计量');    StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);    TenderBase.CurDealTotalPrice := StageRec.ValueByName(sCurField).AsFloat;    TenderBase.PreDealTotalPrice := StageRec.ValueByName(sPreField).AsFloat;    TenderBase.EndDealTotalPrice := StageRec.ValueByName(sEndField).AsFloat;  end;  procedure GatherCommonDealPayData;  var    iRec: Integer;    Rec, StageRec: TsdDataRecord;    DealPay: TDealPayData;  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;        StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);        if StageRec.ValueByName(sEndField).AsFloat = 0 then          Continue;        DealPay := FGatherData.AddDealPay(Rec.ValueByName('Name').AsString);        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;  procedure GatherPayData;  var    Rec, StageRec: TsdDataRecord;  begin    Rec := DealPayRecord('本期应付');    StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);    with FGatherData.PayGather do    begin      CurTotalPrice := CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;      PreTotalPrice := PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;      EndTotalPrice := EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;    end;  end;begin  OpenProjectData(AProject);  try    sCurField := 'TotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);    sPreField := 'PreTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);    sEndField := 'EndTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);    GatherBaseData;    GatherCommonDealPayData;    GatherPayData;  finally    FreeProjectData;  end;end;procedure TrmCustomized2Data.OpenProjectData(AProject: TSelectProject);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.OpenForReport2(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);  end;  FProjectName := Rec.ValueByName('Name').AsString;end;procedure TrmCustomized2Data.WriteData;  procedure WriteProjectData;  var    i: Integer;    Tender: TTenderBaseData;  begin    for i := 0 to FGatherData.TenderCount - 1 do    begin      Tender := FGatherData.Tenders[i];      cdsCustom.Append;      cdsCustomSerialNo.AsInteger := FSerialNo;      cdsCustomName.AsString := Tender.TenderName;      cdsCustomTotalPrice.AsFloat := Tender.TotalPrice;      cdsCustomEndCTotalPrice.AsFloat := Tender.EndCTotalPrice;      cdsCustomEndGatherTotalPrice.AsFloat := Tender.EndGatherTotalPrice;      cdsCustomCurDealTotalPrice.AsFloat := Tender.CurDealTotalPrice;      cdsCustomPreDealTotalPrice.AsFloat := Tender.PreDealTotalPrice;      cdsCustomEndDealTotalPrice.AsFloat := Tender.EndDealTotalPrice;      cdsCustomPrecent.AsFloat := Tender.Precent;      cdsCustom.Post;      Inc(FSerialNo);    end;  end;  procedure WriteProjectGather;  begin    cdsCustom.Append;    cdsCustomName.AsString := FGatherData.TenderGather.TenderName;    cdsCustomTotalPrice.AsFloat := FGatherData.TenderGather.TotalPrice;    cdsCustomEndCTotalPrice.AsFloat := FGatherData.TenderGather.EndCTotalPrice;    cdsCustomEndGatherTotalPrice.AsFloat := FGatherData.TenderGather.EndGatherTotalPrice;    cdsCustomCurDealTotalPrice.AsFloat := FGatherData.TenderGather.CurDealTotalPrice;    cdsCustomPreDealTotalPrice.AsFloat := FGatherData.TenderGather.PreDealTotalPrice;    cdsCustomEndDealTotalPrice.AsFloat := FGatherData.TenderGather.EndDealTotalPrice;    cdsCustomPrecent.AsFloat := FGatherData.TenderGather.Precent;    cdsCustom.Post;  end;  procedure WriteDealPays;  var    i: Integer;    DealPay: TDealPayData;  begin    for i := 0 to FGatherData.DealPayCount - 1 do    begin      DealPay := FGatherData.DealPay[i];      cdsCustom.Append;      cdsCustomSerialNo.AsInteger := FSerialNo;      cdsCustomName.AsString := DealPay.Name;      cdsCustomCurDealTotalPrice.AsFloat := DealPay.CurTotalPrice;      cdsCustomPreDealTotalPrice.AsFloat := DealPay.PreTotalPrice;      cdsCustomEndDealTotalPrice.AsFloat := DealPay.EndTotalPrice;      cdsCustom.Post;      Inc(FSerialNo);    end;  end;  procedure WriteGatherPay;  begin    cdsCustom.Append;    cdsCustomSerialNo.AsInteger := FSerialNo;    cdsCustomName.AsString := FGatherData.PayGather.Name;    cdsCustomCurDealTotalPrice.AsFloat := FGatherData.PayGather.CurTotalPrice;    cdsCustomPreDealTotalPrice.AsFloat := FGatherData.PayGather.PreTotalPrice;    cdsCustomEndDealTotalPrice.AsFloat := FGatherData.PayGather.EndTotalPrice;    cdsCustom.Post;  end;begin  FSerialNo := 1;  WriteProjectData;  WriteProjectGather;  WriteDealPays;  WriteGatherPay;end;end.
 |