Откройте 2 SAP windows параллельно - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу открыть 2 SAP GUI windows и настроить ту же транзакцию, но с другой информацией о ней.

Я знаю, что с VBA / VBS невозможно Запустите эти windows одновременно (как и другие посты, которые я видел здесь), но мне не нужно его запускать, мне просто нужен скрипт для настройки каждого окна с различной информацией. Я могу запустить его вручную после установки.

Я кодировал следующее:

Sub YI19Nreport()
Dim app As Object
Dim connection As Object
Dim session As Object
Dim plant As String

Set SapGuiAuto = GetObject("SAPGUI")
Set app = SapGuiAuto.GetScriptingEngine
Set connection = app.Children(0)
Set session = connection.Children(0)

Set objExcel = GetObject(, "Excel.Application")
Set objSheet = objExcel.Workbooks("Book1.xlsm").Sheets("Sheet1")

'''''Opening first YI19N
session.ActiveWindow().findById("wnd[0]/tbar[0]/okcd").Text = "/nyi19n"
session.ActiveWindow().findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/usr/btn%_S_WERKS_%_APP_%-VALU_PUSH").press
plant = Workbooks("Book1.xlsm").Sheets("Sheet1").Cells(2, 4)

session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").Text = plant

session.findById("wnd[1]/tbar[0]/btn[8]").press

'''''Opening second YI19N    
session.ActiveWindow().findById("wnd[0]/tbar[0]/okcd").Text = "/oyi19n"
session.ActiveWindow().findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/usr/btn%_S_WERKS_%_APP_%-VALU_PUSH").press
plant = Workbooks("Book1.xlsm").Sheets("Sheet1").Cells(3, 4)
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").Text = plant

session.findById("wnd[1]/tbar[0]/btn[8]").press
End Sub

С этим кодом SAP открывает первое окно, вводит информацию и вместо открытия второе окно, заполняет информацию о первом окне строкой, которая мне нужна для второго, и после всего этого открывает второе окно и завершает подпрограмму.

Я полагаю, что это связано с информацией о "детях" установить в начале Sub.

Если кто-то может мне помочь, это будет здорово.

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Я имел дело с подобными топиками 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

0 голосов
/ 03 февраля 2020

Вы можете определить обработчик события CreateSession объекта GuiApplication .

Следующий код представляет собой VBScript, взятый из ссылки и адаптированный так, чтобы глобальный объект lastOpenedSession инициализируется с последним открытым сеансом:

Dim lastOpenedSession ' Global GuiSession object
Dim objSapGui
Set objSapGui = GetObject("SAPGUI")

Dim objScriptingEngine
Set objScriptingEngine = objSapGui.GetScriptingEngine
WScript.ConnectObject objScriptingEngine,  "Engine_"

Dim Waiting
Waiting = 1

Do While (Waiting = 1)
 WScript.Sleep(100)
Loop

Set objScriptingEngine = Nothing
Set objSapGui = Nothing

Sub Engine_CreateSession(ByVal Session)
  Dim result
  Set lastOpenedSession = Session
  result = MsgBox("Session created", vbOKCancel)
  If result = vbCancel then
    Waiting = 0
  End If
End Sub

Эквивалентный код VBA:

  • Создание модуля класса AppHandler:
Private WithEvents app_ As SAPFEWSELib.GuiApplication
Private Sub app_CreateSession(ByVal session As SAPFEWSELib.GuiSession)
  Dim result
  Set lastOpenedSession = Session
  result = MsgBox("Session created", vbOKCancel)
  If result = vbCancel then
    Waiting = 0
  End If
End Sub
  • Основной код:
Dim lastOpenedSession ' Global GuiSession object
Dim objSapGui
Set objSapGui = GetObject("SAPGUI")

Dim objScriptingEngine
Set objScriptingEngine = objSapGui.GetScriptingEngine
Set objAppHandler = New AppHandler
Set objAppHandler.app_ = objScriptingEngine

Dim Waiting
Waiting = 1

Do While (Waiting = 1)
 Application.Sleep(100)
Loop

Set objAppHandler = Nothing
Set objScriptingEngine = Nothing
Set objSapGui = Nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...