powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / ERP и учетные системы [игнор отключен] [закрыт для гостей] / Создание заказа в SAP из .NET-приложения
39 сообщений из 39, показаны все 2 страниц
Создание заказа в SAP из .NET-приложения
    #37423764
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Задача: интегрироваться с SAP, а именно забирать клиентов, формировать заказы покупателей из своего приложения и передавать (т.е. создавать) их в SAP, ну и много чего другого. На данный момент понял, что без знаний самого SAP-а, ABAP-а эту задачу выполнить проблематично. Поэтому пытаюсь разобраться с элементарными задачами. Как например, создание простого заказа покупателя. Насколько я понял, это можно сделать, используя RFC-функцию BAPI_SALESORDER_CREATEFROMDAT2. Но проблема в том, что я не знаю какие параметры в нее нужно передавать. Может кто-нибудь мне подсказать, где посмотреть эти параметры, или привести пример кода на C# по вызову этой функции с созданием этих параметров? Перерыл как весь sql.ru, так и инет в целом - кроме ABAP-скриптов ничего нет. Ужас какой-то.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37423788
Реалист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s.t.a.s,
Вы форумом не ошиблись?
Или это такой тонкий PR ход
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37423794
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Вы форумом не ошиблись?

Хмммм. Если Вы о том, что мой вопрос больше касается .Net-а, то я посчитал, что здесь, на sql.ru, все технари, а вот по SAP-у куда как не сюда (в "ERP и учетные системы") постить? Или что Вы имели в виду?
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37423800
brig_2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s.t.a.s,

SAP здесь особо не обсуждают, а если обсуждают, то высокоуровнево или с точки зрения фукнционала/маркетинга, у SAP есть свои форумы
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37423835
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без грамотного разработчика АВАР это сделать невозможно, т.к. в САП надо написать функции, которые будут создавать документы, а внешнее приложение будет запускать функции и передавать параметры.
Такую задачу я решал, но не с помощью C#, а С++ и Delphi.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37423897
Proforg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbБез грамотного разработчика АВАР это сделать невозможно, т.к. в САП надо написать функции, которые будут создавать документы, а внешнее приложение будет запускать функции и передавать параметры.
Такую задачу я решал, но не с помощью C#, а С++ и Delphi.
Только abap'еры умеют пользоваться гуглой?
http://www.erpgenie.com/sap-technical/interfaces/aspnet-eg-creating-a-purchase-order-via-bapi
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37423988
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно.
Из Дельфей можно сделать тоже самое.

А может внешняя программа отслеживать события в САП, например перехватывать событие записи в базу?
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424115
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ProforgSergey_rbБез грамотного разработчика АВАР это сделать невозможно, т.к. в САП надо написать функции, которые будут создавать документы, а внешнее приложение будет запускать функции и передавать параметры.
Такую задачу я решал, но не с помощью C#, а С++ и Delphi.
Только abap'еры умеют пользоваться гуглой?
http://www.erpgenie.com/sap-technical/interfaces/aspnet-eg-creating-a-purchase-order-via-bapi

ERPConnect - стороннее платное приложение (не SAP-овское). Детализирую, наверное. Поставлена задача использовать SAP .NET Connector 3.0. Платить 5000 баксов за ERPConnect клиент не будет, т.к. все, что нужно и так у него есть, а именно SAP-овский коннектор. В этом-то вся и сложность. :(
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424440
Proforg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s.t.a.s, хелп у сапа вроде достаточно развернутый
http://help.sap.com/saphelp_NW04/helpdata/de/e9/23c80d66d08c4c8c044a3ea11ca90f/frameset.htm

Примеры:
http://www.codeproject.com/KB/database/SapDBReader.aspx
http://www.codeproject.com/KB/dotnet/SAP_NET_Connector.aspx

Третий коннектор я не пользовал, но второй ставился только на VS2003 в комбинации с WinXP (даже виртуалку специально поднимал для него).
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424459
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ссылки. Подключиться к САП-у и получить данные по клиентам, например, я уже умею. Не в этом проблема. Проблема в отсутствии знаний по ABAP-у и мне больше нужна информация по BAPI_SALESORDER_CREATEFROMDAT2. Нет ли ни у кого примера ее использования на c# (с созданием параметров)?
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424463
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще оговорюсь. Опыта разработки под SAP у меня нет и об ABAP услышал только пару дней назад. Соот-но информации по RFC-функциям у меня практически нет. Немного продвинулся в разработке, если можно так сказать. Удалось подключиться к SAP-у и получить данные по клиентам. Но это на данный момент мне не особо нужно. Нужно создавать заказы. Для этого мне нужна информация по BAPI_SALESORDER_CREATEFROMDAT2. Нет ли у кого примера ее использования на c# (с созданием параметров)?

Что на данный момент имею:
RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("WDA");
RfcRepository SapRfcRepository = SapRfcDestination.Repository;

//IRfcFunction BapiGetCompanyList = SapRfcRepository.CreateFunction("BAPI_COMPANY_GETLIST");
//IRfcFunction BapiGetCompanyDetail = SapRfcRepository.CreateFunction("BAPI_COMPANY_GETDETAIL");

IRfcFunction BapiSalesOrder = SapRfcRepository.CreateFunction("BAPI_SALESORDER_CREATEFROMDAT2");

Дальше, по идее нужны параметры. Один из параметров, скорее всего, партнер.
Что-то типа

IRfcTable ORDER_PARTNERS = BapiSalesOrder.GetTable("ORDER_PARTNERS");
ORDER_PARTNERS.Append();
ORDER_PARTNERS.SetValue("Тут какое-то значение, которое не знаю где брать", "PARTN_ROLE");
ORDER_PARTNERS.SetValue("По идее, номер партнера, но где его посмотреть не понятно", "PARTN_NUMB");

Так вот мне бы полный пример вызова этой функции с параметрами.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424515
Proforg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s.t.a.s,
А у вас постановка задачи есть? Т.к. для использования этой бапишки нужно знать точные значения параметров
примерный набор параметров:
http://aries-wandari.blogspot.com/2010/06/bapisalesordercreatefromdat2.html
http://www.sapgeek.net/2011/08/sap-bapi-bapi_salesorder_createfromdat2/

Все параметры - табличные вроде. Т.е. если у вас нет айдишников, то сначала надо будет вытащить кучу справочников. Это вы сами с большой вероятностью не сделаете (т.е. еще будут проблемы с полномочиями). Вы бы нормальную постановку задачи вытащили себе
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424570
Volochkova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s.t.a.sДобрый день!
Задача: интегрироваться с SAP, а именно забирать клиентов, формировать заказы покупателей из своего приложения и передавать (т.е. создавать) их в SAP, ну и много чего другого. На данный момент понял, что без знаний самого SAP-а, ABAP-а эту задачу выполнить проблематично. Поэтому пытаюсь разобраться с элементарными задачами. Как например, создание простого заказа покупателя. Насколько я понял, это можно сделать, используя RFC-функцию BAPI_SALESORDER_CREATEFROMDAT2. Но проблема в том, что я не знаю какие параметры в нее нужно передавать. Может кто-нибудь мне подсказать, где посмотреть эти параметры, или привести пример кода на C# по вызову этой функции с созданием этих параметров? Перерыл как весь sql.ru, так и инет в целом - кроме ABAP-скриптов ничего нет. Ужас какой-то.

ИМХО. Вам надо сделать промежуточную субд, с которой сможет работать SAP.
Из Своей субд вы все туда экспортируете, а в SAP-е делаете "робота" который по расписанию тащит эти данные и делает необходимые действия.
Ну и в обратную сторону так же.

Такое канало на 1с 7.7, 8.х Аксапте, RS-Balance, и самописке на FileMaker.
Внутренними обработками больше шансов создавать объекты, не порушив целостность базы.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424902
Proforg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VolochkovaИМХО. Вам надо сделать промежуточную субд, с которой сможет работать SAP.
Из Своей субд вы все туда экспортируете, а в SAP-е делаете "робота" который по расписанию тащит эти данные и делает необходимые действия.
Ну и в обратную сторону так же.

Такое канало на 1с 7.7, 8.х Аксапте, RS-Balance, и самописке на FileMaker.
Внутренними обработками больше шансов создавать объекты, не порушив целостность базы.
Не надо. На одном проекте сделали именно так. Монстрик получился убогий и примерно в 5 раз более трудоемкий.
У автора правильный подход, вдобавок, оффлайн ему вряд ли подойдет.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37424996
Volochkova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProforgVolochkovaИМХО. Вам надо сделать промежуточную субд, с которой сможет работать SAP.
Из Своей субд вы все туда экспортируете, а в SAP-е делаете "робота" который по расписанию тащит эти данные и делает необходимые действия.
Ну и в обратную сторону так же.

Такое канало на 1с 7.7, 8.х Аксапте, RS-Balance, и самописке на FileMaker.
Внутренними обработками больше шансов создавать объекты, не порушив целостность базы.
Не надо. На одном проекте сделали именно так. Монстрик получился убогий и примерно в 5 раз более трудоемкий.
У автора правильный подход, вдобавок, оффлайн ему вряд ли подойдет.

Все зависит от реализации. Выполнено было не раз и никакого монстра.
А при он лайн интеграции внешними средствами - работа базовых механизмов нарывается на неустранимые ошибки по адресу - и сиди думай что это такое.

А так крутится робот, раз в час залетают документы и строки.
И все кашерно. И главное стабильно.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37425812
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, то чего добился за выходные и сегодняшний день:
1) связался с клиентом. Оказалось у них есть в штате человек, неплохо разбирающийся в SAP, что обрадовало.
2) почти формируется заказ. Привожу код:

RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("WDA");
RfcRepository SapRfcRepository = SapRfcDestination.Repository;
IRfcFunction BapiSalesOrder = SapRfcRepository.CreateFunction("BAPI_SALESORDER_CREATEFROMDAT2");

IRfcTable ORDER_PARTNERS = BapiSalesOrder.GetTable("ORDER_PARTNERS");
ORDER_PARTNERS.Append();
ORDER_PARTNERS.SetValue("PARTN_ROLE", "AG");
ORDER_PARTNERS.SetValue("PARTN_NUMB", "10000396");

IRfcStructure order_header_inx = BapiSalesOrder.GetStructure("ORDER_HEADER_INX");
order_header_inx.SetValue("UPDATEFLAG", "I");
order_header_inx.SetValue("DOC_TYPE", "X");
order_header_inx.SetValue("SALES_ORG", "X");
order_header_inx.SetValue("DISTR_CHAN", "X");
order_header_inx.SetValue("DIVISION", "X");
order_header_inx.SetValue("PURCH_NO_C", "X");
order_header_inx.SetValue("REQ_DATE_H", "X");
order_header_inx.SetValue("PURCH_DATE", "X");

IRfcStructure order_header_in = BapiSalesOrder.GetStructure("ORDER_HEADER_IN");
order_header_in.SetValue("DOC_TYPE", "CMR");
order_header_in.SetValue("SALES_ORG", "1001");
order_header_in.SetValue("DISTR_CHAN", "X");
order_header_in.SetValue("DIVISION", "X");
order_header_in.SetValue("PURCH_NO_C", "200");
order_header_in.SetValue("REQ_DATE_H", "2011-09-05");
order_header_in.SetValue("PURCH_DATE", "2011-09-05");

IRfcTable ORDER_ITEMS_INX = BapiSalesOrder.GetTable("ORDER_ITEMS_INX");
IRfcTable ORDER_ITEMS_IN = BapiSalesOrder.GetTable("ORDER_ITEMS_IN");

ORDER_ITEMS_INX.Append();
ORDER_ITEMS_IN.Append();
ORDER_ITEMS_INX.SetValue("UPDATEFLAG", "I");
ORDER_ITEMS_INX.SetValue("ITM_NUMBER", "1056");
ORDER_ITEMS_IN.SetValue("ITM_NUMBER", "1056");
ORDER_ITEMS_INX.SetValue("MATERIAL", "X");
ORDER_ITEMS_IN.SetValue("MATERIAL", "0");

ORDER_ITEMS_INX.SetValue("COMP_QUANT", "X");
ORDER_ITEMS_IN.SetValue("COMP_QUANT", "2");

BapiSalesOrder.Invoke(SapRfcDestination);

IRfcTable res = BapiSalesOrder.GetTable("RETURN");
listBox1.Items.Add(res.GetString("MESSAGE"));

Но при этом выдается ошибка: "Sales document was not changed". Насколько я понял, все дело в признаке "UPDATEFLAG", но во всех местах кода = "I" (т.е. вставка). Поэтому на этом я "завис" и не пойму куда дальше копать.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37425883
Реалист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s.t.a.s,

Попробуй заменить I на U . Я серьезно !
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37425913
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не помогло. :)
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37426215
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPDATEFLAG при создании заказа заполнять не надо, но дело скорее всего не в этом.

IRfcTable res = BapiSalesOrder.GetTable("RETURN");
listBox1.Items.Add(res.GetString("MESSAGE"));
надо циклом вывести все строки таблицы RETURN, их будет много, они вам скажут, чегно не хватает.

ORDER_ITEMS_IN.Append();
ORDER_ITEMS_IN.SetValue("ITM_NUMBER", "10"); - это счетчик строк
ORDER_ITEMS_IN.SetValue("MATERIAL", "0000001056"); - это номер ОЗМ, причем надо добить нулями до полной длины поля

ORDER_ITEMS_INX.Append();
ORDER_ITEMS_INX.SetValue("ITM_NUMBER", "10");
ORDER_ITEMS_INX.SetValue("MATERIAL", "X");

но скорее всего это не заработает, нет завода, нет схем калькуляции, нет партий поставки (schedule lines), много чего нет... для начала возьмите SD-шника и добейтесь, что ваши параметры заработают в se37, потом уже будете через .net connector пытаться
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37426218
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORDER_PARTNERS.SetValue("PARTN_NUMB", "10000396");
тут надо тоже добивать нулями слева до полной длины поля. иначе будете долго гадать, почему САП не может найти партнера
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37426219
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
order_header_in.SetValue("DISTR_CHAN", "X");
order_header_in.SetValue("DIVISION", "X");
спросите у SD-шников, какие каналы сбыта и сектора у вас используются. вряд ли это "X"
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37426897
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вестник, спасибо большое! Вы все верно указали. Основная проблема в нулях перед кодами. Сейчас практически создал заказ, правда ругается, что "ТоргДокумент пока не полон. Доработайте данные!". Но, думаю, это разрешимо наполнением обязательных параметров в табличной части. Еще раз спасибо!
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37427010
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, что рано обрадовался. Обнаружил в инете, что это сообщение - частое явление, если не коммитить создание заказа. Попробовал это сделать, используя BAPI_TRANSACTION_COMMIT. Пока эффекта никакого.
Нынешний код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("WDA");
                RfcRepository SapRfcRepository = SapRfcDestination.Repository;
                IRfcFunction BapiSalesOrder = SapRfcRepository.CreateFunction("BAPI_SALESORDER_CREATEFROMDAT2");
                
                IRfcTable ORDER_PARTNERS = BapiSalesOrder.GetTable("ORDER_PARTNERS");
                ORDER_PARTNERS.Append();
                ORDER_PARTNERS.SetValue("PARTN_ROLE", "WE");
                ORDER_PARTNERS.SetValue("PARTN_NUMB", "0060125914");
                ORDER_PARTNERS.Append();
                ORDER_PARTNERS.SetValue("PARTN_ROLE", "AG");
                ORDER_PARTNERS.SetValue("PARTN_NUMB", "0060125914");
                
                IRfcStructure order_header_inx = BapiSalesOrder.GetStructure("ORDER_HEADER_INX");
                order_header_inx.SetValue("UPDATEFLAG", "I");
                order_header_inx.SetValue("DOC_TYPE", "X");
                order_header_inx.SetValue("SALES_ORG", "X");
                order_header_inx.SetValue("DISTR_CHAN", "X");
                order_header_inx.SetValue("DIVISION", "X");
                
                IRfcStructure order_header_in = BapiSalesOrder.GetStructure("ORDER_HEADER_IN");
                order_header_in.SetValue("DOC_TYPE", "TA");
                order_header_in.SetValue("SALES_ORG", "12"); 
                order_header_in.SetValue("DISTR_CHAN", "00"); 
                order_header_in.SetValue("DIVISION", "00"); 
                
                IRfcTable ORDER_ITEMS_INX = BapiSalesOrder.GetTable("ORDER_ITEMS_INX");
                IRfcTable ORDER_ITEMS_IN = BapiSalesOrder.GetTable("ORDER_ITEMS_IN");

                ORDER_ITEMS_INX.Append();
                ORDER_ITEMS_IN.Append();
                ORDER_ITEMS_INX.SetValue("UPDATEFLAG", "I");
                ORDER_ITEMS_INX.SetValue("ITM_NUMBER", "000010");
                ORDER_ITEMS_IN.SetValue("ITM_NUMBER", "000010");
                ORDER_ITEMS_INX.SetValue("MATERIAL", "X");
                ORDER_ITEMS_IN.SetValue("MATERIAL", "000000000041000423");
                ORDER_ITEMS_INX.SetValue("TARGET_QTY", "X");
                ORDER_ITEMS_IN.SetValue("TARGET_QTY", "2");
                ORDER_ITEMS_INX.SetValue("PLANT", "X");
                ORDER_ITEMS_IN.SetValue("PLANT", "1201");

                IRfcFunction CommitFunction = SapRfcRepository.CreateFunction("BAPI_TRANSACTION_COMMIT");
                RfcSessionManager.BeginContext(SapRfcDestination);
                BapiSalesOrder.Invoke(SapRfcDestination);
                CommitFunction.Invoke(SapRfcDestination);
                RfcSessionManager.EndContext(SapRfcDestination);

                IRfcTable res = BapiSalesOrder.GetTable("RETURN");
                for (int i = 0; i < res.Count; i++)
                {
                    listBox1.Items.Add(res[i].GetString("MESSAGE"));
                }

Система все равно выдает: " SALES_HEADER_IN обработан успешно. SALES_ITEM_IN обработано успешно. ТоргДокумент еще не полон. Доработайте данные! Стандартный заказ 16534: сохранено. " Но, естественно, я его в заказах не вижу.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37427016
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТоргДокумент пока не полон. Доработайте данные!идите в созданный заказ на изменение (va02) и нажимайте shift-f8 (если мне не изменяет память). получите отчет о неполноте
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37427045
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то сложно у вас все это выглядит.
должно быть примерно так (имена условные):
var c = new connection();
var f = c.createfunction("bapi_salesorder_createfromdat2");

var st = f.Exports("HEADER");
st["VKORG"] = "1000";

var items = f.Tables("ITEMS");

var r = items.Rows.Add();
r["MATNR"].Value = "00000000010010";

f.Execute();
c.Commit();

сейчас под рукой ничего нет, пишу по воспоминаниям
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37427079
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RfcSessionManager.BeginContext(SapRfcDestination);
BapiSalesOrder.Invoke(SapRfcDestination);
CommitFunction.Invoke(SapRfcDestination);
RfcSessionManager.EndContext(SapRfcDestination);судя по всему, вы открыли еще одну сессию и комитете ее, но она не видит заказ, сделанный в другой сессии
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429793
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С созданием заказа разобрался. Но возникла непредвиденная проблема - не удается запустить веб-сервис, использующий .Net Conector. Точнее, веб-сервис нормально запускается, даже в онлайн-отладке все отлично работает (заказ создается), но как только размещаешь веб-сервис на сервер и пытаешься протестировать веб-метод создания заказа, выдает ошибку: "The type initializer for 'SAP.Middleware.Connector.RfcDestinationManager' threw an exception.".
Реализовал уже 2 варианта веб-сервисов: SOAP, WCF. Результат одинаков.
В блоке InnerException для SOAP-овского варианта пишет, что "Event handlers can only be bound to HttpApplication events during IHttpModule initialization.". К чему это, понятия не имею. Валится на BapiSalesOrder.Invoke(SapRfcDestination);.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429797
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз повторюсь, в онлайне из VisualStudio и WCF-сервис, и обычный веб-сервис отлично отрабатывают, заказ создается без проблем. Но как только публикую их на веб-сервер - выдается ошибка.
При этом другие веб-методы веб-сервисов работают в любом случае (и в онлайн-отладке, и при размещении на IIS-е) нормально, т.е. проблема именно при работе с SAP.Middleware.Connector.RfcDestinationManager.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429799
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам код веб-метода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
public string SAPCreateOrder(string AccountSAPCode, string OfferingSAPCode, int Quantity, float Price)
        {
            IDestinationConfiguration dest = new SAPConnectionManager();
            RfcDestinationManager.RegisterDestinationConfiguration(dest);
            RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("WDA");
            RfcRepository SapRfcRepository = SapRfcDestination.Repository;

            //RfcSessionManager.BeginContext(SapRfcDestination);

            IRfcFunction BapiSalesOrder = SapRfcRepository.CreateFunction("BAPI_SALESORDER_CREATEFROMDAT2");
            IRfcFunction CommitFunction = SapRfcRepository.CreateFunction("BAPI_TRANSACTION_COMMIT");

            IRfcTable ORDER_PARTNERS = BapiSalesOrder.GetTable("ORDER_PARTNERS");
            ORDER_PARTNERS.Append();
            /* Роль - получатель */
            ORDER_PARTNERS.SetValue("PARTN_ROLE", "WE");
            /* Получатель */
            //ORDER_PARTNERS.SetValue("PARTN_NUMB", "0060125914");
            ORDER_PARTNERS.SetValue("PARTN_NUMB", AccountSAPCode);
            ORDER_PARTNERS.Append();
            /* Роль - заказчик */
            ORDER_PARTNERS.SetValue("PARTN_ROLE", "AG");
            /* Заказчик */
            //ORDER_PARTNERS.SetValue("PARTN_NUMB", "0060125914");
            ORDER_PARTNERS.SetValue("PARTN_NUMB", AccountSAPCode);

            IRfcStructure order_header_inx = BapiSalesOrder.GetStructure("ORDER_HEADER_INX");
            order_header_inx.SetValue("UPDATEFLAG", "I");
            order_header_inx.SetValue("DOC_TYPE", "X");
            order_header_inx.SetValue("SALES_ORG", "X");
            order_header_inx.SetValue("DISTR_CHAN", "X");
            order_header_inx.SetValue("DIVISION", "X");

            IRfcStructure order_header_in = BapiSalesOrder.GetStructure("ORDER_HEADER_IN");
            /* Тип документа - Стандартный заказ */
            order_header_in.SetValue("DOC_TYPE", "TA");
            /* Компания-продавец (Сбытовая организация) */
            order_header_in.SetValue("SALES_ORG", "12");
            /* Канал сбыта */
            order_header_in.SetValue("DISTR_CHAN", "00");
            /* Сектор */
            order_header_in.SetValue("DIVISION", "00");

            IRfcTable ORDER_ITEMS_INX = BapiSalesOrder.GetTable("ORDER_ITEMS_INX");
            IRfcTable ORDER_ITEMS_IN = BapiSalesOrder.GetTable("ORDER_ITEMS_IN");

            ORDER_ITEMS_INX.Append();
            ORDER_ITEMS_IN.Append();
            /* Признак операции (I-вставка, U - обновление, D - удаление) */
            ORDER_ITEMS_INX.SetValue("UPDATEFLAG", "I");
            /* Порядковый номер */
            ORDER_ITEMS_INX.SetValue("ITM_NUMBER", "000001");
            ORDER_ITEMS_IN.SetValue("ITM_NUMBER", "000001");
            /* Продукт */
            ORDER_ITEMS_INX.SetValue("MATERIAL", "X");
            //ORDER_ITEMS_IN.SetValue("MATERIAL", "000000000041000423");
            ORDER_ITEMS_IN.SetValue("MATERIAL", OfferingSAPCode);
            /* Количество */
            ORDER_ITEMS_INX.SetValue("TARGET_QTY", "X");
            //ORDER_ITEMS_IN.SetValue("TARGET_QTY", "2");
            ORDER_ITEMS_IN.SetValue("TARGET_QTY", Quantity.ToString());
            /* Завод */
            ORDER_ITEMS_INX.SetValue("PLANT", "X");
            ORDER_ITEMS_IN.SetValue("PLANT", "1201");

            IRfcTable ORDER_SCHEDULES_INX = BapiSalesOrder.GetTable("ORDER_SCHEDULES_INX");
            IRfcTable ORDER_SCHEDULES_IN = BapiSalesOrder.GetTable("ORDER_SCHEDULES_IN");
            ORDER_SCHEDULES_INX.Append();
            ORDER_SCHEDULES_IN.Append();
            /* Признак операции (I-вставка, U - обновление, D - удаление) */
            ORDER_SCHEDULES_INX.SetValue("UPDATEFLAG", "I");
            /* Порядковый номер */
            ORDER_SCHEDULES_INX.SetValue("ITM_NUMBER", "000001");
            ORDER_SCHEDULES_IN.SetValue("ITM_NUMBER", "000001");
            /* Количество */
            ORDER_SCHEDULES_INX.SetValue("REQ_QTY", "X");
            //ORDER_SCHEDULES_IN.SetValue("REQ_QTY", "2");
            ORDER_SCHEDULES_IN.SetValue("REQ_QTY", Quantity.ToString());

            IRfcTable ORDER_CONDITIONS_INX = BapiSalesOrder.GetTable("ORDER_CONDITIONS_INX");
            IRfcTable ORDER_CONDITIONS_IN = BapiSalesOrder.GetTable("ORDER_CONDITIONS_IN");
            ORDER_CONDITIONS_INX.Append();
            ORDER_CONDITIONS_IN.Append();
            /* Признак операции (I-вставка, U - обновление, D - удаление) */
            ORDER_CONDITIONS_INX.SetValue("UPDATEFLAG", "I");
            /* Порядковый номер */
            ORDER_CONDITIONS_INX.SetValue("ITM_NUMBER", "000001");
            ORDER_CONDITIONS_IN.SetValue("ITM_NUMBER", "000001");
            /* Порядковый номер условия(прайса) */
            ORDER_CONDITIONS_INX.SetValue("COND_COUNT", "01");
            ORDER_CONDITIONS_IN.SetValue("COND_COUNT", "01");
            /* Код расчета цены */
            ORDER_CONDITIONS_INX.SetValue("COND_TYPE", "Z000");
            ORDER_CONDITIONS_IN.SetValue("COND_TYPE", "Z000");
            /* Цена */
            ORDER_CONDITIONS_INX.SetValue("COND_VALUE", "X");
            ORDER_CONDITIONS_IN.SetValue("COND_VALUE", Price.ToString());
            /* Валюта */
            ORDER_CONDITIONS_INX.SetValue("CURRENCY", "X");
            ORDER_CONDITIONS_IN.SetValue("CURRENCY", "EUR");
            /* По идее, код единицы измерения (шт) */
            ORDER_CONDITIONS_INX.SetValue("COND_P_UNT", "X");
            ORDER_CONDITIONS_IN.SetValue("COND_P_UNT", "1");

            BapiSalesOrder.Invoke(SapRfcDestination);
            CommitFunction.Invoke(SapRfcDestination);
            //RfcSessionManager.EndContext(SapRfcDestination);

            string ResultMessage = "";
            IRfcTable res = BapiSalesOrder.GetTable("RETURN");
            for (int i = 0; i < res.Count; i++)
            {
                ResultMessage = ResultMessage + res[i].GetString("MESSAGE");
            }
            RfcDestinationManager.UnregisterDestinationConfiguration(dest);
            return ResultMessage;
        }
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429837
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сап логон на веб сервере стоит? нужные системы прописаны в etc/services?
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429853
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
судя по всему NCo 3.0 существенно переделан и не сказать, чтобы в нужную сторону. сап логон ему вроде больше не нужен

RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("WDA");WDA - это что? где реально у вас прописывает хост, номер системы, мандант и т.п.?
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429910
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подключение реализовано в классе SAPConnectionManager, а он в свою очередь наследует IDestinationConfiguration.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429914
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WDA - это имя подключения. Как я написал выше, само подключение реализовано в другом классе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class SAPConnectionManager : IDestinationConfiguration
{
        public RfcConfigParameters GetParameters(String destinationName)
        {
            if ("WDA".Equals(destinationName))
            {
                RfcConfigParameters parms = new RfcConfigParameters();
                parms.Add(RfcConfigParameters.AppServerHost, "192.168.1.1");
                parms.Add(RfcConfigParameters.SystemNumber, "00");
                parms.Add(RfcConfigParameters.SystemID, "WDA");
                parms.Add(RfcConfigParameters.User, "user_name");
                parms.Add(RfcConfigParameters.Password, "password");
                parms.Add(RfcConfigParameters.Client, "300");
                parms.Add(RfcConfigParameters.Language, "RU");
                parms.Add(RfcConfigParameters.PoolSize, "10");
                parms.Add(RfcConfigParameters.MaxPoolSize, "10");
                parms.Add(RfcConfigParameters.IdleTimeout, "600");
                return parms;
            }
            else return null;
        }
        public bool ChangeEventsSupported()
        {
            return false;
        }
        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
}
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429918
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вестниксап логон на веб сервере стоит? нужные системы прописаны в etc/services?

SAP Logon стоит. В качестве веб-сервера используется IIS.
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429925
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите в systems32/drivers/etc/services на той машине, где работает нормально. там есть что-то вроде sapmsWDA tcp/3600?
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37429960
s.t.a.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, есть sapmsWDA 3600/tcp.
Просто отладку и размещение веб-сервисов делаю на одной и той же машине. Соот-но, на одной и той же машине при отладке веб-сервис работает, и на той же машине на IIS тот же веб-сервис не работает.

Сложилось впечатление, что сервис в Visual Studio запускается под одним пользователем, а сервис под IIS-ом - под другим (точнее в Application Pool стоит по умолчанию удостоверение NetworkService).
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #37430714
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вряд ли я вам помогу в этой ситуации. может быть дело в уровне Trust-а, может IIS не все библиотеки видит
как вариант, попробуйте отладиться под IIS (или под IIS Express), а не под встроенным веб сервером, найдите точное место где вылетает. мне кажется, что вылетает он намного раньше, чем вы указали
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Создание заказа в SAP из .NET-приложения
    #39410498
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
таже самая проблема (

жалко что не отписались об решении.
проблема именно в некоректно создаваемом destination на серваке,
если конкретнее то как я подозреваю все дело в SystemAttributes, они при создании destination заполняются данными сервера.

решение пока не нашел (
...
Рейтинг: 0 / 0
Создание заказа в SAP из .NET-приложения
    #39410502
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s.t.a.sДа, есть sapmsWDA 3600/tcp.
Просто отладку и размещение веб-сервисов делаю на одной и той же машине. Соот-но, на одной и той же машине при отладке веб-сервис работает, и на той же машине на IIS тот же веб-сервис не работает.

Сложилось впечатление, что сервис в Visual Studio запускается под одним пользователем, а сервис под IIS-ом - под другим (точнее в Application Pool стоит по умолчанию удостоверение NetworkService).


sapmsWDA и 3600/tcp нужно указать в конфигурации (destinationconfig)?
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / ERP и учетные системы [игнор отключен] [закрыт для гостей] / Создание заказа в SAP из .NET-приложения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]