Текущее время: Сб, июн 21 2025, 01:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: RFC-соединение c R3 через VBA
СообщениеДобавлено: Чт, май 05 2011, 12:17 
Начинающий
Начинающий

Зарегистрирован:
Чт, май 05 2011, 11:35
Сообщения: 16
Добрый день! В процессе обработки запроса, необходимо несколько раз вызвать FM-ник через RFC и передать/получить значения переменных. Каждый раз вводить логин-пароль страсть как не хочется. Предполагаю, что параметры соединения можно взять из уже установленого соединения Bex. Ознакомился со всеми представленными здесь темами, посвященными RFC и VBA, нотами SAP, постами на SDN, однако не увидел ни одной рабочей схемы. Господа, поделитесь пожалуйста рабочим куском кода, кто делал, можно без комментариев.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Чт, май 05 2011, 13:46 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
Вот тут описывал вполне себе работоспособную версию для Bex 7.0
http://sapboard.ru/forum/viewtopic.php?p=362399#p362399
Для тройки немного отличается, но где-то на форуме тоже есть.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Чт, май 05 2011, 14:18 
Начинающий
Начинающий

Зарегистрирован:
Чт, май 05 2011, 11:35
Сообщения: 16
При всем моем уважении, не работает. (BI 7.0 )
Вот этот кусок кода из того поста:

Sub Connect()
Dim sapConnection As Variant

Set sapConnection = Run("BEXAnalyzer.XLA!sapBEXgetConnection")
If sapConnection.IsConnected <> 1 Then
MsgBox "Нет соединения!"
Exit Sub
End If
Set objBAPIControl = CreateObject("SAP.Functions")
objBAPIControl.Connection.ApplicationServer = sapConnection.ApplicationServer
objBAPIControl.Connection.Password = sapConnection.Password
objBAPIControl.Connection.client = sapConnection.client
objBAPIControl.Connection.user = sapConnection.user
objBAPIControl.Connection.Language = sapConnection.Language
objBAPIControl.Connection.hostname = sapConnection.hostname
objBAPIControl.Connection.SystemNumber = sapConnection.SystemNumber
objBAPIControl.Connection.System = sapConnection.System
objBAPIControl.Connection.Destination = sapConnection.Destination
If objBAPIControl.Connection.logon(1, True) = True Then
Set objUserList = objBAPIControl.Add("ZFM")
objUserList.exports("TXT1") = Worksheets("Comm").Range("P10").Value
objUserList.Exports("ID") = Worksheets("Comm").Range("P30").Value

returnFunc = objUserList.Call
End If
If returnFunc = True Then
Dim objTable As Object
Set objTable = objUserList.Tables("USERLIST")
ActiveSheet.Cells(4, 1) = "User count :" & objTable.RowCount
End If
End Sub

Функция у меня ничего не возвращает, только получает значения переменных, поэтому последний if можно опустить.
Повесил выполнение на кнопку. При нажатии выполняется без ошибок, однако FM не отрабатывает. Убираем проверку на
objBAPIControl.Connection.logon(1, True) = True
Получаем такую ошибку Run-time error '1001' : No Connection to SAP system available.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Чт, май 05 2011, 15:04 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
У меня работает без проблем.
Система: SAP EHP 1 для SAP NetWeaver 7.0
Коннект к системе произвожу из рабочей книги (через RRMX не пробовал).
SAPRouter не прописан.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Чт, май 05 2011, 16:06 
Начинающий
Начинающий

Зарегистрирован:
Чт, май 05 2011, 11:35
Сообщения: 16
Система: SAP EHP 2 для SAP NetWeaver 7.0
Сапроутер тоже не прописан.
Открываю книгу через Analyzer. Логинюсь в систему.
Смущает следущее - если вывести пароль в рабочую книгу он приходит в зашифрованном формате (логику не пойму, но похоже выделяет трехзначное число на символ M - 148, E - 155, A - тоже 148 почему-то), там указывается прямое присвоение пароля, может в такой форме он не проходит? Хотя excel бы наверное ругнулся в момент установления соединения с неправильным паролем...
Также интересен вопрос, что есть SAP.Functions? библиотеки SAP я не вижу (через F2)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Чт, май 05 2011, 16:27 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
Wanderer написал(а):
Также интересен вопрос, что есть SAP.Functions? библиотеки SAP я не вижу (через F2)

Ссылка на SAP.Functions есть в реестре
Code:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}]
@="SAP Remote Function Call"

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\Control]
@=""

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\InprocServer32]
@="c:\\PROGRA~1\\sap\\frontend\\sapgui\\wdtfuncs.ocx"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\MiscStatus]
@="0"

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\MiscStatus\1]
@="132241"

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\ProgID]
@="SAP.Functions"

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\ToolboxBitmap32]
@="c:\\PROGRA~1\\sap\\frontend\\sapgui\\wdtfuncs.ocx, 1"

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\TypeLib]
@="{5B076C00-2F26-11CF-9AE5-0800096E19F4}"

[HKEY_CLASSES_ROOT\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}\Version]
@="5.0"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Пт, май 06 2011, 01:51 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Вт, сен 13 2005, 10:41
Сообщения: 558
Откуда: Гондурас (округ Москвы)
Пол: Мужской
Для работы с системой R/3 из VBA (и любого другого средства с поддержкой COM) используйте COM-объект SAP.LogonControl .
Непосредственно RFC-вызовы нужно делать через COM-объект SAPFunctions
Когда создадите объект SAPFunctions, его свойство Connection = p_connectionObj (код ниже)

Как работать с COM-объектами объяснять не буду, это не сложно прочитать.

Вот часть модуля ConnectionHandling (в составе BEx, версия 7), касающаяся непосредственно коннекта к R/3.

Public g_logonObj As Object
Public p_connectionObj As Object

Public Function prepareConnection() As Boolean
prepareConnection = False
If provideComponent(g_logonObj, "SAP.LogonControl.1", "Logon Manager") Then
g_logonObj.ApplicationName = "BEx"
g_logonObj.enable3d
Set p_connectionObj = g_logonObj.newconnection()
p_connectionObj.rfcwithdialog = 1
#If ABAPDebug Then
p_connectionObj.tracelevel = vbKeyD
#End If
prepareConnection = True
End If
End Function

Public Function isConnected(Optional andRefreshed As Boolean, Optional andInteractive As Boolean, Optional andValid As Boolean) As Boolean
isConnected = False
If Not p_connectionObj Is Nothing Then
isConnected = (p_connectionObj.isConnected = 1)
Else
End If
End Function

Function provideComponent(compObj As Object, compName As String, compTitle As String) As Boolean
provideComponent = True
On Error Resume Next
If compObj Is Nothing Then
Set compObj = CreateObject(compName)
If compObj Is Nothing Then
provideComponent = False
End If
End If
End Function


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Пт, май 06 2011, 17:16 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 02 2009, 22:28
Сообщения: 228
Откуда: MOW
Пол: Мужской
А есть ли уверенность, что ФМ вообще работает через RFC из VBA?
Не все ФМ-ы так работают. Попробуйте написать пример не в Analyzer, создав Connection с нуля (можно просто с вводом пароля для простоты). Если тоже не работает, значит что-то с ФМ-ом, ищите причину - параметры со STRING, таблицы в IMPORTING / EXPORTING и т.д. Попробуйте для примера вызвать какой-нибудь стандартный BAPI для получения данных, если он заработает а ваш рядом нет опять же что-то с вашим ФМ-ом.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Пт, май 13 2011, 10:37 
Специалист
Специалист

Зарегистрирован:
Вт, авг 21 2007, 18:36
Сообщения: 133
Я пытаюсь выполнить следующий код(в 7ке):

Sub callrfc1()
Dim sapconn As Object
Dim b As Object
Set sapconn = CreateObject("Sap.functions")
Set b = Application.Run("BExAnalyzer.XLA!SAPBEXgetConnection")
Set sapconn.connection = b
End Sub

Пишет ошибку на строке "Set sapconn.connection = b" - вылетает debug


Причем интересно что если сделать книгу в Bex 3.5 то код отрабатывает корректно, т.е. удается выполнить "Set sapconn.connection = b", но возникает другая проблема Set b = Application.Run("BExAnalyzer.XLA!SAPBEXgetConnection") - не отрабатывает, т.е. после выполнения структура b пустая, если делаю ссылку на sapbex.xla, то результат тот же. Далее попытался посмотреть какие есть функции в sapbex.xlа, но он запаролен....
Еще заметил: если добавить add watch, то для переменной sapconn пишет Type "Object/Sapfunctions", а для b Type "Object/CSAPLOGONConnection", не уверен, но может быть это разные все таки разные структуры используются для connection. Полностью пере присвоить все поля данных объектов не удается, для isconnected например пишет что данное поле только для чтения....

Господа может все таки у кого нибудь есть работающий код для 7ки, мне то нужно всего: использовать существующее соединение bw(книга вызвана через rrmx) далее пару параметров передать для fm в bw. Казалось бы так мало.... и одновременно так много хочется......

Спасибо! :-)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Пт, май 13 2011, 13:02 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 02 2009, 22:28
Сообщения: 228
Откуда: MOW
Пол: Мужской
Основная идея, почему не получилось - нужно присваивать не connection, а присваивать отдельные параметры Connection-а, в том числе пароль, который лежит в каком-то зашифрованном виде и все заработает. См. у меня в коде Function logonToRFC.

Выдранный кусок кода ниже, это часть кода которая непосредственно связана с коннектом, остальное убрал.

Code:
Option Explicit

Public gBWConnection As Object
Public gRFCConnection As Object

' Main macros to get data
Sub get_data(ParamArray varname())

    Dim fmProjGetList As Object
    Dim tblProjectKeys As Object
    Dim tblBeRange As Object
    Dim tblProjectRange As Object
    Dim tblProjList As Object
    Dim aShtPrjList As Worksheet
    Dim aVar As Variant
    Dim nRow As Long
    Dim nOutputCurRow As Long
    Dim lastBe As String
    Dim curBe As String
   
    ' Login
    If Not logonToBW() Then
        MsgBox "Ошибка соединения с SAP (BW)", vbCritical, "Ошибка"
        Exit Sub
    End If
   
    If Not logonToRFC() Then
        MsgBox "Ошибка соединения с SAP (RFC)", vbCritical, "Ошибка"
        Exit Sub
    End If

    Set fmProjGetList = gRFCConnection.Add("Z_GET_PROJECTS")
    If Not fmProjGetList.Call Then
        MsgBox "Ошибка при загрузке списка проектов", vbExclamation, "Ошибка"
        Exit Sub
     End If
     
     ' Обрабатываем результат ФМ-а ит.д. и т.п.
  End Sub

' Example from Note 492561
Function logonToBW() As Boolean
    logonToBW = False
    On Error GoTo leave
    'Dim myConnection As Object
   
    Set gBWConnection = Run("BExAnalyzer.XLA!SAPBEXgetConnection")
    With gBWConnection
'      .client =
'      .user =
'      .password =
'      .Language =
'      .systemnumber =
'      .system =
'      .systemid =
'       .ApplicationServer =
'       .SAProuter =
        .logon 0, True
        If .IsConnected <> 1 Then
            .logon 0, False
            If .IsConnected <> 1 Then
                MsgBox "something went wrong ..."
                Exit Function
            End If
        End If
    End With
   
    Run "BExAnalyzer.XLA!SAPBEXinitConnection"
    logonToBW = True
    Exit Function
leave:
    MsgBox Err.Description, vbCritical, "Описание ошибки"
End Function

' Login to SAP.Function interface to call RFC FMs
Function logonToRFC() As Boolean
    Set gRFCConnection = CreateObject("SAP.Functions.Unicode")
   
    'Set gRFCConnection.Connection = gBWConnection
    'gRFCConnection.Connection = gBWConnection
    'logonToRFC = True
    'Exit Function
   
    gRFCConnection.Connection.ApplicationServer = gBWConnection.ApplicationServer
    gRFCConnection.Connection.Password = gBWConnection.Password
    gRFCConnection.Connection.client = gBWConnection.client
    gRFCConnection.Connection.CodePage = gBWConnection.CodePage
    'gRFCConnection.Connection.CodePage = "1504"
    gRFCConnection.Connection.User = gBWConnection.User
    'gRFCConnection.Connection.Language = gBWConnection.Language
    'gRFCConnection.Connection.Language = "RU"
    gRFCConnection.Connection.hostname = gBWConnection.hostname
    gRFCConnection.Connection.SystemNumber = gBWConnection.SystemNumber
    gRFCConnection.Connection.System = gBWConnection.System
    gRFCConnection.Connection.Destination = gBWConnection.Destination
    gRFCConnection.Connection.SapRouter = gBWConnection.SapRouter
    gRFCConnection.Connection.SystemID = gBWConnection.SystemID
    gRFCConnection.Connection.RfcWithDialog = 2      ' Чтобы SAPGUI не вылезало
   
    logonToRFC = gRFCConnection.Connection.logon(0, True)
End Function



Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Ср, май 18 2011, 12:47 
Начинающий
Начинающий

Зарегистрирован:
Чт, май 05 2011, 11:35
Сообщения: 16
Александр, а какой у вас SAPLogon? Версия, патч?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Ср, май 18 2011, 13:23 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Вт, сен 13 2005, 10:41
Сообщения: 558
Откуда: Гондурас (округ Москвы)
Пол: Мужской
bream написал(а):
Я пытаюсь выполнить следующий код(в 7ке):

Sub callrfc1()
Dim sapconn As Object
Dim b As Object
Set sapconn = CreateObject("Sap.functions")
Set b = Application.Run("BExAnalyzer.XLA!SAPBEXgetConnection")
Set sapconn.connection = b
End Sub

Пишет ошибку на строке "Set sapconn.connection = b" - вылетает debug
...
Спасибо! :-)


2bream: я же вам показал кусок, что вы "воткнулись" в BEXAnalizer.xla с упорством маньяка...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Ср, май 18 2011, 14:06 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 02 2009, 22:28
Сообщения: 228
Откуда: MOW
Пол: Мужской
Wanderer написал(а):
Александр, а какой у вас SAPLogon? Версия, патч?


GUI 7.01, пробовал и на patch 11 (по Bex), и на одном из последних тоже.
Это все в 7-ке, в плане BW.

У меня на компе, но работает не только на нем:
GUI Patch 16, build 1128319, version 7100.4.16.3151
Bex: BI AddOn 7.X (based on 7.10)
Support Package 12, Patch 1,
Revision 1656

Вряд ли тут нужно до такой степени скурпулезно разбираться в версиях предполагая что в ней дело, видимо что-то не так делаете.

Пришлите если хотите свой код исправленный с учетом всех советов но все равно не работающий, может будет видно что не так. А если коннектится но не работает ФМ, то можно прислать еще определение параметров ФМ-а из SE37(exporting, importing, tables ит.д.), там тоже могут быть хитрости.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Ср, май 18 2011, 14:27 
Начинающий
Начинающий

Зарегистрирован:
Чт, май 05 2011, 11:35
Сообщения: 16
2BWBAMS: Поясните пожалуйста , как правильно воспользоваться этим куском кода?
Эти функции содержатся в макросах BEx'a, и хоть p_connectionObj и объявлен как глобальная переменная, но значениями она заполнится только лишь в момент обращения к соответствующей функции, которая за это отвечает. Чтобы инициализировать обращение к этим функциям, нам надо либо запустить тот же RUN("BEXAnalyzer.xla!sapBEXgetConnection"), либо еще что-то, например перехватить в момент обновления рабочей книги (?). Но опять таки, пусть у нас есть кнопка на листе и мы не хотим ничего обновлять. Просто перехватить параметры соединения. Если же вообще проследить весь путь p_connectionObj - то вот он:
Set pAddin = CreateObject("com.sap.bi.et.analyzer.addin.BExConnect")
Set SAPFunctions = CreateObject("SAP.Functions")

lName = Application.ActiveWorkbook.Name
Set GetBEx = pAddin.ExcelInterface.WorkbookBExExcelApplication(lName)
Set lBEx = GetBEx
Set p_connectionObj = lBEx.ComConnection
Set SAPFunctions.Connection = p_connectionObj
на второй строчке снизу снова вылет, мой среднестатистический интеллект не в силах переварить это, и сей факт делает меня печальным и нагоняет суицидальные мысли :) просветите плз.

К слову мне удалось настроить соединение, для версии SAPLogon 710, методом, похожим на тот, что описан в предыдущем посте. Тот же RUN, то же прямое присвоение. Однако! При тестировании на SAPLogon'е 720 выявилась очередная премерзопакостная особенность, прямое присвоение пароля уже не прокатывает (gRFCConnection.Connection.Password = gBWConnection.Password). Пароль шифруется по-новому :((( Кстати, насчет gRFCConnection.Connection.SapRouter = gBWConnection.SapRouter
хотя строка унас присутствует, этот параметр все равно не удается вытянуть через тот же RUN, там пусто. приходится присваивать явно... это нормально?
Всем заранее спасибо за содействие и сочувствие :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: RFC-соединение c R3 через VBA
СообщениеДобавлено: Ср, май 18 2011, 15:07 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
Wanderer написал(а):
К слову мне удалось настроить соединение, для версии SAPLogon 710, методом, похожим на тот, что описан в предыдущем посте. Тот же RUN, то же прямое присвоение. Однако! При тестировании на SAPLogon'е 720 выявилась очередная премерзопакостная особенность, прямое присвоение пароля уже не прокатывает (gRFCConnection.Connection.Password = gBWConnection.Password). Пароль шифруется по-новому :((( Кстати, насчет gRFCConnection.Connection.SapRouter = gBWConnection.SapRouter
хотя строка унас присутствует, этот параметр все равно не удается вытянуть через тот же RUN, там пусто. приходится присваивать явно... это нормально?
Всем заранее спасибо за содействие и сочувствие :)


Видимо расстрою вас, но у меня на SAPLogon'е 720 прямое присвоение пароля работает.
А вот с SapRouter тоже пока не разобрался как нормально вытянуть.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB