数据库的设计,
单位和人员之间是一对多的关系,并且不存在一个人同时存在于多个单位的可能(假定)。
这样,设计两个表,
单位表
结构如下
ID:单位的唯一识别号
Name:单位名称。
其他的非关键的字段
人员表
结构如下
ID:人员的唯一识别号
Name:姓名
Apartment:指向单位表中的单位ID,表明这个人员的单位归属。
其他的非关键字段遍历过程,
1、置人员表的游标到第一个记录
2、如果当前记录不是空则,进行3,否则7
3、取出人员表中的当前记录,找到Apartment,遍历TreeView,查找是否存在这样的ID,如果存在,则进行4,否则5
4、在找到的Treenode的子节点中插入一个新节点,Text为用户表当前记录的Name+ID的一个合成。(没有办法,TreeView中的节点除了Text没有其他的比如指针之类的可以描述节点的属性,只好这样处理)。转到6
5、根据找到的Apartmen指出的单位ID,在单位表中定位这个纪录,如果没有找到,则什么也不做,如果找到,插入这个节点到TreeView中,Text为Name和ID的合成。转到4
6、对人员表进行NextRecord,转到2
7、结束。
单位和人员之间是一对多的关系,并且不存在一个人同时存在于多个单位的可能(假定)。
这样,设计两个表,
单位表
结构如下
ID:单位的唯一识别号
Name:单位名称。
其他的非关键的字段
人员表
结构如下
ID:人员的唯一识别号
Name:姓名
Apartment:指向单位表中的单位ID,表明这个人员的单位归属。
其他的非关键字段遍历过程,
1、置人员表的游标到第一个记录
2、如果当前记录不是空则,进行3,否则7
3、取出人员表中的当前记录,找到Apartment,遍历TreeView,查找是否存在这样的ID,如果存在,则进行4,否则5
4、在找到的Treenode的子节点中插入一个新节点,Text为用户表当前记录的Name+ID的一个合成。(没有办法,TreeView中的节点除了Text没有其他的比如指针之类的可以描述节点的属性,只好这样处理)。转到6
5、根据找到的Apartmen指出的单位ID,在单位表中定位这个纪录,如果没有找到,则什么也不做,如果找到,插入这个节点到TreeView中,Text为Name和ID的合成。转到4
6、对人员表进行NextRecord,转到2
7、结束。
//请你测试测试看如下代码function TreeNodeString(mTreeNode: TTreeNode; mDelimiter: string = '\'): string;
begin
Result := '';
while Assigned(mTreeNode) do begin
Result := mTreeNode.Text + mDelimiter + Result;
mTreeNode := mTreeNode.Parent;
end;
Delete(Result, Length(Result) - Length(mDelimiter) + 1, MaxInt);
end; { TreeNodeString }function DataSetToTreeView(mDataSet: TDataSet; mTreeView: TTreeView): Boolean; overload;
const
cDelimiter = '\';
var
J, K: Integer;
vStrPath: string;
vStrText: string;
vTreeNode: TTreeNode;
vBoolFind: Boolean;
begin
Result := False;
if not (Assigned(mDataSet) and Assigned(mTreeView)) then Exit;
if not mDataSet.Active then Exit;
mTreeView.Items.Clear;
mDataSet.First;
while not mDataSet.Eof do begin
vStrPath := '';
vTreeNode := nil;
for J := 0 to mDataSet.FieldCount - 1 do begin
vStrText := mDataSet.Fields[J].DisplayText;
vStrPath := vStrPath + cDelimiter + vStrText;
vBoolFind := False;
for K := 0 to mTreeView.Items.Count - 1 do
if cDelimiter + TreeNodeString(mTreeView.Items[K], cDelimiter) =
vStrPath then begin
vTreeNode := mTreeView.Items[K];
vBoolFind := True;
Break;
end;
if vBoolFind then Continue;
vTreeNode := mTreeView.Items.AddChild(vTreeNode, vStrText);
end;
mDataSet.Next;
end;
Result := True;
end; { DataSetToTreeView }procedure TForm1.Button1Click(Sender: TObject);
begin
DataSetToTreeView(Table1, TreeView1);
end;
const
cDelimiter = '\';
var
J, K: Integer;
vStrPath: string;
vStrText: string;
vTreeNode: TTreeNode;
vBoolFind: Boolean;
begin
Result := False;
if not (Assigned(mDataSet) and Assigned(mTreeView)) then Exit;
if not mDataSet.Active then Exit;
mTreeView.Items.Clear;
mDataSet.First;
while not mDataSet.Eof do begin
vStrPath := '';
vTreeNode := nil;
for J := 0 to mDataSet.FieldCount - 1 do begin
vStrText := mDataSet.Fields[J].DisplayText;
vStrPath := vStrPath + cDelimiter + vStrText;
vBoolFind := False;
for K := 0 to mTreeView.Items.Count - 1 do
if cDelimiter + TreeNodeString(mTreeView.Items[K], cDelimiter) =
vStrPath then begin
vTreeNode := mTreeView.Items[K];
vBoolFind := True;
Break;
end;
if vBoolFind then Continue;
vTreeNode := mTreeView.Items.AddChild(vTreeNode, vStrText);
end;
mDataSet.Next;
end;
Result := True;
end; { DataSetToTreeView }procedure TForm1.Button1Click(Sender: TObject);
begin
DataSetToTreeView(Table1, TreeView1);
end;