rmFxBillsCompareDm.pas 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. unit rmFxBillsCompareDm;
  2. interface
  3. uses
  4. SysUtils, Classes, DB, DBClient, ProjectData, sdIDTree, MCacheTree;
  5. type
  6. {------------------------------------
  7. fctCommon: 常规的分项清单审核比较模式。
  8. fctG07: 广东标准表-台账07表,在fctCommon的基础上加一行公路基本造价汇总行。
  9. 需求有标明: 只需汇总项目节。此处不做特别处理,根据报表设置中的选项决定。
  10. ------------------------------------}
  11. TFxCompareType = (fctCommon, fctG07);
  12. TrmFxBillsCompareData = class(TDataModule)
  13. cdsBills: TClientDataSet;
  14. cdsBillsCode: TStringField;
  15. cdsBillsB_Code: TStringField;
  16. cdsBillsName: TWideStringField;
  17. cdsBillsUnits: TWideStringField;
  18. cdsBillsSQuantity: TFloatField;
  19. cdsBillsSPrice: TFloatField;
  20. cdsBillsSTotalPrice: TFloatField;
  21. cdsBillsCQuantity: TFloatField;
  22. cdsBillsCPrice: TFloatField;
  23. cdsBillsCTotalPrice: TFloatField;
  24. cdsBillsDQuantity: TFloatField;
  25. cdsBillsDPrice: TFloatField;
  26. cdsBillsDTotalPrice: TFloatField;
  27. cdsBillsMemoStr: TStringField;
  28. cdsBillsSDgnQuantity1: TFloatField;
  29. cdsBillsSDgnQuantity2: TFloatField;
  30. cdsBillsSDgnQuantity: TStringField;
  31. cdsBillsCDgnQuantity1: TFloatField;
  32. cdsBillsCDgnQuantity2: TFloatField;
  33. cdsBillsCDgnQuantity: TStringField;
  34. cdsBillsDDgnQuantity1: TFloatField;
  35. cdsBillsDDgnQuantity2: TFloatField;
  36. cdsBillsDDgnQuantity: TStringField;
  37. cdsBillsXiangCode: TWideStringField;
  38. cdsBillsMuCode: TStringField;
  39. cdsBillsJieCode: TStringField;
  40. cdsBillsXiMuCode: TStringField;
  41. private
  42. FCacheTree: TReportCacheTree;
  43. FCompareType: TFxCompareType;
  44. function GetDgnQuantity(ANum1, ANum2: Double): string;
  45. function FilterBillsNode(ANode: TsdIDTreeNode; AParent: TReportCacheNode;
  46. AIsSource: Boolean): TReportCacheNode;
  47. procedure FilterBills(ANode: TsdIDTreeNode; AParent: TReportCacheNode;
  48. AIsSource: Boolean);
  49. procedure WriteNode(ANode: TReportCacheNode);
  50. procedure WriteGatherNodeData(const AName: string);
  51. procedure WriteBills;
  52. public
  53. function AssignData(ASProjectData, ACProjectData: TProjectData): TDataSet;
  54. property CompareType: TFxCompareType read FCompareType write FCompareType;
  55. end;
  56. implementation
  57. uses
  58. CacheTree, Globals;
  59. {$R *.dfm}
  60. { TrmFxBillsCompareData }
  61. function TrmFxBillsCompareData.AssignData(ASProjectData,
  62. ACProjectData: TProjectData): TDataSet;
  63. begin
  64. cdsBills.DisableControls;
  65. cdsBills.Active := True;
  66. cdsBills.EmptyDataSet;
  67. FCacheTree := TReportCacheTree.Create(2);
  68. try
  69. FilterBills(ASProjectData.BillsCompileData.BillsCompileTree.FirstNode, nil, True);
  70. FilterBills(ACProjectData.BillsCompileData.BillsCompileTree.FirstNode, nil, False);
  71. if CompareType = fctG07 then
  72. FCacheTree.ReCalcGatherData;
  73. WriteBills;
  74. Result := cdsBills;
  75. finally
  76. FCacheTree.Free;
  77. cdsBills.EnableControls;
  78. end;
  79. end;
  80. procedure TrmFxBillsCompareData.FilterBills(ANode: TsdIDTreeNode;
  81. AParent: TReportCacheNode; AIsSource: Boolean);
  82. var
  83. ACur: TReportCacheNode;
  84. begin
  85. if not Assigned(ANode) then Exit;
  86. // (Level从0开始取值)
  87. case ReportConfig.GatherLevel of
  88. // 项
  89. 0: if ANode.Level > 1 then Exit;
  90. // 目
  91. 1: if ANode.Level > 2 then Exit;
  92. // 节
  93. 2: if ANode.Level > 3 then Exit;
  94. // 细目
  95. 3: if ANode.Level > 4 then Exit;
  96. // 项目节
  97. 4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
  98. end;
  99. ACur := FilterBillsNode(ANode, AParent, AIsSource);
  100. FilterBills(ANode.FirstChild, ACur, AIsSource);
  101. FilterBills(ANode.NextSibling, AParent, AIsSource);
  102. end;
  103. function TrmFxBillsCompareData.FilterBillsNode(ANode: TsdIDTreeNode;
  104. AParent: TReportCacheNode; AIsSource: Boolean): TReportCacheNode;
  105. var
  106. iGatherCompare: Integer;
  107. ANextSibling: TReportCacheNode;
  108. begin
  109. with ANode.Rec do
  110. begin
  111. if ANode.Rec.ValueByName('B_Code').AsString <> '' then
  112. iGatherCompare := ReportConfig.GclCompare
  113. else
  114. iGatherCompare := ReportConfig.XmjCompare;
  115. case iGatherCompare of
  116. // 按编号
  117. 0: if (ValueByName('Code').asString <> '') or (ValueByName('B_Code').asString <> '') then
  118. Result := FCacheTree.FindNode(AParent,
  119. ValueByName('Code').AsString, ValueByName('B_Code').AsString)
  120. else
  121. Result := FCacheTree.FindNode(AParent, ValueByName('Code').AsString,
  122. ValueByName('B_Code').AsString, ValueByName('Name').AsString);
  123. // 按名称
  124. 1: Result := FCacheTree.FindNode(AParent, ValueByName('Name').AsString);
  125. // 按编号+名称
  126. 2: Result := FCacheTree.FindNode(AParent, ValueByName('Code').AsString,
  127. ValueByName('B_Code').AsString, ValueByName('Name').AsString);
  128. end;
  129. if not Assigned(Result) then
  130. begin
  131. ANextSibling := FCacheTree.FindNextSibling(AParent,
  132. ValueByName('Code').AsString, ValueByName('B_Code').AsString);
  133. Result := FCacheTree.AddNode(AParent, ANextSibling);
  134. Result.Code := ValueByName('Code').AsString;
  135. Result.B_Code := ValueByName('B_Code').AsString;
  136. Result.Name := ValueByName('Name').AsString;
  137. Result.Units := ValueByName('Units').AsString;
  138. end;
  139. if AIsSource then
  140. begin
  141. Result.P_Quantity[0] := ValueByName('Quantity').AsFloat;
  142. Result.P_Price[0] := ValueByName('Price').AsFloat;
  143. Result.P_TotalPrice[0] := ValueByName('TotalPrice').AsFloat;
  144. Result.P_DgnQuantity1[0] := ValueByName('DgnQuantity1').AsFloat;
  145. Result.P_DgnQuantity2[0] := ValueByName('DgnQuantity2').AsFloat;
  146. end
  147. else
  148. begin
  149. Result.P_Quantity[1] := ValueByName('Quantity').AsFloat;
  150. Result.P_Price[1] := ValueByName('Price').AsFloat;
  151. Result.P_TotalPrice[1] := ValueByName('TotalPrice').AsFloat;
  152. Result.P_DgnQuantity1[1] := ValueByName('DgnQuantity1').AsFloat;
  153. Result.P_DgnQuantity2[1] := ValueByName('DgnQuantity2').AsFloat;
  154. end;
  155. end;
  156. end;
  157. function TrmFxBillsCompareData.GetDgnQuantity(ANum1,
  158. ANum2: Double): string;
  159. begin
  160. Result := '';
  161. if ANum1 <> 0 then
  162. begin
  163. Result := FloatToStr(ANum1);
  164. if ANum2 <> 0 then
  165. Result := Result + '/' + FloatToStr(ANum2);
  166. end;
  167. end;
  168. procedure TrmFxBillsCompareData.WriteBills;
  169. begin
  170. WriteNode(TReportCacheNode(FCacheTree.FirstNode));
  171. WriteGatherNodeData('公路基本造价');
  172. end;
  173. procedure TrmFxBillsCompareData.WriteGatherNodeData(const AName: string);
  174. begin
  175. cdsBills.Append;
  176. cdsBillsName.AsString := AName;
  177. with FCacheTree.GatherCacheNode do
  178. begin
  179. cdsBillsSTotalPrice.AsFloat := P_TotalPrice[0];
  180. cdsBillsCTotalPrice.AsFloat := P_TotalPrice[1];
  181. cdsBillsDTotalPrice.AsFloat := P_TotalPrice[1] - P_TotalPrice[0];
  182. end;
  183. cdsBills.Post;
  184. end;
  185. procedure TrmFxBillsCompareData.WriteNode(ANode: TReportCacheNode);
  186. begin
  187. if not Assigned(ANode) then Exit;
  188. cdsBills.Append;
  189. cdsBillsCode.AsString := ANode.Code;
  190. cdsBillsB_Code.AsString := ANode.B_Code;
  191. cdsBillsName.AsString := ANode.Name;
  192. cdsBillsUnits.AsString := ANode.Units;
  193. cdsBillsSQuantity.AsFloat := ANode.P_Quantity[0];
  194. cdsBillsSPrice.AsFloat := ANode.P_Price[0];
  195. cdsBillsSTotalPrice.AsFloat := ANode.P_TotalPrice[0];
  196. cdsBillsSDgnQuantity1.AsFloat := ANode.P_DgnQuantity1[0];
  197. cdsBillsSDgnQuantity2.AsFloat := ANode.P_DgnQuantity2[0];
  198. cdsBillsSDgnQuantity.AsString := GetDgnQuantity(cdsBillsSDgnQuantity1.AsFloat,
  199. cdsBillsSDgnQuantity2.AsFloat);
  200. cdsBillsCQuantity.AsFloat := ANode.P_Quantity[1];
  201. cdsBillsCPrice.AsFloat := ANode.P_Price[1];
  202. cdsBillsCTotalPrice.AsFloat := ANode.P_TotalPrice[1];
  203. cdsBillsCDgnQuantity1.AsFloat := ANode.P_DgnQuantity1[1];
  204. cdsBillsCDgnQuantity2.AsFloat := ANode.P_DgnQuantity2[1];
  205. cdsBillsCDgnQuantity.AsString := GetDgnQuantity(cdsBillsCDgnQuantity1.AsFloat,
  206. cdsBillsCDgnQuantity2.AsFloat);
  207. cdsBillsDQuantity.AsFloat := ANode.P_Quantity[1] - ANode.P_Quantity[0];
  208. cdsBillsDPrice.AsFloat := ANode.P_Price[1] - ANode.P_Price[0];
  209. cdsBillsDTotalPrice.AsFloat := ANode.P_TotalPrice[1] - ANode.P_TotalPrice[0];
  210. cdsBillsDDgnQuantity1.AsFloat := ANode.P_DgnQuantity1[1] - ANode.P_DgnQuantity1[0];
  211. cdsBillsDDgnQuantity2.AsFloat := ANode.P_DgnQuantity2[1] - ANode.P_DgnQuantity2[0];
  212. cdsBillsDDgnQuantity.AsString := GetDgnQuantity(cdsBillsDDgnQuantity1.AsFloat,
  213. cdsBillsDDgnQuantity2.AsFloat);
  214. cdsBillsXiangCode.AsString := ANode.XiangCode;
  215. cdsBillsMuCode.AsString := ANode.MuCode;
  216. cdsBillsJieCode.AsString := ANode.JieCode;
  217. cdsBillsXiMuCode.AsString := ANode.XiMuCode;
  218. cdsBills.Post;
  219. WriteNode(TReportCacheNode(ANode.FirstChild));
  220. WriteNode(TReportCacheNode(ANode.NextSibling));
  221. end;
  222. end.