你的表内容可以变为A-1 A-11,则以下方法改动很小, 不过你也可以保留A1 A11等,不过要判断"1",程序如下: procedure LoadTree(treeDB:TDBDataSet);//初始化树 procedure UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);//更新树 function GetNodeLevel(sFormat,sCode:string):integer; //获得节点层数 function GetNodeItem(sCode:string):integer;//获得item { Public declarations } end; const CTreeCodeFormat='122222'; cTreeMaxLevel=6; CTreeRootTXT='所有图书';var tsgzlfrom: Ttsgzlfrom; _err:integer; curUser:string[10]; mystate:string; gNodeId:string; gNodelevel:integer; gNode:TtreeNode; mynode:array[0..6] of TTreenode; i,Already,CurMode:integer; currow:integer; iniFile:string; HasSub:String; level:Integer; implementationuses bgNewunit; {$R *.DFM}procedure TtsgzlFrom.LoadTree(treeDB:TDBDataSet);//初始化树 var curID,nodeTxt:string; level,num:integer; begin //初始化变量 Screen.Cursor:=crHourGlass; tree.Enabled:=True; tree.Items.Clear; level:=1 ; num:=1; tree.items.clear; //设置根节点 mynode[level]:=Tree.items.add(Tree.Topitem,cTreeRootTxt); mynode[level].ImageIndex:=0; mynode[level].SelectedIndex:=1; //遍历数据表,利用编码字段记录排序规律,依次添加树节点 with TreeDb do begin try if not Active then open; first; while not Eof do begin curID:=trim(FieldByName('tsglb').AsString); nodeTxt:=curID+'-'+trim(FieldByName('tsglbn').AsString); level:=GetNodeLevel(cTreeCodeFormat,curID); //这里返回代码的层次数 if level>0 then begin //增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系。 //注意:这里的父节点是用当前节点的上一级节点mynode[level-1] mynode[level]:=Tree.Items.AddChild(Mynode[level-1],NodeTxt); mynode[level].ImageIndex:=2; mynode[level].SelectedIndex:=3; end; next;//下一条记录 end; finally; close; End; mynode[1].expand(False); Screen.Cursor:=crHourGlass; end; end;function TtsgzlFrom.GetNodeLevel(sFormat,sCode:string):integer; var i,iLen:integer; begin level:=-1 ; iLen:=0; if (sFormat<>'') and (sCode<>'') then for i:=1 to Length(sFormat) do //分析编码格式,找出当前代码层次 begin iLen:=iLen+StrToInt(sFormat[i]); if Length(sCode)=iLen then begin level:=i; break; end; end; result:=level; end;Function TtsgzlFrom.GetNodeItem(sCode:string):integer;//获得item var i,iCount,val:integer; tmp:string; begin Result:=0; iCount:=Tree.Items.Count; if iCount=0 then exit; val:=0; for i:=1 to iCount-1 do begin Tmp:=Tree.Items.Item[i].Text; Tmp:=Copy(Tmp,0,pos('-',Tmp)-1); if Tmp=sCode then begin val:=i; Break; end; end; result:=val; end;procedure TtsgzlFrom.UpdateTree(curNode:TTreenode; nodeTxt:string; state:string); Begin if state='add' then begin curNode:=Tree.Items.addchild(curNode,nodeTxt); curNode.ImageIndex:=2; curnode.SelectedIndex:=3; end; if state='del' then curNode.delete; if state='edi' then curNode.Text:=nodeTxt; end;
不过你也可以保留A1 A11等,不过要判断"1",程序如下:
procedure LoadTree(treeDB:TDBDataSet);//初始化树
procedure UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);//更新树
function GetNodeLevel(sFormat,sCode:string):integer; //获得节点层数
function GetNodeItem(sCode:string):integer;//获得item { Public declarations }
end; const
CTreeCodeFormat='122222';
cTreeMaxLevel=6;
CTreeRootTXT='所有图书';var
tsgzlfrom: Ttsgzlfrom;
_err:integer;
curUser:string[10];
mystate:string;
gNodeId:string;
gNodelevel:integer;
gNode:TtreeNode;
mynode:array[0..6] of TTreenode;
i,Already,CurMode:integer;
currow:integer;
iniFile:string;
HasSub:String; level:Integer;
implementationuses bgNewunit;
{$R *.DFM}procedure TtsgzlFrom.LoadTree(treeDB:TDBDataSet);//初始化树
var curID,nodeTxt:string;
level,num:integer;
begin
//初始化变量
Screen.Cursor:=crHourGlass;
tree.Enabled:=True;
tree.Items.Clear;
level:=1 ;
num:=1;
tree.items.clear;
//设置根节点
mynode[level]:=Tree.items.add(Tree.Topitem,cTreeRootTxt);
mynode[level].ImageIndex:=0;
mynode[level].SelectedIndex:=1;
//遍历数据表,利用编码字段记录排序规律,依次添加树节点
with TreeDb do
begin
try
if not Active then open;
first;
while not Eof do
begin
curID:=trim(FieldByName('tsglb').AsString);
nodeTxt:=curID+'-'+trim(FieldByName('tsglbn').AsString);
level:=GetNodeLevel(cTreeCodeFormat,curID);
//这里返回代码的层次数
if level>0 then
begin
//增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系。
//注意:这里的父节点是用当前节点的上一级节点mynode[level-1]
mynode[level]:=Tree.Items.AddChild(Mynode[level-1],NodeTxt);
mynode[level].ImageIndex:=2;
mynode[level].SelectedIndex:=3;
end;
next;//下一条记录
end;
finally;
close;
End;
mynode[1].expand(False);
Screen.Cursor:=crHourGlass;
end;
end;function TtsgzlFrom.GetNodeLevel(sFormat,sCode:string):integer;
var i,iLen:integer;
begin
level:=-1 ;
iLen:=0;
if (sFormat<>'') and (sCode<>'') then
for i:=1 to Length(sFormat) do //分析编码格式,找出当前代码层次
begin
iLen:=iLen+StrToInt(sFormat[i]);
if Length(sCode)=iLen then
begin
level:=i;
break;
end;
end;
result:=level;
end;Function TtsgzlFrom.GetNodeItem(sCode:string):integer;//获得item
var i,iCount,val:integer;
tmp:string;
begin
Result:=0;
iCount:=Tree.Items.Count;
if iCount=0 then exit;
val:=0;
for i:=1 to iCount-1 do
begin
Tmp:=Tree.Items.Item[i].Text;
Tmp:=Copy(Tmp,0,pos('-',Tmp)-1);
if Tmp=sCode then begin
val:=i;
Break;
end;
end;
result:=val;
end;procedure TtsgzlFrom.UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);
Begin
if state='add' then
begin
curNode:=Tree.Items.addchild(curNode,nodeTxt);
curNode.ImageIndex:=2;
curnode.SelectedIndex:=3;
end;
if state='del' then curNode.delete;
if state='edi' then curNode.Text:=nodeTxt;
end;
(A)是根据T1和T2两表来的,用树形控件就可以实现的,但是要
筛选(A)的最底层又如何做:
当field1='A1'时,显示报表为:
field1
C11
B12
A13我要求一定要用sql语句来写的,所属A1最底层的数据取出来。不能用delpi
来编写语句