Невозможно вызвать функцию SAP BAPI из VBA
Я пытаюсь вызвать функции SAP из макроса Excel, VBA. Я могу установить соединение, но всякий раз, когда код достигает строки, вызывающей функцию, я получаю сообщение об ошибке "Ошибка во время выполнения" 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).
Это как-то связано с разрешениями или что-то?
Спасибо
2 ответа
Я бы не стал точно отвечать на ваш вопрос, но в любом случае надеюсь предоставить полезную информацию. В настоящее время я работаю над миграцией учетных данных из QuickBooks в SAP. Я использовал Ruby и Ruby on Rails для сценариев и веб-интерфейса.
Так как вы хорошо разбираетесь в скриптах, я рекомендую попробовать следующее:
- ruby 1.8.7 (2011-12-28 patchlevel 357) [i386-mingw32] с DevKit с http://rubyinstaller.org/
- SAP NW RFC SDK (распространяется в виде файла NWRFC_7-20004566.sar) - распакуйте файл sapnwrfc.dll в c:\windows\system32
- Библиотека SAP NW RFC Ruby Пирса Хардинга из http://www.piersharding.com/download/ruby/sapnwrfc/sapnwrfc-0.24-x86-mingw32-ruby187.gem
Установить 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 и интегрироваться с различными базами данных. Это работает для меня.
Ура,
Алексей
Для доступа к SAP вам потребуется минимум s_RFC. Для этого вам нужно обратиться в раздел администрирования SAP и определить, какие другие объекты полномочий вам могут (или могут не понадобиться).