根椐数据库内容填充TreeView的问题?问题解决立即结帐

jxc163 2003-08-14 02:58:52
库中有两个表,一个是部门列表,一个员工列表

P_BM表的结构为

  序号,部门编号,部门名称,上级部门,部门说明

P_YG表的结构为
  
  序号,员工编号,员工姓名,所属部门,等等。

现在在要把这两个表的内容添加到一个TreeView中,要求是:

  一个部门要添加到它的上级部门下,没有上级部门的可以直接添加到根下,员工添加到所属部门下。
  要考虑的情况是一个部门有多个多级子部门(级数与个数均不确定,排列顺序是无规律),其次是数据量很大。

  
...全文
41 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxc163 2003-08-19
  • 打赏
  • 举报
回复
部门依然存在
jxc163 2003-08-16
  • 打赏
  • 举报
回复
原因:此文件不存在或已被系统删除!
tanqth 2003-08-16
  • 打赏
  • 举报
回复
可以下呀!
jxc163 2003-08-15
  • 打赏
  • 举报
回复
foreveryday007:我又掉线了!
这样的项目正好,
会好找工作一些
XXSingle 2003-08-15
  • 打赏
  • 举报
回复
支持人: foreveryday007(有無數種方法可以浪費一天的時間…但是…) ( ) 的函数用法.
jxc163 2003-08-15
  • 打赏
  • 举报
回复
各位老兄提供的方法我回去再试
IORILI 2003-08-15
  • 打赏
  • 举报
回复
procedure Tcpya_app.FormCreate(Sender: TObject);
begin
datamodule2.tree.close;
datamodule2.tree.sql.clear;
datamodule2.tree.sql.add('select name from plat order by name');
datamodule2.tree.Active:=true;
datamodule2.tree.Open;
while not datamodule2.tree.Eof do
begin
with tv.Items do
begin
MyTreeNode1 := Add(nil,trim(datamodule2.tree.fields[0].asstring));
with datamodule2 do
begin
child.close;
child.SQL.Clear;
child.SQL.Add('select comp from dalei where plat='''+Trim(datamodule2.tree.Fields[0].asstring)+''''+' order by comp');
child.Active:=true;
child.Open;
While Not child.Eof do
begin
TV.Items.AddChild(mytreenode1,trim(child.Fields[0].AsString));
child.Next;
end; end;
datamodule2.tree.Next;
end;
end;
end;

使我再做项目的时候写的 其中tree、child TADOQUERY
foreveryday007 2003-08-15
  • 打赏
  • 举报
回复
//調用這個就行了
function TForm1.GetTNByView(T: TTreeView; S: String; L: TStringList): TTreeNode;
var
I:Integer;
S1:String;
begin
S1:=L.Names[L.IndexOf(S)];
Try
for i := 0 to T.Items.Count do
begin
Result := GetTNByNode(T.Items[i],s);//這個調用下面的東西
if Result <> nil then Exit;
end;
except
Result:=nil;
end;
end;

function TForm1.GetTNByNode(T:TTreeNode;S:String):TTreeNode;
var
I:Integer;
begin
Try
for i:= 0 to T.Count - 1 do
begin
if T.Item[I].Text=S then
Result:=T.Item[i]
else if T.Item[I].Count > 0 then
Result := GetTNByNode(T.Item[I],S);

if Result <> nil then Exit;
end;
except
Result:=nil;
end;
end;


你試試看
shangui 2003-08-15
  • 打赏
  • 举报
回复
我早就想问这个问题了.
jxc163 2003-08-15
  • 打赏
  • 举报
回复
上面几位的方法我回去再试。

下面的方法是我昨天想用的方法,但调试过程中有一个错误,请大家帮忙看看:

procedure InitTV(TV:TTreeView);
var
TN1:TTreeNode;
R:TStringList;

function GetTN(T:TTreeView;S:String;L:TStringList):TTreeNode;
var
I:Integer;
S1:String;
begin
S1:=L.Names[L.IndexOf(S)];
Try
for i:=0 to T.Items.Count-1 do
if T.Items.Item[I].Text=S1 then Result:=T.Items.Item[i];
Finally
Result:=nil;
end;
end;

begin
R:=TStringList.Create;

Try
with DM do
begin
TSetSelect('Select 部门编号,部门名称,上级部门 From P_bmzl');

with TSet do
while not Eof do
begin
R.Add(Trim(FieldValues['部门编号'])+'='+Trim(FieldValues['部门名称']));
if (FieldByName('上级部门').IsNull or (Trim(FieldValues['上级部门'])='')) then
TN1:=TV.Items.AddChild(Nil,Trim(FieldValues['部门名称']))
else
TN1:=TV.Items.AddChild(GetTN(TV,Trim(FieldValues['上级部门']),R),Trim(FieldValues['部门名称']));
TN1.ImageIndex:=0;
Next;
end;
showinfo(R.Text);
end;{end of with DM}
Finally
R.Free;
end;{end of Try}

end;

jxc163 2003-08-15
  • 打赏
  • 举报
回复
楼上的兄弟,你的控件怎么不能下载。
我的E-mail是:jxc163@163.net
tanqth 2003-08-15
  • 打赏
  • 举报
回复
我有一个控件,是TREE的,但您表的格式不同,您如果用一个SQL把两个表进行联接,就好办了,因为我的控件只要有Tree编码与对应名称就行了。

如:
P_BM表的结构为

  序号,部门编号,部门名称,上级部门,部门说明

P_YG表的结构为
  
  序号,员工编号,员工姓名,所属部门,等等。
中,用P_YG表中的所属部门与P_BM表中的部门编号或部门名称为关联,建立视图,结构如:
序号,部门编号,部门名称,上级部门,部门说明,序号,员工编号,员工姓名,所属部门,等等,您就可以用我那控件了。
http://www.myjinsui.com/down/soft/gbxx.exe
jxc163 2003-08-15
  • 打赏
  • 举报
回复
foreveryday007:我试了这你的方法,返回的返回的函数值依然是空值
jxc163 2003-08-15
  • 打赏
  • 举报
回复
foreveryday007:我试了这你的方法,返回的返回的函数值依然是空值
spears 2003-08-14
  • 打赏
  • 举报
回复
你可以在开始的时候只调最上层的部门
select 部门名称 from p_bm where 上级部门=''
adoquery.sql.add('select 部门名称 from p_bm where 上级部门='''''');
adoquery.open;

while not adoquery.eof do
begin
node:=treeview1.items.add(treeview1.selected,adoquery.fieldbyname('部门名称'))//增加节点
str:='select 部门名称 p_bm hwere 上级部门='+adoquery.fieldbyname('部门名称');
adoquery1.sql.add(str);
sdoquery1.open;
if not adoqeury1.eof then
treeview1.items.addchild(node,'temp');
end;
当展开treeview1时再把所需要的第二三层数据填进去

总的意思就是先只读一层数据,然后用户点到哪个节点再动态生成这个节点的一层子节点,以此类推吧
bxh2dai 2003-08-14
  • 打赏
  • 举报
回复
只要部门的Treeview树解决了,我想你把员工加到部门树应该不是问题了吗?
Query1.SQL.Add('select * form p_bm');这一句改成:
Query1.SQL.Add('select * form p_bm order by 上级部门');也许要好一些
bxh2dai 2003-08-14
  • 打赏
  • 举报
回复
其实这是一个反复查询的过程,你首先把上级部门给空的放到treeview的第一个目录下,也就是你说的直接添加到根下,然后再查询上级部门不给空的数据,找到他在treeview中所在的位置,再直接添加就可以了,你可以分析如下代码:
假设上级部门没有时,为0
var thisnode,tnode:TTreeNode;
str:string;
begin
thisnode:=treeview1.Items.GetFirstNode;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * form p_bm');
query1.Open;
while not Query1.Eof do
begin
if query1.FieldByName('上级部门').AsString='0' then
treeview1.Items.Add(thisnode,query1.fieldbyname('部门名称').AsString)
else
tnode:=treeview1.Items.GetFirstNode;
while tnode<>nil do
begin
if tnode.Text=query1.FieldByName('上级部门').AsString then
begin
treeview1.Items.AddChild(tnode,Query1.fieldbyname('部门名称').AsString);
break;
end;
tnode.GetNext;
end;
end;
end;
cyh1898 2003-08-14
  • 打赏
  • 举报
回复
我还只会静态创建,你这个是动态创建的问题,我也想知道。
我关注,我顶。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧