LeafXmjGlDm.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. private
  16. FProjectData: TObject;
  17. function GetNewLeafXmjGlID: Integer;
  18. public
  19. constructor Create(AProjectData: TObject);
  20. destructor Destroy; override;
  21. procedure Open(AConnetion: TADOConnection);
  22. procedure Save;
  23. procedure RefreshLeafXmj;
  24. procedure ResetPhaseStageLink;
  25. procedure ResetRecordLink;
  26. procedure CalclateRec(ARec: TsdDataRecord);
  27. procedure CalculateLeafXmjGL(AXmjID, AGLID: Integer);
  28. procedure CalculateLeafXmj(AXmjID: Integer);
  29. procedure CalcluateGL(AGLID: Integer);
  30. function LeafXmjGLRec(AXmjID, AGLID: Integer): TLeafXmjGlRecord;
  31. procedure LoadLeafXmjGLs(AGLID: Integer; vGLs: TList);
  32. function AddLeafXmjGl(AXmjID, AGLID: Integer): TLeafXmjGlRecord;
  33. procedure DeleteLeafXmjGl(AXmjID, AGLID: Integer);
  34. end;
  35. implementation
  36. uses
  37. ProjectData, BillsCompileDm, BillsTree, sdIDTree, GclBillsGatherModel,
  38. UtilMethods, PhaseData, StageLeafXmjGlDm, Variants;
  39. {$R *.dfm}
  40. { TLeafXmjGlData }
  41. function TLeafXmjGlData.AddLeafXmjGl(AXmjID,
  42. AGLID: Integer): TLeafXmjGlRecord;
  43. begin
  44. Result := TLeafXmjGlRecord(sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID])));
  45. if not Assigned(Result) then
  46. begin
  47. //Result := TLeafXmjGlRecord(sddLeafXmjGL.Add(True));
  48. Result := TLeafXmjGlRecord(sddLeafXmjGL.Add);
  49. Result.ID.AsInteger := GetNewLeafXmjGlID;
  50. Result.XmjID.AsInteger := AXmjID;
  51. Result.GLID.AsInteger := AGLID;
  52. //Result.EndUpdate;
  53. with TProjectData(FProjectData).PhaseData.StageLeafXmjGlData do
  54. Result.StageRec := StageLeafXmjGlRecord(Result.ID.AsInteger);
  55. end;
  56. end;
  57. procedure TLeafXmjGlData.CalclateRec(ARec: TsdDataRecord);
  58. begin
  59. with TProjectData(FProjectData).PhaseData do
  60. if Assigned(ARec) and Active then
  61. StageLeafXmjGlData.Calculate(ARec.ValueByName('ID').AsInteger);
  62. end;
  63. procedure TLeafXmjGlData.CalcluateGL(AGLID: Integer);
  64. var
  65. idx: TsdIndex;
  66. iRec, iFirst, iLast: Integer;
  67. Rec: TsdDataRecord;
  68. begin
  69. idx := sddLeafXmjGL.FindIndex('idxGl');
  70. iFirst := idx.FindKeyIndex(AGLID);
  71. iLast := idx.FindKeyLastIndex(AGLID);
  72. if iFirst = -1 then Exit;
  73. for iRec := iFirst to iLast do
  74. begin
  75. Rec := idx.Records[iRec];
  76. CalclateRec(Rec);
  77. end;
  78. end;
  79. procedure TLeafXmjGlData.CalculateLeafXmj(AXmjID: Integer);
  80. var
  81. idx: TsdIndex;
  82. iRec, iFirst, iLast: Integer;
  83. Rec: TsdDataRecord;
  84. begin
  85. idx := sddLeafXmjGL.FindIndex('idxXmj');
  86. iFirst := idx.FindKeyIndex(AXmjID);
  87. iLast := idx.FindKeyLastIndex(AXmjID);
  88. if iFirst = -1 then Exit;
  89. for iRec := iFirst to iLast do
  90. begin
  91. Rec := idx.Records[iRec];
  92. CalclateRec(Rec);
  93. end;
  94. end;
  95. procedure TLeafXmjGlData.CalculateLeafXmjGL(AXmjID, AGLID: Integer);
  96. var
  97. Rec: TsdDataRecord;
  98. begin
  99. Rec := sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID]));
  100. CalclateRec(Rec);
  101. end;
  102. constructor TLeafXmjGlData.Create(AProjectData: TObject);
  103. begin
  104. inherited Create(nil);
  105. FProjectData := AProjectData;
  106. sdvLeafXmjGL.Columns.FindColumn('Code').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  107. sdvLeafXmjGL.Columns.FindColumn('Name').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  108. sdvLeafXmjGL.Columns.FindColumn('Units').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  109. sdvLeafXmjGL.Columns.FindColumn('Specs').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  110. end;
  111. procedure TLeafXmjGlData.DeleteLeafXmjGl(AXmjID, AGLID: Integer);
  112. var
  113. Rec: TsdDataRecord;
  114. begin
  115. Rec := sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID]));
  116. if Assigned(Rec) then
  117. begin
  118. with TProjectData(FProjectData).PhaseData do
  119. StageLeafXmjGlData.DeleteLeafXmjGLRecord(Rec.ValueByName('ID').AsInteger);
  120. sddLeafXmjGL.Remove(Rec);
  121. end;
  122. end;
  123. destructor TLeafXmjGlData.Destroy;
  124. begin
  125. inherited;
  126. end;
  127. function TLeafXmjGlData.GetNewLeafXmjGlID: Integer;
  128. var
  129. vIdx: TsdIndex;
  130. begin
  131. vIdx := sddLeafXmjGL.FindIndex('idxID');
  132. if vIdx.RecordCount > 0 then
  133. Result := vIdx.Records[vIdx.RecordCount - 1].ValueByName('ID').AsInteger + 1
  134. else
  135. Result := 0;
  136. end;
  137. procedure TLeafXmjGlData.Open(AConnetion: TADOConnection);
  138. begin
  139. sddLeafXmj.Open;
  140. if not Assigned(sddLeafXmj.FindIndex('idxID')) then
  141. sddLeafXmj.AddIndex('idxID', 'ID');
  142. if not Assigned(sddLeafXmj.FindIndex('idxSerial')) then
  143. sddLeafXmj.AddIndex('idxSerial', 'SerialNo');
  144. sdvLeafXmj.Open;
  145. sdvLeafXmj.IndexName := 'idxSerial';
  146. sdpLeafXmjGL.Connection := AConnetion;
  147. sddLeafXmjGL.Open;
  148. if not Assigned(sddLeafXmjGL.FindIndex('idxID')) then
  149. sddLeafXmjGL.AddIndex('idxID', 'ID');
  150. if not Assigned(sddLeafXmjGL.FindIndex('idxView')) then
  151. sddLeafXmjGL.AddIndex('idxView', 'XmjID;GLID');
  152. if not Assigned(sddLeafXmjGL.FindIndex('idxXmj')) then
  153. sddLeafXmjGL.AddIndex('idxXmj', 'XmjID');
  154. if not Assigned(sddLeafXmjGL.FindIndex('idxGL')) then
  155. sddLeafXmjGL.AddIndex('idxGL', 'GLID');
  156. sdvLeafXmjGL.Open;
  157. sdvLeafXmjGL.IndexName := 'idxView';
  158. end;
  159. procedure TLeafXmjGlData.RefreshLeafXmj;
  160. function CheckLeafXmj(ANode: TBillsIDTreeNode): Boolean;
  161. var
  162. iChild: Integer;
  163. vChild: TBillsIDTreeNode;
  164. begin
  165. Result := False;
  166. if not Assigned(ANode) then Exit;
  167. if ANode.Rec.B_Code.AsString = '' then
  168. begin
  169. if ANode.HasChildren then
  170. begin
  171. for iChild := 0 to ANode.ChildCount - 1 do
  172. begin
  173. vChild := TBillsIDTreeNode(ANode.ChildNodes[iChild]);
  174. if vChild.Rec.B_Code.AsString <> '' then
  175. begin
  176. Result := True;
  177. Break;
  178. end;
  179. end;
  180. end
  181. else
  182. Result := False;
  183. end
  184. else
  185. Result := False;
  186. end;
  187. function GetPegNode(ANode: TBillsIDTreeNode): TBillsIDTreeNode;
  188. begin
  189. Result := nil;
  190. if not Assigned(ANode) then Exit;
  191. if CheckPeg(ANode.Rec.Name.AsString) then
  192. Result := ANode
  193. else
  194. Result := GetPegNode(TBillsIDTreeNode(ANode.Parent));
  195. end;
  196. procedure AddLeafXmj(ANode: TBillsIDTreeNode; ASerialNo: Integer);
  197. var
  198. Rec: TsdDataRecord;
  199. vPeg: TBillsIDTreeNode;
  200. vLeafXmj: TLeafXmjNode;
  201. begin
  202. vPeg := GetPegNode(ANode);
  203. vLeafXmj := TLeafXmjNode.Create(ANode, vPeg);
  204. try
  205. Rec := sddLeafXmj.Add;
  206. Rec.ValueByName('ID').AsInteger := ANode.ID;
  207. Rec.ValueByName('SerialNo').AsInteger := ASerialNo;
  208. Rec.ValueByName('Code').AsString := vLeafXmj.XmjCode;
  209. Rec.ValueByName('Name').AsString := vLeafXmj.XmjName;
  210. Rec.ValueByName('Units').AsString := vLeafXmj.XmjUnits;
  211. Rec.ValueByName('NameDanWei').AsString := vLeafXmj.NameDanWei;
  212. Rec.ValueByName('NameFenBu').AsString := vLeafXmj.NameFenBu;
  213. Rec.ValueByName('NameFenXiang').AsString := vLeafXmj.NameFenXiang;
  214. Rec.ValueByName('NameUnit').AsString := vLeafXmj.NameUnit;
  215. Rec.ValueByName('Peg').AsString := vLeafXmj.Peg;
  216. Rec.ValueByName('Position').AsString := vLeafXmj.Position;
  217. Rec.ValueByName('DrawingCode').AsString := vLeafXmj.DrawingCode;
  218. finally
  219. vLeafXmj.Free;
  220. end;
  221. end;
  222. var
  223. iNode: Integer;
  224. vNode: TBillsIDTreeNode;
  225. begin
  226. sddLeafXmj.BeginUpdate;
  227. sddLeafXmj.DisableControls;
  228. try
  229. sddLeafXmj.DeleteAll;
  230. with TProjectData(FProjectData).BillsCompileData do
  231. begin
  232. for iNode := 0 to BillsCompileTree.Count - 1 do
  233. begin
  234. vNode := TBillsIDTreeNode(BillsCompileTree.Items[iNode]);
  235. if CheckLeafXmj(vNode) then
  236. AddLeafXmj(vNode, iNode);
  237. end;
  238. end;
  239. finally
  240. sddLeafXmj.EnableControls;
  241. sddLeafXmj.EndUpdate;
  242. end;
  243. end;
  244. procedure TLeafXmjGlData.ResetPhaseStageLink;
  245. begin
  246. with TProjectData(FProjectData).PhaseData do
  247. begin
  248. sdvLeafXmjGL.Columns.FindColumn('Quantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  249. sdvLeafXmjGL.Columns.FindColumn('UsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  250. sdvLeafXmjGL.Columns.FindColumn('PAL_UsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  251. sdvLeafXmjGL.Columns.FindColumn('PAL_UsedTotalPrice').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  252. sdvLeafXmjGL.Columns.FindColumn('PAL_DeltaPrice').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  253. sdvLeafXmjGL.Columns.FindColumn('PAL_Total').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  254. sdvLeafXmjGL.Columns.FindColumn('EndQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  255. sdvLeafXmjGL.Columns.FindColumn('EndUsedQuantity').LookupDataSet := StageLeafXmjGlData.sddStageLeafXmjGl;
  256. end;
  257. end;
  258. procedure TLeafXmjGlData.ResetRecordLink;
  259. var
  260. i: Integer;
  261. Rec: TLeafXmjGlRecord;
  262. begin
  263. for i := 0 to sddLeafXmjGL.RecordCount - 1 do
  264. begin
  265. Rec := TLeafXmjGlRecord(sddLeafXmjGL.Records[i]);
  266. with TProjectData(FProjectData).PhaseData.StageLeafXmjGlData do
  267. Rec.StageRec := StageLeafXmjGlRecord(Rec.ID.AsInteger);
  268. end;
  269. end;
  270. procedure TLeafXmjGlData.Save;
  271. begin
  272. sddLeafXmjGL.Save;
  273. end;
  274. procedure TLeafXmjGlData.sdvLeafXmjCurrentChanged(ARecord: TsdDataRecord);
  275. begin
  276. if Assigned(ARecord) then
  277. sdvLeafXmjGL.SetRange([ARecord.ValueByName('ID').AsInteger], [ARecord.ValueByName('ID').AsInteger]);
  278. end;
  279. procedure TLeafXmjGlData.sddLeafXmjGLGetRecordClass(
  280. var ARecordClass: TsdRecordClass);
  281. begin
  282. ARecordClass := TLeafXmjGlRecord;
  283. end;
  284. function TLeafXmjGlData.LeafXmjGLRec(AXmjID,
  285. AGLID: Integer): TLeafXmjGlRecord;
  286. begin
  287. Result := TLeafXmjGlRecord(sddLeafXmjGL.FindKey('idxView', VarArrayOf([AXmjID, AGLID])));
  288. end;
  289. procedure TLeafXmjGlData.LoadLeafXmjGLs(AGLID: Integer; vGLs: TList);
  290. var
  291. idx: TsdIndex;
  292. iRec, iFirst, iLast: Integer;
  293. Rec: TsdDataRecord;
  294. begin
  295. idx := sddLeafXmjGL.FindIndex('idxGl');
  296. iFirst := idx.FindKeyIndex(AGLID);
  297. iLast := idx.FindKeyLastIndex(AGLID);
  298. if iFirst = -1 then Exit;
  299. for iRec := iFirst to iLast do
  300. vGLs.Add(idx.Records[iRec]);
  301. end;
  302. end.