GoodsItemID UpperGoodsItemID
10000 10000
10001 10000
10002 10000
10003 10000
10004 10000
10005 10004
10006 10004
10007 10006
10008 10006
10009 10006
10010 10004
10011 10004
10012 10000
10013 10012
10014 10013
10015 10013
10016 10013
取得选择的资产名称所有子资产名称代码
Sub GetGoodsItemId(TmpID As Long)
Dim Tmprst As ADODB.Recordset
Dim TmpStr As String
Dim Rst As ADODB.Recordset
Set Tmprst = OpenDB("Select GoodsItemID,UpperGoodsItemID from GoodsItem Where GoodsItemID=" & TmpID)
Do While Not Tmprst.EOF
TmpGoodsItemID = TmpGoodsItemID & Tmprst!GoodsItemId & ","
Set Rst = OpenDB("select GoodsItemID,UpperGoodsItemID from Goodsitem Where UpperGoodsItemID=" & Tmprst!GoodsItemId)
Do While Not Rst.EOF
Call GetGoodsItemId(Rst!GoodsItemId)
Rst.MoveNext
Loop
Tmprst.MoveNext
Loop
End Sub
以上这段代码是原来的,现在要用数组改进
下面是我新写的,但是有问题
Sub GetGoodsItemId(TempID As Long)
Dim Tmprst As ADODB.Recordset
Dim i, J, K, L, M, n, O, P As Integer
Dim gk() As StructGoodskinds
Dim TmpGID, TmpUGID As Long
Dim Low, Mid, Hig As Integer
取得记录集并排序
Set Tmprst = OpenDB("Select GoodsItemID,GoodsItemNo,UpperGoodsItemID from GoodsItem order by GoodsItemID,UpperGoodsItemID")
Tmprst.MoveLast
ReDim gk(Tmprst.RecordCount) As StructGoodskinds
Tmprst.MoveFirst
将记录集中的所需数据放入数组中
For i = 0 To Tmprst.RecordCount - 1
gk(i).GoodsItemID = Tmprst!GoodsItemID
gk(i).GoodsItemNO = Tmprst!GoodsItemNO
gk(i).UpperGoodsItemID = Tmprst!UpperGoodsItemID
Tmprst.MoveNext
Next i
在数组中取得资产ID号(GoodsItemID)
Low = 0
Hig = Tmprst.RecordCount - 1
Do While (Low <= Hig)
Mid = (Low + Hig) / 2
i = Mid
If gk(i).GoodsItemID = TempID Then
Exit Do
ElseIf TempID > gk(i).GoodsItemID Then
Low = Mid + 1
Else
Hig = Mid - 1
End If
Loop
将所需数据暂存变量
TmpGID = gk(i).GoodsItemID
TmpUGID = gk(i).UpperGoodsItemID
TmpGoodsItemID = TmpGoodsItemID & gk(i).GoodsItemID & ","
按照所取得的资产ID号,取出拥有下级子资产的ID放入数组gk().TempID中
For J = 0 To Tmprst.RecordCount - 1
If gk(J).UpperGoodsItemID = TmpGID Then
K = K + 1
gk(K).TempID = gk(J).GoodsItemID 递归之后值会被冲掉!
TmpGoodsItemID1 = TmpGoodsItemID1 & gk(K).TempID & ","
End If
Next J
如果子资产中还有下级子资产,利用递归找出其所有子资产,将取出的所有子资产放入全局变量TmpGoodsItemID中
For L = 1 To K
For M = 0 To Tmprst.RecordCount - 1
If gk(L).TempID = gk(M).UpperGoodsItemID Then
Call GetGoodsItemId(gk(L).TempID)
End If
Next M
TmpGoodsItemID = TmpGoodsItemID & gk(L).TempID & ","
Next L
End Sub
现在的问题是那个被冲掉的数据怎么保护啊~~
太长,晕......
再定义一个数组保存原记录!
将你的程序更改如下:
添加一个临时变量就可以了
Sub GetGoodsItemId(TempID As Long)
Dim Tmprst As ADODB.Recordset
Dim i, J, K, L, M, n, O, P As Integer
Dim gk() As StructGoodskinds
Dim Temp_gk() as StructGoodskinds 添加的临时变量
Dim TmpGID, TmpUGID As Long
Dim Low, Mid, Hig As Integer
K = -1 给K赋初值
取得记录集并排序
Set Tmprst = OpenDB("Select GoodsItemID,GoodsItemNo,UpperGoodsItemID from GoodsItem order by GoodsItemID,UpperGoodsItemID")
Tmprst.MoveLast
ReDim gk(Tmprst.RecordCount) As StructGoodskinds
ReDim Temp_gk(Tmprst.RecordCount) As StructGoodskinds
Tmprst.MoveFirst
将记录集中的所需数据放入数组中
For i = 0 To Tmprst.RecordCount - 1
gk(i).GoodsItemID = Tmprst!GoodsItemID
gk(i).GoodsItemNO = Tmprst!GoodsItemNO
gk(i).UpperGoodsItemID = Tmprst!UpperGoodsItemID
Tmprst.MoveNext
Next i
在数组中取得资产ID号(GoodsItemID)
Low = 0
Hig = Tmprst.RecordCount - 1
Do While (Low <= Hig)
Mid = (Low + Hig) / 2
i = Mid
If gk(i).GoodsItemID = TempID Then
Exit Do
ElseIf TempID > gk(i).GoodsItemID Then
Low = Mid + 1
Else
Hig = Mid - 1
End If
Loop
将所需数据暂存变量
TmpGID = gk(i).GoodsItemID
TmpUGID = gk(i).UpperGoodsItemID
TmpGoodsItemID = TmpGoodsItemID & gk(i).GoodsItemID & ","
按照所取得的资产ID号,取出拥有下级子资产的ID放入数组gk().TempID中
For J = 0 To Tmprst.RecordCount - 1
If gk(J).UpperGoodsItemID = TmpGID Then
K = K + 1
Temp_gk(K).TempID = gk(J).GoodsItemID 递归之后值会被冲掉!
TmpGoodsItemID1 = TmpGoodsItemID1 & Temp_gk(K).TempID & ","
End If
Next J
如果子资产中还有下级子资产,利用递归找出其所有子资产,将取出的所有子资产放入全局变量TmpGoodsItemID中
For L = 0 To K 这里循环由0开始
For M = 0 To Tmprst.RecordCount - 1
If Temp_gk(L).TempID = gk(M).UpperGoodsItemID Then
Call GetGoodsItemId(Temp_gk(L).TempID)
End If
Next M
TmpGoodsItemID = TmpGoodsItemID & Temp_gk(L).TempID & ","
Next L
End Sub
同时我想问一下:
1),这里下面两个变量的作用在你的第一个代码中没有
TmpGoodsItemID 与 TmpGoodsItemID1
2),注意这里可能出现的无限递归调用