0

VBscriptにADOクエリ(ADODB.Recordset)があり、次のような結果が返されます。

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がわかっている場合は、結果に基づいて完全なロケーション文字列を作成する必要があります。

たとえば、最上位のグループIDが11の場合、「nId」と「nParentId」の値を調べてグループをトラバースした後、完全な場所の文字列は「マスターサーバー/管理対象コンピューター/サーバー2/Group47」になります。

親グループの数はさまざまである可​​能性があるため、親グループのないグループに到達するまでループする必要があります。また、複数のSQLクエリを作成することは避けたいので、結果を配列にロードして、そこから情報を処理する必要があると想定しています。

これを処理するための最良の方法は何ですか?

前もって感謝します :)

4

2 に答える 2

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ます。

于 2013-03-19T23:24:14.600 に答える
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
于 2013-03-19T22:52:50.827 に答える