PriceMarginBillsDm.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. unit PriceMarginBillsDm;
  2. interface
  3. uses
  4. SysUtils, Classes, sdDB, sdProvider, BillsTree, mDataRecord,
  5. GclBillsGatherModel;
  6. type
  7. TPriceMarginBillsData = class(TDataModule)
  8. sdmpGclBills: TsdMemoryProvider;
  9. sddGclBills: TsdDataSet;
  10. sdmpDetailGclBills: TsdMemoryProvider;
  11. sddDetailGclBills: TsdDataSet;
  12. sdvGclBills: TsdDataView;
  13. sdvDetailGclBills: TsdDataView;
  14. sdvDetailGL: TsdDataView;
  15. procedure sdvGclBillsCurrentChanged(ARecord: TsdDataRecord);
  16. procedure sdvDetailGclBillsFilterRecord(ARecord: TsdDataRecord;
  17. var Allow: Boolean);
  18. procedure sdvDetailGLFilterRecord(ARecord: TsdDataRecord;
  19. var Allow: Boolean);
  20. procedure sdvDetailGclBillsCurrentChanged(ARecord: TsdDataRecord);
  21. procedure sdvDetailGLAfterValueChanged(AValue: TsdValue);
  22. procedure sdvDetailGclBillsGetText(var Text: String;
  23. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  24. DisplayText: Boolean);
  25. procedure sdvDetailGLAfterDeleteRecord(ARecord: TsdDataRecord);
  26. procedure sdvGclBillsGetText(var Text: String; ARecord: TsdDataRecord;
  27. AValue: TsdValue; AColumn: TsdViewColumn; DisplayText: Boolean);
  28. private
  29. FProjectData: TObject;
  30. procedure WriteGclBillsData(AGcls: TList);
  31. function GetMainBillsTree: TBillsIDTree;
  32. public
  33. constructor Create(AProjectData: TObject);
  34. destructor Destroy; override;
  35. procedure RefreshBills;
  36. procedure AddDetailGLs(AGls: TList);
  37. procedure RefreshDetailBills(ABillsID: Integer);
  38. procedure RefreshAllDetailBills;
  39. property ProjectData: TObject read FProjectData;
  40. property MainBillsTree: TBillsIDTree read GetMainBillsTree;
  41. end;
  42. implementation
  43. uses
  44. ZhAPI, ProjectData, UtilMethods;
  45. {$R *.dfm}
  46. { TPriceMarginBillsData }
  47. constructor TPriceMarginBillsData.Create(AProjectData: TObject);
  48. begin
  49. inherited Create(nil);
  50. FProjectData := AProjectData;
  51. sddGclBills.Open;
  52. if not Assigned(sddGclBills.FindIndex('idxIndexCode')) then
  53. sddGclBills.AddIndex('idxIndexCode', 'IndexCode');
  54. sdvGclBills.Open;
  55. sdvGclBills.IndexName := 'idxIndexCode';
  56. sddDetailGclBills.Open;
  57. if not Assigned(sddDetailGclBills.FindIndex('idxSerialNo')) then
  58. sddDetailGclBills.AddIndex('idxSerialNo', 'BillsID;TreeSerialNo');
  59. if not Assigned(sddDetailGclBills.FindIndex('idxRelaBills')) then
  60. sddDetailGclBills.AddIndex('idxRelaBills', 'RelaBillsID');
  61. sdvDetailGclBills.Open;
  62. sdvDetailGclBills.IndexName := 'idxSerialNo';
  63. sdvDetailGL.DataSet := TProjectData(FProjectData).DetailGLData.sddDetailGL;
  64. sdvDetailGL.IndexName := 'idxView';
  65. sdvDetailGL.Columns.FindColumn('Name').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  66. sdvDetailGL.Columns.FindColumn('Units').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  67. end;
  68. destructor TPriceMarginBillsData.Destroy;
  69. begin
  70. inherited;
  71. end;
  72. procedure TPriceMarginBillsData.RefreshBills;
  73. var
  74. vGather: TGclGatherModel;
  75. begin
  76. vGather := TGclGatherModel.Create(FProjectData);
  77. try
  78. vGather.WriteGatherData := WriteGclBillsData;
  79. vGather.Execute;
  80. finally
  81. vGather.Free;
  82. end;
  83. end;
  84. procedure TPriceMarginBillsData.WriteGclBillsData(AGcls: TList);
  85. procedure BeforeWrite;
  86. begin
  87. sdvDetailGclBills.Filtered := False;
  88. sdvDetailGL.Filtered := False;
  89. sddGclBills.DisableControls;
  90. sddGclBills.BeginUpdate;
  91. sddGclBills.DeleteAll;
  92. sddDetailGclBills.DisableControls;
  93. sddDetailGclBills.BeginUpdate;
  94. sddDetailGclBills.DeleteAll;
  95. end;
  96. procedure AfterWrite;
  97. var
  98. idx: TsdIndex;
  99. begin
  100. sddDetailGclBills.EndUpdate;
  101. sddDetailGclBills.EnableControls;
  102. sddGclBills.EndUpdate;
  103. sddGclBills.EnableControls;
  104. if not sdvDetailGL.Active then
  105. sdvDetailGL.Open;
  106. idx := sddGclBills.FindIndex('idxIndexCode');
  107. sdvGclBills.LocateInControl(sdvGclBills.Records[0]);
  108. sdvDetailGclBills.Filtered := True;
  109. sdvDetailGclBills.LocateInControl(sdvDetailGclBills.Records[0]);
  110. sdvDetailGL.Filtered := True;
  111. sdvDetailGclBills.LocateInControl(sdvDetailGclBills.Records[0]);
  112. end;
  113. procedure WriteDetailGclNode(AGclNode: TGclNode);
  114. var
  115. iDetailGcl: Integer;
  116. vDetailGcl: TDetailGclNode;
  117. Rec: TsdDataRecord;
  118. begin
  119. for iDetailGcl := 0 to AGclNode.DetailGclCount -1 do
  120. begin
  121. vDetailGcl := AGclNode.DetailGcl[iDetailGcl];
  122. Rec := sddDetailGclBills.Add;
  123. Rec.ValueByName('ID').AsInteger := vDetailGcl.ID;
  124. Rec.ValueByName('BillsID').AsInteger := AGclNode.ID;
  125. Rec.ValueByName('TreeSerialNo').AsInteger := vDetailGcl.TreeSerialNo;
  126. Rec.ValueByName('RelaBillsID').AsInteger := vDetailGcl.BillsID;
  127. if Assigned(vDetailGcl.LeafXmj) then
  128. begin
  129. Rec.ValueByName('LeafXmjID').AsInteger := vDetailGcl.LeafXmj.ID;
  130. Rec.ValueByName('XmjCode').AsString := vDetailGcl.LeafXmj.XmjCode;
  131. Rec.ValueByName('XmjName').AsString := vDetailGcl.LeafXmj.XmjName;
  132. Rec.ValueByName('XmjUnits').AsString := vDetailGcl.LeafXmj.XmjUnits;
  133. Rec.ValueByName('NameDanWei').AsString := vDetailGcl.LeafXmj.NameDanWei;
  134. Rec.ValueByName('NameFenXiang').AsString := vDetailGcl.LeafXmj.NameFenXiang;
  135. Rec.ValueByName('NameFenBu').AsString := vDetailGcl.LeafXmj.NameFenBu;
  136. Rec.ValueByName('NameUnit').AsString := vDetailGcl.LeafXmj.NameUnit;
  137. Rec.ValueByName('Peg').AsString := vDetailGcl.LeafXmj.Peg;
  138. Rec.ValueByName('Position').AsString := vDetailGcl.LeafXmj.Position;
  139. Rec.ValueByName('DrawingCode').AsString := vDetailGcl.LeafXmj.DrawingCode;
  140. end;
  141. Rec.ValueByName('CurDealQuantity').AsFloat := vDetailGcl.CurDealQuantity;
  142. Rec.ValueByName('CurQcQuantity').AsFloat := vDetailGcl.CurQcQuantity;
  143. Rec.ValueByName('CurGatherQuantity').AsFloat := vDetailGcl.CurGatherQuantity;
  144. Rec.ValueByName('PM_PreTotalPrice').AsFloat := vDetailGcl.PM_PreTotalPrice;
  145. Rec.ValueByName('PM_TotalPrice').AsFloat := vDetailGcl.PM_TotalPrice;
  146. end;
  147. end;
  148. procedure WriteGclNode(AGclNode: TGclNode);
  149. var
  150. Rec: TsdDataRecord;
  151. begin
  152. Rec := sddGclBills.Add;
  153. Rec.ValueByName('ID').AsInteger := AGclNode.ID;
  154. Rec.ValueByName('B_Code').AsString := AGclNode.B_Code;
  155. Rec.ValueByName('IndexCode').AsString := AGclNode.IndexCode;
  156. Rec.ValueByName('Name').AsString := AGclNode.Name;
  157. Rec.ValueByName('Units').AsString := AGclNode.Units;
  158. Rec.ValueByName('Price').AsFloat := AGclNode.Price;
  159. Rec.ValueByName('CurDealQuantity').AsFloat := AGclNode.CurDealQuantity;
  160. Rec.ValueByName('CurQcQuantity').AsFloat := AGclNode.CurQcQuantity;
  161. Rec.ValueByName('CurGatherQuantity').AsFloat := AGclNode.CurGatherQuantity;
  162. WriteDetailGclNode(AGclNode);
  163. end;
  164. var
  165. iGcl: Integer;
  166. vGclNode: TGclNode;
  167. begin
  168. BeforeWrite;
  169. try
  170. for iGcl := 0 to AGcls.Count - 1 do
  171. begin
  172. vGclNode := TGclNode(AGcls.Items[iGcl]);
  173. WriteGclNode(vGclNode);
  174. end;
  175. finally
  176. AfterWrite;
  177. end;
  178. end;
  179. procedure TPriceMarginBillsData.sdvGclBillsCurrentChanged(
  180. ARecord: TsdDataRecord);
  181. begin
  182. sdvDetailGclBills.RefreshFilter;
  183. sdvDetailGclBills.LocateInControl(sdvDetailGclBills.Records[0]);
  184. end;
  185. procedure TPriceMarginBillsData.sdvDetailGclBillsFilterRecord(
  186. ARecord: TsdDataRecord; var Allow: Boolean);
  187. begin
  188. if Assigned(sdvGclBills.Current) and Assigned(ARecord) then
  189. Allow := ARecord.ValueByName('BillsID').AsInteger = sdvGclBills.Current.ValueByName('ID').AsInteger
  190. else
  191. Allow := False;
  192. end;
  193. procedure TPriceMarginBillsData.sdvDetailGLFilterRecord(
  194. ARecord: TsdDataRecord; var Allow: Boolean);
  195. begin
  196. if Assigned(sdvDetailGclBills.Current) and Assigned(ARecord) then
  197. Allow := ARecord.ValueByName('BillsID').AsInteger = sdvDetailGclBills.Current.ValueByName('RelaBillsID').AsInteger
  198. else
  199. Allow := False;
  200. end;
  201. function TPriceMarginBillsData.GetMainBillsTree: TBillsIDTree;
  202. begin
  203. Result := TProjectData(FProjectData).BillsMeasureData.BillsMeasureTree;
  204. end;
  205. procedure TPriceMarginBillsData.AddDetailGLs(AGls: TList);
  206. begin
  207. TProjectData(FProjectData).DetailGLData.AddDetailGLs(
  208. sdvDetailGclBills.Current.ValueByName('RelaBillsID').AsInteger, AGls);
  209. sdvDetailGL.RefreshFilter;
  210. end;
  211. procedure TPriceMarginBillsData.sdvDetailGclBillsCurrentChanged(
  212. ARecord: TsdDataRecord);
  213. begin
  214. sdvDetailGL.RefreshFilter;
  215. end;
  216. procedure TPriceMarginBillsData.RefreshDetailBills(ABillsID: Integer);
  217. var
  218. Rec: TsdDataRecord;
  219. StageRec: TStageRecord;
  220. begin
  221. Rec := sddDetailGclBills.FindKey('idxRelaBills', ABillsID);
  222. if not Assigned(Rec) then Exit;
  223. StageRec := TProjectData(FProjectData).PhaseData.StageData.StageRecord(ABillsID);
  224. if Assigned(StageRec) then
  225. Rec.ValueByName('PM_TotalPrice').AsFloat := StageRec.PM_TotalPrice.AsFloat
  226. else
  227. Rec.ValueByName('PM_TotalPrice').AsFloat := 0;
  228. end;
  229. procedure TPriceMarginBillsData.sdvDetailGLAfterValueChanged(
  230. AValue: TsdValue);
  231. var
  232. ARec: TDetailGLRecord;
  233. begin
  234. if SameText(AValue.FieldName, 'Quantity') then
  235. begin
  236. ARec := TDetailGLRecord(AValue.Owner);
  237. // 更新调差工料--本期价差
  238. with TProjectData(FProjectData).ProjectGLData do
  239. CalculateGL_PM(ARec.GLID.AsInteger);
  240. // 更新清单调差数据,材料调差节点数据
  241. with TProjectData(FProjectData).PhaseData.StageData do
  242. begin
  243. CalculatePriceMargin(ARec.BillsID.AsInteger);
  244. CalculatePriceMarginNode;
  245. end;
  246. // 更新价差清单内存表信息
  247. with TProjectData(FProjectData).PriceMarginBillsData do
  248. RefreshDetailBills(ARec.BillsID.AsInteger);
  249. // 更新合同支付
  250. TProjectData(FProjectData).PhaseData.PhasePayData.CalculateAll;
  251. end;
  252. end;
  253. procedure TPriceMarginBillsData.sdvDetailGclBillsGetText(var Text: String;
  254. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  255. DisplayText: Boolean);
  256. procedure GetDisplayText;
  257. begin
  258. if ((Pos('Price', AColumn.FieldName) > 0) or
  259. (Pos('Quantity', AColumn.FieldName) > 0)) then
  260. begin
  261. if AValue.AsFloat = 0 then
  262. Text := '';
  263. end;
  264. end;
  265. begin
  266. if DisplayText then
  267. GetDisplayText;
  268. end;
  269. procedure TPriceMarginBillsData.sdvDetailGLAfterDeleteRecord(
  270. ARecord: TsdDataRecord);
  271. var
  272. ARec: TDetailGLRecord;
  273. begin
  274. if ARecord.ValueByName('Quantity').AsFloat <> 0 then
  275. begin
  276. ARec := TDetailGLRecord(ARecord);
  277. // 更新调差工料--本期价差
  278. with TProjectData(FProjectData).ProjectGLData do
  279. CalculateGL_PM(ARec.GLID.AsInteger);
  280. // 更新清单调差数据,材料调差节点数据
  281. with TProjectData(FProjectData).PhaseData.StageData do
  282. begin
  283. CalculatePriceMargin(ARec.BillsID.AsInteger);
  284. CalculatePriceMarginNode;
  285. end;
  286. // 更新价差清单内存表信息
  287. with TProjectData(FProjectData).PriceMarginBillsData do
  288. RefreshDetailBills(ARec.BillsID.AsInteger);
  289. // 更新合同支付
  290. TProjectData(FProjectData).PhaseData.PhasePayData.CalculateAll;
  291. end;
  292. end;
  293. procedure TPriceMarginBillsData.sdvGclBillsGetText(var Text: String;
  294. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  295. DisplayText: Boolean);
  296. procedure GetDisplayText;
  297. begin
  298. if ((Pos('Price', AColumn.FieldName) > 0) or
  299. (Pos('Quantity', AColumn.FieldName) > 0)) then
  300. begin
  301. if AValue.AsFloat = 0 then
  302. Text := '';
  303. end;
  304. end;
  305. begin
  306. if DisplayText then
  307. GetDisplayText;
  308. end;
  309. procedure TPriceMarginBillsData.RefreshAllDetailBills;
  310. var
  311. i: Integer;
  312. Rec: TsdDataRecord;
  313. StageRec: TStageRecord;
  314. begin
  315. for i := 0 to sddDetailGclBills.RecordCount - 1 do
  316. begin
  317. Rec := sddDetailGclBills.Records[i];
  318. with TProjectData(FProjectData).PhaseData.StageData do
  319. StageRec := StageRecord(Rec.ValueByName('RelaBillsID').AsInteger);
  320. if Assigned(StageRec) then
  321. Rec.ValueByName('PM_TotalPrice').AsFloat := StageRec.PM_TotalPrice.AsFloat
  322. else
  323. Rec. ValueByName('PM_TotalPrice').AsFloat := 0;
  324. end;
  325. end;
  326. end.