Текущее время: Пн, июл 28 2025, 01:22

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Создание заказа из .NET
СообщениеДобавлено: Пн, сен 05 2011, 17:47 
Начинающий
Начинающий

Зарегистрирован:
Сб, сен 03 2011, 12:45
Сообщения: 8
Добрый день!
Нужно создавать заказ из веб-сервиса. Для этого использую RFC-функцию BAPI_SALESORDER_CREATEFROMDAT2. При попытке вызвать эту функцию возвращается ошибка "Sales document was not changed". Что может быть?

Привожу код:

Code:
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"));


Насколько я понял, все дело в признаке "UPDATEFLAG", но во всех местах кода он равен "I" (т.е. вставка). На этой проблеме я "завис" и не пойму куда дальше копать.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание заказа из .NET
СообщениеДобавлено: Вт, сен 06 2011, 07:25 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Чт, май 19 2005, 12:34
Сообщения: 1941
Откуда: НК
Пол: Мужской
а в системе напрямую все создается нормально с теми же параметрами?

посмотрите через SE37, как используется этот ФМ в системе и какие параметры забиваются. может, что-то забыли.
SE37 - BAPI_SALESORDER_CREATEFROMDAT2 - Журнал использования (Ctrl-Shift-F3) )

а BAPI_TRANSACTION_COMMIT после выполнения ФМ делаете, кстати?

и еще можно почитать ноты, может там что-то полезное будет

_________________
Eritis sicut Deus, scientes bonum et malum...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание заказа из .NET
СообщениеДобавлено: Вт, сен 06 2011, 10:08 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
А что это за товар с кодом "0", вы пытаетесь сделать заказ с текстовой позицией? Напрямую в интерфейсе SAP в транзакции VA01 заказ с такими данными создается?

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание заказа из .NET
СообщениеДобавлено: Вт, сен 06 2011, 10:10 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Ну и в догонку. Поищите информацию про отладку RFC вызовов со стороны SAP. Мне кажется, такая возможность есть и я бы ей воспользовался: поставил точку прерывания в начале BAPI_SALESORDER_CREATEFROMDAT2 и посмотрел, как туда данные передаются. Дело может бытьв чем угодно, например, в формате дат.

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание заказа из .NET
СообщениеДобавлено: Вт, сен 06 2011, 15:16 
Начинающий
Начинающий

Зарегистрирован:
Сб, сен 03 2011, 12:45
Сообщения: 8
Спасибо за ответы. Немного продвинулся в этом деле. Сейчас код выглядит так:

Code:
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.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");

               
                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"));
                }

                listBox1.Items.Add("***************************************************");
                IRfcStructure res1 = CommitFunction.GetStructure("RETURN");
                for (int i = 0; i < res1.Count; i++)
                {
                    listBox1.Items.Add(res1[i]);
                }


Сейчас говорит: "SALES_HEADER_IN обработан успешно. SALES_ITEM_IN обработано успешно. ТоргДокумент еще не полон. Доработайте данные! Стандартный заказ 16534: сохранено.". Коммит вроде сейчас делаю, используя "BAPI_TRANSACTION_COMMIT", поэтому проблема скорее всего действительно в неполноте данных табличной части. В SE37 удалось создать такой заказ и похоже, что проблема в отсутствии у меня "Стоимости нетто" и какого-то параметра "Расчет цены" цены. Но как это добро добавить пока не знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание заказа из .NET
СообщениеДобавлено: Ср, сен 07 2011, 19:49 
Начинающий
Начинающий

Зарегистрирован:
Сб, сен 03 2011, 12:45
Сообщения: 8
С созданием заказа разобрался. Из .Net-овского приложения заказ создается успешно. Но возникла непредвиденная проблема - не удается запустить веб-сервис, использующий .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);.

Еще раз повторюсь, в онлайне из VisualStudio и WCF-сервис, и обычный веб-сервис отлично отрабатывают, заказ создается без проблем. Но как только публикую их на веб-сервер - выдается ошибка.

Прим.: Другие веб-методы веб-сервисов при этом работают в любом случае нормально, т.е. проблема именно при работе с SAP.Middleware.Connector.RfcDestinationManager.

Привожу сам код:

Code:
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;
        }


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание заказа из .NET
СообщениеДобавлено: Чт, сен 08 2011, 18:28 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
Такие вопросы уже надо скорее на MSDN задавать. Навскидку - возможно используется неправильный пароль/отзыв или firewall не пускает. Кроме того, в VS обычно можно посмотреть детали для exception, вы смотрели?

_________________
"One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important." Bertrand Russell


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание заказа из .NET
СообщениеДобавлено: Пт, сен 09 2011, 12:20 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Чт, май 19 2005, 12:34
Сообщения: 1941
Откуда: НК
Пол: Мужской
C коммитом разобрались, с ФМ вроде тоже. Остальное уже к SD не относится, так что тема переезжает в "прочие вопросы" :)

_________________
Eritis sicut Deus, scientes bonum et malum...


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

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


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

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


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

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