LeafXmjGlDm.pas 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. unit LeafXmjGlDm;
  2. interface
  3. uses
  4. SysUtils, Classes, ADODB, sdDB, sdProvider, mDataRecord;
  5. type
  6. TLeafXmjGlData = class(TDataModule)
  7. sdpLeafXmjGL: TsdADOProvider;
  8. sddLeafXmjGL: TsdDataSet;
  9. sdvLeafXmjGL: TsdDataView;
  10. smpLeafXmj: TsdMemoryProvider;
  11. sddLeafXmj: TsdDataSet;
  12. sdvLeafXmj: TsdDataView;
  13. procedure sdvLeafXmjCurrentChanged(ARecord: TsdDataRecord);
  14. procedure sddLeafXmjGLGetRecordClass(var ARecordClass: TsdRecordClass);
  15. procedure sdvLeafXmjGLSetText(var Text: String; ARecord: TsdDataRecord;
  16. AValue: TsdValue; AColumn: TsdViewColumn; var Allow: Boolean);
  17. procedure sdvLeafXmjGLGetText(var Text: String; ARecord: TsdDataRecord;
  18. AValue: TsdValue; AColumn: TsdViewColumn; DisplayText: Boolean);
  19. private
  20. FProjectData: TObject;
  21. function GetNewLeafXmjGlID: Integer;
  22. public
  23. constructor Create(AProjectData: TObject);
  24. destructor Destroy; override;
  25. procedure Open(AConnetion: TADOConnection);
  26. procedure Save;
  27. procedure RefreshLeafXmj;
  28. procedure ResetPhaseStageLink;
  29. procedure ResetRecordLink;
  30. procedure CalclateRec(ARec: TsdDataRecord);
  31. procedure CalculateLeafXmjGL(AXmjID, AGLID: Integer);
  32. procedure CalculateLeafXmj(AXmjID: Integer);
  33. procedure CalcluateGL(AGLID: Integer);
  34. function LeafXmjGLRec(AXmjID, AGLID: Integer): TLeafXmjGlRecord;
  35. function CheckWithoutUsedQuantity(AIndex: Integer): Boolean;
  36. procedure LoadLeafXmjGLs(AGLID: Integer; vGLs: TList);
  37. function AddLeafXmjGl(AXmjID, AGLID: Integer): TLeafXmjGlRecord;
  38. procedure DeleteLeafXmjGl(AXmjID, AGLID: Integer);
  39. property ProjectData: TObject read FProjectData;
  40. end;
  41. implementation
  42. uses
  43. ProjectData, BillsCompileDm, BillsTree, sdIDTree, GclBillsGatherModel,
  44. UtilMethods, PhaseData, StageLeafXmjGlDm, Variants, DB;
  45. {$R *.dfm}
  46. { TLeafXmjGlData }
  47. function TLeafXmjGlData.AddLeafXmjGl(AXmjID,
  48. AGLID: Integer): TLeafXmjGlRecord;
  49. begin
  50. Result := TLeafXmjGlRecord(sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID])));
  51. if not Assigned(Result) then
  52. begin
  53. //Result := TLeafXmjGlRecord(sddLeafXmjGL.Add(True));
  54. Result := TLeafXmjGlRecord(sddLeafXmjGL.Add);
  55. Result.ID.AsInteger := GetNewLeafXmjGlID;
  56. Result.XmjID.AsInteger := AXmjID;
  57. Result.GLID.AsInteger := AGLID;
  58. //Result.EndUpdate;
  59. with TProjectData(FProjectData).PhaseData.StageLeafXmjGlData do
  60. Result.StageRec := StageLeafXmjGlRecord(Result.ID.AsInteger);
  61. end;
  62. end;
  63. procedure TLeafXmjGlData.CalclateRec(ARec: TsdDataRecord);
  64. begin
  65. with TProjectData(FProjectData).PhaseData do
  66. if Assigned(ARec) and Active then
  67. StageLeafXmjGlData.Calculate(ARec.ValueByName('ID').AsInteger);
  68. end;
  69. procedure TLeafXmjGlData.CalcluateGL(AGLID: Integer);
  70. var
  71. idx: TsdIndex;
  72. iRec, iFirst, iLast: Integer;
  73. Rec: TsdDataRecord;
  74. begin
  75. idx := sddLeafXmjGL.FindIndex('idxGl');
  76. iFirst := idx.FindKeyIndex(AGLID);
  77. iLast := idx.FindKeyLastIndex(AGLID);
  78. if iFirst = -1 then Exit;
  79. for iRec := iFirst to iLast do
  80. begin
  81. Rec := idx.Records[iRec];
  82. CalclateRec(Rec);
  83. end;
  84. end;
  85. procedure TLeafXmjGlData.CalculateLeafXmj(AXmjID: Integer);
  86. var
  87. idx: TsdIndex;
  88. iRec, iFirst, iLast: Integer;
  89. Rec: TsdDataRecord;
  90. begin
  91. idx := sddLeafXmjGL.FindIndex('idxXmj');
  92. iFirst := idx.FindKeyIndex(AXmjID);
  93. iLast := idx.FindKeyLastIndex(AXmjID);
  94. if iFirst = -1 then Exit;
  95. for iRec := iFirst to iLast do
  96. begin
  97. Rec := idx.Records[iRec];
  98. CalclateRec(Rec);
  99. end;
  100. end;
  101. procedure TLeafXmjGlData.CalculateLeafXmjGL(AXmjID, AGLID: Integer);
  102. var
  103. Rec: TsdDataRecord;
  104. begin
  105. Rec := sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID]));
  106. CalclateRec(Rec);
  107. end;
  108. constructor TLeafXmjGlData.Create(AProjectData: TObject);
  109. begin
  110. inherited Create(nil);
  111. FProjectData := AProjectData;
  112. sdvLeafXmjGL.Columns.FindColumn('Code').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  113. sdvLeafXmjGL.Columns.FindColumn('Name').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  114. sdvLeafXmjGL.Columns.FindColumn('Units').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  115. sdvLeafXmjGL.Columns.FindColumn('Specs').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  116. end;
  117. procedure TLeafXmjGlData.DeleteLeafXmjGl(AXmjID, AGLID: Integer);
  118. var
  119. Rec: TsdDataRecord;
  120. begin
  121. Rec := sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID]));
  122. if Assigned(Rec) then
  123. begin
  124. with TProjectData(FProjectData).PhaseData do
  125. StageLeafXmjGlData.DeleteLeafXmjGLRecord(Rec.ValueByName('ID').AsInteger);
  126. sddLeafXmjGL.Remove(Rec);
  127. end;
  128. end;
  129. destructor TLeafXmjGlData.Destroy;
  130. begin
  131. inherited;
  132. end;
  133. function TLeafXmjGlData.GetNewLeafXmjGlID: Integer;
  134. var
  135. vIdx: TsdIndex;
  136. begin
  137. vIdx := sddLeafXmjGL.FindIndex('idxID');
  138. if vIdx.RecordCount > 0 then
  139. Result := vIdx.Records[vIdx.RecordCount - 1].ValueByName('ID').AsInteger + 1
  140. else
  141. Result := 0;
  142. end;
  143. procedure TLeafXmjGlData.Open(AConnetion: TADOConnection);
  144. begin
  145. sddLeafXmj.Open;
  146. if not Assigned(sddLeafXmj.FindIndex('idxID')) then
  147. sddLeafXmj.AddIndex('idxID', 'ID');
  148. if not Assigned(sddLeafXmj.FindIndex('idxSerial')) then
  149. sddLeafXmj.AddIndex('idxSerial', 'SerialNo');
  150. sdvLeafXmj.Open;
  151. sdvLeafXmj.IndexName := 'idxSerial';
  152. sdpLeafXmjGL.Connection := AConnetion;
  153. sddLeafXmjGL.Open;
  154. if not Assigned(sddLeafXmjGL.FindIndex('idxID')) then
  155. sddLeafXmjGL.AddIndex('idxID', 'ID');
  156. if not Assigned(sddLeafXmjGL.FindIndex('idxView')) then
  157. sddLeafXmjGL.AddIndex('idxView', 'XmjID;GLID');
  158. if not Assigned(sddLeafXmjGL.FindIndex('idxXmj')) then
  159. sddLeafXmjGL.AddIndex('idxXmj', 'XmjID');
  160. if not Assigned(sddLeafXmjGL.FindIndex('idxGL')) then
  161. sddLeafXmjGL.AddIndex('idxGL', 'GLID');
  162. sdvLeafXmjGL.Open;
  163. sdvLeafXmjGL.IndexName := 'idxView';
  164. end;
  165. procedure TLeafXmjGlData.RefreshLeafXmj;
  166. function CheckLeafXmj(ANode: TBillsIDTreeNode): Boolean;
  167. var
  168. iChild: Integer;
  169. vChild: TBillsIDTreeNode;
  170. begin
  171. Result := False;
  172. if not Assigned(ANode) then Exit;
  173. if ANode.Rec.B_Code.AsString = '' then
  174. begin
  175. if ANode.HasChildren then
  176. begin
  177. for iChild := 0 to ANode.ChildCount - 1 do
  178. begin
  179. vChild := TBillsIDTreeNode(ANode.ChildNodes[iChild]);
  180. if vChild.Rec.B_Code.AsString <> '' then
  181. begin
  182. Result := True;
  183. Break;
  184. end;
  185. end;
  186. end
  187. else
  188. Result := False;
  189. end
  190. else
  191. Result := False;
  192. end;
  193. function CheckFilterLeafXmj(ANode: TBillsIDTreeNode): Boolean;
  194. function CheckExist: Boolean;
  195. begin
  196. Result := Assigned(sddLeafXmjGL.FindKey('idxXmj', ANode.ID));
  197. end;
  198. function CheckCur: Boolean;
  199. var
  200. vIdx: TsdIndex;
  201. iRec, iBegin, iEnd: Integer;
  202. Rec: TLeafXmjGlRecord;
  203. StageRec: TStageLeafXmjGlRecord;
  204. begin
  205. Result := False;
  206. vIdx := sddLeafXmjGL.FindIndex('idxXmj');
  207. iBegin := vIdx.FindKeyIndex(ANode.ID);
  208. iEnd := vIdx.FindKeyLastIndex(ANode.ID);
  209. if iBegin >= 0 then
  210. begin
  211. for iRec := iBegin to iEnd do
  212. begin
  213. Rec := TLeafXmjGlRecord(vIdx.Records[iRec]);
  214. StageRec := TStageLeafXmjGlRecord(Rec.StageRec);
  215. if Assigned(StageRec) and (StageRec.Quantity.AsFloat <> 0) then
  216. begin
  217. Result := True;
  218. Break;
  219. end;
  220. end;
  221. end;
  222. end;
  223. function CheckEnd: Boolean;
  224. var
  225. vIdx: TsdIndex;
  226. iRec, iBegin, iEnd: Integer;
  227. Rec: TLeafXmjGlRecord;
  228. StageRec: TStageLeafXmjGlRecord;
  229. begin
  230. Result := False;
  231. vIdx := sddLeafXmjGL.FindIndex('idxXmj');
  232. iBegin := vIdx.FindKeyIndex(ANode.ID);
  233. iEnd := vIdx.FindKeyLastIndex(ANode.ID);
  234. if iBegin >= 0 then
  235. begin
  236. for iRec := iBegin to iEnd do
  237. begin
  238. Rec := TLeafXmjGlRecord(vIdx.Records[iRec]);
  239. StageRec := TStageLeafXmjGlRecord(Rec.StageRec);
  240. if Assigned(StageRec) and (StageRec.EndQuantity.AsFloat <> 0) then
  241. begin
  242. Result := True;
  243. Break;
  244. end;
  245. end;
  246. end;
  247. end;
  248. begin
  249. case TProjectData(FProjectData).ProjProperties.LeafXmjGlFilterType of
  250. 0: Result := CheckExist;
  251. 1: Result := CheckCur;
  252. 2: Result := CheckEnd;
  253. end;
  254. end;
  255. function GetPegNode(ANode: TBillsIDTreeNode): TBillsIDTreeNode;
  256. begin
  257. Result := nil;
  258. if not Assigned(ANode) then Exit;
  259. if CheckPeg(ANode.Rec.Name.AsString) then
  260. Result := ANode
  261. else
  262. Result := GetPegNode(TBillsIDTreeNode(ANode.Parent));
  263. end;
  264. procedure AddLeafXmj(ANode: TBillsIDTreeNode; ASerialNo: Integer);
  265. var
  266. Rec: TsdDataRecord;
  267. vPeg: TBillsIDTreeNode;
  268. vLeafXmj: TLeafXmjNode;
  269. begin
  270. vPeg := GetPegNode(ANode);
  271. vLeafXmj := TLeafXmjNode.Create(ANode, vPeg);
  272. try
  273. Rec := sddLeafXmj.Add;
  274. Rec.ValueByName('ID').AsInteger := ANode.ID;
  275. Rec.ValueByName('SerialNo').AsInteger := ASerialNo;
  276. Rec.ValueByName('Code').AsString := vLeafXmj.XmjCode;
  277. Rec.ValueByName('Name').AsString := vLeafXmj.XmjName;
  278. Rec.ValueByName('Units').AsString := vLeafXmj.XmjUnits;
  279. Rec.ValueByName('NameDanWei').AsString := vLeafXmj.NameDanWei;
  280. Rec.ValueByName('NameFenBu').AsString := vLeafXmj.NameFenBu;
  281. Rec.ValueByName('NameFenXiang').AsString := vLeafXmj.NameFenXiang;
  282. Rec.ValueByName('NameUnit').AsString := vLeafXmj.NameUnit;
  283. Rec.ValueByName('Peg').AsString := vLeafXmj.Peg;
  284. Rec.ValueByName('Position').AsString := vLeafXmj.Position;
  285. Rec.ValueByName('DrawingCode').AsString := vLeafXmj.DrawingCode;
  286. finally
  287. vLeafXmj.Free;
  288. end;
  289. end;
  290. var
  291. iNode: Integer;
  292. vNode: TBillsIDTreeNode;
  293. iBookMarkID: Integer;
  294. begin
  295. if Assigned(sdvLeafXmj.Current) then
  296. iBookMarkID := sdvLeafXmj.Current.ValueByName('ID').AsInteger
  297. else
  298. iBookMarkID := -1;
  299. sddLeafXmj.BeginUpdate;
  300. sddLeafXmj.DisableControls;
  301. try
  302. sddLeafXmj.DeleteAll;
  303. with TProjectData(FProjectData).BillsCompileData do
  304. begin
  305. for iNode := 0 to BillsCompileTree.Count - 1 do
  306. begin
  307. vNode := TBillsIDTreeNode(BillsCompileTree.Items[iNode]);
  308. if CheckLeafXmj(vNode) and CheckFilterLeafXmj(vNode) then
  309. AddLeafXmj(vNode, iNode);
  310. end;
  311. end;
  312. finally
  313. sddLeafXmj.EnableControls;
  314. sddLeafXmj.EndUpdate;
  315. if iBookMarkID <> -1 then
  316. begin
  317. if Assigned(sddLeafXmj.FindKey('idxID', iBookMarkID)) then
  318. sdvLeafXmj.LocateInControl(sddLeafXmj.FindKey('idxID', iBookMarkID))
  319. else if sddLeafXmj.RecordCount > 0 then
  320. sdvLeafXmj.LocateInControl(sddLeafXmj.Records[0]);
  321. end
  322. else if sddLeafXmj.RecordCount > 0 then
  323. sdvLeafXmj.LocateInControl(sddLeafXmj.Records[0]);
  324. end;
  325. end;
  326. procedure TLeafXmjGlData.ResetPhaseStageLink;
  327. begin
  328. with TProjectData(FProjectData).PhaseData do
  329. begin
  330. sdvLeafXmjGL.Columns.FindColumn('Quantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  331. sdvLeafXmjGL.Columns.FindColumn('UsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  332. sdvLeafXmjGL.Columns.FindColumn('PAL_UsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  333. sdvLeafXmjGL.Columns.FindColumn('PAL_UsedTotalPrice').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  334. sdvLeafXmjGL.Columns.FindColumn('PAL_DeltaPrice').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  335. sdvLeafXmjGL.Columns.FindColumn('PAL_Total').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  336. sdvLeafXmjGL.Columns.FindColumn('EndQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  337. sdvLeafXmjGL.Columns.FindColumn('EndUsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  338. end;
  339. end;
  340. procedure TLeafXmjGlData.ResetRecordLink;
  341. var
  342. i: Integer;
  343. Rec: TLeafXmjGlRecord;
  344. begin
  345. for i := 0 to sddLeafXmjGL.RecordCount - 1 do
  346. begin
  347. Rec := TLeafXmjGlRecord(sddLeafXmjGL.Records[i]);
  348. with TProjectData(FProjectData).PhaseData.StageLeafXmjGlData do
  349. Rec.StageRec := StageLeafXmjGlRecord(Rec.ID.AsInteger);
  350. end;
  351. end;
  352. procedure TLeafXmjGlData.Save;
  353. begin
  354. sddLeafXmjGL.Save;
  355. end;
  356. procedure TLeafXmjGlData.sdvLeafXmjCurrentChanged(ARecord: TsdDataRecord);
  357. begin
  358. if Assigned(ARecord) then
  359. sdvLeafXmjGL.SetRange([ARecord.ValueByName('ID').AsInteger], [ARecord.ValueByName('ID').AsInteger]);
  360. end;
  361. procedure TLeafXmjGlData.sddLeafXmjGLGetRecordClass(
  362. var ARecordClass: TsdRecordClass);
  363. begin
  364. ARecordClass := TLeafXmjGlRecord;
  365. end;
  366. function TLeafXmjGlData.LeafXmjGLRec(AXmjID,
  367. AGLID: Integer): TLeafXmjGlRecord;
  368. begin
  369. Result := TLeafXmjGlRecord(sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID])));
  370. end;
  371. procedure TLeafXmjGlData.LoadLeafXmjGLs(AGLID: Integer; vGLs: TList);
  372. var
  373. idx: TsdIndex;
  374. iRec, iFirst, iLast: Integer;
  375. Rec: TsdDataRecord;
  376. begin
  377. idx := sddLeafXmjGL.FindIndex('idxGl');
  378. iFirst := idx.FindKeyIndex(AGLID);
  379. iLast := idx.FindKeyLastIndex(AGLID);
  380. if iFirst = -1 then Exit;
  381. for iRec := iFirst to iLast do
  382. vGLs.Add(idx.Records[iRec]);
  383. end;
  384. procedure TLeafXmjGlData.sdvLeafXmjGLSetText(var Text: String;
  385. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  386. var Allow: Boolean);
  387. begin
  388. if SameText(AColumn.FieldName, 'UsedQuantity') then
  389. begin
  390. if (Text <> AValue.AsString) and (Text <> '') then
  391. begin
  392. with TProjectData(FProjectData).PhaseData.StageLeafXmjGlData do
  393. Text := FloatToStr(Decimal.Quantity.RoundTo(StrToFloatDef(Text, 0)));
  394. end;
  395. end;
  396. end;
  397. procedure TLeafXmjGlData.sdvLeafXmjGLGetText(var Text: String;
  398. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  399. DisplayText: Boolean);
  400. procedure GetDisplayText;
  401. begin
  402. if AValue.Field.DataType = ftFloat then
  403. begin
  404. if AValue.AsFloat = 0 then
  405. Text := '';
  406. end;
  407. end;
  408. begin
  409. if DisplayText then
  410. GetDisplayText;
  411. end;
  412. function TLeafXmjGlData.CheckWithoutUsedQuantity(AIndex: Integer): Boolean;
  413. var
  414. vRec: TsdDataRecord;
  415. vIdx: TsdIndex;
  416. iRec, iFirst, iLast: Integer;
  417. Rec: TLeafXmjGlRecord;
  418. StageRec: TStageLeafXmjGlRecord;
  419. begin
  420. Result := False;
  421. if AIndex < sddLeafXmj.RecordCount then
  422. begin
  423. vRec := sddLeafXmj.Records[AIndex];
  424. vIdx := sddLeafXmjGL.FindIndex('idxXmj');
  425. iFirst := vIdx.FindKeyIndex(vRec.ValueByName('ID').AsInteger);
  426. iLast := vIdx.FindKeyLastIndex(vRec.ValueByName('ID').AsInteger);
  427. if iFirst >= 0 then
  428. begin
  429. for iRec := iFirst to iLast do
  430. begin
  431. Rec := TLeafXmjGlRecord(vIdx.Records[iRec]);
  432. StageRec := TStageLeafXmjGlRecord(Rec.StageRec);
  433. if Assigned(StageRec) and (StageRec.Quantity.AsFloat <> 0) and (StageRec.UsedQuantity.AsFloat = 0) then
  434. begin
  435. Result := True;
  436. Break;
  437. end;
  438. end;
  439. end;
  440. end;
  441. end;
  442. end.