2013-03-19 22 views
0

我有一個ADO查詢(ADODB.Recordset)在VBScript將返回結果如下圖所示:生成字符串基於組的陣列

nId wstrName    nParentId 
0 Managed computers  2 
1 Unassigned computers NULL 
2 Master Server   NULL 
3 pseudohosts   NULL 
5 Server 2    0 
8 Group100    5 
10 Group22    5 
11 Group47    5 
13 Group33    5 
14 Group39    5 
15 Group11    5 

我需要建立基於一個完整的位置字符串當我知道最高級別組ID時結果。

E.g.如果頂層組ID是11,那麼在遍歷組之後,通過查看「nId」和「nParentId」值,完整的位置字符串將是「主服務器/受管計算機/服務器2 /組47」。

父組的數量可能會有所不同,所以我需要循環,直到我到達沒有父組的組。我也想避免做多個SQL查詢,所以我假設結果應該被加載到一個數組中,然後從那裏處理信息。

處理這個問題的最佳方法是什麼?

感謝提前:)

回答

1

您可以記錄工作,因爲它是。試試這個:

groupname = "..." 

rs.MoveFirst 
rs.Find("wstrName = '" & groupname & "'") 
location = rs("wstrName") 
parent = rs("nParentId") 
Do Until parent = "NULL" 
    rs.MoveFirst 
    rs.Find("nId = " & parent) 
    location = rs("wstrName") & "/" & location 
    parent = rs("nParentId") 
Loop 

您可能需要調整取決於循環的條件在您的記錄中NULL值是否是字符串"NULL"或實際Null值。

+0

+1.4爲不需要額外數據結構的解決方案; -0.4爲四個虛假的括號。 – 2013-03-20 00:19:43

+0

工程就像一個魅力,如此簡單,謝謝:) – 2013-03-20 08:08:43

0

使用字典來存儲你的表格數據和遞歸函數來建立位置字符串。

演示腳本:

Dim dicData : Set dicData = CreateObject("Scripting.Dictionary") 
'   nId   wstrName    nParentId 
    dicData(0) = Array("Managed computers" , 2 ) 
    dicData(1) = Array("Unassigned computers", NULL) 
    dicData(2) = Array("Master Server"  , NULL) 
    dicData(3) = Array("pseudohosts"   , NULL) 
    dicData(5) = Array("Server 2"   , 0 ) 
    dicData(8) = Array("Group100"   , 5 ) 
    dicData(10) = Array("Group22"    , 5 ) 
    dicData(11) = Array("Group47"    , 5 ) 
    dicData(13) = Array("Group33"    , 5 ) 
    dicData(14) = Array("Group39"    , 5 ) 
    dicData(15) = Array("Group11"    , 5 ) 
    Dim nId 
    For Each nId In dicData.Keys() 
     WScript.Echo Right(100 + nId, 2), buildLoc(dicData, nId, Array()) 
    Next 

Function buildLoc(dicData, nId, aTmp) 
    ReDim Preserve aTmp(UBound(aTmp) + 1) 
    aTmp(UBound(aTmp)) = dicData(nId)(0) 
    If IsNull(dicData(nId)(1)) Then 
    reverseArr aTmp 
    buildLoc = Join(aTmp, "/") 
    Else 
    buildLoc = buildLoc(dicData, dicData(nId)(1), aTmp) 
    End If 
End Function 

Sub reverseArr(aX) 
    Dim nUB : nUB = UBound(aX) 
    Dim nUB2 : nUB2 = nUB \ 2 
    Dim i, vt 
    For i = 0 To nUB2 
     vt   = aX(i) 
     aX(i)  = aX(nUB - i) 
     aX(nUB - i) = vt 
    Next 
End Sub 

輸出:

00 Master Server/Managed computers 
01 Unassigned computers 
02 Master Server 
03 pseudohosts 
05 Master Server/Managed computers/Server 2 
08 Master Server/Managed computers/Server 2/Group100 
10 Master Server/Managed computers/Server 2/Group22 
11 Master Server/Managed computers/Server 2/Group47 
13 Master Server/Managed computers/Server 2/Group33 
14 Master Server/Managed computers/Server 2/Group39 
15 Master Server/Managed computers/Server 2/Group11 
+0

謝謝您的貢獻:) – 2013-03-20 08:09:39

相關問題