一个treeview,一个dbgrid,和ADOQuery,datasource1通过单击treeview的结点,让dbgrid显示结点相关联的的数据。
如树的结构如下
甲公司
A部门
B部门
c部门
D部门
I部门
乙公司
F部门
H部门
其中有两个表:
表一:EpDept (部门结构表)
DpId (int) DpNa (varchar) DpTyp(varchar) DpPrId(int)
01 甲公司 001 nill
02 A部门 001001 01
03 B部门 001002 01
04 c部门 001002001 03
05 D部门 001002001001 04
06 乙公司 002 nill
07 F部门 002001 06
08 H部门 002002 06
09 I部门 001003 02
表二:Employee (员工信息表)
EpId EpNa DpId
1 张三 05
2 李四 09
现在我已经根据EpDept 中的DpId 、DpPrId字段生成了树型结构。我现在的问题是:
我单击 “甲公司” 节点是,需要在dbgrid中显示其甲公司下各部门的员工信息,但不要显示乙公司各部门的信息??
或者说点“B部门”时只显示其下的所属员工,而不显示其他部门的员工。。
急切等待中
如树的结构如下
甲公司
A部门
B部门
c部门
D部门
I部门
乙公司
F部门
H部门
其中有两个表:
表一:EpDept (部门结构表)
DpId (int) DpNa (varchar) DpTyp(varchar) DpPrId(int)
01 甲公司 001 nill
02 A部门 001001 01
03 B部门 001002 01
04 c部门 001002001 03
05 D部门 001002001001 04
06 乙公司 002 nill
07 F部门 002001 06
08 H部门 002002 06
09 I部门 001003 02
表二:Employee (员工信息表)
EpId EpNa DpId
1 张三 05
2 李四 09
现在我已经根据EpDept 中的DpId 、DpPrId字段生成了树型结构。我现在的问题是:
我单击 “甲公司” 节点是,需要在dbgrid中显示其甲公司下各部门的员工信息,但不要显示乙公司各部门的信息??
或者说点“B部门”时只显示其下的所属员工,而不显示其他部门的员工。。
急切等待中
解决方案 »
- 在StringGrid中如何实现鼠标滚轮操纵滚动条,而不是一行一行的走
- Delphi中如何杀进程呀?
- 大家好,我是个新手,以后请多多关照,想问问选择书开始学习比较好
- access中长表名数据要怎么取?
- 如何生成这样的txt?
- >>>>>>来者有分>>>>在delphi中如何引用api函数,需要引用那个单元?
- select 语句
- 如何对SQL SERVER的数据库进行加密,别人备份出后不能恢复
- 请问如何得到windows系统新安装了程序消息及新安装的程序名称?
- 请问一下谁能送我一个DELPHI的EXCEL读入控件(带多页),先谢了
- 利用ini配置文件连接sql2000数据库 出现的怪问题~~
- 利用mshtml得到了某个IHTMLElement的实例,但是如何获得这个实例的width呢?
定义部门数据结构
type
PDeptInfo=^TDeptInfo;
TDeptInfo=record
DpId: integer;
DpNa: string;
DpPrId: integer;
end;假定部门树名称 tvDept
生成树的时候,在添加节点的时候需要稍微做一点处理:procedure DestroyTree();
var
i: integer;
begin
tvDept.OnChange := nil;
for i:=0 to tvDept.Items.Count-1 do Dispose(PDeptInfo(tvDept.Items[i].Data));
tvDept.Items.Clear;
end;procedure BuildDeptTree();
var
node: TTreeNode;
lpDept: PDeptInfo;
begin
DestroyTree(); 添加树节点
new(lpDept);
lpDept^.DpId := ...
...
node.data := lpDept;
tvDept.OnChange := OnRefreshEmployee;
end;procedure OnRefreshEmployee(Sender: TObject; Node: TTreeNode);
var
strSql: string;
begin
if tvDept.Selected <> nil then
strSql := 'select * from Employee where DpId='+IntToStr(PDeptInfo(tvDept.Selected.Data)^.DpId
else
strSql := 'select * from Employee where 1<0'; //没选中部门,则没有任何人员记录。
生成记录集
end;最后,模块关闭的时候,记得把树销毁回收资源!
04 c部门 001002001 03
05 D部门 001002001001 04
假设现在选中的是B部门,根据DpTyp like'001002%'可以查询得到其子部门 001002001和001002001001
最终得到DpId=03,04,05,然后根据得到的这三个DpId到Employee中查询就可以到的你想要的结果了。select * from Employee where DpId in(select DpId from EpDept where DpTyp like'001002%')
此产品包含在产品集合 obout components Suite 中。
Tree_DB