SAP Logon с VBA
Всем доброе утро!
Я искал решение в последние дни, но мне действительно не удалось добиться успеха: я пытаюсь создать код vba: 1- войти в SAP, 2- выполнить несколько транзакций, 3- экспортировать в excel.
Но даже часть "войти в SAP" не в порядке!
Я пробовал несколько кодов, один из которых открывается ОТКРЫВАЕТ экран входа в SAP, но не заполняет поля. Я использовал CreateObject("Sapgui.ScriptingCtrl.1")
:
Sub Entrar_SAP()
If Not IsObject(SAPguiApp) Then
Set SAPguiApp = CreateObject("Sapgui.ScriptingCtrl.1")
End If
If Not IsObject(Connection) Then
Set Connection = SAPguiApp.OpenConnection("xxxxxxx)", True)
End If
If Not IsObject(session) Then
Set session = Connection.Children(0)
End If
session.findById("wnd[0]/usr/txtRSYST-MANDT").Text = "100"
session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "user"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "pass"
session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "PT"
session.findById("wnd[0]/usr/txtRSYST-LANGU").SetFocus
session.findById("wnd[0]/usr/txtRSYST-LANGU").caretPosition = 2
session.findById("wnd[0]").sendVKey 0
Еще один, с CreateObject("SAP.Functions")
, показал: "Ошибка RFC получена. Нет авторизации RFC для функционального модуля RFC PING"
код:
'Declaration
Dim objBAPIControl As Object 'Function Control (Collective object)
Dim sapConnection As Object 'Connection object
Set objBAPIControl = CreateObject("SAP.Functions")
Set sapConnection = objBAPIControl.Connection
sapConnection.Client = "xxxxx"
sapConnection.User = "xxxxxx"
sapConnection.Language = "PT"
sapConnection.hostname = "xxxxx"
sapConnection.Password = "xxxxxxxx" 'Fake password
sapConnection.SystemNumber = "4"
sapConnection.System = "xxxxxx)"
sapConnection.Logon
If sapConnection.Logon(1, True) <> True Then
MsgBox "No connection to R/3!"
Exit Sub 'End program
End If
Может кто-нибудь, пожалуйста, помогите мне? Спасибо!!
2 ответа
Во-первых, RFC - это прекрасный метод взаимодействия с SAP. Это не без поддержки.
Во-вторых, у вас недостаточно авторизации, поэтому ваш код не будет работать, даже если вы правильно выберете синтаксис. Msgstr "Ошибка RFC получена. Нет авторизации RFC для функционального модуля RFC PING". Попросите команду SAP предоставить вам доступ для удаленного выполнения RFC. Спросите SAP_S_RFCACL.
Кстати, ваш основной объект - выполнение некоторых транзакций и экспорт в Excel - довольно прост в SAP. Может быть, вам стоит попросить команду SAP сделать это для вас, а не разрабатывать это в VBA?
Я предполагаю, что вы тянете через таблицу чтения RFC. Это соединение будет хорошо работать для тех.
Dim LogonControl As Object
Dim conn As Object
Dim retcd As Boolean
Set LogonControl = CreateObject("SAP.LogonControl.1")
Set conn = LogonControl.NewConnection
conn.System = "strSystemName"
conn.Client = "100"
conn.Language = "EN"
conn.User = "sUserName"
conn.Password = "strPassword"
retcd = conn.Logon(0, True) 'True = No logon GUI 'False = logon GUI
If retcd <> True Then
MsgBox "Login failed for- " & strSystemName & " -UserName or Password are incorrect, check them and run try again ."
Exit Sub
End If
Set funcControl = CreateObject("SAP.Functions")
funcControl.Connection = conn
С этого момента вы можете совершать RFC-звонки без проблем.
Но, чтобы быть правдивым, Выше почти то, что у вас есть в качестве второго примера. ваша ошибка RFC вы получаете, похоже, что у вас нет настроек безопасности для SAP, чтобы делать RFC-вызовы для любой таблицы, из которой вы тянете, и у вас нет проблем с вашим логином.
Отказ от ответственности: SAP не поддерживает RFC_READ_TABLE и является скорее бэкдором, чем повседневным методом извлечения данных.
Edit1: чтобы покрыть комментарии, а не превращать это в обсуждение, я постараюсь обобщить их здесь.
во-первых
всплывающее окно: если вы хотите всплывающее окно для входа в систему, то вам нужно изменить эту строку кода
retcd = conn.Logon(0, True)
в
retcd = conn.Logon(0, False) 'This one DISPLAYS the pop-up
во-вторых
Разрешения: RFC_Read_Table использует очень разные параметры безопасности, чем использует t-код SAP. Техническую разницу трудно объяснить, но для практического правила. Если вы не можете получить доступ к таблице SAP (t-код SE16), вы, скорее всего, не сможете вытащить его из таблицы чтения RFC
в-третьих
Если в вашей компании есть несколько блоков SAP (DEV, production, test), имя системы будет ТОЧНО, что отображается на экране выбора блока SAP под именем. при условии, что вы получили ошибку RFC из вашего второго блока кода, тогда имя блока, которое вы использовали в этом коде, будет правильным.
Вы можете обойти элементы управления RFC и просто использовать обычный сценарий, который имитирует пользователя-человека и вручную вводит имя пользователя и пароль. Благодарность The Script Man с форумов SAP:
Sub SapLogin()
'Logs onto SAP system
Dim SapGuiApp As Object
Dim oConnection As Object
Dim session As Object
Dim SAPCon As Object, SAPSesi As Object
Dim SAPGUIAuto As Object, SAPApp As Object
Dim system As String
system = "XX" 'SAP system you will log on to like "01. ENGINEERING PRODUCTION [EG1]
If SapGuiApp Is Nothing Then
Set SapGuiApp = CreateObject("Sapgui.ScriptingCtrl.1")
End If
If oConnection Is Nothing Then
Set oConnection = SapGuiApp.OpenConnection(system, True)
End If
If SAPSesi Is Nothing Then
Set SAPSesi = oConnection.Children(0)
End If
Application.DisplayAlerts = FALSE
With SAPSesi
.FindById("wnd[0]/usr/txtRSYST-MANDT").Text = "100"
.FindById("wnd[0]/usr/txtRSYST-BNAME").Text = "USERNAME"
.FindById("wnd[0]/usr/pwdRSYST-BCODE").Text = "PASSWORD"
.FindById("wnd[0]/usr/txtRSYST-LANGU").Text = "EN"
.FindById("wnd[0]").SendVKey 0
'start extraction
.FindById("wnd[0]").Maximize
.FindById("wnd[0]/tbar[0]/okcd").Text = "/TCODEYOUWANTTORUN"
.FindById("wnd[0]").SendVKey 0
'...
'etc
'...
End With
Application.DisplayAlerts = True
MsgBox "After clicking OK, this SAP session is terminated."
End Sub