| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 | unit rmFxBillsCompareDm;interfaceuses  SysUtils, Classes, DB, DBClient, ProjectData, sdIDTree, MCacheTree;type  {------------------------------------    fctCommon: 常规的分项清单审核比较模式。    fctG07: 广东标准表-台账07表,在fctCommon的基础上加一行公路基本造价汇总行。            需求有标明: 只需汇总项目节。此处不做特别处理,根据报表设置中的选项决定。  ------------------------------------}  TFxCompareType = (fctCommon, fctG07);  TrmFxBillsCompareData = class(TDataModule)    cdsBills: TClientDataSet;    cdsBillsCode: TStringField;    cdsBillsB_Code: TStringField;    cdsBillsName: TWideStringField;    cdsBillsUnits: TWideStringField;    cdsBillsSQuantity: TFloatField;    cdsBillsSPrice: TFloatField;    cdsBillsSTotalPrice: TFloatField;    cdsBillsCQuantity: TFloatField;    cdsBillsCPrice: TFloatField;    cdsBillsCTotalPrice: TFloatField;    cdsBillsDQuantity: TFloatField;    cdsBillsDPrice: TFloatField;    cdsBillsDTotalPrice: TFloatField;    cdsBillsMemoStr: TStringField;    cdsBillsSDgnQuantity1: TFloatField;    cdsBillsSDgnQuantity2: TFloatField;    cdsBillsSDgnQuantity: TStringField;    cdsBillsCDgnQuantity1: TFloatField;    cdsBillsCDgnQuantity2: TFloatField;    cdsBillsCDgnQuantity: TStringField;    cdsBillsDDgnQuantity1: TFloatField;    cdsBillsDDgnQuantity2: TFloatField;    cdsBillsDDgnQuantity: TStringField;    cdsBillsXiangCode: TWideStringField;    cdsBillsMuCode: TStringField;    cdsBillsJieCode: TStringField;    cdsBillsXiMuCode: TStringField;  private    FCacheTree: TReportCacheTree;    FCompareType: TFxCompareType;    function GetDgnQuantity(ANum1, ANum2: Double): string;    function FilterBillsNode(ANode: TsdIDTreeNode; AParent: TReportCacheNode;      AIsSource: Boolean): TReportCacheNode;    procedure FilterBills(ANode: TsdIDTreeNode; AParent: TReportCacheNode;      AIsSource: Boolean);    procedure WriteNode(ANode: TReportCacheNode);    procedure WriteGatherNodeData(const AName: string);    procedure WriteBills;  public    function AssignData(ASProjectData, ACProjectData: TProjectData): TDataSet;    property CompareType: TFxCompareType read FCompareType write FCompareType;  end;implementationuses  CacheTree, Globals;{$R *.dfm}{ TrmFxBillsCompareData }function TrmFxBillsCompareData.AssignData(ASProjectData,  ACProjectData: TProjectData): TDataSet;begin  cdsBills.DisableControls;  cdsBills.Active := True;  cdsBills.EmptyDataSet;  FCacheTree := TReportCacheTree.Create(2);  try    FilterBills(ASProjectData.BillsCompileData.BillsCompileTree.FirstNode, nil, True);    FilterBills(ACProjectData.BillsCompileData.BillsCompileTree.FirstNode, nil, False);    if CompareType = fctG07 then      FCacheTree.ReCalcGatherData;    WriteBills;    Result := cdsBills;  finally    FCacheTree.Free;    cdsBills.EnableControls;  end;end;procedure TrmFxBillsCompareData.FilterBills(ANode: TsdIDTreeNode;  AParent: TReportCacheNode; AIsSource: Boolean);var  ACur: TReportCacheNode;begin  if not Assigned(ANode) then Exit;  // (Level从0开始取值)  case ReportConfig.GatherLevel of    // 项    0: if ANode.Level > 1 then Exit;    // 目    1: if ANode.Level > 2 then Exit;    // 节    2: if ANode.Level > 3 then Exit;    // 细目    3: if ANode.Level > 4 then Exit;    // 项目节    4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;  end;  ACur := FilterBillsNode(ANode, AParent, AIsSource);  FilterBills(ANode.FirstChild, ACur, AIsSource);  FilterBills(ANode.NextSibling, AParent, AIsSource);end;function TrmFxBillsCompareData.FilterBillsNode(ANode: TsdIDTreeNode;  AParent: TReportCacheNode; AIsSource: Boolean): TReportCacheNode;var  iGatherCompare: Integer;  ANextSibling: TReportCacheNode;begin  with ANode.Rec do  begin    if ANode.Rec.ValueByName('B_Code').AsString <> '' then      iGatherCompare := ReportConfig.GclCompare    else      iGatherCompare := ReportConfig.XmjCompare;    case iGatherCompare of      // 按编号      0: if (ValueByName('Code').asString <> '') or (ValueByName('B_Code').asString <> '') then           Result := FCacheTree.FindNode(AParent,               ValueByName('Code').AsString, ValueByName('B_Code').AsString)         else           Result := FCacheTree.FindNode(AParent, ValueByName('Code').AsString,             ValueByName('B_Code').AsString, ValueByName('Name').AsString);      // 按名称      1: Result := FCacheTree.FindNode(AParent, ValueByName('Name').AsString);      // 按编号+名称      2: Result := FCacheTree.FindNode(AParent, ValueByName('Code').AsString,             ValueByName('B_Code').AsString, ValueByName('Name').AsString);    end;    if not Assigned(Result) then    begin      ANextSibling := FCacheTree.FindNextSibling(AParent,          ValueByName('Code').AsString, ValueByName('B_Code').AsString);      Result := FCacheTree.AddNode(AParent, ANextSibling);      Result.Code := ValueByName('Code').AsString;      Result.B_Code := ValueByName('B_Code').AsString;      Result.Name := ValueByName('Name').AsString;      Result.Units := ValueByName('Units').AsString;    end;        if AIsSource then    begin      Result.P_Quantity[0] := ValueByName('Quantity').AsFloat;      Result.P_Price[0] := ValueByName('Price').AsFloat;      Result.P_TotalPrice[0] := ValueByName('TotalPrice').AsFloat;      Result.P_DgnQuantity1[0] := ValueByName('DgnQuantity1').AsFloat;      Result.P_DgnQuantity2[0] := ValueByName('DgnQuantity2').AsFloat;    end    else    begin      Result.P_Quantity[1] := ValueByName('Quantity').AsFloat;      Result.P_Price[1] := ValueByName('Price').AsFloat;      Result.P_TotalPrice[1] := ValueByName('TotalPrice').AsFloat;      Result.P_DgnQuantity1[1] := ValueByName('DgnQuantity1').AsFloat;      Result.P_DgnQuantity2[1] := ValueByName('DgnQuantity2').AsFloat;    end;  end;end;function TrmFxBillsCompareData.GetDgnQuantity(ANum1,  ANum2: Double): string;begin  Result := '';  if ANum1 <> 0 then  begin    Result := FloatToStr(ANum1);    if ANum2 <> 0 then      Result := Result + '/' + FloatToStr(ANum2);  end;end;procedure TrmFxBillsCompareData.WriteBills;begin  WriteNode(TReportCacheNode(FCacheTree.FirstNode));  WriteGatherNodeData('公路基本造价');end;procedure TrmFxBillsCompareData.WriteGatherNodeData(const AName: string);begin  cdsBills.Append;  cdsBillsName.AsString := AName;  with FCacheTree.GatherCacheNode do  begin    cdsBillsSTotalPrice.AsFloat := P_TotalPrice[0];    cdsBillsCTotalPrice.AsFloat := P_TotalPrice[1];    cdsBillsDTotalPrice.AsFloat := P_TotalPrice[1] - P_TotalPrice[0];  end;  cdsBills.Post;end;procedure TrmFxBillsCompareData.WriteNode(ANode: TReportCacheNode);begin  if not Assigned(ANode) then Exit;  cdsBills.Append;  cdsBillsCode.AsString := ANode.Code;  cdsBillsB_Code.AsString := ANode.B_Code;  cdsBillsName.AsString := ANode.Name;  cdsBillsUnits.AsString := ANode.Units;  cdsBillsSQuantity.AsFloat := ANode.P_Quantity[0];  cdsBillsSPrice.AsFloat := ANode.P_Price[0];  cdsBillsSTotalPrice.AsFloat := ANode.P_TotalPrice[0];  cdsBillsSDgnQuantity1.AsFloat := ANode.P_DgnQuantity1[0];  cdsBillsSDgnQuantity2.AsFloat := ANode.P_DgnQuantity2[0];  cdsBillsSDgnQuantity.AsString := GetDgnQuantity(cdsBillsSDgnQuantity1.AsFloat,      cdsBillsSDgnQuantity2.AsFloat);  cdsBillsCQuantity.AsFloat := ANode.P_Quantity[1];  cdsBillsCPrice.AsFloat := ANode.P_Price[1];  cdsBillsCTotalPrice.AsFloat := ANode.P_TotalPrice[1];  cdsBillsCDgnQuantity1.AsFloat := ANode.P_DgnQuantity1[1];  cdsBillsCDgnQuantity2.AsFloat := ANode.P_DgnQuantity2[1];  cdsBillsCDgnQuantity.AsString := GetDgnQuantity(cdsBillsCDgnQuantity1.AsFloat,      cdsBillsCDgnQuantity2.AsFloat);  cdsBillsDQuantity.AsFloat := ANode.P_Quantity[1] - ANode.P_Quantity[0];  cdsBillsDPrice.AsFloat := ANode.P_Price[1] - ANode.P_Price[0];  cdsBillsDTotalPrice.AsFloat := ANode.P_TotalPrice[1] - ANode.P_TotalPrice[0];  cdsBillsDDgnQuantity1.AsFloat := ANode.P_DgnQuantity1[1] - ANode.P_DgnQuantity1[0];  cdsBillsDDgnQuantity2.AsFloat := ANode.P_DgnQuantity2[1] - ANode.P_DgnQuantity2[0];  cdsBillsDDgnQuantity.AsString := GetDgnQuantity(cdsBillsDDgnQuantity1.AsFloat,      cdsBillsDDgnQuantity2.AsFloat);  cdsBillsXiangCode.AsString := ANode.XiangCode;  cdsBillsMuCode.AsString := ANode.MuCode;  cdsBillsJieCode.AsString := ANode.JieCode;  cdsBillsXiMuCode.AsString := ANode.XiMuCode;  cdsBills.Post;  WriteNode(TReportCacheNode(ANode.FirstChild));  WriteNode(TReportCacheNode(ANode.NextSibling));end;end.
 |