powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ERP и учетные системы [игнор отключен] [закрыт для гостей] / Создание заказа в SAP из .NET-приложения
25 сообщений из 39, страница 1 из 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
25 сообщений из 39, страница 1 из 2
Форумы / ERP и учетные системы [игнор отключен] [закрыт для гостей] / Создание заказа в SAP из .NET-приложения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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