rmGclBillsAuditCompareDm.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. unit rmGclBillsAuditCompareDm;
  2. interface
  3. uses
  4. SysUtils, Classes, DB, DBClient, ProjectData, sdIDTree, sdDB;
  5. type
  6. TrmFilterType = (rmftPhaseDeal, rmftPhaseQc, rmftPhasePc, rmftPhaseGather);
  7. TDataType = (atRefer, atReply);
  8. TGclNode = class
  9. private
  10. FB_Code: string;
  11. FIndexCode: string;
  12. FName: string;
  13. FUnits: string;
  14. FPrice: Double;
  15. FNewPrice: Double;
  16. FReferCurDealQuantity: Double;
  17. FReferCurDealTotalPrice: Double;
  18. FReferCurQcQuantity: Double;
  19. FReferCurQcTotalPrice: Double;
  20. FReferCurQcBGLCode: string;
  21. FReferCurPcQuantity: Double;
  22. FReferCurPcTotalPrice: Double;
  23. FReferCurPcBGLCode: string;
  24. FReferCurGatherQuantity: Double;
  25. FReferCurGatherTotalPrice: Double;
  26. FReplyCurDealQuantity: Double;
  27. FReplyCurDealTotalPrice: Double;
  28. FReplyCurQcQuantity: Double;
  29. FReplyCurQcTotalPrice: Double;
  30. FReplyCurQcBGLCode: string;
  31. FReplyCurPcQuantity: Double;
  32. FReplyCurPcTotalPrice: Double;
  33. FReplyCurPcBGLCode: string;
  34. FReplyCurGatherQuantity: Double;
  35. FReplyCurGatherTotalPrice: Double;
  36. end;
  37. TrmGclBillsAuditCompareData = class(TDataModule)
  38. cdsBills: TClientDataSet;
  39. cdsBillsB_Code: TStringField;
  40. cdsBillsIndexCode: TStringField;
  41. cdsBillsName: TWideStringField;
  42. cdsBillsUnits: TWideStringField;
  43. cdsBillsPrice: TFloatField;
  44. cdsBillsNewPrice: TFloatField;
  45. cdsBillsReferCurDealQuantity: TFloatField;
  46. cdsBillsReferCurDealTotalPrice: TFloatField;
  47. cdsBillsReferCurQcQuantity: TFloatField;
  48. cdsBillsReferCurQcTotalPrice: TFloatField;
  49. cdsBillsReferCurQcBGLCode: TWideStringField;
  50. cdsBillsReferCurPcQuantity: TFloatField;
  51. cdsBillsReferCurPcTotalPrice: TFloatField;
  52. cdsBillsReferCurPcBGLCode: TWideStringField;
  53. cdsBillsReferCurGatherQuantity: TFloatField;
  54. cdsBillsReferCurGatherTotalPrice: TFloatField;
  55. cdsBillsReplyCurDealQuantity: TFloatField;
  56. cdsBillsReplyCurDealTotalPrice: TFloatField;
  57. cdsBillsReplyCurQcQuantity: TFloatField;
  58. cdsBillsReplyCurQcTotalPrice: TFloatField;
  59. cdsBillsReplyCurQcBGLCode: TWideStringField;
  60. cdsBillsReplyCurPcQuantity: TFloatField;
  61. cdsBillsReplyCurPcTotalPrice: TFloatField;
  62. cdsBillsReplyCurPcBGLCode: TWideStringField;
  63. cdsBillsReplyCurGatherQuantity: TFloatField;
  64. cdsBillsReplyCurGatherTotalPrice: TFloatField;
  65. cdsBillsFlowIndex: TIntegerField;
  66. private
  67. FProjectData: TProjectData;
  68. FrmFilterType: TrmFilterType;
  69. FGclList: TList;
  70. procedure FilterGclBills(ANode: TsdIDTreeNode; ADataType: TDataType);
  71. procedure FilterBills(ANode: TsdIDTreeNode; ADataType: TDataType);
  72. procedure WriteBills;
  73. public
  74. constructor Create;
  75. destructor Destroy; override;
  76. function AssignData(AProjectData: TProjectData;
  77. ArmFilterType: TrmFilterType): TDataSet;
  78. end;
  79. implementation
  80. uses
  81. ZhAPI, UtilMethods, PhaseData;
  82. {$R *.dfm}
  83. { TrmGclBillsAuditCompareData }
  84. function TrmGclBillsAuditCompareData.AssignData(AProjectData: TProjectData;
  85. ArmFilterType: TrmFilterType): TDataSet;
  86. var
  87. iStageMark: Integer;
  88. begin
  89. FProjectData := AProjectData;
  90. FrmFilterType := ArmFilterType;
  91. cdsBills.Active := True;
  92. cdsBills.DisableControls;
  93. try
  94. cdsBills.EmptyDataSet;
  95. if FProjectData.PhaseData.Active then
  96. with FProjectData.BillsMeasureData.BillsMeasureTree do
  97. begin
  98. iStageMark := FProjectData.PhaseData.StageIndex;
  99. FProjectData.PhaseData.StageIndex := 0;
  100. FilterBills(FirstNode, atRefer);
  101. if FProjectData.PhaseData.StageCount > 1 then
  102. begin
  103. FProjectData.PhaseData.StageIndex := FProjectData.PhaseData.AuditCount;
  104. FilterBills(FirstNode, atReply);
  105. end;
  106. end;
  107. WriteBills;
  108. finally
  109. FProjectData.PhaseData.StageIndex := iStageMark;
  110. ClearObjects(FGclList);
  111. cdsBills.EnableControls;
  112. Result := cdsBills;
  113. end;
  114. end;
  115. constructor TrmGclBillsAuditCompareData.Create;
  116. begin
  117. inherited Create(nil);
  118. FGclList := TList.Create;
  119. cdsBills.IndexFieldNames := 'IndexCode';
  120. end;
  121. destructor TrmGclBillsAuditCompareData.Destroy;
  122. begin
  123. ClearObjects(FGclList);
  124. FGclList.Free;
  125. inherited;
  126. end;
  127. procedure TrmGclBillsAuditCompareData.FilterBills(ANode: TsdIDTreeNode;
  128. ADataType: TDataType);
  129. begin
  130. if not Assigned(ANode) then Exit;
  131. if ANode.HasChildren then
  132. FilterBills(ANode.FirstChild, ADataType)
  133. else
  134. FilterGclBills(ANode, ADataType);
  135. FilterBills(ANode.NextSibling, ADataType);
  136. end;
  137. procedure TrmGclBillsAuditCompareData.FilterGclBills(ANode: TsdIDTreeNode;
  138. ADataType: TDataType);
  139. function CreateGclNode(ARec: TsdDataRecord): TGclNode;
  140. begin
  141. Result := TGclNode.Create;
  142. FGclList.Add(Result);
  143. Result.FB_Code := ARec.ValueByName('B_Code').AsString;
  144. Result.FIndexCode := B_CodeToIndexCode(ARec.ValueByName('B_Code').AsString);
  145. Result.FName := ARec.ValueByName('Name').AsString;
  146. Result.FUnits := ARec.ValueByName('Units').AsString;
  147. Result.FPrice := ARec.ValueByName('Price').AsFloat;
  148. Result.FNewPrice := ARec.ValueByName('NewPrice').AsFloat;
  149. end;
  150. function GetGclNode(ARec: TsdDataRecord): TGclNode;
  151. var
  152. I: Integer;
  153. GclNode: TGclNode;
  154. begin
  155. Result := nil;
  156. for I := 0 to FGclList.Count - 1 do
  157. begin
  158. GclNode := TGclNode(FGclList.Items[I]);
  159. if SameText(GclNode.FB_Code, ARec.ValueByName('B_Code').AsString) and
  160. SameText(GclNode.FName, ARec.ValueByName('Name').AsString) and
  161. SameText(GclNode.FUnits, ARec.ValueByName('Units').AsString) and
  162. (GclNode.FPrice = ARec.ValueByName('Price').AsFloat) then
  163. begin
  164. Result := GclNode;
  165. Break;
  166. end;
  167. end;
  168. if not Assigned(Result) then
  169. Result := CreateGclNode(ARec);
  170. end;
  171. procedure LoadReferData(AGclNode: TGclNode; ARec: TsdDataRecord);
  172. begin
  173. AGclNode.FReferCurDealQuantity := AGclNode.FReferCurDealQuantity + ARec.ValueByName('DealQuantity').AsFloat;
  174. AGclNode.FReferCurDealTotalPrice := AGclNode.FReferCurDealTotalPrice + ARec.ValueByName('DealTotalPrice').AsFloat;
  175. AGclNode.FReferCurQcQuantity := AGclNode.FReferCurQcQuantity + ARec.ValueByName('QcQuantity').AsFloat;
  176. AGclNode.FReferCurQcTotalPrice := AGclNode.FReferCurQcTotalPrice + ARec.ValueByName('QcTotalPrice').AsFloat;
  177. AGclNode.FReferCurQcBGLCode := MergeRelaBGL(AGclNode.FReferCurQcBGLCode, ARec.ValueByName('QcBGLCode').AsString);
  178. AGclNode.FReferCurPcQuantity := AGclNode.FReferCurPcQuantity + ARec.ValueByName('PcQuantity').AsFloat;
  179. AGclNode.FReferCurPcTotalPrice := AGclNode.FReferCurPcTotalPrice + ARec.ValueByName('PcTotalPrice').AsFloat;
  180. AGclNode.FReferCurPcBGLCode := MergeRelaBGL(AGclNode.FReferCurPcBGLCode, ARec.ValueByName('PcBGLCode').AsString);
  181. AGclNode.FReferCurGatherQuantity := AGclNode.FReferCurGatherQuantity + ARec.ValueByName('GatherQuantity').AsFloat;
  182. AGclNode.FReferCurGatherTotalPrice := AGclNode.FReferCurGatherTotalPrice + ARec.ValueByName('GatherTotalPrice').AsFloat;
  183. end;
  184. procedure LoadReplyData(AGclNode: TGclNode; ARec: TsdDataRecord);
  185. begin
  186. AGclNode.FReplyCurDealQuantity := AGclNode.FReplyCurDealQuantity + ARec.ValueByName('DealQuantity').AsFloat;
  187. AGclNode.FReplyCurDealTotalPrice := AGclNode.FReplyCurDealTotalPrice + ARec.ValueByName('DealTotalPrice').AsFloat;
  188. AGclNode.FReplyCurQcQuantity := AGclNode.FReplyCurQcQuantity + ARec.ValueByName('QcQuantity').AsFloat;
  189. AGclNode.FReplyCurQcTotalPrice := AGclNode.FReplyCurQcTotalPrice + ARec.ValueByName('QcTotalPrice').AsFloat;
  190. AGclNode.FReplyCurQcBGLCode := MergeRelaBGL(AGclNode.FReplyCurQcBGLCode, ARec.ValueByName('QcBGLCode').AsString);
  191. AGclNode.FReplyCurPcQuantity := AGclNode.FReplyCurPcQuantity + ARec.ValueByName('PcQuantity').AsFloat;
  192. AGclNode.FReplyCurPcTotalPrice := AGclNode.FReplyCurPcTotalPrice + ARec.ValueByName('PcTotalPrice').AsFloat;
  193. AGclNode.FReplyCurPcBGLCode := MergeRelaBGL(AGclNode.FReplyCurPcBGLCode, ARec.ValueByName('PcBGLCode').AsString);
  194. AGclNode.FReplyCurGatherQuantity := AGclNode.FReplyCurGatherQuantity + ARec.ValueByName('GatherQuantity').AsFloat;
  195. AGclNode.FReplyCurGatherTotalPrice := AGclNode.FReplyCurGatherTotalPrice + ARec.ValueByName('GatherTotalPrice').AsFloat;
  196. end;
  197. var
  198. Rec, StageRec: TsdDataRecord;
  199. GclNode: TGclNode;
  200. begin
  201. if not Assigned(ANode) then Exit;
  202. Rec := ANode.Rec;
  203. if Rec.ValueByName('B_Code').AsString = '' then Exit;
  204. StageRec := TProjectData(FProjectData).PhaseData.StageData.StageRecord(ANode.ID);
  205. {case ADataType of
  206. atRefer: StageRec := TProjectData(FProjectData).PhaseData.ReferData.StageRecord(ANode.ID);
  207. atReply: StageRec := TProjectData(FProjectData).PhaseData.LastStageData.StageRecord(ANode.ID);
  208. end;}
  209. if not Assigned(StageRec) then Exit;
  210. case FrmFilterType of
  211. rmftPhaseDeal: if StageRec.ValueByName('DealTotalPrice').AsFloat = 0 then Exit;
  212. rmftPhaseQc: if StageRec.ValueByName('QcTotalPrice').AsFloat = 0 then Exit;
  213. rmftPhasePc: if StageRec.ValueByName('PcTotalPrice').AsFloat = 0 then Exit;
  214. rmftPhaseGather: if StageRec.ValueByName('GatherTotalPrice').AsFloat = 0 then Exit;
  215. end;
  216. GclNode := GetGclNode(Rec);
  217. case ADataType of
  218. atRefer: LoadReferData(GclNode, StageRec);
  219. atReply: LoadReplyData(GclNode, StageRec);
  220. end;
  221. end;
  222. procedure TrmGclBillsAuditCompareData.WriteBills;
  223. var
  224. I: Integer;
  225. GclNode: TGclNode;
  226. begin
  227. for I := 0 to FGclList.Count - 1 do
  228. begin
  229. GclNode := TGclNode(FGclList.Items[I]);
  230. cdsBills.Append;
  231. cdsBillsB_Code.AsString := GclNode.FB_Code;
  232. cdsBillsIndexCode.AsString := GclNode.FIndexCode;
  233. cdsBillsName.AsString := GclNode.FName;
  234. cdsBillsUnits.AsString := GclNode.FUnits;
  235. cdsBillsPrice.AsFloat := GclNode.FPrice;
  236. cdsBillsNewPrice.AsFloat := GclNode.FNewPrice;
  237. cdsBillsReferCurDealQuantity.AsFloat := GclNode.FReferCurDealQuantity;
  238. cdsBillsReferCurDealTotalPrice.AsFloat := GclNode.FReferCurDealTotalPrice;
  239. cdsBillsReferCurQcQuantity.AsFloat := GclNode.FReferCurQcQuantity;
  240. cdsBillsReferCurQcTotalPrice.AsFloat := GclNode.FReferCurQcTotalPrice;
  241. cdsBillsReferCurQcBGLCode.AsString := GclNode.FReferCurQcBGLCode;
  242. cdsBillsReferCurPcQuantity.AsFloat := GclNode.FReferCurPcQuantity;
  243. cdsBillsReferCurPcTotalPrice.AsFloat := GclNode.FReferCurPcTotalPrice;
  244. cdsBillsReferCurPcBGLCode.AsString := GclNode.FReferCurPcBGLCode;
  245. cdsBillsReferCurGatherQuantity.AsFloat := GclNode.FReferCurGatherQuantity;
  246. cdsBillsReferCurGatherTotalPrice.AsFloat := GclNode.FReferCurGatherTotalPrice;
  247. cdsBillsReplyCurDealQuantity.AsFloat := GclNode.FReplyCurDealQuantity;
  248. cdsBillsReplyCurDealTotalPrice.AsFloat := GclNode.FReplyCurDealTotalPrice;
  249. cdsBillsReplyCurQcQuantity.AsFloat := GclNode.FReplyCurQcQuantity;
  250. cdsBillsReplyCurQcTotalPrice.AsFloat := GclNode.FReplyCurQcTotalPrice;
  251. cdsBillsReplyCurQcBGLCode.AsString := GclNode.FReplyCurQcBGLCode;
  252. cdsBillsReplyCurPcQuantity.AsFloat := GclNode.FReplyCurPcQuantity;
  253. cdsBillsReplyCurPcTotalPrice.AsFloat := GclNode.FReplyCurPcTotalPrice;
  254. cdsBillsReplyCurPcBGLCode.AsString := GclNode.FReplyCurPcBGLCode;
  255. cdsBillsReplyCurGatherQuantity.AsFloat := GclNode.FReplyCurGatherQuantity;
  256. cdsBillsReplyCurGatherTotalPrice.AsFloat := GclNode.FReplyCurGatherTotalPrice;
  257. cdsBillsFlowIndex.AsInteger := 0;
  258. cdsBills.Post;
  259. end;
  260. end;
  261. end.