求构建目录算法

tulipcaicai 2011-02-21 03:27:36
想通过读取数据库中的记录来自动生成目录,求个算法。

数据库中内容:

ID NodeName FatherID Levl
1 子站节点目录 0 0
2 Substation1 1 1
3 Substation2 1 1
4 Substation3 1 1
5 Substation4 1 1
6 Bay1 2 2
7 Bay2 2 2
8 Bay1 3 2
9 Bay1 4 2
10 Bay1 5 2
11 PZSU1 6 3
12 PZSU2 6 3
13 PZSU1 7 3
...


生成后的目录如下:
Substation1
Bay1
PZSU1
PZSU2
Bay2
PZSU1
Substation2
Bay1
Substation3
Bay1
......

...全文
82 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tulipcaicai 2011-02-22
  • 打赏
  • 举报
回复
[code=C]/C++void CListTreeDlg::ReadDir()
{
CString strSQL, strNodeName;
int nID, nlevel, nfatherID;
HTREEITEM hRoot, hItem1, hItem2;
std::vector<Dir> Vecdir;
Dir Subsysdir;
if (pGlobal->m_bconnDataBase)
{
strSQL = "Receive_Tab_Subsysdir";
pGlobal->m_AdoReceive.Open(strSQL, adCmdText);
if (pGlobal->m_AdoReceive.GetFieldsCount())
{
while (!pGlobal->m_AdoReceive.IsEOF())
{
pGlobal->m_AdoReceive.GetCollect("ID", nID);
pGlobal->m_AdoReceive.GetCollect("NodeName", strNodeName);
pGlobal->m_AdoReceive.GetCollect("FatherID", nfatherID);
pGlobal->m_AdoReceive.GetCollect("levl", nlevel);

Subsysdir.nID = nID;
Subsysdir.strNodename = strNodeName;
Subsysdir.nfatherID = nfatherID;
Subsysdir.nlevl = nlevel;

Vecdir.push_back(Subsysdir);

pGlobal->m_AdoReceive.MoveNext();
}
}
pGlobal->m_AdoReceive.Close();
}
for (int i = 0; i < Vecdir.size(); i++)
{
if (Vecdir[i].nlevl == 0)
{
hRoot = m_trBooks.InsertItem("目录");
}
else if(Vecdir[i].nlevl == 1)
{
hItem1 = m_trBooks.InsertItem(Vecdir[i].strNodename, hRoot);
for (int j = 0; j < Vecdir.size(); j++ )
{
if (Vecdir[i].nID == Vecdir[j].nfatherID && Vecdir[j].nlevl == 2)
{
hItem2 = m_trBooks.InsertItem(Vecdir[j].strNodename, hItem1);
for (int k = 0; k < Vecdir.size(); k++)
{
if (Vecdir[j].nID == Vecdir[k].nfatherID && Vecdir[k].nlevl == 3)
{
m_trBooks.InsertItem(Vecdir[k].strNodename, hItem2);
}
}
}
}

}
else
{

}
}

}
[/code]
tulipcaicai 2011-02-22
  • 打赏
  • 举报
回复
[code=C]/C++
void CListTreeDlg::ReadDir()
{
CString strSQL, strNodeName;
int nID, nlevel, nfatherID;
HTREEITEM hRoot, hItem1, hItem2;
std::vector<Dir> Vecdir;
Dir Subsysdir;
if (pGlobal->m_bconnDataBase)
{
strSQL = "Receive_Tab_Subsysdir";
pGlobal->m_AdoReceive.Open(strSQL, adCmdText);
if (pGlobal->m_AdoReceive.GetFieldsCount())
{
while (!pGlobal->m_AdoReceive.IsEOF())
{
pGlobal->m_AdoReceive.GetCollect("ID", nID);
pGlobal->m_AdoReceive.GetCollect("NodeName", strNodeName);
pGlobal->m_AdoReceive.GetCollect("FatherID", nfatherID);
pGlobal->m_AdoReceive.GetCollect("levl", nlevel);

Subsysdir.nID = nID;
Subsysdir.strNodename = strNodeName;
Subsysdir.nfatherID = nfatherID;
Subsysdir.nlevl = nlevel;

Vecdir.push_back(Subsysdir);

pGlobal->m_AdoReceive.MoveNext();
}
}
pGlobal->m_AdoReceive.Close();
}
for (int i = 0; i < Vecdir.size(); i++)
{
if (Vecdir[i].nlevl == 0)
{
hRoot = m_trBooks.InsertItem("目录");
}
else if(Vecdir[i].nlevl == 1)
{
hItem1 = m_trBooks.InsertItem(Vecdir[i].strNodename, hRoot);
for (int j = 0; j < Vecdir.size(); j++ )
{
if (Vecdir[i].nID == Vecdir[j].nfatherID && Vecdir[j].nlevl == 2)
{
hItem2 = m_trBooks.InsertItem(Vecdir[j].strNodename, hItem1);
for (int k = 0; k < Vecdir.size(); k++)
{
if (Vecdir[j].nID == Vecdir[k].nfatherID && Vecdir[k].nlevl == 3)
{
m_trBooks.InsertItem(Vecdir[k].strNodename, hItem2);
}
}
}
}

}
else
{

}
}

}

[/code]
tulipcaicai 2011-02-22
  • 打赏
  • 举报
回复
实现的代码片断如下:
[code=C]/C++
void CListTreeDlg::ReadDir()
{
CString strSQL, strNodeName;
int nID, nlevel, nfatherID;
HTREEITEM hRoot, hItem1, hItem2;
std::vector<Dir> Vecdir;
Dir Subsysdir;
if (pGlobal->m_bconnDataBase)
{
strSQL = "Receive_Tab_Subsysdir";
pGlobal->m_AdoReceive.Open(strSQL, adCmdText);
if (pGlobal->m_AdoReceive.GetFieldsCount())
{
while (!pGlobal->m_AdoReceive.IsEOF())
{
pGlobal->m_AdoReceive.GetCollect("ID", nID);
pGlobal->m_AdoReceive.GetCollect("NodeName", strNodeName);
pGlobal->m_AdoReceive.GetCollect("FatherID", nfatherID);
pGlobal->m_AdoReceive.GetCollect("levl", nlevel);

Subsysdir.nID = nID;
Subsysdir.strNodename = strNodeName;
Subsysdir.nfatherID = nfatherID;
Subsysdir.nlevl = nlevel;

Vecdir.push_back(Subsysdir);

pGlobal->m_AdoReceive.MoveNext();
}
}
pGlobal->m_AdoReceive.Close();
}
for (int i = 0; i < Vecdir.size(); i++)
{
if (Vecdir[i].nlevl == 0)
{
hRoot = m_trBooks.InsertItem("目录");
}
else if(Vecdir[i].nlevl == 1)
{
hItem1 = m_trBooks.InsertItem(Vecdir[i].strNodename, hRoot);
for (int j = 0; j < Vecdir.size(); j++ )
{
if (Vecdir[i].nID == Vecdir[j].nfatherID && Vecdir[j].nlevl == 2)
{
hItem2 = m_trBooks.InsertItem(Vecdir[j].strNodename, hItem1);
for (int k = 0; k < Vecdir.size(); k++)
{
if (Vecdir[j].nID == Vecdir[k].nfatherID && Vecdir[k].nlevl == 3)
{
m_trBooks.InsertItem(Vecdir[k].strNodename, hItem2);
}
}
}
}

}
else
{

}
}

}

[/code]
onlyliu 2011-02-21
  • 打赏
  • 举报
回复
举个例:
select a.id as father目录ID,
a.nodemame as father目录名称,
b.nodemame as 子目录,
from tablename a ,tablename b
where a.FatherID=b.FatherID and b.Levl=2
tulipcaicai 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 onlyliu 的回复:]

可以这样
先从数据库查询一级的所有。然后构建( Levl=1)

再查询二级的所有 Levl=2,加入条件(father ID=x)进行名称显示。

再查询三级 Levl=3,加入条件 (father id=x,father father id=x)进行显示。
你可以查询一下 表要用别名来表示
[/Quote]

fatherID 是不一定的。
onlyliu 2011-02-21
  • 打赏
  • 举报
回复
可以这样
先从数据库查询一级的所有。然后构建( Levl=1)

再查询二级的所有 Levl=2,加入条件(father ID=x)进行名称显示。

再查询三级 Levl=3,加入条件 (father id=x,father father id=x)进行显示。
你可以查询一下 表要用别名来表示

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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