PriceMarginBillsDm.pas 12 KB

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