关于数据库与算法问题。头大! 我第一天上班,就遇到这个难题.拜托高手写给我代码看看阿! 在下万分感激.

yunok 2003-07-08 10:32:10
关于数据库与算法问题。头大! 我第一天上班,就遇到这个难题.拜托高手写给我代码看看阿! 在下万分感激.

1。有一个表有2个子段。如下:
历史 现状
A1 A5
A2 A5
A3 A5
A4 A6
A4 A7
A5 A8
A6 A8
A7 A8
2.我现在第一次搜索到了A8,然后用一个Treevie1控件显示。显示为根节点“数据表”之下。例如如下树

的显示:
--A8
------A7
------A7
------A5

3.然后又搜索A7对应的 "现状" 的内容对应为:
--A8
------A7
----------A4
------A7
------A5

4.我的意思就是这样的 先找"现状"表中的A8,.现状中的A8所对应的有3个历史记录,就把这3个对应的"历

史"作为A8的子节点列出来.然后再分别搜寻A5,A6,A7所对应的"现状"中有没有他们,如果有,就找"历史"(

如上图A7又对应了A4 ).

5.如果有这样很多循环的循环.要求如上图结构列出到Treeview中.如何做???

6.我第一天上班,就遇到这个难题.拜托高手写给我代码看看阿!
...全文
49 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunok 2003-07-08
  • 打赏
  • 举报
回复
cdknet(cdksoft) ,非常感谢你!我需要时间试一下.等我一下
cdknet 2003-07-08
  • 打赏
  • 举报
回复
这样程序循环量比较大,尤其是在层次很多的情况下,代码没有测试过
cdknet 2003-07-08
  • 打赏
  • 举报
回复
先找出有多少现状,聚合所有的现状

从第一个现状开始,找出它所有的建一个Node,把<<<现状>>>送到下面的循环

{循环}
查出所有的历史,如果有历史把找到的每一个历史写入一个Node,再把<<<历史>>>进行嵌套循环
{循环}

yunok 2003-07-08
  • 打赏
  • 举报
回复
cdknet(cdksoft) ,让我仔细看一下.又点头大
yunok 2003-07-08
  • 打赏
  • 举报
回复
wjt2000(堂堂正正做男人),你给的什么呀?我晕
cdknet 2003-07-08
  • 打赏
  • 举报
回复
TreeRoot 为一常数,TreeRoot = "root"

Set Rs = WinApp.DBbase.Execute(SQLStr)

执行一个SQL语句,并返回一个记录集
cdknet 2003-07-08
  • 打赏
  • 举报
回复
注明:
Set TreeNode = tvwArea.Nodes.Add(TreeRoot, tvwChild, Key, tStr, "iDir", "iOpenDir")

"iDir", "iOpenDir" 为图标

cdknet 2003-07-08
  • 打赏
  • 举报
回复

'建立树型结构:
Private Sub CreateTree()
Dim Key As String
Dim Rs As ADODB.Recordset

Set TreeNode = tvwArea.Nodes.Add(, , TreeRoot, "数据表", "iRoot")
TreeNode.Expanded = True
tStr = "select distinct 现状 from 表"
Set Rs = WinApp.DBbase.Execute(tStr)
For i = 0 To Rs.RecordCount - 1
tStr = Trim(Rs(0))
Key = i + 1 & Trim(Rs(0))
Set TreeNode = tvwArea.Nodes.Add(TreeRoot, tvwChild, Key, tStr, "iDir", "iOpenDir")

AddNodes Key
Rs.MoveNext
Next
Rs.Close
Set Rs = Nothing
'tvwArea.Nodes(1).Selected = True
'Call tvwArea_NodeClick(tvwArea.Nodes(1))
End Sub

'添加树型控件数据:
Private Sub AddNodes(Keys As String)
On Error GoTo ErrorHand
Dim keyCount As Long
Dim tNode As Node
Dim Rs As New Recordset
Dim NKeys As String, SQLStr As String, tStr As String
keyCount = 1
SQLStr = "select 历史 from 表 where 现状='" & Mid(Keys, 2) & "'"
Set Rs = WinApp.DBbase.Execute(SQLStr)
Do While Not Rs.EOF
tStr = Trim(Rs(0))
NKeys = keyCount & tStr

Set tNode = tvwArea.Nodes.Add(Keys, tvwChild, NKeys, tStr)

AddNodes keyCount '嵌套循环
Rs.MoveNext
keyCount = keyCount + 1
Loop
Rs.Close
Set Rs = Nothing
Set tNode = Nothing
Exit Sub
ErrorHand:
Set Rs = Nothing
Set tNode = Nothing
End Sub
wjt2000 2003-07-08
  • 打赏
  • 举报
回复
//得到当前node的子nodes
public static void GetNodes(TreeNode node,string conditions,char level)
{
try
{
myNode[] mynode=new myNode[10000];//定义保存起始值的结构数组
string str=@"select DeptName,DeptCode from Info where Level='"+level+"'and DeptCode like '"+conditions+"%'";
SqlCommand myCommand = new SqlCommand ( str , globalVar.myConnection ) ;
SqlDataReader reader=myCommand.ExecuteReader();
long sum=0;
while(reader.Read())
{
mynode[sum].DeptName=reader[0].ToString().Trim();
mynode[sum].DeptCode=reader[1].ToString().Trim();
sum++;
}
reader.Close();
for(long i=0;i<sum;i++)
{
string name=mynode[i].DeptName.ToString();
string code=mynode[i].DeptCode.ToString();
TreeNode newNode=new TreeNode(name+"("+code+")");
node.Nodes.Add(newNode);
GetNodes(newNode,mynode[i].DeptCode,Convert.ToChar(level+1));//继续下一级的菜单
}
}
catch(Exception e1)
{
MessageBox.Show(e1.Message,"提示");
}
yunok 2003-07-08
  • 打赏
  • 举报
回复
谢谢wbtanwf(学无止境) .我看看先
yunok 2003-07-08
  • 打赏
  • 举报
回复
cdknet(cdksoft),是从A8开始.

其实A8是用户指定的.将来可能有A100之类的等等
wbtanwf 2003-07-08
  • 打赏
  • 举报
回复
我刚写完树形控件,我把我的代码给你参考参考,里面用了一个第归算法(不过,我的搜索和你的刚好相反,我是先找母级,再找它的子级):
Private Sub FindUpdate(ByVal strBS As String, ByVal strValue As String)
Dim tempRs As New ADODB.Recordset

tempRs.Open "select * from xj_sb_lj where pid='" & strBS & "'", p_conn, a dOpenDynamic, adLockPessimistic
If Not tempRs.EOF Then
tempRs.MoveFirst
While (Not tempRs.EOF)
tempRs.Update "syzt", strValue
Call FindUpdate(tempRs.Fields!bs, strValue)
tempRs.MoveNext
Wend
Else
Exit Sub
End If
End Sub
Private Sub FindDel(ByVal strBS As String)
Dim tempRs As New ADODB.Recordset

tempRs.Open "select * from xj_sb_lj where pid='" & strBS & "'", p_conn, adOpenForwardOnly, adLockReadOnly
If Not tempRs.EOF Then
tempRs.MoveFirst
While (Not tempRs.EOF)
p_conn.Execute "delete from xj_sb_lj where bs='" & tempRs.Fields!bs & "'"
Call FindDel(tempRs.Fields!bs)
tempRs.MoveNext
Wend
Else
'Exit Sub
p_conn.Execute "delete from xj_xjnr where lx_bs='" & strBS & "'"
End If
End Sub
wd_318 2003-07-08
  • 打赏
  • 举报
回复
杨兄:出现这样的结果,你大约是把:
Select distinct 历史 from 表 where 现状=上级代码 order by 历史
改成了?
Select distinct * from 表 where 现状=上级代码 order by 历史
吧?

不能这样,*部份应该用:字段名1,字段名2,字段名3.... 代替,用到几个字段就写几个
这样才不会重复
cdknet 2003-07-08
  • 打赏
  • 举报
回复
还要问下,是不是指定从A8开如,如果是就简单了,还有,有没有A10 A3000 An???
cdknet 2003-07-08
  • 打赏
  • 举报
回复
1。有一个表有2个子段。如下:
历史 现状
A1 A5
A2 A5
A3 A5
A4 A6
A4 A7
A5 A8
A6 A8
A7 A8

加一条:
A8 A4 这种可能性会不会发现,发生了怎么办?(如果不发生当然不靠虑了)
wd_318 2003-07-08
  • 打赏
  • 举报
回复
如果要解决cdknet(cdksoft) 提出的问题,可以加上一个时候要素,因为可以确定:
历史时间肯定小于现状时间的,这样的话,需要多加上一参数和一个字段
yunok 2003-07-08
  • 打赏
  • 举报
回复
最终结果是这样的:

--A8
------A7
----------A4
------A7
----------A4
------A5
----------A4
cdknet 2003-07-08
  • 打赏
  • 举报
回复
无限找下去我知道,
A2
...A4
....A8
....A12
....An

我就是想知道如果相互关联了怎么办?
yunok 2003-07-08
  • 打赏
  • 举报
回复
你看一下这个表里的关系:
1。有一个表有2个子段。如下:
历史 现状
A1 A5
A2 A5
A3 A5
A4 A6
A4 A7
A5 A8
A6 A8
A7 A8

到A4就结束了
yunok 2003-07-08
  • 打赏
  • 举报
回复
你看一下这个表里的关系:
1。有一个表有2个子段。如下:
历史 现状
A1 A5
A2 A5
A3 A5
A4 A6
A4 A7
A5 A8
A6 A8
A7 A8

到A4就结束了
加载更多回复(22)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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