0

大家早上好!

最近几天我一直在寻找解决方案,但我真的没有成功:我正在尝试制作一个 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 PING 没有 RFC 授权”

代码是:

'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

有人可以帮帮我吗?谢谢!!

4

3 回答 3

1

首先,RFC 是与 SAP 交互的完美方法。这不是失去支持。

其次,您没有足够的授权,因此即使您的语法正确,您的代码也无法工作。“收到 RFC 错误。功能模块 RFC PING 没有 RFC 授权”。请您的 SAP 团队授予您远程执行 RFC 的权限。询问SAP_S_RFCACL

附带说明一下,运行一些事务并导出到 Excel 的主要目标在 SAP 中很容易实现。也许你应该让你的 SAP 团队为你做这件事,而不是用 VBA 开发它?

于 2015-06-23T09:08:18.407 回答
0

我假设您通过 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 ,它更像是一个后门,而不是用于提取数据的日常方法。

编辑1:为了覆盖评论而不是将其变成讨论,我将尝试在这里总结它们。

首先

弹出窗口:如果你想要登录的弹出窗口,那么你需要更改这行代码

retcd = conn.Logon(0, True) 

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

第二

权限:RFC_Read_Table 使用与 SAP t-Code 使用的非常不同的安全设置,技术差异很难解释,但根据经验,如果您无法访问 SAP 表(t-Code SE16),您很可能无法访问从 RFC 读取表中提取它

第三

如果您的公司有多个 SAP 框(DEV、生产、测试​​),则系统名称将与名称下的 SAP 框选择屏幕上显示的完全一致。假设您从第二个代码块中收到 RFC 错误,那么您在该代码中使用的框名称将是正确的。

于 2015-06-22T16:32:13.893 回答
0

您可以绕过 RFC 控制,只使用模仿​​人类用户并手动引入用户名和密码的普通脚本。归功于 SAP 论坛中的 The Script Man

 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
于 2020-03-20T13:46:56.970 回答