Текущее время: Вс, июл 27 2025, 03:10

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


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

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


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

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