Unable to call SAP BAPI function from VBA

那年仲夏 提交于 2019-12-13 19:08:37

问题


I'm trying to call SAP functions from an Excel macro, VBA. I can do the connection, but whenever the code reaches the line that calls a function, I get the error message "Run-time error '61704': Internal application error.

My code is the following:

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")

The error comes just when the last line is executed. I've added librfc32.dll in the references, I'm able to execute GUI scripts (recorded from SAP).

Does it have something to do with permissions or something?

Thanks


回答1:


I would not answer exactly your question but I hope to provide useful info anyway. I currently work on migration of accounting data from QuickBooks to SAP. I used Ruby and Ruby on Rails for scripting and web interface.

Since you are comfortable with scripting let me recommend to try the following:

  • ruby 1.8.7 (2011-12-28 patchlevel 357) [i386-mingw32] with DevKit from http://rubyinstaller.org
  • SAP NW RFC SDK (distributed as NWRFC_7-20004566.sar file) - extract sapnwrfc.dll into c:\windows\system32
  • SAP NW RFC Ruby library by Pierce Harding from http://www.piersharding.com/download/ruby/sapnwrfc/sapnwrfc-0.24-x86-mingw32-ruby187.gem

Installing Ruby and libraries is really simple.

You may need to create config file:

# 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"    

Then try something like this:

# 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")

You may receive errors regarding GL accounts etc. but this is just my working example. What's important here is to get RFC connection established. Then you can move on to prepare BAPI_REQUISITION_CREATE call, fill in call.REQUISITION_ITEMS, invoke it and check call.RETURN.

You may also find convenient that Ruby and Ruby on Rails can read data from Excel and integrate with different databases. This is working for me.

Cheers,

Alexei




回答2:


To access SAP you will need at a minimun s_RFC. You need to get with your SAP admin section for this and to determine which other authority objects that you might (or might not) need.



来源:https://stackoverflow.com/questions/11300503/unable-to-call-sap-bapi-function-from-vba

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!