Невозможно вызвать функцию 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 и библиотеки действительно просто.

Вам может понадобиться создать файл конфигурации:

# 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 и определить, какие другие объекты полномочий вам могут (или могут не понадобиться).

Другие вопросы по тегам