Текущее время: Пт, апр 19 2024, 08:01

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Ср, мар 30 2016, 18:40 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пт, янв 18 2008, 10:34
Сообщения: 716
Откуда: Moscow
Пол: Мужской
подозреваю, что tab надо создавать через new (т.е. инициализировать) а не через только gettable

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Чт, мар 31 2016, 04:53 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Ваш код мне очень напомнил соответственное API для Java (видимо оно у сапа весьма единообразно сделано).
_garycor_ написал:
[RfcServerFunction(Name = "ZDDK_DIADOC_TEST")]
public void diadoc_login(RfcServerContext context, IRfcFunction function)
{
String i_login = function.GetValue("I_LOGIN").ToString();
String i_password = function.GetValue("I_PASSWORD").ToString();

IRfcTable tab = function.GetTable("ET_ORGS");

FileStream fs = new FileStream("c:\\1\\1.txt", FileMode.Append);
StreamWriter sw = new StreamWriter(fs);

sw.WriteLine("---------------------------------------");
tab.Append();
tab.SetValue("TDLINE", "dsfsdfsdf");
sw.WriteLine("GetTable_Append_" + tab.CurrentRow.ToString());
sw.WriteLine("GetTable_RowCount_" + tab.RowCount.ToString());
sw.WriteLine("GetTable_FieldCount" + tab.Metadata.LineType.FieldCount.ToString());

sw.Close(); fs.Close();
}
}


В Java работа с TABLE параметрами отличается совсем чуть-чуть:
Code:
ParameterList tables = function.getTableParameterList();
Table tbl = tables.getTable("TABLE_NAME");
tbl.appendRow();
table.setValue(<тут значение>, <тут имя поля>); // вот тут порядок параметров почему-то отличается, что странно


Почему-то никак не могу найти в публичном доступе API для .NET. Для Java - вот пример:https://help.sap.com/javadocs/NW04/current/jc/com/sap/mw/jco/JCO.Record.html#setValue%28long,%20java.lang.String%29

Выглядит так что вы делаете всё правильно. Создайте еще в системе на всякий случай ФМ с таким же интрфейсом.
Еще одно отличие моего случая с Java, у нас всё-таки есть это обратное соединение для вычитывания метаданных, про которое я говорил. И иногда при разработке бывает так что где-то в кеше может застрять старая структура ФМа и на стороне Java не видно новых полей.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Чт, мар 31 2016, 05:07 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Ну на всякий случай :) Попробуйте оба параметра в строке таблицы заполнить )) Может собака неглубоко зарыта.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Чт, мар 31 2016, 17:50 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
ghost написал:
подозреваю, что tab надо создавать через new (т.е. инициализировать) а не через только gettable

пробовал

как только потом добавляю в конце функции
Code:
function.SetValue("ET_ORGS", tab);
то RFC сразу падает в дамп. Ощущение, что серверная функция не воспринимает таблицу как параметр.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Чт, мар 31 2016, 17:59 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
2 AFH
у function не вижу метода function.getTableParameterList();

заполнил оба поля в таблице.
в файлике вижу строку TABLE ET_ORGS [STRUCTURE TLINE { FIELD TDFORMAT=22 FIELD TDLINE=dsfsdfsdf }]
но RFC по прежнему падает в дамп.

попробовал создать новую функцию. результат тот же.

а для обратного соединения нужны же саповские логин/пароль? а их использовать не хотят.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Чт, мар 31 2016, 20:41 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пт, янв 18 2008, 10:34
Сообщения: 716
Откуда: Moscow
Пол: Мужской
вроде все верно.
единственное смущает вот эта строка
Code:
IRfcTable tab = function.GetTable("ET_ORGS").Metadata.CreateTable();

не пробовали так ?
Code:
IRfcTable tab = function.GetTable("ET_ORGS");

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 04:51 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
_garycor_ написал:
Code:
                            RfcStructureMetadata stru = new RfcStructureMetadata("TLINE");
                            stru.AddField(new RfcFieldMetadata("TDFORMAT", RfcDataType.CHAR, 2, 0, 0, 0));
                            stru.AddField(new RfcFieldMetadata("TDLINE", RfcDataType.CHAR, 132, 0, 0, 0));
                            RfcTableMetadata t = new RfcTableMetadata("ET_ORGS", stru);
                            fmd.AddParameter(new RfcParameterMetadata("ET_ORGS", t, RfcDirection.TABLES, false));


А если переделать на Exporting параметр?

Или как вариант, указать сразу структуру как тип Tables-параметра. Ведь в абап для tables-параметров как раз используются именно структуры.

Code:
                            RfcStructureMetadata stru = new RfcStructureMetadata("TLINE");
                            stru.AddField(new RfcFieldMetadata("TDFORMAT", RfcDataType.CHAR, 2, 0, 0, 0));
                            stru.AddField(new RfcFieldMetadata("TDLINE", RfcDataType.CHAR, 132, 0, 0, 0));
                            fmd.AddParameter(new RfcParameterMetadata("ET_ORGS", stru, RfcDirection.TABLES, false));


А у вас самая последняя версия коннектора?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 08:18 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
ghost написал:
вроде все верно.
единственное смущает вот эта строка
Code:
IRfcTable tab = function.GetTable("ET_ORGS").Metadata.CreateTable();

не пробовали так ?
Code:
IRfcTable tab = function.GetTable("ET_ORGS");


точно. изначально так и делал.
опять же получаю дамп когда появляется обращение к таблице типа tab.Append();. хотя файлик куда сохраняю данные таблицы после ее заполнения показывает, что таблица заполнилась.


Последний раз редактировалось _garycor_ Пт, апр 01 2016, 08:25, всего редактировалось 1 раз.

Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 08:24 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
Цитата:
Или как вариант, указать сразу структуру как тип Tables-параметра. Ведь в абап для tables-параметров как раз используются именно структуры.

это как делается?

Цитата:
А у вас самая последняя версия коннектора?

NCo303_Net40_x64


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 08:47 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
_garycor_ написал:
это как делается?


Я думаю как-то так:
Code:
                            RfcStructureMetadata stru = new RfcStructureMetadata("TLINE");
                            stru.AddField(new RfcFieldMetadata("TDFORMAT", RfcDataType.CHAR, 2, 0, 0, 0));
                            stru.AddField(new RfcFieldMetadata("TDLINE", RfcDataType.CHAR, 132, 0, 0, 0));
                            fmd.AddParameter(new RfcParameterMetadata("ET_ORGS", stru, RfcDirection.TABLES, false));


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 09:00 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
Цитата:
Я думаю как-то так:


не вышло. тогда перестает срабатывать тест соединения в SM59
сейчас попробую установить NCo3017_Net40_x64


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 09:23 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
А переделать из Tables в Exporting?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 09:26 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
AFH написал(а):
А переделать из Tables в Exporting?

Ваххххх! вот это ход конем... сработало. а зачем тогда такое понятие как RfcDirection.TABLES?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 10:13 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
_garycor_ написал:
Ваххххх! вот это ход конем... сработало. а зачем тогда такое понятие как RfcDirection.TABLES?

Вообще Сап предупреждает что параметры Tables устарели... Может там какой неочевидный нюанс есть.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: sap .NET connector
СообщениеДобавлено: Пт, апр 01 2016, 16:28 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
с таблицами разобрались. теперь другая проблема.
завел в RFC импортный параметр I_SRU типа TLINE
Code:
FUNCTION ZDDK_LOGIN .
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(I_LOGIN) TYPE  STRING
*"     VALUE(I_PASSWORD) TYPE  STRING
*"     VALUE(I_STRU) TYPE  TLINE
*"  EXPORTING
*"     VALUE(E_TOKEN) TYPE  STRING
*"     VALUE(ET_ORGS) TYPE  ZDDK_ORG_T
*"----------------------------------------------------------------------
ENDFUNCTION.


на стороне сервера прописал его в репозитарий
Code:
            RfcStructureMetadata I_STRU = new RfcStructureMetadata("I_STRU");
            I_STRU.AddField(new RfcFieldMetadata("TDFORMAT", RfcDataType.CHAR, 2, 0, 0, 0));
            I_STRU.AddField(new RfcFieldMetadata("TDLINE", RfcDataType.CHAR, 132, 0, 0, 0));
            fmd.AddParameter(new RfcParameterMetadata("I_STRU", I_STRU, RfcDirection.IMPORT, false));

и в самой функции
Code:
            IRfcStructure I_STRU = function.GetStructure("I_STRU");
            string tdline = I_STRU.GetValue("TDLINE").ToString();

все работает.

теперь хочу чтобы сервер вернул в RFC точно такую же структуру. прописал экспортный параметр E_STRU
Code:
FUNCTION ZDDK_LOGIN .
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(I_LOGIN) TYPE  STRING
*"     VALUE(I_PASSWORD) TYPE  STRING
*"     VALUE(I_STRU) TYPE  TLINE
*"  EXPORTING
*"     VALUE(E_TOKEN) TYPE  STRING
*"     VALUE(ET_ORGS) TYPE  ZDDK_ORG_T
*"     VALUE(E_STRU) TYPE  TLINE
*"----------------------------------------------------------------------
ENDFUNCTION.


прописал на стороне сервера в репозитарий
Code:
            RfcStructureMetadata E_STRU = new RfcStructureMetadata("E_STRU");
            E_STRU.AddField(new RfcFieldMetadata("TDFORMAT", RfcDataType.CHAR, 2, 0, 0, 0));
            E_STRU.AddField(new RfcFieldMetadata("TDLINE", RfcDataType.CHAR, 132, 0, 0, 0));
            fmd.AddParameter(new RfcParameterMetadata("E_STRU", E_STRU, RfcDirection.EXPORT, false));


в самой функции пока с ней никак не работаю.

запускаю RFC и опять получаю дамп с ошибкой "Индекс находился вне границ массива.".

не понимаю... тут-то что может быть?


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

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


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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