Текущее время: Пт, мар 29 2024, 09:33

Часовой пояс: 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 часа


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

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


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

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