Я имел дело с подобными топиками c в прошлом. Речь шла об определении, могут ли транзакции SAP выполняться параллельно с использованием VBA. И если да, то, что это экономит с точки зрения времени по сравнению с последовательным выполнением транзакций SAP.
Вы можете решить это только с помощью обходного пути. Это состояло из запуска сценария VB из программы VBA.
Посмотрите мои примеры и попытайтесь выяснить, как вы можете применить их к вашей проблеме.
, например:
Sub Parallel_Sessions()
Set SapGuiAuto = GetObject("SAPGUI")
Set SAP_Application = SapGuiAuto.GetScriptingEngine
Set Connection = SAP_Application.Children(0)
Set session = Connection.Children(0)
Set wshell = CreateObject("Wscript.Shell")
Time_1 = TimeValue(Time)
For mysession = 0 To 5
Set session = Connection.Children(Int(mysession))
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nreiscn"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtS_BUKRS-LOW").Text = "2000"
session.findById("wnd[0]/usr/chkP_USEPTN").SetFocus
session.findById("wnd[0]/usr/chkP_USEPTN").Selected = True
session.findById("wnd[0]/usr/chkP_GRID").Selected = True
session.findById("wnd[0]/usr/chkP_DSPBUP").Selected = True
session.findById("wnd[0]/usr/ctxtSO_PARTN-LOW").Text = "1"
session.findById("wnd[0]/usr/ctxtSO_PARTN-HIGH").Text = "1000"
session.findById("wnd[0]/usr/chkP_DSPBUP").SetFocus
If mysession < 5 Then session.createSession
waitTill = Now() + TimeValue("00:00:03")
While Now() < waitTill
DoEvents
Wend
If mysession = 5 Then
session.findById("wnd[0]/tbar[1]/btn[8]").press
Else
wshell.Run """c:\tmp\Script_parallel_Sessions.vbs""" & " " & mysession
End If
Next
Time_2 = TimeValue(Time)
Time_0 = Round((Time_2 - Time_1) * 24 * 3600, 2)
MsgBox "This run for 6 sessions lasted " & Time_0 & " s ", vbInformation + vbMsgBoxForeground, "Note"
End Sub
Script_parallel_Sessions.vbs:
If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
for mysession = 0 to 5
if cstr(mysession) = cstr(wscript.arguments(0)) then
Set session = connection.Children(int(mysession))
session.findById("wnd[0]/tbar[1]/btn[8]").press
end if
next
А теперь серийная обработка:
Sub Seriell_Sessions()
Set SapGuiAuto = GetObject("SAPGUI")
Set SAP_Application = SapGuiAuto.GetScriptingEngine
Set Connection = SAP_Application.Children(0)
Set session = Connection.Children(0)
Time_1 = TimeValue(Time)
For mysession = 0 To 5
Set session = Connection.Children(Int(mysession))
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nreiscn"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtS_BUKRS-LOW").Text = "2000"
session.findById("wnd[0]/usr/chkP_USEPTN").SetFocus
session.findById("wnd[0]/usr/chkP_USEPTN").Selected = True
session.findById("wnd[0]/usr/chkP_GRID").Selected = True
session.findById("wnd[0]/usr/chkP_DSPBUP").Selected = True
session.findById("wnd[0]/usr/ctxtSO_PARTN-LOW").Text = "1"
session.findById("wnd[0]/usr/ctxtSO_PARTN-HIGH").Text = "1000"
session.findById("wnd[0]/usr/chkP_DSPBUP").SetFocus
If mysession < 5 Then session.createSession
waitTill = Now() + TimeValue("00:00:03")
While Now() < waitTill
DoEvents
Wend
session.findById("wnd[0]/tbar[1]/btn[8]").press
Next
Time_2 = TimeValue(Time)
Time_0 = Round((Time_2 - Time_1) * 24 * 3600, 2)
MsgBox "This run for 6 sessions lasted " & Time_0 & " s ", vbInformation + vbMsgBoxForeground, "Note"
End Sub
С уважением, ScriptMan