|  | @@ -3,7 +3,7 @@ unit SearchDm;
 | 
	
		
			
				|  |  |  interface
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  uses
 | 
	
		
			
				|  |  | -  SysUtils, Classes, DB, DBClient, sdIDTree, sdDB;
 | 
	
		
			
				|  |  | +  SysUtils, Classes, DB, DBClient, sdIDTree, sdDB, BillsTree;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type
 | 
	
		
			
				|  |  |    TLocateType = (ltCompile, ltMeasure);
 | 
	
	
		
			
				|  | @@ -25,10 +25,7 @@ type
 | 
	
		
			
				|  |  |    private
 | 
	
		
			
				|  |  |      FProjectData: TObject;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    procedure BeginSearch;
 | 
	
		
			
				|  |  | -    procedure EndSearch;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    procedure AddSearchResult(Rec, StageRec: TsdDataRecord);
 | 
	
		
			
				|  |  | +    procedure AddSearchResult(ANode: TBillsIDTreeNode);
 | 
	
		
			
				|  |  |    public
 | 
	
		
			
				|  |  |      constructor Create(AProjectData: TObject);
 | 
	
		
			
				|  |  |      destructor Destroy; override;
 | 
	
	
		
			
				|  | @@ -45,36 +42,37 @@ type
 | 
	
		
			
				|  |  |  implementation
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  uses
 | 
	
		
			
				|  |  | -  ProjectData, BillsMeasureDm, BillsCompileDm, Math, ZhAPI;
 | 
	
		
			
				|  |  | +  ProjectData, BillsMeasureDm, BillsCompileDm, Math, ZhAPI,
 | 
	
		
			
				|  |  | +  UtilMethods;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  {$R *.dfm}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  { TSearchData }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -procedure TSearchData.AddSearchResult(Rec, StageRec: TsdDataRecord);
 | 
	
		
			
				|  |  | +procedure TSearchData.AddSearchResult(ANode: TBillsIDTreeNode);
 | 
	
		
			
				|  |  |  begin
 | 
	
		
			
				|  |  | +  if not Assigned(ANode) then Exit;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    cdsSearch.Append;
 | 
	
		
			
				|  |  | -  cdsSearchID.AsInteger := Rec.ValueByName('ID').AsInteger;
 | 
	
		
			
				|  |  | -  cdsSearchCode.AsString := Rec.ValueByName('Code').AsString;
 | 
	
		
			
				|  |  | -  cdsSearchB_Code.AsString := Rec.ValueByName('B_Code').AsString;
 | 
	
		
			
				|  |  | -  cdsSearchName.AsString := Rec.ValueByName('Name').AsString;
 | 
	
		
			
				|  |  | -  cdsSearchUnits.AsString := Rec.ValueByName('Units').AsString;
 | 
	
		
			
				|  |  | -  cdsSearchPrice.AsFloat := Rec.ValueByName('Price').AsFloat;
 | 
	
		
			
				|  |  | -  cdsSearchQuantity.AsString := Rec.ValueByName('Quantity').AsString;
 | 
	
		
			
				|  |  | -  if Assigned(StageRec) then
 | 
	
		
			
				|  |  | -    cdsSearchCurQcQuantity.AsFloat := StageRec.ValueByName('QcQuantity').AsFloat;
 | 
	
		
			
				|  |  | -  cdsSearchAddGatherQuantity.AsString := Rec.ValueByName('AddGatherQuantity').AsString;
 | 
	
		
			
				|  |  | -  if cdsSearchQuantity.AsFloat <> 0 then
 | 
	
		
			
				|  |  | -    cdsSearchCompleteRate.AsFloat := advRoundTo(
 | 
	
		
			
				|  |  | -        Rec.ValueByName('AddDealQuantity').AsFloat/cdsSearchQuantity.AsFloat*100);
 | 
	
		
			
				|  |  | +  with ANode do
 | 
	
		
			
				|  |  | +  begin
 | 
	
		
			
				|  |  | +    cdsSearchID.AsInteger := Rec.ValueByName('ID').AsInteger;
 | 
	
		
			
				|  |  | +    cdsSearchCode.AsString := Rec.ValueByName('Code').AsString;
 | 
	
		
			
				|  |  | +    cdsSearchB_Code.AsString := Rec.ValueByName('B_Code').AsString;
 | 
	
		
			
				|  |  | +    cdsSearchName.AsString := Rec.ValueByName('Name').AsString;
 | 
	
		
			
				|  |  | +    cdsSearchUnits.AsString := Rec.ValueByName('Units').AsString;
 | 
	
		
			
				|  |  | +    cdsSearchPrice.AsFloat := Rec.ValueByName('Price').AsFloat;
 | 
	
		
			
				|  |  | +    cdsSearchQuantity.AsString := Rec.ValueByName('Quantity').AsString;
 | 
	
		
			
				|  |  | +    if Assigned(StageRec) then
 | 
	
		
			
				|  |  | +      cdsSearchCurQcQuantity.AsFloat := StageRec.ValueByName('QcQuantity').AsFloat;
 | 
	
		
			
				|  |  | +    cdsSearchAddGatherQuantity.AsString := Rec.ValueByName('AddGatherQuantity').AsString;
 | 
	
		
			
				|  |  | +    if cdsSearchQuantity.AsFloat <> 0 then
 | 
	
		
			
				|  |  | +      cdsSearchCompleteRate.AsFloat := advRoundTo(
 | 
	
		
			
				|  |  | +          Rec.ValueByName('AddDealQuantity').AsFloat/cdsSearchQuantity.AsFloat*100);
 | 
	
		
			
				|  |  | +  end;
 | 
	
		
			
				|  |  |    cdsSearch.Post;
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -procedure TSearchData.BeginSearch;
 | 
	
		
			
				|  |  | -begin
 | 
	
		
			
				|  |  | -  cdsSearch.DisableControls;
 | 
	
		
			
				|  |  | -end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  constructor TSearchData.Create(AProjectData: TObject);
 | 
	
		
			
				|  |  |  begin
 | 
	
		
			
				|  |  |    inherited Create(nil);
 | 
	
	
		
			
				|  | @@ -86,11 +84,6 @@ begin
 | 
	
		
			
				|  |  |    inherited;
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -procedure TSearchData.EndSearch;
 | 
	
		
			
				|  |  | -begin
 | 
	
		
			
				|  |  | -  cdsSearch.EnableControls;
 | 
	
		
			
				|  |  | -end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  procedure TSearchData.LocateCurrent(ALocateType: TLocateType);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    procedure LocateCompile;
 | 
	
	
		
			
				|  | @@ -123,75 +116,50 @@ begin
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  procedure TSearchData.SearchKeyword(const AKeyword: string);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  procedure CheckKeyword(ANode: TsdIDTreeNode);
 | 
	
		
			
				|  |  | -  var
 | 
	
		
			
				|  |  | -    Rec, StageRec: TsdDataRecord;
 | 
	
		
			
				|  |  | -  begin
 | 
	
		
			
				|  |  | -    Rec := ANode.Rec;
 | 
	
		
			
				|  |  | -    StageRec := TProjectData(FProjectData).PhaseData.StageData.StageRecord(ANode.ID);
 | 
	
		
			
				|  |  | -    // Task 꼇꿴璂淃커쌘,쏭꿴璂묏넋좆헌데
 | 
	
		
			
				|  |  | -    if {(Pos(AKeyword, Rec.ValueByName('Code').AsString) > 0) or}
 | 
	
		
			
				|  |  | -        (Pos(AKeyword, Rec.ValueByName('B_Code').AsString) > 0) or
 | 
	
		
			
				|  |  | -        (Pos(AKeyword, Rec.ValueByName('Name').AsString) > 0) then
 | 
	
		
			
				|  |  | -    begin
 | 
	
		
			
				|  |  | -      AddSearchResult(Rec, StageRec);
 | 
	
		
			
				|  |  | -    end;
 | 
	
		
			
				|  |  | -  end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  procedure RecursiveSearchKeyword(ANode: TsdIDTreeNode);
 | 
	
		
			
				|  |  | -  begin
 | 
	
		
			
				|  |  | -    if not Assigned(ANode) then Exit;
 | 
	
		
			
				|  |  | -    CheckKeyword(ANode);
 | 
	
		
			
				|  |  | -    if ANode.HasChildren then
 | 
	
		
			
				|  |  | -      RecursiveSearchKeyword(ANode.FirstChild);
 | 
	
		
			
				|  |  | -    RecursiveSearchKeyword(ANode.NextSibling);
 | 
	
		
			
				|  |  | -  end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +var
 | 
	
		
			
				|  |  | +  iNode: Integer;
 | 
	
		
			
				|  |  | +  vNode: TBillsIDTreeNode;
 | 
	
		
			
				|  |  |  begin
 | 
	
		
			
				|  |  |    if AKeyword = '' then Exit;
 | 
	
		
			
				|  |  | -  BeginSearch;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  cdsSearch.DisableControls;
 | 
	
		
			
				|  |  |    try
 | 
	
		
			
				|  |  |      cdsSearch.EmptyDataSet;
 | 
	
		
			
				|  |  |      with TProjectData(FProjectData).BillsMeasureData do
 | 
	
		
			
				|  |  | -      RecursiveSearchKeyword(BillsMeasureTree.FirstNode);
 | 
	
		
			
				|  |  | +    begin
 | 
	
		
			
				|  |  | +      for iNode := 0 to BillsMeasureTree.Count - 1 do
 | 
	
		
			
				|  |  | +      begin
 | 
	
		
			
				|  |  | +        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[iNode]);
 | 
	
		
			
				|  |  | +        if (Pos(AKeyword, vNode.Rec.B_Code.AsString) > 0) or
 | 
	
		
			
				|  |  | +            (Pos(AKeyword, vNode.Rec.Name.AsString) > 0) then
 | 
	
		
			
				|  |  | +          AddSearchResult(vNode);
 | 
	
		
			
				|  |  | +      end;
 | 
	
		
			
				|  |  | +    end;
 | 
	
		
			
				|  |  |    finally
 | 
	
		
			
				|  |  | -    EndSearch;
 | 
	
		
			
				|  |  | +    cdsSearch.EnableControls;
 | 
	
		
			
				|  |  |    end;
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  procedure TSearchData.SearchOverRange;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  procedure CheckOverRange(ANode: TsdIDTreeNode);
 | 
	
		
			
				|  |  | -  var
 | 
	
		
			
				|  |  | -    Rec, StageRec: TsdDataRecord;
 | 
	
		
			
				|  |  | -  begin
 | 
	
		
			
				|  |  | -    Rec := ANode.Rec;
 | 
	
		
			
				|  |  | -    StageRec := TProjectData(FProjectData).PhaseData.StageData.StageRecord(ANode.ID);
 | 
	
		
			
				|  |  | -    if Rec.ValueByName('Quantity').AsFloat < Rec.ValueByName('AddDealQuantity').AsFloat then
 | 
	
		
			
				|  |  | -    begin
 | 
	
		
			
				|  |  | -      AddSearchResult(Rec, StageRec)
 | 
	
		
			
				|  |  | -    end;
 | 
	
		
			
				|  |  | -  end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  procedure RecursiveSearchOverRange(ANode: TsdIDTreeNode);
 | 
	
		
			
				|  |  | -  begin
 | 
	
		
			
				|  |  | -    if not Assigned(ANode) then Exit;
 | 
	
		
			
				|  |  | -    if ANode.HasChildren then
 | 
	
		
			
				|  |  | -      RecursiveSearchOverRange(ANode.FirstChild)
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      CheckOverRange(ANode);
 | 
	
		
			
				|  |  | -    RecursiveSearchOverRange(ANode.NextSibling);
 | 
	
		
			
				|  |  | -  end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +var
 | 
	
		
			
				|  |  | +  i: Integer;
 | 
	
		
			
				|  |  | +  vNode: TBillsIDTreeNode;
 | 
	
		
			
				|  |  |  begin
 | 
	
		
			
				|  |  | -  BeginSearch;
 | 
	
		
			
				|  |  | +  cdsSearch.DisableControls;
 | 
	
		
			
				|  |  |    try
 | 
	
		
			
				|  |  |      cdsSearch.EmptyDataSet;
 | 
	
		
			
				|  |  |      with TProjectData(FProjectData).BillsMeasureData do
 | 
	
		
			
				|  |  | -      RecursiveSearchOverRange(BillsMeasureTree.FirstNode);
 | 
	
		
			
				|  |  | +    begin
 | 
	
		
			
				|  |  | +      for i := 0 to BillsMeasureTree.Count - 1 do
 | 
	
		
			
				|  |  | +      begin
 | 
	
		
			
				|  |  | +        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
 | 
	
		
			
				|  |  | +        if not vNode.HasChildren then
 | 
	
		
			
				|  |  | +          if vNode.Rec.Quantity.AsFloat < vNode.Rec.AddDealQuantity.AsFloat then
 | 
	
		
			
				|  |  | +            AddSearchResult(vNode);
 | 
	
		
			
				|  |  | +      end;
 | 
	
		
			
				|  |  | +    end;
 | 
	
		
			
				|  |  |    finally
 | 
	
		
			
				|  |  | -    EndSearch;
 | 
	
		
			
				|  |  | +    cdsSearch.EnableControls;
 | 
	
		
			
				|  |  |    end;
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -205,38 +173,25 @@ begin
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  procedure TSearchData.SearchBelowRange;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  procedure CheckBelowRange(ANode: TsdIDTreeNode);
 | 
	
		
			
				|  |  | -  var
 | 
	
		
			
				|  |  | -    Rec, StageRec: TsdDataRecord;
 | 
	
		
			
				|  |  | -  begin
 | 
	
		
			
				|  |  | -    Rec := ANode.Rec;
 | 
	
		
			
				|  |  | -    if Rec.ValueByName('Quantity').AsFloat = 0 then Exit;
 | 
	
		
			
				|  |  | -    StageRec := TProjectData(FProjectData).PhaseData.StageData.StageRecord(ANode.ID);
 | 
	
		
			
				|  |  | -    if Rec.ValueByName('Quantity').AsFloat > Rec.ValueByName('AddDealQuantity').AsFloat then
 | 
	
		
			
				|  |  | -    begin
 | 
	
		
			
				|  |  | -      AddSearchResult(Rec, StageRec)
 | 
	
		
			
				|  |  | -    end;
 | 
	
		
			
				|  |  | -  end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  procedure RecursiveSearchBelowRange(ANode: TsdIDTreeNode);
 | 
	
		
			
				|  |  | -  begin
 | 
	
		
			
				|  |  | -    if not Assigned(ANode) then Exit;
 | 
	
		
			
				|  |  | -    if ANode.HasChildren then
 | 
	
		
			
				|  |  | -      RecursiveSearchBelowRange(ANode.FirstChild)
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      CheckBelowRange(ANode);
 | 
	
		
			
				|  |  | -    RecursiveSearchBelowRange(ANode.NextSibling);
 | 
	
		
			
				|  |  | -  end;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +var
 | 
	
		
			
				|  |  | +  i: Integer;
 | 
	
		
			
				|  |  | +  vNode: TBillsIDTreeNode;
 | 
	
		
			
				|  |  |  begin
 | 
	
		
			
				|  |  | -  BeginSearch;
 | 
	
		
			
				|  |  | +  cdsSearch.DisableControls;
 | 
	
		
			
				|  |  |    try
 | 
	
		
			
				|  |  |      cdsSearch.EmptyDataSet;
 | 
	
		
			
				|  |  |      with TProjectData(FProjectData).BillsMeasureData do
 | 
	
		
			
				|  |  | -      RecursiveSearchBelowRange(BillsMeasureTree.FirstNode);
 | 
	
		
			
				|  |  | +    begin
 | 
	
		
			
				|  |  | +      for i := 0 to BillsMeasureTree.Count - 1 do
 | 
	
		
			
				|  |  | +      begin
 | 
	
		
			
				|  |  | +        vNode := TBillsIDTreeNode(BillsMeasureTree.Items[i]);
 | 
	
		
			
				|  |  | +        if not vNode.HasChildren then
 | 
	
		
			
				|  |  | +          if vNode.Rec.Quantity.AsFloat > vNode.Rec.AddDealQuantity.AsFloat then
 | 
	
		
			
				|  |  | +            AddSearchResult(vNode);
 | 
	
		
			
				|  |  | +      end;
 | 
	
		
			
				|  |  | +    end;
 | 
	
		
			
				|  |  |    finally
 | 
	
		
			
				|  |  | -    EndSearch;
 | 
	
		
			
				|  |  | +    cdsSearch.EnableControls;
 | 
	
		
			
				|  |  |    end;
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 |