VBA Sap Scripting, чтобы открыть или подключиться / остаться в уже открытом окне сеанса - PullRequest
0 голосов
/ 17 апреля 2019

Я сделал все возможное, чтобы автоматизировать извлечение данных транзакции SAP с помощью VBA и SAP, записать и воспроизвести сценарий .vbs, теперь я столкнулся с проблемой, которую не видел в той же программе в Visual Basic Studio .NET, если SAP EasyДоступ к моему соединению по имени: LA-6-Prod уже открыт, затем появляется окно Multilogon и нарушает мой код, таким образом проваливая весь процесс.

Как я могу получить свой код, чтобы использовать уже существующее и открытое соединение илиоткрыть его, если он не открыт?

Он отлично работает, если LA-6-Prod не открыт, но не может сказать конечному пользователю, чтобы убедиться, что окна подключения не открыты перед выполнением макроса.

Большое спасибо

Это мой код:

  Sub my_sap

  Dim SapGui

  Dim Applic

  Dim connection

  strconnection = Worksheets("sap_info").Range("A2").Value

  Dim session

  Dim WSHShell

  Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbNormalFocus

  Set WSHShell = CreateObject("WScript.Shell")

  Do Until WSHShell.AppActivate("SAP Logon ")

    application.Wait Now + TimeValue("0:00:01")

  Loop

  Set WSHShell = Nothing

  Set SapGui = GetObject("SAPGUI")

  Set Applic = SapGui.GetScriptingEngine

  Set connection = Applic.OpenConnection('LA-6-Prod', True)

  Set session = connection.Children(0)

'===============SAP SCRIPTING===========

Execute SAP stuffs, I put in here what I recorded from sap record and it works OK

'=======================================

  Set session = Nothing

  connection.CloseSession ("ses[0]")

  Set connection = Nothing

  Set sap = Nothing

'End of my sub

End Sub

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Вы можете использовать функцию для проверки, если соединение уже открыто, используя что-то вроде этого ...

Sub sap()

If SAP_Connection Then
MsgBox ("Sap is Open so just attached to session(0)")
Else
MsgBox ("Sap is NOT open so open Logon Window")
End If

End Sub

Функция будет выглядеть следующим образом ...

Function SAP_Connection() As Boolean

On Error GoTo ErrSap

If Not IsObject(SapApplication) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set SapApplication = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = SapApplication.Children(0)
End If
If Not IsObject(Session) Then
   Set Session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject Session, "on"
   WScript.ConnectObject SapApplication, "on"
End If

SAP_Connection = True
Exit Function

ErrSap:
SAP_Connection = False

End Function

1 голос
/ 18 апреля 2019

Если вы используете функции SAP BAPI в локальной установке клиента, вы можете обойти необходимость выполнения команд оболочки и т. Д.

Один из методов в VBA - создать глобальную переменную типа Object в модуле для функций SAP.

  1. В одной подпрограмме в том же модуле создайте объект и войдите в SAP.
  2. В других подпрограммах / функциях выполнять некоторые действия.
  3. Используйте последнюю подпрограмму для выхода из системы и удаления объекта.

Глобальная переменная сохраняет ваш сеанс открытым на время вашей обработки.

Например, в ваших глобальных переменных в верхней части вашего модуля вы можете поместить:

Dim objR3 As Object  'SAP functions / connection

Допустим, вы создаете форму доступа с некоторыми текстовыми полями для атрибутов входа в систему (для этого вы также можете использовать Excel и просто ссылаться на ячейки). Затем в подпрограмме входа используйте что-то вроде:

strUser = frm!txtSAPUser
strPwd = frm!txtPassword
strClient = frm!txtClient
strSystem = frm!txtSystem
strServer = frm!txtServer
Set objR3 = CreateObject("SAP.Functions")
With objR3.Connection
    .System = strSystem
    .client = strClient
    .User = strUser
    .Password = strPwd
    .language = "EN"
    .ApplicationServer = strServer
    .SystemNumber = strSystem
    '--if no logon then exit
If .logon(0, True) <> True Then
    MsgBox "Login failed.", vbExclamation, "Login"
End If
End With

Затем, выполнив некоторые действия в других подпрограммах, вы можете использовать команду logoff в подпрограмме выхода из системы:

    objR3.Connection.LOGOFF

Этот метод будет держать ваше соединение открытым, пока вы выполняете некоторые сценарии для интерфейса SAP.

...