123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- unit rmGclBillsPlaneDm;
- // 0号台账平面表
- interface
- uses
- 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;
- implementation
- uses
- 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.
|