LeafXmjGlDm.pas 11 KB

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