求一构造树的递归算法!!急急急 表有三个字段 ID,NAME,PARENTID求一递归算法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 分数太少了,如有多一点分,我愿意将成功源码Mail给你。 开玩笑的,楼主不要介意,呵呵!我用的数据库表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. 如有需要源程序和源数据库,跟我联系。[email protected] 大家都在什么系统下做开发? 求教一个dll静态释放的问题,请给出解决代码! Win32服务线程中使用的函数要在哪儿声明和定义? 怎样在子窗口中使用数据库控件? memo中的光标位置改变会触发什么事件? FastReport复合报表问题 打印预览时怎么什么都看不到啦? 用dephi7的朋友帮忙看一下啊,socket传输的问题 ADOQuery的问题 DELPHI工程和窗体图标 声明一个类,如何使用其事件? 为什么会出现 Connection is busy whith result for another hstmt???
我用的数据库表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.
[email protected]