| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 | 
							- unit rmFxBillsCompareDm;
 
- interface
 
- uses
 
-   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;
 
- implementation
 
- uses
 
-   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.
 
 
  |