表有三个字段  ID,NAME,PARENTID求一递归算法

解决方案 »

  1.   

    分数太少了,如有多一点分,我愿意将成功源码Mail给你。
      

  2.   

    开玩笑的,楼主不要介意,呵呵!
    我用的数据库表BOM:
    ItemNO [Varchar(20)] ,SubItemNo [Varchar(20)],Description [Varchar(40)],Qty [numeric (9,2)],Unit [Varchar(4)],Re [Varchar(50)]递归生成树:
    unit BomMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, Buttons, DB, ADODB, Grids;type
      TfrmBomMain = class(TForm)
        TreeView1: TTreeView;
        Edit1: TEdit;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        Label1: TLabel;
        SpeedButton3: TSpeedButton;
        SpeedButton4: TSpeedButton;
        GroupBox1: TGroupBox;
        AdoConn1: TADOConnection;
        AQuery1: TADOQuery;
        StringGrid1: TStringGrid;
        procedure SpeedButton4Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
        procedure CreateTree(AId:String;FatherNode:TTreeNode); //添加分类过程
        procedure CheckCode(TmpItemNo:String);  //检测数据库中有无输入的Item No
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmBomMain: TfrmBomMain;implementationuses Search;{$R *.dfm}procedure TfrmBomMain.CreateTree(AId:String;FatherNode:TTreeNode);  //生成树过程
    var
      QryTmp:TADOQuery;
      myNode:TTreeNode;
    begin
      QryTmp:=TADOQuery.Create(self);
      QryTmp.ConnectionString:='Provider=SQLOLEDB.1;Password=801728;Persist Security Info=True;User ID=sa;Initial Catalog=Fspgroup;Data Source=FSPIT02';
      QryTmp.SQL.Add('select * from Bom');
      QryTmp.SQL.Add('where ItemNo='+QuotedStr(AId));
      QryTmp.Open;
      while not QryTmp.Eof do
        begin
          myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.FieldValues['SubItemNo']);      CreateTree(QryTmp.FieldValues['SubItemNo'],myNode); //递归调用过程
          QryTmp.Next;
        end;
      QryTmp.Free;
    end;procedure TfrmBomMain.CheckCode(TmpItemNo:String);
    begin
      AQuery1.Close;
      AQuery1.SQL.Clear;
      AQuery1.SQL.Text:='select * from Bom where itemno='+QuotedStr(TmpItemNo);
      AQuery1.Open;
    end;procedure TfrmBomMain.SpeedButton4Click(Sender: TObject);
    var
      TmpNode:TTreeNode;
    begin
      CheckCode(edit1.Text);
      if AQuery1.RecordCount=0 then
        begin
          Application.MessageBox('查无此Item No!!! ','系统提示',MB_ICONINFORMATION+MB_OK);
          exit;
        end;
      Treeview1.Items.Clear;
      TmpNode:=Treeview1.Items.Add(nil,edit1.Text);
      CreateTree(edit1.Text,TmpNode);
      Treeview1.FullExpand;
    end;procedure TfrmBomMain.Edit1KeyPress(Sender: TObject; var Key: Char);
    var
      TmpNode:TTreeNode;
    begin
      if key=#13 then
        begin
          CheckCode(edit1.Text);
          if AQuery1.RecordCount=0 then
            begin
              Application.MessageBox('查无此Item No!!! ','系统提示',MB_ICONINFORMATION+MB_OK);
              exit;
            end;
          Treeview1.Items.Clear;
          TmpNode:=Treeview1.Items.Add(nil,edit1.Text);
          CreateTree(edit1.Text,TmpNode);
          Treeview1.FullExpand;
        end;
    end;procedure TfrmBomMain.SpeedButton3Click(Sender: TObject);
    var
      TmpNode:TTreeNode;
    begin
      frmSearch:=TfrmSearch.Create(Application);
      frmSearch.Update;
      frmSearch.ShowModal;
      frmSearch.Free;
      Treeview1.Items.Clear;
      TmpNode:=Treeview1.Items.Add(nil,edit1.Text);
      CreateTree(edit1.Text,TmpNode);
      Treeview1.FullExpand;
    end;procedure TfrmBomMain.FormCreate(Sender: TObject);
    begin
      StringGrid1.Cells[1,0]:='组件';
      StringGrid1.Cells[2,0]:='用量';
      StringGrid1.Cells[3,0]:='单位';
    end;procedure TfrmBomMain.TreeView1Click(Sender: TObject);
    var
      i:integer;
    begin
      Try
      AQuery1.Close;
      AQuery1.SQL.Clear;
      AQuery1.SQL.Text:='select * from Bom where itemno='+QuotedStr(Treeview1.Selected.Text);
      AQuery1.Open;
      StringGrid1.RowCount:=AQuery1.RecordCount+1;
      for i:=1 to AQuery1.RecordCount do
        begin
          StringGrid1.Cells[1,i]:=AQuery1.FieldValues['SubItemNo'];
          StringGrid1.Cells[2,i]:=AQuery1.FieldValues['Qty'];
          StringGrid1.Cells[3,i]:=AQuery1.FieldValues['Unit'];
          AQuery1.Next;
        end;
      Except
      End;
    end;end.    
    unit Search;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,  Grids, DBGrids, StdCtrls, DB, ADODB;type
      TfrmSearch = class(TForm)
        DBGrid1: TDBGrid;
        Label1: TLabel;
        Edit1: TEdit;
        Label2: TLabel;
        AQuery1: TADOQuery;
        DataSource1: TDataSource;
        procedure DBGrid1DblClick(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmSearch: TfrmSearch;implementationuses BomMain;{$R *.dfm}procedure TfrmSearch.DBGrid1DblClick(Sender: TObject);
    begin
      frmBomMain.Edit1.Text:=aquery1.FieldValues['itemno'];
      Close;
    end;procedure TfrmSearch.Edit1Change(Sender: TObject);
    var
      str1:string;
    begin
      Str1:='itemno like '+''''+Trim(Edit1.Text)+'%'+'''';
      if trim(edit1.Text)='' then
        begin
          AQuery1.Filtered:=False;
          exit;
        end;
      AQuery1.Filtered:=False;
      AQuery1.Filter:=Str1;
      AQuery1.Filtered:=True;
    end;end.
      

  3.   

    如有需要源程序和源数据库,跟我联系。
    [email protected]