123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- unit DbTreeImport;
- interface
- uses
- ProjectData, MCacheTree, DbTreeDm, Classes, sdIDTree;
- const
- FirstPartID = 1;
- type
- TDbTreeImport = class
- private
- FProjectData: TProjectData;
- FCacheTree: TBillsCacheTree;
- FFirstPart: TBillsCacheNode;
- FDefautNext: TBillsCacheNode;
- procedure BeginImport;
- procedure EndImport;
- procedure PrepareBaseTree;
- procedure LoadBaseTree;
- function AddDbNode(ADbNode: TsdIDTreeNode; AParent, ANextSibling: TBillsCacheNode): TBillsCacheNode;
- procedure LoadDbTree(const AFileName, ATable: string);
- procedure WriteDbTree;
- function DecryptFile(const AFileName: string): string;
- public
- constructor Create(AProjectData: TProjectData);
- destructor Destroy; override;
- procedure ImportDbTree(const AFileName, ATable: string);
- end;
- procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
- implementation
- uses
- UtilMethods, TransFile, mDataRecord, BillsDm, CacheTree, BillsTree,
- ExcelImport, sdDB, SysUtils, ConditionalDefines;
- procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
- var
- vImport: TDbTreeImport;
- begin
- vImport := TDbTreeImport.Create(AProjectData);
- try
- vImport.ImportDbTree(AFileName, 'Bills');
- finally
- vImport.Free;
- end;
- end;
- { TDbTreeImport }
- function TDbTreeImport.AddDbNode(ADbNode: TsdIDTreeNode; AParent,
- ANextSibling: TBillsCacheNode): TBillsCacheNode;
- var
- iChild: Integer;
- vChild: TsdIDTreeNode;
- begin
- if _IsDebugView then
- begin
- if Assigned(ADbNode) and Assigned(AParent) then
- begin
- if (ADbNode.Rec.ValueByName('B_Code').AsString <> '') and ADbNode.HasChildren then
- begin
- for iChild := 0 to ADbNode.ChildCount - 1 do
- AddDbNode(ADbNode.ChildNodes[iChild], AParent, nil);
- end
- else
- begin
- Result := FCacheTree.AddNode(AParent, ANextSibling);
- Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
- Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
- Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
- Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
- Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat;
- Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
- Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
- Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
- Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
- for iChild := 0 to ADbNode.ChildCount - 1 do
- AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
- end;
- end;
- end
- else
- begin
- if Assigned(ADbNode) and Assigned(AParent) then
- begin
- Result := FCacheTree.AddNode(AParent, ANextSibling);
- Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
- Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
- Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
- Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
- Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat;
- Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
- Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
- Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
- Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
- for iChild := 0 to ADbNode.ChildCount - 1 do
- AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
- end;
- end;
- end;
- procedure TDbTreeImport.BeginImport;
- begin
- FCacheTree := TBillsCacheTree.Create;
- FProjectData.DisConnectTree;
- FProjectData.BillsData.DisableEvents;
- end;
- constructor TDbTreeImport.Create(AProjectData: TProjectData);
- begin
- FProjectData := AProjectData;
- end;
- function TDbTreeImport.DecryptFile(const AFileName: string): string;
- begin
- Result := GetTempFileName;
- AutoDecryptFile(AFileName, Result);
- end;
- destructor TDbTreeImport.Destroy;
- begin
- inherited;
- end;
- procedure TDbTreeImport.EndImport;
- begin
- FCacheTree.Free;
- FProjectData.BillsData.EnableEvents;
- FProjectData.ReConnectTree;
- FProjectData.BillsCompileData.CalculateAll;
- end;
- procedure TDbTreeImport.ImportDbTree(const AFileName, ATable: string);
- var
- sDecryptFile: string;
- begin
- sDecryptFile := DecryptFile(AFileName);
- if not FileExists(sDecryptFile) then
- begin
- ErrorMessage('ÎÞ·¨´ò¿ªÎļþ¡£');
- Exit;
- end;
- BeginImport;
- try
- LoadBaseTree;
- PrepareBaseTree;
- LoadDbTree(sDecryptFile, ATable);
- WriteDbTree;
- finally
- EndImport;
- end;
- end;
- procedure TDbTreeImport.LoadBaseTree;
- var
- BaseImportor: TBillsExcelImport;
- begin
- BaseImportor := TBillsExcelImport.Create(nil);
- try
- BaseImportor.ImportToTree(FCacheTree, GetTemplateBillsFileName);
- finally
- BaseImportor.Free;
- end;
- end;
- procedure TDbTreeImport.LoadDbTree(const AFileName, ATable: string);
- var
- vDbTreeData: TDbTreeData;
- vFirstPart, vChild: TsdIDTreeNode;
- iChild: Integer;
- begin
- try
- vDbTreeData := TDbTreeData.Create(AFileName, ATable);
- vFirstPart := vDbTreeData.DbTree.FirstNode;
- for iChild := 0 to vFirstPart.ChildCount - 1 do
- begin
- vChild := vFirstPart.ChildNodes[iChild];
- if vChild.Rec.ValueByName('Code').AsString = '1-10' then
- Break;
- AddDbNode(vChild, FFirstPart, FDefautNext);
- end;
- finally
- vDbTreeData.Free;
- end;
- end;
- procedure TDbTreeImport.PrepareBaseTree;
- var
- vClears: TList;
- vChild: TBillsCacheNode;
- i: Integer;
- begin
- vClears := TList.Create;
- try
- FFirstPart := TBillsCacheNode(FCacheTree.FirstNode);
- vChild := TBillsCacheNode(FFirstPart.FirstChild);
- while Assigned(vChild) do
- begin
- if vChild.Code = '1-10' then
- begin
- FDefautNext := vChild;
- Break;
- end
- else
- vClears.Add(vChild);
- vChild := TBillsCacheNode(vChild.NextSibling);
- end;
- for i := 0 to vClears.Count - 1 do
- FCacheTree.DeleteNode(TBillsCacheNode(vClears.Items[i]));
- finally
- vClears.Free;
- end;
- end;
- procedure TDbTreeImport.WriteDbTree;
- var
- iNode: Integer;
- Rec: TBillsRecord;
- vNode: TBillsCacheNode;
- begin
- FProjectData.BillsData.sddBills.BeginUpdate;
- try
- FProjectData.BillsData.sddBills.DeleteAll;
- for iNode := 0 to FCacheTree.CacheNodes.Count - 1 do
- begin
- vNode := TBillsCacheNode(FCacheTree.CacheNodes.Items[iNode]);
- Rec := TBillsRecord(FProjectData.BillsData.sddBills.Add);
- Rec.ID.AsInteger := vNode.ID;
- Rec.ParentID.AsInteger := vNode.ParentID;
- Rec.NextSiblingID.AsInteger := vNode.NextSiblingID;
- Rec.Code.AsString := vNode.Code;
- Rec.B_Code.AsString := vNode.B_Code;
- Rec.Name.AsString := vNode.Name;
- Rec.Units.AsString := vNode.Units;
- Rec.Price.AsFloat := vNode.Price;
- Rec.OrgQuantity.AsFloat := vNode.OrgQuantity;
- Rec.DgnQuantity1.AsFloat := vNode.DgnQuantity1;
- Rec.DgnQuantity2.AsFloat := vNode.DgnQuantity2;
- Rec.DrawingCode.AsString := vNode.DrawingCode;
- end;
- finally
- FProjectData.BillsData.sddBills.EndUpdate;
- end;
- end;
- end.
|