1

我正在尝试从 Excel 宏 VBA 调用 SAP 函数。我可以进行连接,但是每当代码到达调用函数的行时,我都会收到错误消息

运行时错误“61704”:内部应用程序错误。

我的代码如下:

Dim functionCtrl As Object
Dim sapConnection As Object
Dim theFunc As Object
Dim PoNumber

Set functionCtrl = CreateObject("SAP.Functions")
Set sapConnection = functionCtrl.Connection
sapConnection.System = ""
sapConnection.Client = ""
sapConnection.user = ""
sapConnection.Password = ""
sapConnection.Language = ""

If sapConnection.logon(0, False) <> True Then
MsgBox "No connection to R/3 System"
Exit Sub                                           'End program
End If
Set theFunc = functionCtrl.Add("BAPI_REQUISITION_CREATE")

错误仅在执行最后一行时出现。我在参考文献中添加了 librfc32.dll,我能够执行 GUI 脚本(从 SAP 记录)。

它与权限或其他什么有关吗?

谢谢

4

2 回答 2

1

我不会完全回答你的问题,但我希望无论如何都能提供有用的信息。我目前致力于将会计数据从 QuickBooks 迁移到 SAP。我使用 Ruby 和 Ruby on Rails 编写脚本和 Web 界面。

由于您对脚本编写感到满意,因此我建议您尝试以下方法:

安装 Ruby 和库非常简单。

您可能需要创建配置文件:

# c:\tmp\sapdev.yml
# adjust parameters to yours
ashost: your.sap.server.ip
sysnr: "00"
client: "100"
user: yoursaplogin
passwd: yoursappwd
lang: EN
trace: "1"    

然后尝试这样的事情:

# c:\tmp\sap-test.rb
require 'rubygems'
require 'sapnwrfc'

SAPNW::Base.config_location = "c:\\tmp\\sapdev.yml"
SAPNW::Base.load_config
conn = SAPNW::Base.rfc_connect
attrib = conn.connection_attributes
# here you will find if you can connect to SAP programmatically
puts "\n>>> Connection Attributes: #{attrib.inspect}\n"

# discover the BAPI function
call = conn.discover("BAPI_ACC_DOCUMENT_CHECK").new_function_call

# set up parameters. in this case DOCUMENTHEADER, ACCOUNTGL and CURRENCYAMOUNT
call.DOCUMENTHEADER = { 
  "HEADER_TXT" => "EXCEL POST", 
  "COMP_CODE" => "2080", 
  "DOC_DATE" => "20090123", 
  "PSTNG_DATE" => "20090123", 
  "USERNAME" => "YOURSAPLOGIN", 
  "BUS_ACT" => "RFBU", 
  "DOC_TYPE" => "SA" # CUSTOMER INVOICE 
}
puts "\n>>> DOCUMENTHEADER:"
p call.DOCUMENTHEADER

call.ACCOUNTGL = [
  {"ITEMNO_ACC" => "0000000001", "GL_ACCOUNT" =>"0000500000" },
  {"ITEMNO_ACC" => "0000000002", "GL_ACCOUNT" =>"0000799900", "ORDERID" => "CS_USD4110" }
]
puts "\n>>> ACCOUNTGL:"
p call.ACCOUNTGL

call.CURRENCYAMOUNT = [
   {"ITEMNO_ACC" => "0000000001", "CURR_TYPE" => "00", "CURRENCY" => "USD", "AMT_DOCCUR" => "-0.70" }, 
   {"ITEMNO_ACC" => "0000000002", "CURR_TYPE" => "00", "CURRENCY" => "USD", "AMT_DOCCUR" => "0.70" }
]
puts "\n>>> CURRENCYAMOUNT:"
p call.CURRENCYAMOUNT

call.invoke
puts "\n>>> call.RETURN:" 
message = []
call.RETURN.each do |r|
    message << r["MESSAGE"].strip
end
message.uniq!
puts message.join("\n")

您可能会收到有关 GL 帐户等的错误,但这只是我的工作示例。这里重要的是建立 RFC 连接。然后你可以继续准备BAPI_REQUISITION_CREATE调用,填写call.REQUISITION_ITEMS,调用它并检查call.RETURN

您可能还会发现 Ruby 和 Ruby on Rails 可以从 Excel 读取数据并与不同的数据库集成,这很方便。这对我有用。

干杯,

阿列克谢

于 2012-07-31T07:47:28.753 回答
0

要访问 SAP,您至少需要 s_RFC。为此,您需要与您的 SAP 管理部分联系,并确定您可能(或可能不需要)需要哪些其他权限对象。

于 2012-07-06T16:23:36.287 回答