Скрипт SAP работает медленнее со временем VBA - PullRequest
0 голосов
/ 14 января 2019

Когда я запускаю сценарий SAP в VBA (excel) в течение длительного периода времени, сеанс SAP начинает замедляться. Если я прерву код и начну его снова, сеанс SAP все еще будет работать с низкой скоростью, с которой он был. Если я закрою Excel и снова выполню код, сеанс SAP все еще будет работать на низкой скорости. Однако если я закрою сеанс SAP и снова открою его, а затем выполню код (не закрывая Excel), скорость снова вернется к оптимальной скорости.

Я запустил приведенный ниже код (в качестве теста), чтобы увидеть снижение скорости. Когда код начинался, каждый цикл занимал около 4 секунд, однако 300-й цикл уменьшал скорость до 16 секунд за цикл.

Это может показаться тривиальным, но я запускаю другой блок кода (слишком большой для публикации), который имеет около 3000 циклов для выполнения, где каждый цикл занимает около 25 секунд для выполнения с оптимальной скоростью (минута или дольше на цикл один раз SAP начинает тормозить).

Вместо запуска блока из 100 циклов, закрытия SAP, повторного открытия SAP и последующего запуска следующего блока из 100 циклов (что я и делал), кто-нибудь знает, что замедляет сеанс SAP и, если есть способ сбросить SAP программно, чтобы код снова вернулся к оптимальной скорости? Буду очень признателен за любую помощь или направление, я не могу найти много в Интернете по этому поводу.

Sub runScript()

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual

    Dim count As Integer
    count = 1

    Do While count < 1000

        Dim startDateTime As Date
        startDateTime = Now

        Call enterExitTransactionIW33

        Cells(count, 2) = DateDiff("S", startDateTime, Now)
        count = count + 1

    Loop

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic

End Sub

Private Sub enterExitTransactionIW33()

    Dim SAPGuiAuto, SAPApp, SAPConnection, SAPSession As Object

    Set SAPGuiAuto = GetObject("SAPGUI")
    Set SAPApp = SAPGuiAuto.GetScriptingEngine
    Set SAPConnection = SAPApp.Children(0)
    Set SAPSession = SAPConnection.Children(0)

    SAPSession.findById("wnd[0]/tbar[0]/okcd").Text = "IW33"
    SAPSession.findById("wnd[0]").sendVKey 0

    SAPSession.findById("wnd[0]/usr/ctxtCAUFVD-AUFNR").Text = "80808080"
    SAPSession.findById("wnd[0]").sendVKey 0

    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1100/tabsTS_1100/tabpVGUE").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpMUEB").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpKOAU").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpPARU").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpIOLU").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpIHKD").Select

    SAPSession.findById("wnd[0]/tbar[0]/okcd").Text = "/N"
    SAPSession.findById("wnd[0]").sendVKey 0

End Sub
...