【问题标题】:Assign Item-ID with loop variable使用循环变量分配 Item-ID
【发布时间】:2016-01-22 10:51:52
【问题描述】:

我正在尝试编写一些 .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 它工作得很好。但我找不到带有变量的项目。

有谁能帮帮我吗?我不知道该怎么办。

【问题讨论】:

  • 看起来您使用了某种自定义类,但没有定义很难建议。 application 是什么,它在哪里创建,期待 Set application = ... 某处的东西。它不能是经典 ASP 中的 Application 对象,因为它没有 Connections 集合,那么它是什么?我们不介意你知道的读者,你已经发布了我认为是自定义类代码的内容,所以我们需要所有的部分,而不是一个什么都不告诉我们的 sn-p。
  • Arf,对不起。我会在稍后添加它。

标签: vbscript sap-gui


【解决方案1】:

可能是 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 开始,当我手动放入索引时工作得非常好。我不太确定你对第二个解决方案的意图是什么,我也没有得到你在那里使用的那个“con”变量。无论哪种方式,我想稍后一一提及连接和会话。所以我将来需要一种索引。
  • 这完全是猜测工作,您在哪里见过 VBScript 中的内置对象 Application.Connections?我知道我没有。
  • 完全不用猜测。它是 VBScript,所以没有默认的 Application 对象,但是你可以声明“Application 是你想要的任何东西,如果该对象有 Connections 方法,那么它是完全有效的。例如,这使用 Application.Folders 方法来确认C盘存在.... Dim Application Set Application = CreateObject("Scripting.FileSystemObject") Msgbox Application.FolderExists("C:")
  • 另外,OP 明确指出当索引是带有数字的硬编码时代码有效,因此应用程序对象和连接集合必须存在。
  • 您应该编辑掉第一个循环解决方案,因为它不起作用。但第二个工作得很好。 :)
【解决方案2】:

汤姆在我上面的回答中的评论。我的第一个答案将适用于 For Each..Next 方法,但我确实在 Next 语句中发现了一个语法错误(请参阅上面我对该行的编辑。

但是,如果您真的不想使用 For Each 方法,或者它对您不起作用,那么您应该能够使索引方法起作用。

VBScript 不是强类型的,因此您不能使用精确的数字类型(如 Integer、Long 或 Byte)对变量进行 Dim。但是,您正在使用的类型库可能需要 Connections 方法的强类型参数。通常,VBScript 或您正在调用的方法会处理此问题,但您确实提到您正在使用 SAP(我过去已经自动化),所以我假设这是问题的原因.

就像我说的,VBScript 不提供强类型声明,但它允许您将值强制转换为特定类型。您说当您提供像 0 或 1 这样的数字文字时,您设法使代码正常工作,因此 似乎 您的连接方法将接受整数,但您的 i 变量 可能 em> 隐含地是一个 Long,考虑到它是如何声明的。

您可以通过将数字文字(默认为整数类型)分配给 i 来检查这一点,如下所示:

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 方法需要一个整数。所以你有可能让它发挥作用:

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

【讨论】:

  • 很抱歉告诉你,但以上都不起作用。它仍然是相同的错误消息。但我得到了你的“For..Each”解决方案。在这方面我犯了大错。非常感谢您,特别感谢您为此付出的努力!
  • 您能详细说明@Tom 吗?出于某种原因,您似乎对此感到困惑。理想情况下,想知道错误是什么,只是说 “我这边的大错误。” 并不能帮助遇到类似错误的其他人寻找答案。跨度>
  • 很容易。我只是没有正确实现 ThunderFrame 的代码,虽然它很容易。这就是为什么我认为它不起作用的原因。
  • 并进一步详细说明:您似乎需要一个整数数据类型,但我(!)不知道如何(尤其是不知道首先提到的这两个解决方案)分配一个整数变量的值。总结:它确实适用于数字,但不适用于变量。
【解决方案3】:

我设法避免坏索引错误的唯一方法是在索引值相同的情况下通过在每个变量后添加 +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

【讨论】:

  • ses[0] GuiSession /app/con[0]/ses[0] ses[1] GuiSession /app/con[0]/ses[1] ses[2] GuiSession /app/ con[0]/ses[2] ses[3] GuiSession /app/con[0]/ses[3] ses[4] GuiSession /app/con[0]/ses[4] ses[5] GuiSession /app /con[0]/ses[5]
【解决方案4】:

由于本文中仍有活动,我将发布我的最终代码。它不再使用了,但我想,如果还有人在寻找该特定问题的答案,这里有一个可行的解决方案。 (虽然其他答案真的很有帮助!)

这是由在 .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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2019-08-11
    • 2021-03-26
    • 2018-05-31
    • 2016-07-30
    • 2015-07-07
    相关资源
    最近更新 更多