rmWeiWuZjjlGatherDm.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. unit rmWeiWuZjjlGatherDm;
  2. interface
  3. uses
  4. SysUtils, Classes, ProjectData, DB, sdDB, DBClient;
  5. type
  6. TZjjl = class
  7. private
  8. FCode: string;
  9. FCertificateCode: string;
  10. FBGLCode: string;
  11. FPegName: string;
  12. FBeginPeg: string;
  13. FEndPeg: string;
  14. FFBFXName: string;
  15. FUnitName: string;
  16. FDrawingCode: string;
  17. FFormulaMemo: string;
  18. FRelaFile: string;
  19. FBillsCode: string;
  20. FBillsName: string;
  21. FBillsUnits: string;
  22. FBillsPrice: Double;
  23. FFilterDrawingCode: string;
  24. FBillsCurDealQuantity: Double;
  25. FBillsCurDealTotalPrice: Double;
  26. FBillsCurQcQuantity: Double;
  27. FBillsCurQcTotalPrice: Double;
  28. FBillsCurGatherQuantity: Double;
  29. FBillsCurGatherTotalPrice: Double;
  30. FBillsEndDealQuantity: Double;
  31. FBillsEndDealTotalPrice: Double;
  32. FBillsEndQcQuantity: Double;
  33. FBillsEndQcTotalPrice: Double;
  34. FBillsEndGatherQuantity: Double;
  35. FBillsEndGatherTotalPrice: Double;
  36. function MergeStr(AStr1, AStr2: string): string;
  37. public
  38. constructor Create(ARec, ABillsRec, AStageRec: TsdDataRecord);
  39. procedure Merge(ARec, ABillsRec, AStageRec: TsdDataRecord);
  40. end;
  41. TrmWeiWuZjjlGatherData = class(TDataModule)
  42. cdsZjjl: TClientDataSet;
  43. cdsZjjlCode: TWideStringField;
  44. cdsZjjlCertificateCode: TWideStringField;
  45. cdsZjjlBGLCode: TMemoField;
  46. cdsZjjlPegName: TWideStringField;
  47. cdsZjjlBeginPeg: TWideStringField;
  48. cdsZjjlEndPeg: TWideStringField;
  49. cdsZjjlFBFXName: TWideStringField;
  50. cdsZjjlUnitName: TWideStringField;
  51. cdsZjjlDrawingCode: TWideStringField;
  52. cdsZjjlFormulaMemo: TMemoField;
  53. cdsZjjlRelaFile: TMemoField;
  54. cdsZjjlBillsCode: TStringField;
  55. cdsZjjlBillsName: TWideStringField;
  56. cdsZjjlBillsUnits: TWideStringField;
  57. cdsZjjlBillsPrice: TFloatField;
  58. cdsZjjlFilterDrawingCode: TWideStringField;
  59. cdsZjjlBillsCurDealQuantity: TFloatField;
  60. cdsZjjlBillsCurDealTotalPrice: TFloatField;
  61. cdsZjjlBillsCurQcQuantity: TFloatField;
  62. cdsZjjlBillsCurQcTotalPrice: TFloatField;
  63. cdsZjjlBillsCurGatherQuantity: TFloatField;
  64. cdsZjjlBillsCurGatherTotalPrice: TFloatField;
  65. cdsZjjlBillsEndDealQuantity: TFloatField;
  66. cdsZjjlBillsEndDealTotalPrice: TFloatField;
  67. cdsZjjlBillsEndQcQuantity: TFloatField;
  68. cdsZjjlBillsEndQcTotalPrice: TFloatField;
  69. cdsZjjlBillsEndGatherQuantity: TFloatField;
  70. cdsZjjlBillsEndGatherTotalPrice: TFloatField;
  71. private
  72. FZjjlList: TList;
  73. function FindZjjl(ARec, ABillsRec: TsdDataRecord): TZjjl;
  74. procedure GatherZjjl(AProjectData: TProjectData);
  75. procedure WriteData;
  76. public
  77. function AssignData(AProjectData: TProjectData): TDataSet;
  78. end;
  79. implementation
  80. uses
  81. ZhAPI, PhaseData, UtilMethods;
  82. {$R *.dfm}
  83. function GetThirdPartString(const AStr: string; AFilter: Char = '-'): string;
  84. var
  85. sgs: TStringList;
  86. begin
  87. sgs := TStringList.Create;
  88. try
  89. sgs.Delimiter := AFilter;
  90. sgs.DelimitedText := AStr;
  91. while sgs.Count > 2 do
  92. sgs.Delete(sgs.Count - 1);
  93. Result := sgs.DelimitedText;
  94. finally
  95. sgs.Free;
  96. end;
  97. end;
  98. { TZjjl }
  99. constructor TZjjl.Create(ARec, ABillsRec, AStageRec: TsdDataRecord);
  100. begin
  101. FCode := ARec.ValueByName('Code').AsString;
  102. FCertificateCode := ARec.ValueByName('CertificateCode').AsString;
  103. FBGLCode := ARec.ValueByName('BGLCode').AsString;
  104. FPegName := ARec.ValueByName('PegName').AsString;
  105. FBeginPeg := ARec.ValueByName('BeginPeg').AsString;
  106. FEndPeg := ARec.ValueByName('EndPeg').AsString;
  107. FFBFXName := ARec.ValueByName('FBFXName').AsString;
  108. FUnitName := ARec.ValueByName('UnitName').AsString;
  109. FDrawingCode := ARec.ValueByName('DrawingCode').AsString;
  110. FFormulaMemo := ARec.ValueByName('FormulaMemo').AsString;
  111. FRelaFile := ARec.ValueByName('RelaFile').AsString;
  112. FBillsCode := ABillsRec.ValueByName('B_Code').AsString;
  113. FBillsName := ABillsRec.ValueByName('Name').AsString;
  114. FBillsUnits := ABillsRec.ValueByName('Units').AsString;
  115. FBillsPrice := ABillsRec.ValueByName('Price').AsFloat;
  116. FFilterDrawingCode := GetThirdPartString(ABillsRec.ValueByName('DrawingCode').AsString);
  117. if Assigned(AStageRec) then
  118. begin
  119. FBillsCurDealQuantity := AStageRec.ValueByName('DealQuantity').AsFloat;
  120. FBillsCurDealTotalPrice := AStageRec.ValueByName('DealTotalPrice').AsFloat;
  121. FBillsCurQcQuantity := AStageRec.ValueByName('QcQuantity').AsFloat;
  122. FBillsCurQcTotalPrice := AStageRec.ValueByName('QcTotalPrice').AsFloat;
  123. FBillsCurGatherQuantity := AStageRec.ValueByName('GatherQuantity').AsFloat;
  124. FBillsCurGatherTotalPrice := AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  125. FBillsEndDealQuantity := AStageRec.ValueByName('DealQuantity').AsFloat;
  126. FBillsEndDealTotalPrice := AStageRec.ValueByName('DealTotalPrice').AsFloat;
  127. FBillsEndQcQuantity := AStageRec.ValueByName('QcQuantity').AsFloat;
  128. FBillsEndQcTotalPrice := AStageRec.ValueByName('QcTotalPrice').AsFloat;
  129. FBillsEndGatherQuantity := AStageRec.ValueByName('GatherQuantity').AsFloat;
  130. FBillsEndGatherTotalPrice := AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  131. end;
  132. end;
  133. procedure TZjjl.Merge(ARec, ABillsRec, AStageRec: TsdDataRecord);
  134. begin
  135. FCertificateCode := MergeStr(FCertificateCode, ARec.ValueByName('CertificateCode').AsString);
  136. FBGLCode := MergeRelaBGL(FBGLCode, ARec.ValueByName('BGLCode').AsString);
  137. FDrawingCode := MergeStr(FDrawingCode, ARec.ValueByName('DrawingCode').AsString);
  138. FFormulaMemo := MergeStr(FFormulaMemo, ARec.ValueByName('FormulaMemo').AsString);
  139. FRelaFile := MergeStr(FRelaFile, ARec.ValueByName('RelaFile').AsString);
  140. if Assigned(AStageRec) then
  141. begin
  142. FBillsCurDealQuantity := FBillsCurDealQuantity + AStageRec.ValueByName('DealQuantity').AsFloat;
  143. FBillsCurDealTotalPrice := FBillsCurDealTotalPrice + AStageRec.ValueByName('DealTotalPrice').AsFloat;
  144. FBillsCurQcQuantity := FBillsCurQcQuantity + AStageRec.ValueByName('QcQuantity').AsFloat;
  145. FBillsCurQcTotalPrice := FBillsCurQcTotalPrice + AStageRec.ValueByName('QcTotalPrice').AsFloat;
  146. FBillsCurGatherQuantity := FBillsCurGatherQuantity + AStageRec.ValueByName('GatherQuantity').AsFloat;
  147. FBillsCurGatherTotalPrice := FBillsCurGatherTotalPrice + AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  148. FBillsEndDealQuantity := FBillsEndDealQuantity + AStageRec.ValueByName('DealQuantity').AsFloat;
  149. FBillsEndDealTotalPrice := FBillsEndDealTotalPrice + AStageRec.ValueByName('DealTotalPrice').AsFloat;
  150. FBillsEndQcQuantity := FBillsEndQcQuantity + AStageRec.ValueByName('QcQuantity').AsFloat;
  151. FBillsEndQcTotalPrice := FBillsEndQcTotalPrice + AStageRec.ValueByName('QcTotalPrice').AsFloat;
  152. FBillsEndGatherQuantity := FBillsEndGatherQuantity + AStageRec.ValueByName('GatherQuantity').AsFloat;
  153. FBillsEndGatherTotalPrice := FBillsEndGatherTotalPrice + AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  154. end;
  155. end;
  156. function TZjjl.MergeStr(AStr1, AStr2: string): string;
  157. begin
  158. if (AStr1 <> '') then
  159. begin
  160. if (AStr2 <> '') then
  161. Result := AStr1 + ';' + AStr2
  162. else
  163. Result := AStr1;
  164. end
  165. else
  166. begin
  167. if (AStr2 <> '') then
  168. Result := AStr2
  169. else
  170. Result := '';
  171. end;
  172. end;
  173. { TrmWeiWuZjjlGatherData }
  174. function TrmWeiWuZjjlGatherData.AssignData(
  175. AProjectData: TProjectData): TDataSet;
  176. begin
  177. FZjjlList := TList.Create;
  178. try
  179. if AProjectData.PhaseData.Active then
  180. begin
  181. GatherZjjl(AProjectData);
  182. WriteData;
  183. end;
  184. Result := cdsZjjl;
  185. finally
  186. ClearObjects(FZjjlList);
  187. FZjjlList.Free;
  188. end;
  189. end;
  190. function TrmWeiWuZjjlGatherData.FindZjjl(ARec, ABillsRec: TsdDataRecord): TZjjl;
  191. var
  192. sCode, sName, sUnits, sDrawingCode: string;
  193. fPrice: Double;
  194. i: Integer;
  195. vZ: TZjjl;
  196. begin
  197. sCode := ABillsRec.ValueByName('B_Code').AsString;
  198. sName := ABillsRec.ValueByName('Name').AsString;
  199. sUnits := ABillsRec.ValueByName('Units').AsString;
  200. sDrawingCode := GetThirdPartString(ABillsRec.ValueByName('DrawingCode').AsString);
  201. fPrice := ABillsRec.valueByName('Price').AsFloat;
  202. Result := nil;
  203. for i := 0 to FZjjlList.Count - 1 do
  204. begin
  205. vZ := TZjjl(FZjjlList.Items[i]);
  206. if SameText(vZ.FBillsCode, sCode) and SameText(vZ.FBillsName, sName) and SameText(vZ.FBillsUnits, sUnits) and
  207. (PriceRoundTo(fPrice - vZ.FBillsPrice) < 0.00001) and
  208. SameText(sDrawingCode, vZ.FFilterDrawingCode) then
  209. begin
  210. Result := vZ;
  211. Break;
  212. end;
  213. end;
  214. end;
  215. procedure TrmWeiWuZjjlGatherData.GatherZjjl(AProjectData: TProjectData);
  216. var
  217. i: Integer;
  218. Rec, BillsRec, StageRec: TsdDataRecord;
  219. vZ: TZjjl;
  220. begin
  221. for i := 0 to AProjectData.PhaseData.ZJJLData.sddZJJL.RecordCount - 1 do
  222. begin
  223. Rec := AProjectData.PhaseData.ZJJLData.sddZJJL.Records[I];
  224. BillsRec := AProjectData.BillsData.sddBills.FindKey('idxID', Rec.ValueByName('BillsID').AsInteger);
  225. StageRec := AProjectData.PhaseData.StageData.StageRecord(Rec.ValueByName('BillsID').AsInteger);
  226. if Assigned(Rec) and Assigned(BillsRec) then
  227. begin
  228. vZ := FindZjjl(Rec, BillsRec);
  229. if not Assigned(vZ) then
  230. begin
  231. vZ := TZjjl.Create(Rec, BillsRec, StageRec);
  232. FZjjlList.Add(vZ);
  233. end
  234. else
  235. vZ.Merge(Rec, BillsRec, StageRec);
  236. end;
  237. end;
  238. end;
  239. procedure TrmWeiWuZjjlGatherData.WriteData;
  240. var
  241. i: Integer;
  242. vZ: TZjjl;
  243. begin
  244. cdsZjjl.Active := True;
  245. cdsZjjl.EmptyDataSet;
  246. for i := 0 to FZjjlList.Count - 1 do
  247. begin
  248. vZ := TZjjl(FZjjlList.Items[i]);
  249. cdsZjjl.Append;
  250. cdsZjjlCode.AsString := vZ.FCode;
  251. cdsZjjlCertificateCode.AsString := vZ.FCertificateCode;
  252. cdsZjjlBGLCode.AsString := vZ.FBGLCode;
  253. cdsZjjlPegName.AsString := vZ.FPegName;
  254. cdsZjjlBeginPeg.AsString := vZ.FBeginPeg;
  255. cdsZjjlEndPeg.AsString := vZ.FEndPeg;
  256. cdsZjjlFBFXName.AsString := vZ.FFBFXName;
  257. cdsZjjlUnitName.AsString := vZ.FUnitName;
  258. cdsZjjlDrawingCode.AsString := vZ.FDrawingCode;
  259. cdsZjjlBillsCode.AsString := vZ.FBillsCode;
  260. cdsZjjlBillsName.AsString := vZ.FBillsName;
  261. cdsZjjlBillsUnits.AsString := vZ.FBillsUnits;
  262. cdsZjjlBillsPrice.AsFloat := vZ.FBillsPrice;
  263. cdsZjjlFilterDrawingCode.AsString := vZ.FFilterDrawingCode;
  264. cdsZjjlBillsCurDealQuantity.AsFloat := vZ.FBillsCurDealQuantity;
  265. cdsZjjlBillsCurDealTotalPrice.AsFloat := vZ.FBillsCurDealTotalPrice;
  266. cdsZjjlBillsCurQcQuantity.AsFloat := vZ.FBillsCurQcQuantity;
  267. cdsZjjlBillsCurQcTotalPrice.AsFloat := vZ.FBillsCurQcTotalPrice;
  268. cdsZjjlBillsCurGatherQuantity.AsFloat := vZ.FBillsCurGatherQuantity;
  269. cdsZjjlBillsCurGatherTotalPrice.AsFloat := vZ.FBillsCurGatherTotalPrice;
  270. cdsZjjlBillsEndDealQuantity.AsFloat := vZ.FBillsEndDealQuantity;
  271. cdsZjjlBillsEndDealTotalPrice.AsFloat := vZ.FBillsEndDealTotalPrice;
  272. cdsZjjlBillsEndQcQuantity.AsFloat := vZ.FBillsEndQcQuantity;
  273. cdsZjjlBillsEndQcTotalPrice.AsFloat := vZ.FBillsEndQcTotalPrice;
  274. cdsZjjlBillsEndGatherQuantity.AsFloat := vZ.FBillsEndGatherQuantity;
  275. cdsZjjlBillsEndGatherTotalPrice.AsFloat := vZ.FBillsEndGatherTotalPrice;
  276. cdsZjjl.Post;
  277. end;
  278. end;
  279. end.