我正在尝试做一些.vbs脚本来减轻我的SAP工作量。 我开始很容易,所以首先我想看看在特定连接上打开了多少个会话。
这是我的代码:
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
iConnections = application.Connections.Count
If iConnections > 0 Then
For i = 0 to iConnections - 1
iSessions = application.Connections.Item(i).Sessions.Count
msgbox iSessions & " Sessions for Connection " & i + 1
Next
End If
问题是:我在第3行“收集访问的错误索引类型”中收到错误。“
如果我只是将0或1放在那里而不是'i',那么它的效果非常好。但我找不到带变量的Item。
你能帮助我吗?我不知道该怎么做。答案 0 :(得分:0)
可能是Connections集合的索引从1开始,而不是0.您可以尝试:
If iConnections > 0 Then
For i = 1 to iConnections
iSessions = application.Connections.Item(i).Sessions.Count
msgbox iSessions & " Sessions for Connection " & i
Next
End If
如果这不起作用,那么您可以尝试使用For..Each枚举它们,而不是通过索引引用连接,就像这样
If iConnections > 0 Then
For Each con in Application.Connections
i = i + 1
iSessions = con.Sessions.Count
msgbox iSessions & " Sessions for Connection " & i
'EDIT: The next line can't explicitly use Next con in VB-script, so I've commented out con
Next 'con
End If
答案 1 :(得分:0)
继汤姆在上面的回答中的评论之后。我的第一个答案将适用于For Each..Next方法,但我确实在Next语句中发现了语法错误(请参阅上面对该行的编辑。
但是,如果你真的不想使用For Each方法,或者它不适合你,那么你 应该能够使索引方法正常工作。
VBScript不是强类型的,因此您不能使用Integer,Long或Byte等精确数字类型对变量进行Dim。但是,您正在使用的类型库可能需要Connections方法的强类型参数。通常情况下,VBScript或您正在调用的方法会处理这个问题,但您确实提到过您正在使用SAP(我过去已经自动化),因此我认为这是导致问题的原因
就像我说的,VBScript不提供强类型声明,但它确实允许你将值强制转换为特定类型。你说当你提供像0或1这样的数字文字时,你设法让代码工作,所以似乎你的连接方法将接受一个整数,但你的i变量可能 em>隐含地是一个Long,给出它的声明方式。
您可以通过为i指定一个数字文字(默认为Integer类型)来检查这一点,如下所示:
i = 0
iSessions = application.Connections.Item(i).Sessions.Count
msgbox iSessions & " Sessions for Connection " & i
有时,COM对象不允许您在没有完全处理父项的句柄的情况下访问子成员,因此更精细的测试将是:
i = 0
Set con = application.Connections.Item(i)
iSessions = con.Sessions.Count
msgbox iSessions & " Sessions for Connection " & i
如果上述任何一个工作,那么你有一个线索,表明Connections.Item方法需要一个Integer。所以你可以让它发挥作用:
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
'The connections.Count method might coerce a Long or an Integer, or even a Byte
iConnections = application.Connections.Count
If iConnections > 0 Then
'Convert iConnections to an Integer, and i should then be an Integer too
For i = 0 to CInt(iConnections) - 1
set con = application.Connections.Item(i)
iSessions = con.Sessions.Count
msgbox iSessions & " Sessions for Connection " & i + 1
Next
End If
答案 2 :(得分:0)
我设法避免错误索引错误的唯一方法是当我操纵索引值时,通过在每个变量之后添加+ 1 + 0-1来实现它。
下面是使用早期绑定计算1个连接中的会话数
Sub Session_count()
Dim sapAuto As Object
Dim sapGUI As SAPFEWSELib.GuiApplication
Dim con As SAPFEWSELib.GuiConnection
Dim sapSession As SAPFEWSELib.GuiSession
Dim i As Long
Dim iSessions As Long
Dim IConnections As Long
Set sapAuto = GetObject("sapgui")
Set sapGUI = sapAuto.GetScriptingEngine
IConnections = sapGUI.Connections.Count
If IConnections > 0 Then
Set con = sapGUI.Connections.Item(IConnections - 1 + 1 - 0 - 1)
iSessions = con.Sessions.Count - 1
If iSessions > 0 Then
i = 0
Do
Set sapSession = con.Children.Item(i + 1 + 0 - 1)
With sapSession
Debug.Print .Name, .Type, .ID
End With
i = i + 1 + 1 - 0 - 1 'Here am still incementing i by 1 but for some reason SAP won't give you a bad index
Set sapSession = Nothing
Loop While i + 0 + 1 - 1 < iSessions + 1
End If
End If
End Sub
&#13;
答案 3 :(得分:0)
由于这篇文章还有活动,我会发布我的最终代码。它已经不再使用了,但我想,如果还有人在寻找特定问题的答案,那么这是一个有效的解决方案。 (虽然其他答案真的很有帮助!)
这是一个在.hta文件中运行的脚本。因此列表框。列出了所有会话及其ID。
function SessionInfo
Dim i as Long
'clear listbox
SessionList.innerhtml = ""
'create listbox
Set optGroup = Document.createElement("OPTGROUP")
optGroup.label = "Server"
'count number of connections
ConnectionCount = application.Connections.Count
If ConnectionCount > 0 Then
Sessionlist.appendChild(optGroup)
Else
optGroup.label = No connection."
Sessionlist.appendChild(optGroup)
End If
If ConnectionCount > 0 Then
For Each conn in application.Connections
SessionCount = conn.Sessions.Count
Set objOption = nothing
Set optGroup = Document.createElement("OPTGROUP")
optGroup.label = conn.Description
Sessionlist.appendChild(optGroup)
i = 0
For Each sess In conn.Sessions
i = i + 1
Set objOption = Document.createElement("OPTION")
objOption.Text = "Session " & i & ": " & sess.ID
objOption.Value = sess.ID
SessionList.options.add(objOption)
Next
Next
Else
Exit function
End If
End function