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

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


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Пн, янв 18 2010, 15:58 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, фев 12 2009, 17:20
Сообщения: 70
Пол: Мужской
Пошерстил ресурсы типа:
http://www.sap-img.com/abap/vb-codes-or-vba-macro-code-for-access-sap-and-run-one-rfc.htm и
http://abap4.tripod.com/SAP_and_VBA__Visual_Basic_for_Applications_.html

На их основе накропал:
Code:
Option Compare Database
Option Explicit

Function RFC_READ_TABLE()

Dim R3, MyFunc, App As Object

' Define the objects to hold IMPORT parameters
Dim QUERY_TABLE As Object
Dim DELIMITER   As Object
Dim NO_DATA     As Object
Dim ROWSKIPS    As Object
Dim ROWCOUNT    As Object

' Define the objects to hold the EXPORT parameters
' None for RFC_TABLE_READ

' Define the objects to hold the TABLES parameters
' Where clause
Dim OPTIONS As Object
' Fill with fields to return.  After function call will hold
' detailed information about the columns of data (start position
' of each field, length, etc.
Dim FIELDS  As Object
' Holds the data returned by the function
Dim DATA    As Object

' Use to write out results
Dim ROW As Object

Dim Result As Boolean
Dim iRow, iColumn, iStart, iStartRow, iField, iLength As Integer

'**********************************************
'Create Server object and Setup the connection
'**********************************************
Set R3 = CreateObject("SAP.Functions")

R3.Connection.User = "user"
R3.Connection.Password = "1234"
R3.Connection.client = "000"
R3.Connection.ApplicationServer = "10.0.0.0"
R3.Connection.Language = "RU"

If R3.Connection.logon(0, True) <> True Then
   Exit Function
End If

'*****************************************************
'Call RFC function RFC_READ_TABLE
'*****************************************************
Set MyFunc = R3.Add("RFC_READ_TABLE")

' Set the Objects to the parameter they will return

Set QUERY_TABLE = MyFunc.exports("QUERY_TABLE")
Set DELIMITER = MyFunc.exports("DELIMITER")
Set NO_DATA = MyFunc.exports("NO_DATA")
Set ROWSKIPS = MyFunc.exports("ROWSKIPS")
Set ROWCOUNT = MyFunc.exports("ROWCOUNT")

Set OPTIONS = MyFunc.Tables("OPTIONS")
Set FIELDS = MyFunc.Tables("FIELDS")

QUERY_TABLE.Value = Forms![frmInput]![txtQueryTable]
DELIMITER.Value = Forms![frmInput]![txtDelimiter]'";" ","
NO_DATA = Forms![frmInput]![txtNoData] '"NO"
ROWSKIPS = Forms![frmInput]![txtRowsSkip] "0

If Forms![frmInput]![txtRowCount] <> "" Then
    ROWCOUNT = Forms![frmInput]![txtRowCount]  ' "2"
End If

If Forms![frmInput]![txtOptions] <> "" Then
    OPTIONS.Rows.Add
    OPTIONS.Value(1, "TEXT") = Forms![frmInput]![txtOptions]
End If

If Forms![frmInput]![txtFields] <> "" Then
'   Separate the field into individual fields (input is comma separated)
    Dim vArray As Variant
    vArray = Split(Forms![frmInput]![txtFields], ",")
    Dim vField As Variant
    Dim j As Integer
    For Each vField In vArray
        If vField <> "" Then
            j = j + 1
            FIELDS.Rows.Add
            FIELDS.Value(j, "FIELDNAME") = vField
        End If
    Next
End If
Result = MyFunc.CALL

If Result = True Then
  Set DATA = MyFunc.Tables("DATA")
  Set FIELDS = MyFunc.Tables("FIELDS")
  Set OPTIONS = MyFunc.Tables("OPTIONS")
Else
    MsgBox MyFunc.EXCEPTION
    R3.Connection.LOGOFF
    Exit Function
End If

'*******************************************
'Quit the SAP Application
'*******************************************
R3.Connection.LOGOFF

If Result <> True Then
  MsgBox (MyFunc.EXCEPTION)
  Exit Function
End If

'Open the table in the Database
'**************************************
    Dim db As Database
    Dim rs As Recordset
    Dim SQL As String
    Set db = CurrentDb 'OpenDatabase("C:\yourdb.mdb")
    Set rs = db.OpenRecordset("TABLE1")
   
'Display Contents of the table
'**************************************

iField = 1
' For each row of data returned in table DATA
For iRow = 1 To DATA.ROWCOUNT
'   Add a new row to the DB
    rs.AddNew
'   For each field that is returned in table FIELDS
    For iField = 1 To FIELDS.ROWCOUNT
' Determine where in the string the first field is
        iStart = FIELDS(iField, "OFFSET") + 1
iLength = FIELDS(iField, "LENGTH")

' Set the variable vField to be the contents of the current field
'       If the fields at the end of the record are blank, then explicitly set the value
        If iStart > Len(DATA(iRow, "WA")) Then
            vField = Null
Else
            vField = Mid(DATA(iRow, "WA"), iStart, iLength)
End If

' Depending on the current field, put it in the appropriate Access
' DB field
Select Case iField
Case 1
  rs("Field1") = vField
Case 2
  rs("Field2") = vField
  Case 3
  rs("Field3") = vField
  Case 4
  rs("Field4") = vField
End Select
    Next
rs.Update
Next
   
    Set db = Nothing
    Set rs = Nothing
End Function

Function Split(ByVal inp As String, Optional delim As String = ",") As Variant
    ' Chris Rae's VBA Code Archive - http://chrisrae.com/vba
    ' Code written by Chris Rae, 25/5/00
    Dim outarray() As Variant
    Dim arrsize As Integer
    While InStr(inp, delim) > 0
        ReDim Preserve outarray(0 To arrsize) As Variant
        outarray(arrsize) = Left(inp, InStr(inp, delim) - 1)
        inp = Mid(inp, InStr(inp, delim) + 1)
        arrsize = arrsize + 1
    Wend
    ' We still have one element left
    ReDim Preserve outarray(0 To arrsize) As Variant
    outarray(arrsize) = inp
    Split = outarray
End Function



Соединение и передача параметров проходит успешно, Result = True, объект Err=0, однако на выходе DATA.ROWCOUNT = 0. :cry:
Наличие записей в таблице sap в соответствии с переданными параметрами проверял. Исходная система 4.0, access 2007. В чем ошибка не понимаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Пн, янв 18 2010, 17:38 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 02 2009, 22:28
Сообщения: 228
Откуда: MOW
Пол: Мужской
Взял ваш пример, подставил свои данные логина, первую поправшуюся таблицу, удалил присвоение в параметры options, fields перед вызовом (то есть выбираю всю таблицу: все записи и все поля) - все заработало.

Следовательно:
1. Пример в принципе рабочий
2. Попробуйте при вызове ни указывать ничего ни в options, ни в fields, может быть неправильный SQL-запрос
3. Попробуйте вызвать ФМ с теми же параметрами в SE37, может проще будет понять причину. У меня все работает одинаково и там и там
4. Если действительно "шаманство" происходит, попробуйте поставить все новейшие патчи на GUI, а можно и на сам офис наличие всех SP проверить

ЗЫ Правда система у меня новая, 701. VB вызывал из Excel 2007


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Вт, янв 19 2010, 11:57 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, фев 12 2009, 17:20
Сообщения: 70
Пол: Мужской
to raaleksandr: Спасибо за отклик! Приведите пожалуйста свой код. Попробовал как Вы описали, результат тот же.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Вт, янв 19 2010, 12:08 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 02 2009, 22:28
Сообщения: 228
Откуда: MOW
Пол: Мужской
Даже оставил ваш закомментированный код для ясности
Code:
Option Explicit

Function RFC_READ_TABLE()

Dim R3, MyFunc, App As Object

' Define the objects to hold IMPORT parameters
Dim QUERY_TABLE As Object
Dim DELIMITER   As Object
Dim NO_DATA     As Object
Dim ROWSKIPS    As Object
Dim ROWCOUNT    As Object

' Define the objects to hold the EXPORT parameters
' None for RFC_TABLE_READ

' Define the objects to hold the TABLES parameters
' Where clause
Dim OPTIONS As Object
' Fill with fields to return.  After function call will hold
' detailed information about the columns of data (start position
' of each field, length, etc.
Dim FIELDS  As Object
' Holds the data returned by the function
Dim DATA    As Object

' Use to write out results
Dim ROW As Object

Dim Result As Boolean
Dim iRow, iColumn, iStart, iStartRow, iField, iLength As Integer

'**********************************************
'Create Server object and Setup the connection
'**********************************************
Set R3 = CreateObject("SAP.Functions")

R3.Connection.User = "..."
R3.Connection.Password = "..."
R3.Connection.client = "..."
R3.Connection.ApplicationServer = "..."
R3.Connection.Language = "RU"
R3.Connection.SapRouter = "..."

If R3.Connection.logon(0, True) <> True Then
   Exit Function
End If

'*****************************************************
'Call RFC function RFC_READ_TABLE
'*****************************************************
Set MyFunc = R3.Add("RFC_READ_TABLE")

' Set the Objects to the parameter they will return

Set QUERY_TABLE = MyFunc.exports("QUERY_TABLE")
Set DELIMITER = MyFunc.exports("DELIMITER")
Set NO_DATA = MyFunc.exports("NO_DATA")
Set ROWSKIPS = MyFunc.exports("ROWSKIPS")
Set ROWCOUNT = MyFunc.exports("ROWCOUNT")

Set OPTIONS = MyFunc.Tables("OPTIONS")
Set FIELDS = MyFunc.Tables("FIELDS")

QUERY_TABLE.Value = "USR21" ' Forms![frmInput]![txtQueryTable]
DELIMITER.Value = "#" ' Forms![frmInput]![txtDelimiter] '";" ","
NO_DATA = "" ' Forms![frmInput]![txtNoData] '"NO"
ROWSKIPS = 0 ' Forms![frmInput]![txtRowsSkip] "0

'If Forms![frmInput]![txtRowCount] <> "" Then
'    ROWCOUNT = Forms![frmInput]![txtRowCount]  ' "2"
'End If

'If Forms![frmInput]![txtOptions] <> "" Then
'    OPTIONS.Rows.Add
'    OPTIONS.Value(1, "TEXT") = Forms![frmInput]![txtOptions]
'End If

'If Forms![frmInput]![txtFields] <> "" Then
'   Separate the field into individual fields (input is comma separated)
'    Dim vArray As Variant
'    vArray = Split(Forms![frmInput]![txtFields], ",")
'    Dim vField As Variant
'    Dim j As Integer
'    For Each vField In vArray
'        If vField <> "" Then
'            j = j + 1
'            FIELDS.Rows.Add
'            FIELDS.Value(j, "FIELDNAME") = vField
'        End If
'    Next
'End If
Result = MyFunc.CALL

If Result = True Then
  Set DATA = MyFunc.Tables("DATA")
  Set FIELDS = MyFunc.Tables("FIELDS")
  Set OPTIONS = MyFunc.Tables("OPTIONS")
Else
    MsgBox MyFunc.EXCEPTION
    R3.Connection.LOGOFF
    Exit Function
End If

'*******************************************
'Quit the SAP Application
'*******************************************
R3.Connection.LOGOFF

If Result <> True Then
  MsgBox (MyFunc.EXCEPTION)
  Exit Function
End If

'Open the table in the Database
'**************************************
    'Dim db As Database
    'Dim rs As Recordset
    'Dim SQL As String
    'Set db = CurrentDb 'OpenDatabase("C:\yourdb.mdb")
    'Set rs = db.OpenRecordset("TABLE1")
   
'Display Contents of the table
'**************************************

iField = 1
' For each row of data returned in table DATA
For iRow = 1 To DATA.ROWCOUNT
    MsgBox DATA(iRow, 1)
'   Add a new row to the DB
    'rs.AddNew
'   For each field that is returned in table FIELDS
    'For iField = 1 To FIELDS.ROWCOUNT
' Determine where in the string the first field is
    '    iStart = FIELDS(iField, "OFFSET") + 1
'iLength = FIELDS(iField, "LENGTH")

' Set the variable vField to be the contents of the current field
'       If the fields at the end of the record are blank, then explicitly set the value
'       If iStart > Len(DATA(iRow, "WA")) Then
  '          vField = Null
'Else
'           vField = Mid(DATA(iRow, "WA"), iStart, iLength)
'End If

' Depending on the current field, put it in the appropriate Access
' DB field
'Select Case iField
'Case 1
'  rs("Field1") = vField
'Case 2
'  rs("Field2") = vField
'  Case 3
'  rs("Field3") = vField
'  Case 4
'  rs("Field4") = vField
'End Select
'   Next
'rs.Update
Next
   
    'Set db = Nothing
    'Set rs = Nothing
End Function


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Вт, янв 19 2010, 14:20 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пт, авг 31 2007, 00:02
Сообщения: 73
Откуда: Видное
Пол: Мужской
ФМ RFC_READ_TABLE почему то не работает в ЕСС 6.0, тестил на 3-х инсталяциях в разных конторах.
я делал на базе ФМ RFC_GET_TABLE_ENTRIES и RFC_GET_NAMETAB
принцип то же самый, единственное нельзя наложить критерий выборки, так что не рекомендую юзать с таблицами типа BSEG, MSEG)

_________________
Как истинный планер всегда позади)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Вт, янв 19 2010, 18:21 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, фев 12 2009, 17:20
Сообщения: 70
Пол: Мужской
raaleksandr: Спасибо, Ваш пример работает. Но почему то возвращает некоректно русские символы. Очевидно нужно как то передать правильную кодировку.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Вт, янв 19 2010, 19:11 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 02 2009, 22:28
Сообщения: 228
Откуда: MOW
Пол: Мужской
Попробуйте перед подключением к SAP дописать строчку
Code:
R3.Connection.CodePage = "1504"


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединение с sap из vba. Ткните носом в ошибку!
СообщениеДобавлено: Ср, янв 20 2010, 01:39 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
TYLLIKAH написал:
ФМ RFC_READ_TABLE почему то не работает в ЕСС 6.0, тестил на 3-х инсталяциях в разных конторах.
я делал на базе ФМ RFC_GET_TABLE_ENTRIES и RFC_GET_NAMETAB
принцип то же самый, единственное нельзя наложить критерий выборки, так что не рекомендую юзать с таблицами типа BSEG, MSEG)

Странно а у меня в ЕСС 6.0 ФМ RFC_READ_TABLE работает, возможно тут дело в полномочиях

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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