DbTreeImport.pas 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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;
  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 Assigned(ADbNode) and Assigned(AParent) then
  51. begin
  52. Result := FCacheTree.AddNode(AParent, ANextSibling);
  53. Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
  54. Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
  55. Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
  56. Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
  57. Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat;
  58. Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
  59. Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
  60. Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
  61. Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
  62. for iChild := 0 to ADbNode.ChildCount - 1 do
  63. AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
  64. end;
  65. end;
  66. procedure TDbTreeImport.BeginImport;
  67. begin
  68. FCacheTree := TBillsCacheTree.Create;
  69. FProjectData.DisConnectTree;
  70. FProjectData.BillsData.DisableEvents;
  71. end;
  72. constructor TDbTreeImport.Create(AProjectData: TProjectData);
  73. begin
  74. FProjectData := AProjectData;
  75. end;
  76. function TDbTreeImport.DecryptFile(const AFileName: string): string;
  77. begin
  78. Result := GetTempFileName;
  79. AutoDecryptFile(AFileName, Result);
  80. end;
  81. destructor TDbTreeImport.Destroy;
  82. begin
  83. inherited;
  84. end;
  85. procedure TDbTreeImport.EndImport;
  86. begin
  87. FCacheTree.Free;
  88. FProjectData.BillsData.EnableEvents;
  89. FProjectData.ReConnectTree;
  90. FProjectData.BillsCompileData.CalculateAll;
  91. end;
  92. procedure TDbTreeImport.ImportDbTree(const AFileName, ATable: string);
  93. var
  94. sDecryptFile: string;
  95. begin
  96. sDecryptFile := DecryptFile(AFileName);
  97. if not FileExists(sDecryptFile) then
  98. begin
  99. ErrorMessage('ÎÞ·¨´ò¿ªÎļþ¡£');
  100. Exit;
  101. end;
  102. BeginImport;
  103. try
  104. LoadBaseTree;
  105. PrepareBaseTree;
  106. LoadDbTree(sDecryptFile, ATable);
  107. WriteDbTree;
  108. finally
  109. EndImport;
  110. end;
  111. end;
  112. procedure TDbTreeImport.LoadBaseTree;
  113. var
  114. BaseImportor: TBillsExcelImport;
  115. begin
  116. BaseImportor := TBillsExcelImport.Create(nil);
  117. try
  118. BaseImportor.ImportToTree(FCacheTree, GetTemplateBillsFileName);
  119. finally
  120. BaseImportor.Free;
  121. end;
  122. end;
  123. procedure TDbTreeImport.LoadDbTree(const AFileName, ATable: string);
  124. var
  125. vDbTreeData: TDbTreeData;
  126. vFirstPart, vChild: TsdIDTreeNode;
  127. iChild: Integer;
  128. begin
  129. try
  130. vDbTreeData := TDbTreeData.Create(AFileName, ATable);
  131. vFirstPart := vDbTreeData.DbTree.FirstNode;
  132. for iChild := 0 to vFirstPart.ChildCount - 1 do
  133. begin
  134. vChild := vFirstPart.ChildNodes[iChild];
  135. if vChild.Rec.ValueByName('Code').AsString = '1-10' then
  136. Break;
  137. AddDbNode(vChild, FFirstPart, FDefautNext);
  138. end;
  139. finally
  140. vDbTreeData.Free;
  141. end;
  142. end;
  143. procedure TDbTreeImport.PrepareBaseTree;
  144. var
  145. vClears: TList;
  146. vChild: TBillsCacheNode;
  147. i: Integer;
  148. begin
  149. vClears := TList.Create;
  150. try
  151. FFirstPart := TBillsCacheNode(FCacheTree.FirstNode);
  152. vChild := TBillsCacheNode(FFirstPart.FirstChild);
  153. while Assigned(vChild) do
  154. begin
  155. if vChild.Code = '1-10' then
  156. begin
  157. FDefautNext := vChild;
  158. Break;
  159. end
  160. else
  161. vClears.Add(vChild);
  162. vChild := TBillsCacheNode(vChild.NextSibling);
  163. end;
  164. for i := 0 to vClears.Count - 1 do
  165. FCacheTree.DeleteNode(TBillsCacheNode(vClears.Items[i]));
  166. finally
  167. vClears.Free;
  168. end;
  169. end;
  170. procedure TDbTreeImport.WriteDbTree;
  171. var
  172. iNode: Integer;
  173. Rec: TBillsRecord;
  174. vNode: TBillsCacheNode;
  175. begin
  176. FProjectData.BillsData.sddBills.BeginUpdate;
  177. try
  178. FProjectData.BillsData.sddBills.DeleteAll;
  179. for iNode := 0 to FCacheTree.CacheNodes.Count - 1 do
  180. begin
  181. vNode := TBillsCacheNode(FCacheTree.CacheNodes.Items[iNode]);
  182. Rec := TBillsRecord(FProjectData.BillsData.sddBills.Add);
  183. Rec.ID.AsInteger := vNode.ID;
  184. Rec.ParentID.AsInteger := vNode.ParentID;
  185. Rec.NextSiblingID.AsInteger := vNode.NextSiblingID;
  186. Rec.Code.AsString := vNode.Code;
  187. Rec.B_Code.AsString := vNode.B_Code;
  188. Rec.Name.AsString := vNode.Name;
  189. Rec.Units.AsString := vNode.Units;
  190. Rec.Price.AsFloat := vNode.Price;
  191. Rec.OrgQuantity.AsFloat := vNode.OrgQuantity;
  192. Rec.DgnQuantity1.AsFloat := vNode.DgnQuantity1;
  193. Rec.DgnQuantity2.AsFloat := vNode.DgnQuantity2;
  194. Rec.DrawingCode.AsString := vNode.DrawingCode;
  195. end;
  196. finally
  197. FProjectData.BillsData.sddBills.EndUpdate;
  198. end;
  199. end;
  200. end.