rmGclBillsPlaneDm.pas 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. unit rmGclBillsPlaneDm;
  2. // 0号台账平面表
  3. interface
  4. uses
  5. SysUtils, Classes, ProjectData, DB, DBClient, sdIDTree;
  6. type
  7. TGclBillNode = class
  8. private
  9. FB_Code: string;
  10. FName: string;
  11. FUnits: string;
  12. FQuantity: Double;
  13. public
  14. property B_Code: string read FB_Code write FB_Code;
  15. property Name: string read FName write FName;
  16. property Units: string read FUnits write FUnits;
  17. property Quantity: Double read FQuantity write FQuantity;
  18. end;
  19. TLastXmjNode = class
  20. private
  21. FGclBills: TList;
  22. FCode: string;
  23. FName: string;
  24. FUnits: string;
  25. FPeg: string;
  26. FParentName: string;
  27. FDrawingCode: string;
  28. function GetBeginPeg: string;
  29. function GetEndPeg: string;
  30. function GetLastCode: string;
  31. function GetPreCode: string;
  32. procedure SetPeg(const Value: string);
  33. public
  34. constructor Create;
  35. destructor Destroy; override;
  36. function AddGclBillNode: TGclBillNode;
  37. property Code: string read FCode write FCode;
  38. property PreCode: string read GetPreCode;
  39. property LastCode: string read GetLastCode;
  40. property Name: string read FName write FName;
  41. property Units: string read FUnits write FUnits;
  42. property Peg: string read FPeg write SetPeg;
  43. property BeginPeg: string read GetBeginPeg;
  44. property EndPeg: string read GetEndPeg;
  45. property ParentName: string read FParentName write FParentName;
  46. property DrawingCode: string read FDrawingCode write FDrawingCode;
  47. end;
  48. TrmGclBillsPlaneData = class(TDataModule)
  49. cdsGclBillsPlane: TClientDataSet;
  50. cdsGclBillsPlanePreCode: TStringField;
  51. cdsGclBillsPlaneLastCode: TStringField;
  52. cdsGclBillsPlaneCode: TStringField;
  53. cdsGclBillsPlaneXmjName: TWideStringField;
  54. cdsGclBillsPlaneXmjUnits: TWideStringField;
  55. cdsGclBillsPlanePeg: TWideStringField;
  56. cdsGclBillsPlaneBeginPeg: TWideStringField;
  57. cdsGclBillsPlaneEndPeg: TWideStringField;
  58. cdsGclBillsPlaneNameBuWei: TWideStringField;
  59. cdsGclBillsPlaneB_Code: TStringField;
  60. cdsGclBillsPlaneName: TWideStringField;
  61. cdsGclBillsPlaneUnits: TWideStringField;
  62. cdsGclBillsPlaneQuantity: TFloatField;
  63. cdsGclBillsPlaneDrawingCode: TWideStringField;
  64. private
  65. FLastXmjs: TList;
  66. FProjectData: TProjectData;
  67. procedure AddGclBill(ANode: TsdIDTreeNode; ALastXmj: TLastXmjNode);
  68. procedure AddGclBills(ANode:TsdIDTreeNode; ALastXmj: TLastXmjNode);
  69. function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  70. function CheckLastXmj(ANode: TsdIDTreeNode): Boolean;
  71. procedure AddLastXmj(ANode: TsdIDTreeNode);
  72. procedure FilterBills(ANode: TsdIDTreeNode);
  73. procedure WriteLastXmj(ALastXmj: TLastXmjNode);
  74. procedure WriteData;
  75. public
  76. function AssignData(AProjectData: TProjectData): TDataSet;
  77. end;
  78. implementation
  79. uses
  80. ZhAPI, UtilMethods, sdDB;
  81. {$R *.dfm}
  82. { TLastXmjNode }
  83. function TLastXmjNode.AddGclBillNode: TGclBillNode;
  84. begin
  85. Result := TGclBillNode.Create;
  86. FGclBills.Add(Result);
  87. end;
  88. constructor TLastXmjNode.Create;
  89. begin
  90. FGclBills := TList.Create;
  91. end;
  92. destructor TLastXmjNode.Destroy;
  93. begin
  94. ClearObjects(FGclBills);
  95. FGclBills.Free;
  96. inherited;
  97. end;
  98. function TLastXmjNode.GetBeginPeg: string;
  99. var
  100. iPos: Integer;
  101. begin
  102. iPos := Pos('~', FPeg);
  103. Result := Copy(FPeg, 1, iPos-1);
  104. end;
  105. function TLastXmjNode.GetEndPeg: string;
  106. var
  107. iPos: Integer;
  108. begin
  109. iPos := Pos('~', FPeg);
  110. Result := Copy(FPeg, iPos + 1, Length(FPeg) - iPos);
  111. end;
  112. function TLastXmjNode.GetLastCode: string;
  113. begin
  114. Result := GetLastSetmentOfCode(FCode);
  115. end;
  116. function TLastXmjNode.GetPreCode: string;
  117. begin
  118. Result := GetPrefixOfCode(FCode);
  119. end;
  120. procedure TLastXmjNode.SetPeg(const Value: string);
  121. begin
  122. FPeg := StringReplace(Value, '~', '~', [rfReplaceAll]);
  123. end;
  124. { TrmGclBillsPlaneData }
  125. procedure TrmGclBillsPlaneData.AddGclBill(ANode: TsdIDTreeNode;
  126. ALastXmj: TLastXmjNode);
  127. var
  128. GclBill: TGclBillNode;
  129. begin
  130. if ANode.Rec.ValueByName('B_Code').AsString = '' then Exit;
  131. GclBill := ALastXmj.AddGclBillNode;
  132. GclBill.B_Code := ANode.Rec.ValueByName('B_Code').AsString;
  133. GclBill.Name := ANode.Rec.ValueByName('Name').AsString;
  134. GclBill.Units := ANode.Rec.ValueByName('Units').AsString;
  135. GclBill.Quantity := ANode.Rec.ValueByName('Quantity').AsFloat;
  136. end;
  137. procedure TrmGclBillsPlaneData.AddGclBills(ANode: TsdIDTreeNode;
  138. ALastXmj: TLastXmjNode);
  139. begin
  140. if not Assigned(ANode) then Exit;
  141. if not ANode.HasChildren then
  142. AddGclBill(ANode, ALastXmj);
  143. AddGclBills(ANode.FirstChild, ALastXmj);
  144. AddGclBills(ANode.NextSibling, ALastXmj);
  145. end;
  146. procedure TrmGclBillsPlaneData.AddLastXmj(ANode: TsdIDTreeNode);
  147. var
  148. LastXmj: TLastXmjNode;
  149. vPeg: TsdIDTreeNode;
  150. begin
  151. if not Assigned(ANode) then Exit;
  152. LastXmj := TLastXmjNode.Create;
  153. FLastXmjs.Add(LastXmj);
  154. LastXmj.Code := ANode.Rec.ValueByName('Code').AsString;
  155. LastXmj.Name := ANode.Rec.ValueByName('Name').AsString;
  156. LastXmj.Units := ANode.Rec.ValueByName('Units').AsString;
  157. vPeg := GetPegNode(ANode);
  158. if Assigned(vPeg) then
  159. LastXmj.Peg := vPeg.Rec.ValueByName('Name').AsString;
  160. if Assigned(ANode.Parent) then
  161. LastXmj.ParentName := ANode.Parent.Rec.ValueByName('Name').AsString;
  162. LastXmj.DrawingCode := ANode.Rec.ValueByName('DrawingCode').AsString;
  163. AddGclBills(ANode.FirstChild, LastXmj);
  164. end;
  165. function TrmGclBillsPlaneData.AssignData(
  166. AProjectData: TProjectData): TDataSet;
  167. begin
  168. FLastXmjs := TList.Create;
  169. cdsGclBillsPlane.Active := True;
  170. cdsGclBillsPlane.EmptyDataSet;
  171. try
  172. FProjectData := AProjectData;
  173. FilterBills(FProjectData.BillsCompileData.BillsCompileTree.FirstNode);
  174. WriteData;
  175. finally
  176. ClearObjects(FLastXmjs);
  177. FLastXmjs.Free;
  178. Result := cdsGclBillsPlane;
  179. end;
  180. end;
  181. function TrmGclBillsPlaneData.CheckLastXmj(ANode: TsdIDTreeNode): Boolean;
  182. function IsXmj: Boolean;
  183. begin
  184. Result := ANode.Rec.ValueByName('Code').AsString <> '';
  185. end;
  186. function HasGcl: Boolean;
  187. var
  188. vChild: TsdIDTreeNode;
  189. begin
  190. Result := False;
  191. vChild := ANode.FirstChild;
  192. while not Result and Assigned(vChild) do
  193. begin
  194. if (vChild.Rec.ValueByName('Code').AsString = '') and
  195. (vChild.Rec.ValueByName('B_Code').AsString <> '') then
  196. Result := True;
  197. vChild := vChild.NextSibling;
  198. end;
  199. end;
  200. begin
  201. // 报表数据的主体应是工程量清单,故最底层项目节的判断为,其下含有工程量清单则为项目节
  202. Result := IsXmj and HasGcl;
  203. end;
  204. procedure TrmGclBillsPlaneData.FilterBills(ANode: TsdIDTreeNode);
  205. begin
  206. if not Assigned(ANode) then Exit;
  207. if CheckLastXmj(ANode) then
  208. AddLastXmj(ANode);
  209. FilterBills(ANode.FirstChild);
  210. FilterBills(ANode.NextSibling);
  211. end;
  212. function TrmGclBillsPlaneData.GetPegNode(
  213. ANode: TsdIDTreeNode): TsdIDTreeNode;
  214. begin
  215. Result := nil;
  216. if not Assigned(ANode) then Exit;
  217. if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then
  218. Result := ANode
  219. else
  220. Result := GetPegNode(ANode.Parent);
  221. end;
  222. procedure TrmGclBillsPlaneData.WriteData;
  223. var
  224. i: Integer;
  225. begin
  226. for i := 0 to FLastXmjs.Count - 1 do
  227. WriteLastXmj(TLastXmjNode(FLastXmjs.Items[i]));
  228. end;
  229. procedure TrmGclBillsPlaneData.WriteLastXmj(ALastXmj: TLastXmjNode);
  230. var
  231. i: Integer;
  232. GclBill: TGclBillNode;
  233. begin
  234. for i := 0 to ALastXmj.FGclBills.Count - 1 do
  235. begin
  236. GclBill := TGclBillNode(ALastXmj.FGclBills.Items[i]);
  237. cdsGclBillsPlane.Append;
  238. cdsGclBillsPlanePreCode.AsString := ALastXmj.PreCode;
  239. cdsGclBillsPlaneLastCode.AsString := ALastXmj.LastCode;
  240. cdsGclBillsPlaneCode.AsString := ALastXmj.Code;
  241. cdsGclBillsPlaneXmjName.AsString := ALastXmj.Name;
  242. cdsGclBillsPlaneXmjUnits.AsString := ALastXmj.Units;
  243. cdsGclBillsPlanePeg.AsString := ALastXmj.Peg;
  244. cdsGclBillsPlaneBeginPeg.AsString := ALastXmj.BeginPeg;
  245. cdsGclBillsPlaneEndPeg.AsString := ALastXmj.EndPeg;
  246. cdsGclBillsPlaneNameBuWei.AsString := ALastXmj.ParentName;
  247. cdsGclBillsPlaneDrawingCode.AsString := ALastXmj.DrawingCode;
  248. cdsGclBillsPlaneB_Code.AsString := GclBill.B_Code;
  249. cdsGclBillsPlaneName.AsString := GclBill.Name;
  250. cdsGclBillsPlaneUnits.AsString := GclBill.Units;
  251. cdsGclBillsPlaneQuantity.AsFloat := GclBill.Quantity;
  252. cdsGclBillsPlane.Post;
  253. end;
  254. end;
  255. end.