ZJJLDm.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. unit ZJJLDm;
  2. interface
  3. uses
  4. ZjGrid,
  5. SysUtils, Classes, DB, DBClient, ADODB, sdIDTree, sdDB, Provider,
  6. Windows, BillsTree, sdProvider, Variants;
  7. type
  8. TZJJLType = (ztFx, ztGcl);
  9. TZJJLNode = class
  10. private
  11. FBillsID: Integer;
  12. FCode: string;
  13. FCertificateCode: string;
  14. FBillsCode: string;
  15. FFormulaMemo: string;
  16. FRelaFile: string;
  17. FType: Integer;
  18. end;
  19. TZJJLInfoRec = Record
  20. FBFXName: string;
  21. PegName: string;
  22. BeginPeg: string;
  23. EndPeg: string;
  24. BGLCode: string;
  25. DrawingCode: string;
  26. UnitName: string;
  27. end;
  28. TZJJLData = class(TDataModule)
  29. sdpZJJL: TsdADOProvider;
  30. sddZJJL: TsdDataSet;
  31. sdvZJJL: TsdDataView;
  32. sdpHistory: TsdADOProvider;
  33. sddHistory: TsdDataSet;
  34. procedure sdvZJJLBeforeValueChange(AValue: TsdValue;
  35. const NewValue: Variant; var Allow: Boolean);
  36. procedure sdvZJJLAfterDeleteRecord(ARecord: TsdDataRecord);
  37. private
  38. FPhaseData: TObject;
  39. FCanModified: Boolean;
  40. FNewID: Integer;
  41. FOrgDataList: TList;
  42. procedure GenerateZJJLNode(ANode: TsdIDTreeNode; AType: Integer);
  43. function CheckLastXmj(AID: Integer): Boolean;
  44. function CheckBGExist(ANode: TsdIDTreeNode): Boolean;
  45. function CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
  46. procedure GenerateLastXmj(ANode: TsdIDTreeNode);
  47. procedure GenerateNode(ANode: TsdIDTreeNode);
  48. procedure GenerateLeafNode(ANode: TsdIDTreeNode);
  49. procedure GenerateNodeByB_Code(ANode: TsdIDTreeNode);
  50. procedure DeleteAll;
  51. procedure RestoreOrgData;
  52. procedure DeleteHistory(ABillsID, AType: Integer);
  53. procedure DetailGridCellCanEdit(Sender: TObject; const ACoord: TPoint;
  54. var Allow: Boolean);
  55. procedure DetailGridCellTextChanged(Sender: TObject; Col, Row: Integer);
  56. function GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName, ADef: string): string;
  57. function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  58. function GetBGLCode(ANode: TsdIDTreeNode): string;
  59. // 取树结构的第ALevel层节点的名称(level从0开始)
  60. function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;
  61. function GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
  62. function GetPegName(ANode: TsdIDTreeNode): string;
  63. function GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
  64. function GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
  65. function GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
  66. function GetNewHistoryID: Integer;
  67. procedure SetHistory(const AFieldName, AValue: string; AZJJL_Rec: TsdDataRecord);
  68. // 向父项检测,直至提取到图册号为止
  69. function GetDrawingCode(ANode: TsdIDTreeNode): string;
  70. procedure CheckZjjlVerison;
  71. function GetMainBillsTree: TsdIDTree;
  72. public
  73. constructor Create(APhaseData: TObject);
  74. destructor Destroy; override;
  75. procedure Open(AConnection: TADOConnection);
  76. procedure Save;
  77. procedure ClearHistory;
  78. procedure GenerateAll;
  79. procedure GenerateAllByB_Code;
  80. procedure AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
  81. function GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
  82. function GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
  83. function GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
  84. procedure LocateBills;
  85. property PhaseData: TObject read FPhaseData;
  86. property MainBillsTree: TsdIDTree read GetMainBillsTree;
  87. property CanModified: Boolean read FCanModified write FCanModified;
  88. end;
  89. implementation
  90. uses
  91. PhaseData, ProjectData, BillsDm, UtilMethods, ProjectProperty, ZhAPI,
  92. BillsCompileDm, BillsMeasureDm, mPegFilter;
  93. {$R *.dfm}
  94. { TZJJLData }
  95. constructor TZJJLData.Create(APhaseData: TObject);
  96. begin
  97. inherited Create(nil);
  98. FPhaseData := APhaseData;
  99. FOrgDataList := TList.Create;
  100. end;
  101. destructor TZJJLData.Destroy;
  102. begin
  103. ClearObjects(FOrgDataList);
  104. FOrgDataList.Free;
  105. inherited;
  106. end;
  107. function TZJJLData.GetMainBillsTree: TsdIDTree;
  108. begin
  109. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  110. Result := BillsMeasureData.BillsMeasureTree;
  111. end;
  112. procedure TZJJLData.Open(AConnection: TADOConnection);
  113. begin
  114. sdpZJJL.Connection := AConnection;
  115. sddZJJL.Open;
  116. sddZJJL.AddIndex('idxID', 'ID');
  117. sddZJJL.AddIndex('idxBillsID', 'BillsID');
  118. sdvZJJL.Open;
  119. sdpHistory.Connection := AConnection;
  120. sddHistory.Open;
  121. sddHistory.AddIndex('idxID', 'ID');
  122. sddHistory.AddIndex('idxHistory', 'BillsID;Type;FieldName');
  123. CheckZjjlVerison;
  124. end;
  125. procedure TZJJLData.Save;
  126. begin
  127. sddZJJL.Save;
  128. sddHistory.Save;
  129. end;
  130. function TZJJLData.CheckLastXmj(AID: Integer): Boolean;
  131. var
  132. stnNode, stnChild: TsdIDTreeNode;
  133. begin
  134. stnNode := MainBillsTree.FindNode(AID);
  135. Result := stnNode.Rec.ValueByName('Code').AsString <> '';
  136. if not stnNode.HasChildren or not Result then Exit;
  137. stnChild := stnNode.FirstChild;
  138. Result := stnChild.Rec.ValueByName('B_Code').AsString <> '';
  139. end;
  140. procedure TZJJLData.AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
  141. var
  142. iRowIndex: Integer;
  143. begin
  144. ADetailGrid.OnCellTextChanged := nil;
  145. ADetailGrid.FixedRowCount := 0;
  146. ADetailGrid.FixedColCount := 0;
  147. ADetailGrid.ColCount := 1;
  148. ADetailGrid.RowCount := 11;
  149. ADetailGrid.DefaultColWidth := 300;
  150. for iRowIndex := 0 to ADetailGrid.RowCount - 1 do
  151. ADetailGrid[0, iRowIndex].Align := gaTopLeft;
  152. if not Assigned(ARec) then Exit;
  153. ADetailGrid.Cells[0, 0].Text := '变更令号:' + ARec.ValueByName('BGLCode').AsString;
  154. ADetailGrid.Cells[0, 1].Text := '部位:' + ARec.ValueByName('PegName').AsString;
  155. ADetailGrid.Cells[0, 2].Text := '起始桩号:' + ARec.ValueByName('BeginPeg').AsString;
  156. ADetailGrid.Cells[0, 3].Text := '终止桩号:' + ARec.ValueByName('EndPeg').AsString;
  157. ADetailGrid.Cells[0, 4].Text := '分部分项工程:' + ARec.ValueByName('FBFXName').AsString;
  158. ADetailGrid.Cells[0, 5].Text := '计量单元:' + ARec.ValueByName('UnitName').AsString;
  159. ADetailGrid.Cells[0, 6].Text := '图号:' + ARec.ValueByName('DrawingCode').AsString;
  160. ADetailGrid.Cells[0, 7].Text := '计算式说明:';
  161. ADetailGrid.Cells[0, 8].Text := ARec.ValueByName('FormulaMemo').AsString;
  162. ADetailGrid.Cells[0, 8].Align := gaTopLeft;
  163. ADetailGrid.RowHeights[8] := 57;
  164. ADetailGrid.Cells[0, 9].Text := '计算草图几何尺寸:';
  165. ADetailGrid.Cells[0, 10].Text := ARec.ValueByName('RelaFile').AsString;
  166. ADetailGrid.Cells[0, 10].Align := gaTopLeft;
  167. ADetailGrid.RowHeights[10] := 57;
  168. ADetailGrid.OnCellTextChanged := DetailGridCellTextChanged;
  169. end;
  170. procedure TZJJLData.GenerateAll;
  171. begin
  172. RestoreOrgData;
  173. FNewID := 1;
  174. DeleteAll;
  175. GenerateNode(MainBillsTree.FirstNode);
  176. TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
  177. end;
  178. procedure TZJJLData.GenerateNode(ANode: TsdIDTreeNode);
  179. begin
  180. if not Assigned(ANode) then Exit;
  181. if CheckLastXmj(ANode.ID) then
  182. GenerateLastXmj(ANode)
  183. else
  184. GenerateNode(ANode.FirstChild);
  185. GenerateNode(ANode.NextSibling);
  186. end;
  187. procedure TZJJLData.GenerateLastXmj(ANode: TsdIDTreeNode);
  188. begin
  189. if CheckMeasureExist(ANode) then
  190. GenerateZJJLNode(ANode, 0);
  191. end;
  192. function TZJJLData.CheckBGExist(ANode: TsdIDTreeNode): Boolean;
  193. function CheckBGLExist(AID: Integer): Boolean;
  194. var
  195. StageRec: TsdDataRecord;
  196. begin
  197. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  198. Result := Assigned(StageRec) and
  199. ((StageRec.ValueByName('QcBGLCode').AsString <> '')
  200. or (StageRec.ValueByName('PcBGLCode').AsString <> ''));
  201. end;
  202. var
  203. iChild: Integer;
  204. begin
  205. Result := False;
  206. if not Assigned(ANode) then Exit;
  207. if ANode.HasChildren then
  208. begin
  209. for iChild := 0 to ANode.ChildCount - 1 do
  210. begin
  211. Result := Result or CheckBGExist(ANode.ChildNodes[iChild]);
  212. if Result then Break;
  213. end;
  214. end
  215. else
  216. Result := CheckBGLExist(ANode.ID);
  217. end;
  218. procedure TZJJLData.DeleteAll;
  219. begin
  220. sddZJJL.DeleteAll;
  221. end;
  222. procedure TZJJLData.RestoreOrgData;
  223. function CreateNodeData(ARec: TsdDataRecord): TZJJLNode;
  224. begin
  225. Result := TZJJLNode.Create;
  226. Result.FBillsID := ARec.ValueByName('BillsID').AsInteger;
  227. Result.FCode := ARec.ValueByName('Code').AsString;
  228. Result.FCertificateCode := ARec.ValueByName('CertificateCode').AsString;
  229. Result.FBillsCode := ARec.ValueByName('BillsCode').AsString;
  230. Result.FFormulaMemo := ARec.ValueByName('FormulaMemo').AsString;
  231. Result.FRelaFile := ARec.ValueByName('RelaFile').AsString;
  232. Result.FType := ARec.ValueByName('Type').AsInteger;
  233. end;
  234. var
  235. i: Integer;
  236. vRec: TsdDataRecord;
  237. begin
  238. FOrgDataList.Clear;
  239. for i := 0 to sddZJJL.RecordCount - 1 do
  240. begin
  241. vRec := sddZJJL.Records[i];
  242. FOrgDataList.Add(CreateNodeData(vRec));
  243. end;
  244. end;
  245. function TZJJLData.CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
  246. function CheckStageCompleteData(AID: Integer): Boolean;
  247. var
  248. StageRec: TsdDataRecord;
  249. begin
  250. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  251. Result := Assigned(StageRec) and
  252. ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
  253. or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
  254. end;
  255. var
  256. iChild: Integer;
  257. begin
  258. Result := False;
  259. if not Assigned(ANode) then Exit;
  260. if ANode.HasChildren then
  261. begin
  262. for iChild := 0 to ANode.ChildCount - 1 do
  263. begin
  264. Result := Result or CheckMeasureExist(ANode.ChildNodes[iChild]);
  265. if Result then Break;
  266. end;
  267. end
  268. else
  269. Result := CheckStageCompleteData(ANode.ID);
  270. end;
  271. procedure TZJJLData.DetailGridCellCanEdit(Sender: TObject;
  272. const ACoord: TPoint; var Allow: Boolean);
  273. begin
  274. Allow := ((ACoord.Y = 6) or (ACoord.Y = 8)) and
  275. not TPhaseData(FPhaseData).StageDataReadOnly;
  276. end;
  277. function TZJJLData.GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
  278. var
  279. vPeg, vNode: TsdIDTreeNode;
  280. begin
  281. vNode := MainBillsTree.FindNode(ABillsID);
  282. vPeg := GetPegNode(vNode);
  283. Result.BGLCode := GetBGLCode(vNode);
  284. Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
  285. Result.FBFXName := GetFBFXName(vNode, vPeg);
  286. Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
  287. Result.DrawingCode := GetDrawingCode(vNode);
  288. end;
  289. procedure TZJJLData.DetailGridCellTextChanged(Sender: TObject; Col,
  290. Row: Integer);
  291. var
  292. Rec: TsdDataRecord;
  293. begin
  294. Rec := sdvZJJL.Current;
  295. if not Assigned(Rec) then Exit;
  296. if (Row = 8) then
  297. Rec.ValueByName('FormulaMemo').AsString := TZJGrid(Sender).Cells[Col, Row].Text
  298. else if (Row = 10) then
  299. Rec.ValueByName('RelaFile').AsString := TZJGrid(Sender).Cells[Col, Row].Text;
  300. end;
  301. procedure TZJJLData.GenerateAllByB_Code;
  302. begin
  303. RestoreOrgData;
  304. FNewID := 1;
  305. DeleteAll;
  306. GenerateNodeByB_Code(MainBillsTree.FirstNode);
  307. TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
  308. end;
  309. procedure TZJJLData.GenerateNodeByB_Code(ANode: TsdIDTreeNode);
  310. begin
  311. if not Assigned(ANode) then Exit;
  312. if ANode.HasChildren then
  313. GenerateNodeByB_Code(ANode.FirstChild)
  314. else
  315. GenerateLeafNode(ANode);
  316. GenerateNodeByB_Code(ANode.NextSibling);
  317. end;
  318. procedure TZJJLData.GenerateLeafNode(ANode: TsdIDTreeNode);
  319. function CheckMeasureExist(AID: Integer): Boolean;
  320. var
  321. StageRec: TsdDataRecord;
  322. begin
  323. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  324. Result := Assigned(StageRec) and
  325. ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
  326. or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
  327. end;
  328. begin
  329. if (ANode.Rec.ValueByName('B_Code').AsString <> '') and
  330. CheckMeasureExist(ANode.ID) then
  331. GenerateZJJLNode(ANode, 1);
  332. end;
  333. procedure TZJJLData.GenerateZJJLNode(ANode: TsdIDTreeNode;
  334. AType: Integer);
  335. function GetNewCode: string;
  336. begin
  337. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  338. begin
  339. Result := ProjProperties.ZJJLPreText;
  340. if (Result <> '') and (Result[Length(Result)] <> '-') then
  341. Result := Result + '-';
  342. Result := Result + Format('%d-%d', [PhaseIndex, FNewID]);
  343. end;
  344. end;
  345. function GetOrgZJJLNode(ABillsID: Integer): TZJJLNode;
  346. var
  347. iIndex: Integer;
  348. begin
  349. Result := nil;
  350. for iIndex := 0 to FOrgDataList.Count - 1 do
  351. // 7/30新增了一个“总量控制”模式,Type字段控制。真的是要疯掉了。
  352. if (TZJJLNode(FOrgDataList.Items[iIndex]).FBillsID = ABillsID)
  353. and (TZJJLNode(FOrgDataList.Items[iIndex]).FType = AType) then
  354. begin
  355. Result := TZJJLNode(FOrgDataList.Items[iIndex]);
  356. Break;
  357. end;
  358. end;
  359. function GetFieldValue(const AFieldName, ADefaultValue: string): string;
  360. var
  361. HistoryRec: TsdDataRecord;
  362. begin
  363. HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([ANode.ID, AType, AFieldName]));
  364. if Assigned(HistoryRec) then
  365. Result := HistoryRec.ValueByName('FieldValue').AsString
  366. else
  367. Result := ADefaultValue;
  368. end;
  369. var
  370. ZJJLNode: TZJJLNode;
  371. vInfoRec: TZJJLInfoRec;
  372. Rec: TsdDataRecord;
  373. begin
  374. Rec := sddZJJL.Add;
  375. Rec.ValueByName('ID').AsInteger := FNewID;
  376. Rec.ValueByName('BillsID').AsInteger := ANode.ID;
  377. Rec.ValueByName('Type').AsInteger := AType;
  378. if AType = Ord(ztFx) then
  379. Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('Code').AsString
  380. else if AType = Ord(ztGcl) then
  381. Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('B_Code').AsString;
  382. Rec.ValueByName('Code').AsString := GetFieldValue('Code', GetNewCode);
  383. Rec.ValueByName('CertificateCode').AsString := GetFieldValue('CertificateCode', '');
  384. Rec.ValueByName('FormulaMemo').AsString := GetFieldValue('FormulaMemo', '');
  385. Rec.ValueByName('RelaFile').AsString := GetFieldValue('RelaFile', '');
  386. vInfoRec := GetInfoRec_2(ANode.ID, AType);
  387. Rec.ValueByName('BGLCode').AsString := GetFieldValue('BGLCode', vInfoRec.BGLCode);
  388. Rec.ValueByName('PegName').AsString := GetFieldValue('PegName', vInfoRec.PegName);
  389. Rec.ValueByName('BeginPeg').AsString := GetFieldValue('BeginPeg', vInfoRec.BeginPeg);
  390. Rec.ValueByName('EndPeg').AsString := GetFieldValue('EndPeg', vInfoRec.EndPeg);
  391. Rec.ValueByName('FBFXName').AsString := GetFieldValue('FBFXName', vInfoRec.FBFXName);
  392. Rec.ValueByName('UnitName').AsString := GetFieldValue('UnitName', vInfoRec.UnitName);
  393. Rec.ValueByName('DrawingCode').AsString := GetFieldValue('DrawingCode', vInfoRec.DrawingCode);
  394. Inc(FNewID);
  395. end;
  396. function TZJJLData.GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
  397. var
  398. vNode: TsdIDTreeNode;
  399. begin
  400. vNode := MainBillsTree.FindNode(ABillsID);
  401. Result.BGLCode := GetBGLCode(vNode);
  402. if Assigned(vNode.Parent) then
  403. Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
  404. Result.FBFXName := '';
  405. Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
  406. Result.DrawingCode := GetDrawingCode(vNode);
  407. end;
  408. function TZJJLData.GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
  409. begin
  410. if AType = 0 then
  411. Result := GetInfoRecByCode(ABillsID)
  412. else if AType = 1 then
  413. Result := GetInfoRecByB_Code(ABillsID);
  414. end;
  415. procedure TZJJLData.LocateBills;
  416. var
  417. Rec: TsdDataRecord;
  418. begin
  419. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  420. begin
  421. Rec := BillsData.sddBills.FindKey('idxID', sdvZJJL.Current.ValueByName('BillsID').AsInteger);
  422. BillsMeasureData.sdvBillsMeasure.LocateInControl(Rec);
  423. end;
  424. end;
  425. function TZJJLData.GetDrawingCode(ANode: TsdIDTreeNode): string;
  426. var
  427. vNode: TBillsIDTreeNode;
  428. begin
  429. Result := '';
  430. vNode := TBillsIDTreeNode(ANode);
  431. while (Result = '') and Assigned(vNode) do
  432. begin
  433. if Assigned(vNode.Rec) then
  434. Result := vNode.Rec.DrawingCode.AsString;
  435. vNode := TBillsIDTreeNode(vNode.Parent);
  436. end;
  437. end;
  438. procedure TZJJLData.CheckZjjlVerison;
  439. procedure LoadVersion0Info;
  440. var
  441. i: Integer;
  442. Rec: TsdDataRecord;
  443. ZJJLInfoRec: TZJJLInfoRec;
  444. begin
  445. for i := 0 to sddZJJL.RecordCount - 1 do
  446. begin
  447. Rec := sddZJJL.Records[i];
  448. ZJJLInfoRec := GetInfoRec(Rec.ValueByName('BillsID').AsInteger, Rec.ValueByName('Type').AsInteger);
  449. Rec.ValueByName('BGLCode').AsString := ZJJLInfoRec.BGLCode;
  450. Rec.ValueByName('PegName').AsString := ZJJLInfoRec.PegName;
  451. Rec.ValueByName('FBFXName').AsString := ZJJLInfoRec.FBFXName;
  452. Rec.ValueByName('UnitName').AsString := ZJJLInfoRec.UnitName;
  453. Rec.ValueByName('DrawingCode').AsString := ZJJLInfoRec.DrawingCode;
  454. end;
  455. end;
  456. procedure LoadVersion0History;
  457. var
  458. i, j, iNewID: Integer;
  459. Rec: TsdDataRecord;
  460. begin
  461. for i := 0 to sddZJJL.RecordCount - 1 do
  462. begin
  463. Rec := sddZJJL.Records[i];
  464. SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
  465. SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
  466. SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
  467. end;
  468. end;
  469. begin
  470. if TPhaseData(PhaseData).PhaseProperty.ZjjlVersion = 0 then
  471. begin
  472. TPhaseData(PhaseData).PhaseProperty.ZJJLPreText := TProjectData(TPhaseData(PhaseData).ProjectData).ProjProperties.ZJJLPreText;
  473. LoadVersion0Info;
  474. LoadVersion0History;
  475. end;
  476. end;
  477. function TZJJLData.GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
  478. begin
  479. if AType = 0 then
  480. Result := GetInfoRecByCode_2(ABillsID)
  481. else if AType = 1 then
  482. Result := GetInfoRecByB_Code_2(ABillsID);
  483. end;
  484. function TZJJLData.GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
  485. var
  486. vNode: TsdIDTreeNode;
  487. sPeg: string;
  488. vPegFilter: TPegStrFilter;
  489. begin
  490. vNode := MainBillsTree.FindNode(ABillsID);
  491. sPeg := GetPegName(vNode);
  492. Result.BGLCode := GetBGLCode(vNode);
  493. if Assigned(vNode.Parent) then
  494. Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
  495. if sPeg <> '' then
  496. begin
  497. vPegFilter := TPegStrFilter.Create;
  498. vPegFilter.PegStr := sPeg;
  499. Result.BeginPeg := vPegFilter.BeginPeg;
  500. Result.EndPeg := vPegFilter.EndPeg;
  501. vPegFilter.Free;
  502. end;
  503. Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
  504. Result.DrawingCode := GetDrawingCode(vNode);
  505. end;
  506. function TZJJLData.GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
  507. var
  508. vPeg, vNode: TsdIDTreeNode;
  509. vPegFilter: TPegStrFilter;
  510. begin
  511. vNode := MainBillsTree.FindNode(ABillsID);
  512. vPeg := GetPegNode(vNode);
  513. Result.BGLCode := GetBGLCode(vNode);
  514. Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
  515. if Result.PegName <> '' then
  516. begin
  517. vPegFilter := TPegStrFilter.Create;
  518. vPegFilter.PegStr := Result.PegName;
  519. Result.BeginPeg := vPegFilter.BeginPeg;
  520. Result.EndPeg := vPegFilter.EndPeg;
  521. vPegFilter.Free;
  522. end;
  523. Result.FBFXName := GetFBFXName(vNode, vPeg);
  524. Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
  525. Result.DrawingCode := GetDrawingCode(vNode);
  526. end;
  527. function TZJJLData.GetBGLCode(ANode: TsdIDTreeNode): string;
  528. begin
  529. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  530. Result := BillsMeasureData.GatherRelaBGL(ANode);
  531. end;
  532. function TZJJLData.GetPegName(ANode: TsdIDTreeNode): string;
  533. var
  534. vPeg: TsdIDTreeNode;
  535. begin
  536. vPeg := GetPegNode(ANode);
  537. Result := GetFieldStrDef(vPeg, 'Name', '');
  538. end;
  539. function TZJJLData.GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName,
  540. ADef: string): string;
  541. begin
  542. if Assigned(ANode) then
  543. Result := ANode.Rec.ValueByName(AFieldName).AsString
  544. else
  545. Result := '';
  546. end;
  547. function TZJJLData.GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  548. begin
  549. Result := nil;
  550. if not Assigned(ANode) then Exit;
  551. if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then
  552. Result := ANode
  553. else
  554. Result := GetPegNode(ANode.Parent);
  555. end;
  556. function TZJJLData.GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
  557. var
  558. vCurNode: TsdIDTreeNode;
  559. begin
  560. Result := '';
  561. if not Assigned(ANode) then Exit;
  562. // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
  563. if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
  564. begin
  565. // 取树结构的第三、四层节点的名称
  566. Result := GetNameByLevel(ANode, 2);
  567. if (Result <> '') and (GetNameByLevel(ANode, 3) <> '') then
  568. Result := Result + ',';
  569. Result := Result + GetNameByLevel(ANode, 3);
  570. end
  571. // 否则,合并[桩号节点的子节点]至[计量单元节点的父节点]的名称
  572. else
  573. begin
  574. vCurNode := ANode.Parent;
  575. // 转化为判断层次,层次大于[桩号节点的子节点]的层次
  576. while vCurNode.Level > APegNode.Level do
  577. begin
  578. Result := vCurNode.Rec.ValueByName('Name').AsString + ',' + Result;
  579. vCurNode := vCurNode.Parent;
  580. end;
  581. end;
  582. end;
  583. function TZJJLData.GetNameByLevel(ANode: TsdIDTreeNode;
  584. ALevel: Integer): string;
  585. begin
  586. Result := '';
  587. if not Assigned(ANode) then Exit;
  588. if ANode.Level = ALevel then
  589. Result := ANode.Rec.ValueByName('Name').AsString
  590. else if ANode.Level > ALevel then
  591. Result := GetNameByLevel(ANode.Parent, ALevel);
  592. end;
  593. procedure TZJJLData.SetHistory(const AFieldName, AValue: string;
  594. AZJJL_Rec: TsdDataRecord);
  595. var
  596. HistoryRec: TsdDataRecord;
  597. begin
  598. HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([AZJJL_Rec.ValueByName('BillsID').AsInteger,
  599. AZJJL_Rec.ValueByName('Type').AsInteger, AFieldName]));
  600. if not Assigned(HistoryRec) then
  601. begin
  602. HistoryRec := sddHistory.Add;
  603. HistoryRec.ValueByName('ID').AsInteger := GetNewHistoryID;
  604. HistoryRec.ValueByName('BillsID').AsInteger := AZJJL_Rec.ValueByName('BillsID').AsInteger;
  605. HistoryRec.ValueByName('Type').AsInteger := AZJJL_Rec.ValueByName('Type').AsInteger;
  606. HistoryRec.ValueByName('FieldName').AsString := AFieldName;
  607. end;
  608. HistoryRec.ValueByName('FieldValue').AsString := AValue;
  609. end;
  610. function TZJJLData.GetNewHistoryID: Integer;
  611. var
  612. idx: TsdIndex;
  613. begin
  614. idx := sddHistory.FindIndex('idxID');
  615. if idx.RecordCount = 0 then
  616. Result := 1
  617. else
  618. Result := idx.Records[idx.RecordCount - 1].ValueByName('ID').AsInteger + 1;
  619. end;
  620. procedure TZJJLData.sdvZJJLBeforeValueChange(AValue: TsdValue;
  621. const NewValue: Variant; var Allow: Boolean);
  622. function CheckFieldNeedHistory(const AFieldName: string): Boolean;
  623. begin
  624. Result := SameText(AFieldName, 'Code') or
  625. SameText(AFieldName, 'CertificateCode') or
  626. SameText(AFieldName, 'BGLCode') or
  627. SameText(AFieldName, 'PegName') or
  628. SameText(AFieldName, 'BeginPeg') or
  629. SameText(AFieldName, 'EndPeg') or
  630. SameText(AFieldName, 'FBFXName') or
  631. SameText(AFieldName, 'UnitName') or
  632. SameText(AFieldName, 'DrawingCode') or
  633. SameText(AFieldName, 'FormulaMemo') or
  634. SameText(AFieldName, 'RelaFile');
  635. end;
  636. var
  637. sNewValue: string;
  638. begin
  639. if CheckFieldNeedHistory(AValue.FieldName) then
  640. begin
  641. sNewValue := VarToStrDef(NewValue, '');
  642. if sNewValue <> AValue.AsString then
  643. SetHistory(AValue.FieldName, sNewValue, AValue.Owner);
  644. end;
  645. end;
  646. procedure TZJJLData.sdvZJJLAfterDeleteRecord(ARecord: TsdDataRecord);
  647. begin
  648. DeleteHistory(ARecord.ValueByName('BillsID').AsInteger, ARecord.ValueByName('Type').AsInteger);
  649. end;
  650. procedure TZJJLData.DeleteHistory(ABillsID, AType: Integer);
  651. var
  652. i: Integer;
  653. Rec: TsdDataRecord;
  654. begin
  655. i := 0;
  656. while (i < sddHistory.RecordCount) do
  657. begin
  658. Rec := sddHistory.Records[i];
  659. if (ABillsID = Rec.ValueByName('BillsID').AsInteger) and
  660. (AType = Rec.ValueByName('Type').AsInteger) then
  661. sddHistory.Remove(Rec)
  662. else
  663. Inc(i);
  664. end;
  665. end;
  666. procedure TZJJLData.ClearHistory;
  667. begin
  668. sddHistory.DeleteAll;
  669. end;
  670. end.