No RFC authorization for function module RFC PING from VBA?

24.4k views Asked by At

Good morning, everybody!

I've been looking for the solution in the last days but I really have not managed to succeed: I am trying to make a VBA code to:

  1. log into SAP,
  2. run some transactions,
  3. export to excel.

But even the "log into SAP" part is not OK!

I tried several codes, the one below OPENS the SAP logon screen, but does not fill in any fields.

In the first attempt, I Used 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

In the second attempt, I tried CreateObject("SAP.Functions"), it showed:

"RFC error received. No RFC authorization for function module RFC PING"

The code is:

'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

Can someone please help me? Thanks!!

3

There are 3 answers

6
Jimmy Jazzx On

I assume your pulling via an RFC read Table. This Connection will work fine for those.

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

From this Point on you can make your RFC call without any issues.

But to be truthful though, Above is almost exactly what you have as your second example. your RFC Error your getting seems like you don't have security settings for SAP to make RFC calls to whatever table your pulling from and not a problem with your login code.

Disclaimer: RFC_READ_TABLE is NOT supported by SAP and is more of a backdoor then a day to day method for pulling data.

Edit1: To Cover the Comments and not turn this into a discussion I will try and Summarize them here.

Firstly

the pop-up: If you want the pop-up for the log in then you need to change this line of code

retcd = conn.Logon(0, True) 

to

retcd = conn.Logon(0, False) 'This one DISPLAYS the pop-up

Secondly

The Permissions: RFC_Read_Table uses Very Different Security Settings then a SAP t-Code uses, The technical Difference is difficult to explain but for a rule of thumb, If you cant access the SAP Table (t-Code SE16) you most likely not be able to pull it from RFC Read Table

Thirdly

If your company has Multiple SAP boxes (DEV, production, test) the Systemname would be EXACTLY what shows up on the box selection screen of SAP under name. assuming you were getting an RFC error from your second code block then the box name you used in that code would be the correct one.

3
Mikael G On

First of all, RFC is a perfectly fine method for interacting with SAP. It's not out of support.

Second, you don't have enough authorization so your code will not work even if you get the syntax right. "RFC error received. No RFC authorization for function module RFC PING". Ask your SAP team to give you access to execute RFCs remotely. Ask for SAP_S_RFCACL.

On a side note, your main object of running some transactions and exporting to Excel is quite easy to do in SAP. Maybe you should just ask your SAP team to do it for you instead of developing it in VBA?

0
PJ_ On

You can bypass RFC controls and just go for a normal scripting that imitates a human user and manually introduces username and password. Credit to The Script Man from the SAP forums:

 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