PriceMarginBillsDm.pas 10 KB

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