| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 | unit rmGclBillsPlaneDm;// 0号台账平面表interfaceuses  SysUtils, Classes, ProjectData, DB, DBClient, sdIDTree;type  TGclBillNode = class  private    FB_Code: string;    FName: string;    FUnits: string;    FQuantity: Double;  public    property B_Code: string read FB_Code write FB_Code;    property Name: string read FName write FName;    property Units: string read FUnits write FUnits;    property Quantity: Double read FQuantity write FQuantity;  end;  TLastXmjNode = class  private    FGclBills: TList;    FCode: string;    FName: string;    FUnits: string;    FPeg: string;    FParentName: string;    FDrawingCode: string;    function GetBeginPeg: string;    function GetEndPeg: string;    function GetLastCode: string;    function GetPreCode: string;    procedure SetPeg(const Value: string);  public    constructor Create;    destructor Destroy; override;    function AddGclBillNode: TGclBillNode;    property Code: string read FCode write FCode;    property PreCode: string read GetPreCode;    property LastCode: string read GetLastCode;    property Name: string read FName write FName;    property Units: string read FUnits write FUnits;    property Peg: string read FPeg write SetPeg;    property BeginPeg: string read GetBeginPeg;    property EndPeg: string read GetEndPeg;    property ParentName: string read FParentName write FParentName;    property DrawingCode: string read FDrawingCode write FDrawingCode;  end;  TrmGclBillsPlaneData = class(TDataModule)    cdsGclBillsPlane: TClientDataSet;    cdsGclBillsPlanePreCode: TStringField;    cdsGclBillsPlaneLastCode: TStringField;    cdsGclBillsPlaneCode: TStringField;    cdsGclBillsPlaneXmjName: TWideStringField;    cdsGclBillsPlaneXmjUnits: TWideStringField;    cdsGclBillsPlanePeg: TWideStringField;    cdsGclBillsPlaneBeginPeg: TWideStringField;    cdsGclBillsPlaneEndPeg: TWideStringField;    cdsGclBillsPlaneNameBuWei: TWideStringField;    cdsGclBillsPlaneB_Code: TStringField;    cdsGclBillsPlaneName: TWideStringField;    cdsGclBillsPlaneUnits: TWideStringField;    cdsGclBillsPlaneQuantity: TFloatField;    cdsGclBillsPlaneDrawingCode: TWideStringField;  private    FLastXmjs: TList;    FProjectData: TProjectData;    procedure AddGclBill(ANode: TsdIDTreeNode; ALastXmj: TLastXmjNode);    procedure AddGclBills(ANode:TsdIDTreeNode; ALastXmj: TLastXmjNode);    function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;    function CheckLastXmj(ANode: TsdIDTreeNode): Boolean;    procedure AddLastXmj(ANode: TsdIDTreeNode);    procedure FilterBills(ANode: TsdIDTreeNode);    procedure WriteLastXmj(ALastXmj: TLastXmjNode);    procedure WriteData;  public    function AssignData(AProjectData: TProjectData): TDataSet;  end;implementationuses  ZhAPI, UtilMethods, sdDB;{$R *.dfm}{ TLastXmjNode }function TLastXmjNode.AddGclBillNode: TGclBillNode;begin  Result := TGclBillNode.Create;  FGclBills.Add(Result);end;constructor TLastXmjNode.Create;begin  FGclBills := TList.Create;end;destructor TLastXmjNode.Destroy;begin  ClearObjects(FGclBills);  FGclBills.Free;  inherited;end;function TLastXmjNode.GetBeginPeg: string;var  iPos: Integer;begin  iPos := Pos('~', FPeg);  Result := Copy(FPeg, 1, iPos-1);end;function TLastXmjNode.GetEndPeg: string;var  iPos: Integer;begin  iPos := Pos('~', FPeg);  Result := Copy(FPeg, iPos + 1, Length(FPeg) - iPos);end;function TLastXmjNode.GetLastCode: string;begin  Result := GetLastSetmentOfCode(FCode);end;function TLastXmjNode.GetPreCode: string;begin  Result := GetPrefixOfCode(FCode);end;procedure TLastXmjNode.SetPeg(const Value: string);begin  FPeg := StringReplace(Value, '~', '~', [rfReplaceAll]);end;{ TrmGclBillsPlaneData }procedure TrmGclBillsPlaneData.AddGclBill(ANode: TsdIDTreeNode;  ALastXmj: TLastXmjNode);var  GclBill: TGclBillNode;begin  if ANode.Rec.ValueByName('B_Code').AsString = '' then Exit;  GclBill := ALastXmj.AddGclBillNode;  GclBill.B_Code := ANode.Rec.ValueByName('B_Code').AsString;  GclBill.Name := ANode.Rec.ValueByName('Name').AsString;  GclBill.Units := ANode.Rec.ValueByName('Units').AsString;  GclBill.Quantity := ANode.Rec.ValueByName('Quantity').AsFloat;end;procedure TrmGclBillsPlaneData.AddGclBills(ANode: TsdIDTreeNode;  ALastXmj: TLastXmjNode);begin  if not Assigned(ANode) then Exit;  if not ANode.HasChildren then    AddGclBill(ANode, ALastXmj);  AddGclBills(ANode.FirstChild, ALastXmj);  AddGclBills(ANode.NextSibling, ALastXmj);end;procedure TrmGclBillsPlaneData.AddLastXmj(ANode: TsdIDTreeNode);var  LastXmj: TLastXmjNode;  vPeg: TsdIDTreeNode;begin  if not Assigned(ANode) then Exit;  LastXmj := TLastXmjNode.Create;  FLastXmjs.Add(LastXmj);  LastXmj.Code := ANode.Rec.ValueByName('Code').AsString;  LastXmj.Name := ANode.Rec.ValueByName('Name').AsString;  LastXmj.Units := ANode.Rec.ValueByName('Units').AsString;  vPeg := GetPegNode(ANode);  if Assigned(vPeg) then    LastXmj.Peg := vPeg.Rec.ValueByName('Name').AsString;  if Assigned(ANode.Parent) then    LastXmj.ParentName := ANode.Parent.Rec.ValueByName('Name').AsString;  LastXmj.DrawingCode := ANode.Rec.ValueByName('DrawingCode').AsString;  AddGclBills(ANode.FirstChild, LastXmj);end;function TrmGclBillsPlaneData.AssignData(  AProjectData: TProjectData): TDataSet;begin  FLastXmjs := TList.Create;  cdsGclBillsPlane.Active := True;  cdsGclBillsPlane.EmptyDataSet;  try    FProjectData := AProjectData;    FilterBills(FProjectData.BillsCompileData.BillsCompileTree.FirstNode);    WriteData;  finally    ClearObjects(FLastXmjs);    FLastXmjs.Free;    Result := cdsGclBillsPlane;  end;end;function TrmGclBillsPlaneData.CheckLastXmj(ANode: TsdIDTreeNode): Boolean;  function IsXmj: Boolean;  begin    Result := ANode.Rec.ValueByName('Code').AsString <> '';  end;  function HasGcl: Boolean;  var    vChild: TsdIDTreeNode;  begin    Result := False;    vChild := ANode.FirstChild;    while not Result and Assigned(vChild) do    begin      if (vChild.Rec.ValueByName('Code').AsString = '') and         (vChild.Rec.ValueByName('B_Code').AsString <> '') then        Result := True;      vChild := vChild.NextSibling;    end;  end;begin  // 报表数据的主体应是工程量清单,故最底层项目节的判断为,其下含有工程量清单则为项目节  Result := IsXmj and HasGcl;end;procedure TrmGclBillsPlaneData.FilterBills(ANode: TsdIDTreeNode);begin  if not Assigned(ANode) then Exit;  if CheckLastXmj(ANode) then    AddLastXmj(ANode);  FilterBills(ANode.FirstChild);  FilterBills(ANode.NextSibling);end;function TrmGclBillsPlaneData.GetPegNode(  ANode: TsdIDTreeNode): TsdIDTreeNode;begin  Result := nil;  if not Assigned(ANode) then Exit;  if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then    Result := ANode  else    Result := GetPegNode(ANode.Parent);end;procedure TrmGclBillsPlaneData.WriteData;var  i: Integer;begin  for i := 0 to FLastXmjs.Count - 1 do    WriteLastXmj(TLastXmjNode(FLastXmjs.Items[i]));end;procedure TrmGclBillsPlaneData.WriteLastXmj(ALastXmj: TLastXmjNode);var  i: Integer;  GclBill: TGclBillNode;begin  for i := 0 to ALastXmj.FGclBills.Count - 1 do  begin    GclBill := TGclBillNode(ALastXmj.FGclBills.Items[i]);    cdsGclBillsPlane.Append;    cdsGclBillsPlanePreCode.AsString := ALastXmj.PreCode;    cdsGclBillsPlaneLastCode.AsString := ALastXmj.LastCode;    cdsGclBillsPlaneCode.AsString := ALastXmj.Code;    cdsGclBillsPlaneXmjName.AsString := ALastXmj.Name;    cdsGclBillsPlaneXmjUnits.AsString := ALastXmj.Units;    cdsGclBillsPlanePeg.AsString := ALastXmj.Peg;    cdsGclBillsPlaneBeginPeg.AsString := ALastXmj.BeginPeg;    cdsGclBillsPlaneEndPeg.AsString := ALastXmj.EndPeg;        cdsGclBillsPlaneNameBuWei.AsString := ALastXmj.ParentName;    cdsGclBillsPlaneDrawingCode.AsString := ALastXmj.DrawingCode;    cdsGclBillsPlaneB_Code.AsString := GclBill.B_Code;    cdsGclBillsPlaneName.AsString := GclBill.Name;    cdsGclBillsPlaneUnits.AsString := GclBill.Units;    cdsGclBillsPlaneQuantity.AsFloat := GclBill.Quantity;    cdsGclBillsPlane.Post;  end;end;end.
 |