DbTreeImport.pas 5.6 KB

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