DbTreeImport.pas 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. unit DbTreeImport;
  2. interface
  3. uses
  4. ProjectData, MCacheTree, DbTreeDm, Classes, sdIDTree;
  5. const
  6. FirstPartID = 1;
  7. type
  8. TDbTreeImport = class
  9. private
  10. FProjectData: TProjectData;
  11. FCacheTree: TBillsCacheTree;
  12. FFirstPart: TBillsCacheNode;
  13. FDefautNext: TBillsCacheNode;
  14. procedure BeginImport;
  15. procedure EndImport;
  16. procedure PrepareBaseTree;
  17. procedure LoadBaseTree;
  18. function AddDbNode(ADbNode: TsdIDTreeNode; AParent, ANextSibling: TBillsCacheNode): TBillsCacheNode;
  19. procedure LoadDbTree(const AFileName, ATable: string);
  20. procedure WriteDbTree;
  21. function DecryptFile(const AFileName: string): string;
  22. public
  23. constructor Create(AProjectData: TProjectData);
  24. destructor Destroy; override;
  25. procedure ImportDbTree(const AFileName, ATable: string);
  26. end;
  27. procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
  28. implementation
  29. uses
  30. UtilMethods, TransFile, mDataRecord, BillsDm, CacheTree, BillsTree,
  31. ExcelImport, sdDB, SysUtils, ConditionalDefines;
  32. procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
  33. var
  34. vImport: TDbTreeImport;
  35. begin
  36. vImport := TDbTreeImport.Create(AProjectData);
  37. try
  38. vImport.ImportDbTree(AFileName, 'Bills');
  39. finally
  40. vImport.Free;
  41. end;
  42. end;
  43. { TDbTreeImport }
  44. function TDbTreeImport.AddDbNode(ADbNode: TsdIDTreeNode; AParent,
  45. ANextSibling: TBillsCacheNode): TBillsCacheNode;
  46. var
  47. iChild: Integer;
  48. vChild: TsdIDTreeNode;
  49. begin
  50. if _IsDebugView then
  51. begin
  52. if Assigned(ADbNode) and Assigned(AParent) then
  53. begin
  54. if (ADbNode.Rec.ValueByName('B_Code').AsString <> '') and ADbNode.HasChildren then
  55. begin
  56. for iChild := 0 to ADbNode.ChildCount - 1 do
  57. AddDbNode(ADbNode.ChildNodes[iChild], AParent, nil);
  58. end
  59. else
  60. begin
  61. Result := FCacheTree.AddNode(AParent, ANextSibling);
  62. Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
  63. Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
  64. Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
  65. Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
  66. Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat;
  67. Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
  68. Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
  69. Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
  70. Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
  71. for iChild := 0 to ADbNode.ChildCount - 1 do
  72. AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
  73. end;
  74. end;
  75. end
  76. else
  77. begin
  78. if Assigned(ADbNode) and Assigned(AParent) then
  79. begin
  80. Result := FCacheTree.AddNode(AParent, ANextSibling);
  81. Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
  82. Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
  83. Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
  84. Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
  85. Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat;
  86. Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
  87. Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
  88. Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
  89. Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
  90. for iChild := 0 to ADbNode.ChildCount - 1 do
  91. AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
  92. end;
  93. end;
  94. end;
  95. procedure TDbTreeImport.BeginImport;
  96. begin
  97. FCacheTree := TBillsCacheTree.Create;
  98. FProjectData.DisConnectTree;
  99. FProjectData.BillsData.DisableEvents;
  100. end;
  101. constructor TDbTreeImport.Create(AProjectData: TProjectData);
  102. begin
  103. FProjectData := AProjectData;
  104. end;
  105. function TDbTreeImport.DecryptFile(const AFileName: string): string;
  106. begin
  107. Result := GetTempFileName;
  108. AutoDecryptFile(AFileName, Result);
  109. end;
  110. destructor TDbTreeImport.Destroy;
  111. begin
  112. inherited;
  113. end;
  114. procedure TDbTreeImport.EndImport;
  115. begin
  116. FCacheTree.Free;
  117. FProjectData.BillsData.EnableEvents;
  118. FProjectData.ReConnectTree;
  119. FProjectData.BillsCompileData.CalculateAll;
  120. end;
  121. procedure TDbTreeImport.ImportDbTree(const AFileName, ATable: string);
  122. var
  123. sDecryptFile: string;
  124. begin
  125. sDecryptFile := DecryptFile(AFileName);
  126. if not FileExists(sDecryptFile) then
  127. begin
  128. ErrorMessage('ÎÞ·¨´ò¿ªÎļþ¡£');
  129. Exit;
  130. end;
  131. BeginImport;
  132. try
  133. LoadBaseTree;
  134. PrepareBaseTree;
  135. LoadDbTree(sDecryptFile, ATable);
  136. WriteDbTree;
  137. finally
  138. EndImport;
  139. end;
  140. end;
  141. procedure TDbTreeImport.LoadBaseTree;
  142. var
  143. BaseImportor: TBillsExcelImport;
  144. begin
  145. BaseImportor := TBillsExcelImport.Create(nil);
  146. try
  147. BaseImportor.ImportToTree(FCacheTree, GetTemplateBillsFileName);
  148. finally
  149. BaseImportor.Free;
  150. end;
  151. end;
  152. procedure TDbTreeImport.LoadDbTree(const AFileName, ATable: string);
  153. var
  154. vDbTreeData: TDbTreeData;
  155. vFirstPart, vChild: TsdIDTreeNode;
  156. iChild: Integer;
  157. begin
  158. try
  159. vDbTreeData := TDbTreeData.Create(AFileName, ATable);
  160. vFirstPart := vDbTreeData.DbTree.FirstNode;
  161. for iChild := 0 to vFirstPart.ChildCount - 1 do
  162. begin
  163. vChild := vFirstPart.ChildNodes[iChild];
  164. if vChild.Rec.ValueByName('Code').AsString = '1-10' then
  165. Break;
  166. AddDbNode(vChild, FFirstPart, FDefautNext);
  167. end;
  168. finally
  169. vDbTreeData.Free;
  170. end;
  171. end;
  172. procedure TDbTreeImport.PrepareBaseTree;
  173. var
  174. vClears: TList;
  175. vChild: TBillsCacheNode;
  176. i: Integer;
  177. begin
  178. vClears := TList.Create;
  179. try
  180. FFirstPart := TBillsCacheNode(FCacheTree.FirstNode);
  181. vChild := TBillsCacheNode(FFirstPart.FirstChild);
  182. while Assigned(vChild) do
  183. begin
  184. if vChild.Code = '1-10' then
  185. begin
  186. FDefautNext := vChild;
  187. Break;
  188. end
  189. else
  190. vClears.Add(vChild);
  191. vChild := TBillsCacheNode(vChild.NextSibling);
  192. end;
  193. for i := 0 to vClears.Count - 1 do
  194. FCacheTree.DeleteNode(TBillsCacheNode(vClears.Items[i]));
  195. finally
  196. vClears.Free;
  197. end;
  198. end;
  199. procedure TDbTreeImport.WriteDbTree;
  200. var
  201. iNode: Integer;
  202. Rec: TBillsRecord;
  203. vNode: TBillsCacheNode;
  204. begin
  205. FProjectData.BillsData.sddBills.BeginUpdate;
  206. try
  207. FProjectData.BillsData.sddBills.DeleteAll;
  208. for iNode := 0 to FCacheTree.CacheNodes.Count - 1 do
  209. begin
  210. vNode := TBillsCacheNode(FCacheTree.CacheNodes.Items[iNode]);
  211. Rec := TBillsRecord(FProjectData.BillsData.sddBills.Add);
  212. Rec.ID.AsInteger := vNode.ID;
  213. Rec.ParentID.AsInteger := vNode.ParentID;
  214. Rec.NextSiblingID.AsInteger := vNode.NextSiblingID;
  215. Rec.Code.AsString := vNode.Code;
  216. Rec.B_Code.AsString := vNode.B_Code;
  217. Rec.Name.AsString := vNode.Name;
  218. Rec.Units.AsString := vNode.Units;
  219. Rec.Price.AsFloat := vNode.Price;
  220. Rec.OrgQuantity.AsFloat := vNode.OrgQuantity;
  221. Rec.DgnQuantity1.AsFloat := vNode.DgnQuantity1;
  222. Rec.DgnQuantity2.AsFloat := vNode.DgnQuantity2;
  223. Rec.DrawingCode.AsString := vNode.DrawingCode;
  224. end;
  225. finally
  226. FProjectData.BillsData.sddBills.EndUpdate;
  227. end;
  228. end;
  229. end.