Коннект Python к SAP R/3
Нужно подключиться из python 3.8 к SAP R3. Поиск по гуглу привел к 2 методам через Dispatch("SAP.Functions") и через pyrfc. так как для pyrfc нужно устанавливать доп пакеты. Хотелось бы подключиться через Dispatch("SAP.Functions") Дабы все работало от базового клиента Пишем код
from win32com.client import Dispatch
import inspect
f = Dispatch("SAP.Functions")
f.Connection.User = 'aa'
f.Connection.LogOn(0,False)
на строчке f.Connection.username = 'aa' получаем
Traceback (most recent call last):
File "d:\Python\SAP\saptest1.py", line 5, in <module>
f.Connection.User = 'aa'
File "C:\python\lib\site-packages\win32com\client\dynamic.py", line 559, in __setattr__
self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value)
pywintypes.com_error: (-2147352562, 'Недопустимое число параметров.', None, None)
Добавление любых строк к F приводит к этой ошибке
Поиск по инету приводит к такому коду где утверждается что все работает https://stackoverflow.com/questions/52153056/set-query-parameters-of-rfc-read-table-using-win32com-module
from win32com.client import Dispatch
Functions = Dispatch("SAP.Functions")
Functions.Connection.Client = "400"
Functions.Connection.ApplicationServer = "myserver"
Functions.Connection.Language = "EN"
Functions.Connection.User = "myuser"
Functions.Connection.Password = "mypwd"
Functions.Connection.SystemNumber = "00"
Functions.Connection.UseSAPLogonIni = False
if (Functions.Connection.Logon (0,True) == True):
print("Logon OK")
Причем у меня есть код на MSSQL сервере где установлен стандартный клиент сапа и MSSQL сервер из stored procedure коннектится нормально к сапу. Через SAP.Functions и параметры передаются
То что оле объект рабочий и он есть это подтверждается запуском такого кода
f = Dispatch("SAP.Functions")
f.Connection.LogOn(0,False)
Вызывается стандартный логин сапа и просит ввести данные. Мне нужно избежать диалогового окна и подключиться автоматически.
Что не так делаю?
Спасибо.
Ответы (1 шт):
В общем пару дней долбился.. Вот решение
from win32com.client.dynamic import Dispatch
LogonControl = Dispatch("SAP.LogonControl.1")
objConnection = LogonControl.NewConnection
objConnection.user = 'user'
objConnection.password = 'password'
objConnection.client = '013'
objConnection.applicationserver = 'ipaddres'
objConnection.systemnumber = '03'
objConnection.usesaplogonini = False
if not objConnection.Logon(0, True):
print('LogonError....')
else:
print('LogonOK....')
f = Dispatch("SAP.Functions")
f.Connection = objConnection
RFC = f.Add("RFC_READ_TABLE")
RFC.Exports("QUERY_TABLE").Value = "ZPGAUTOADDMAT"
RFC.Exports("ROWCOUNT").Value = "100"
RFC.Exports("DELIMITER").Value = ";"
if RFC.Call == False:
print('Error call function')
else:
tblOptions = RFC.Tables("OPTIONS")
tblData = RFC.Tables("DATA")
tblFields = RFC.Tables("FIELDS")
print(tblFields.RowCount)
print(tblFields(1,"FIELDNAME"))
row = 1
while row <= tblData.RowCount:
print(tblData(row,(1)))
row = row + 1
Обязательно атрибуты objConnection маленькими буквами !!!
objConnection.user = 'USERNAME'
objConnection.password = 'password'
objConnection.client = '013'
objConnection.applicationserver = 'ipaddres'
objConnection.systemnumber = '03'
objConnection.usesaplogonini = False
В этом был вся трудность. Я взял чужой код, где написано все работает. Но пока случайно не сделал маленькими буквами, ничего не работало. Хотя у меня в MSSQL через stored procedure, написаны с большой буквы все атрибуты и там работает.