AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.07.2011, 16:37   #1  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Программное создание заказа на покупку
День добрый!

Пытаюсь программно создать строку заказа, как и сам заказ. Столкнулся с проблемой, что строки заказа не создаются.

Вот код:
X++:
static void NewPurch(Args _args)
{
    PurchTable _pTable;
    PurchLine _pLine;
    str _purchId, _PurchName, _OrderAccount, _InvoiceAccount,
    _payment, _vendGroup, _paymentSched, _itemBuyerGroup;

    PurchStatus _purchStatus;
    PurchaseType _PurchaseType;
    SettlementType _SettleVoucher;
    Date _DeliveryDate;

    ;

    _purchId = '00000223_106';
    _PurchName = 'ООО форд';
    _OrderAccount = '000223_053';
    _InvoiceAccount = '000223_053';
    _DeliveryDate = today()+1;
    _payment = '25е число';
    _vendGroup = 'поставщики';
    _paymentSched = 'оплата за месяц';
    _itemBuyerGroup = '1';

    _purchStatus = PurchStatus::Backorder ;
    _PurchaseType = PurchaseType::Journal ;
    _SettleVoucher = SettlementType::None ;

    ttsbegin;

    select forupdate _pTable;
    _pTable.initValue();
    _pTable.PurchId = _purchId;
    _pTable.PurchName = _purchName;
    _pTable.OrderAccount = _OrderAccount;
    _pTable.InvoiceAccount = _InvoiceAccount;
    _pTable.DeliveryDate = _DeliveryDate;
    _pTable.Payment = _payment;
    _pTable.VendGroup = _vendGroup;
    _pTable.PaymentSched = _paymentSched;
    _pTable.ItemBuyerGroupId = _itemBuyerGroup;
    _pTable.PurchStatus = _purchStatus;
    _pTable.PurchaseType = _purchaseType;
    _ptable.SettleVoucher = _SettleVoucher;
    _pTable.CurrencyCode = 'руб';
    _pTable.LanguageId = 'ru';

    _pTable.insert() ;
    
     ttscommit;

 }
это для заказа и вот для строчек заказа
X++:
static void NewPurchLine(Args _args)
{
    PurchLine _pLine;

    str _purchId, _ItemId, _purchUnit;
    real _QtyOrdered, _RemainPurchPhysical, _purchPrice,
        _purchQty, _RemainInventPhysical;
    PurchStatus _purchStatus;
    PurchaseType _PurchaseType;
    Date _DeliveryDate;
    ;

    _purchId = '00000223_106';
    _itemId = '001';
    _purchStatus = PurchStatus::Backorder ;
    _DeliveryDate = today()+1;
    _QtyOrdered = 999;
    _RemainPurchPhysical = 999;
    _PurchPrice = 10;
    _PurchUnit = 'шт';
    _PurchQty = 999;
    _PurchaseType = PurchaseType::Journal ;
    _RemainInventPhysical = 999;
    

    ttsbegin;

    select forupdate _pLine;
    _pLine.initValue();
    _pLine.PurchId = _purchId;
    _pLine.ItemId = _itemId;
    _pLine.PurchStatus = _purchStatus;
    _pLine.DeliveryDate = _DeliveryDate;
    _pLine.QtyOrdered = _QtyOrdered;
    _pLine.RemainPurchPhysical = _RemainPurchPhysical;
    _pLine.PurchPrice = _PurchPrice;
    _pLine.PurchUnit = _PurchUnit;
    _pLine.PurchQty = _purchQty;
    _pLine.PurchaseType = _PurchaseType;
    _pLine.RemainInventPhysical = _RemainInventPhysical;


    
    _pLine.insert() ;

    ttscommit;

 }
Вылетает с ошибкой "Код номенклатуры не может быть изменен, если уже созданы складские проводки. Обновление отменено."

Вроде все связи в таблицах посмотрел и всё равно не пойму, где ошибся...
Старый 28.07.2011, 16:56   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
ошибок у вас очень много, чтоб их исправить смотрите примеры в самой аксапте.
скажу про одну, чтобы создать новую строку ее не нужно выбирать
Старый 28.07.2011, 16:57   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
не надо вот это вызывать
X++:
 select forupdate _pLine;
сделайте просто
X++:
_pLine = null;
у вас подтягивается часть данных из какой-то существующей строки закупки
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: niksen (1).
Старый 28.07.2011, 17:04   #4  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
чтобы узнать как создаются строки или заполняются те или иные поля в таблице, попробуйте создать ее через интерфейс, и пробегитесь дебагером по коду
За это сообщение автора поблагодарили: niksen (1).
Старый 28.07.2011, 20:31   #5  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
А еще есть простой способ получить рабочий код для вставки записи в таблицу - в паспорте записи по кнопке "Сценарий" система в буфер вставляет код, который можно прямо в джоб вставить (для инсертов, например, можно транзакцию и не открывать).
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: niksen (1).
Старый 29.07.2011, 08:08   #7  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Ivanhoe
Спасибо, не знал об этом, всё галопом по европам и торопясь и побыстрее, что особо времени не было читать никаких умных книг, я туда только ради вопросов непонятных залезаю, но наверное такими темпами надо будет прочитать парочку от корки до корки и сделать много заданий для закрепления.

Vals
Требование простое - программный периодический перенос из одной системы в другую, т.к. начальству в некоторых смыслах нравится Dynamics AX больше других систем. Кстати, хорошие тренинги у Вас.

ice
Дебаггером я итак пробегаюсь всегда, даже если код работает, чтобы узнать возможные причины. А вот такую простую причину, как блокировка всей таблицы в результате select forupdate я забыл
За это сообщение автора поблагодарили: Vals (1).
Старый 29.07.2011, 08:37   #8  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
Лучше стараться по-максимуму пользоваться стандартным API.
Изучите классы PurchAutoCreate*
За это сообщение автора поблагодарили: niksen (1).
Старый 29.07.2011, 08:49   #9  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
jonny
PurchAutoCreare - это конечно хорошо, но записи нужно ещё и обновлять иногда. Для этого как ни крути, всё равно программно придётся создавать. Да и не для всех есть AutoCreate. Но в целом, согласен, спасибо, надо использовать
Старый 29.07.2011, 09:14   #10  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
Ну во всяком случае эти классы позволяют разобраться что к чему. К тому же можно создать наследника с нужной вам функциональностью.
Старый 29.07.2011, 09:16   #11  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
jonny
наследники с нужной функциональностью - это конечно хорошо, но есть ли такие почти у каждой таблицы и формы? Как работать с этими классами? Например, ту же запись через PurchAutoCreate через job как создать?
Старый 29.07.2011, 09:43   #12  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
PurchAutoCreate - базовый класс, в функционале аксапты используются его наследники - например PurchAutoCreate_tmpPurchLine.
В случае с ним надо заполнить таблицу tmpPurchLine, подать ее на вход метода construct и вызвать метод create. Пример использования - в классе PurchCreateReleaseOrder.
В вашем случае для задач интеграции можно создать наследника, который бы использовал не временную табличку, а читал бы данные из файла.
Я к чему веду - никто конечно не обязывает вас использовать имеющиеся классы, я привел их для того чтобы вы могли изучить как правильно создавать заказы на покупку, по возможности по-максимуму используя имеющуюся функциональность.
Я думаю преимущества такого подхода несомненны.
Старый 29.07.2011, 09:58   #13  
Vals is offline
Vals
Аманд
Аватар для Vals
Компания АМАНД
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2009
 
1,765 / 507 (20) +++++++
Регистрация: 27.02.2002
Адрес: Pass partout, Москва
Цитата:
Требование простое - программный периодический перенос из одной системы в другую, т.к. начальству в некоторых смыслах нравится Dynamics AX больше других систем.
В аксапте есть Сводное планирование, которое создаёт закупки. А простой перенос из другой системы выглядит не самым лучшим решением (если в ней нет планирования).
Старый 29.07.2011, 10:00   #14  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Vals
именно для планирования и была выбрана аксапта. Этого нет нигде в таких масштабах и настройках, да при такой цене
Старый 29.07.2011, 10:14   #15  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
У меня работает что то типа такого в Ax2009...

X++:
static void createPurch()
{
    AxPurchTable            axPurchTable;
    VendTable               vendTable;
    PurchTable              purchTable;
    AxPurchLine             axPurchLine;
    ;

    vendTable = VendTable::find("тра та та");

    purchTable.initFromVendTable(vendTable);

    axPurchTable = new axPurchTable();
    axPurchTable.PurchTable(purchTable);
    axPurchTable.parmPurchaseType(PurchaseType::Purch);
    axPurchTable.parmInventLocationId("Sklad");
    axPurchTable.parmDimension(vendTable.Dimension);
    axPurchTable.save();

    purchTable = axPurchTable.purchTable();

    info(strfmt("Создана закупка %1 на поставщика %2 с кодом %3", purchTable.PurchId, vendTable.Name, vendTable.AccountNum));
    
            axPurchLine = new axPurchLine();

            axPurchLine.parmPurchId(purchTable.PurchId);
            axPurchLine.parmItemId("ItemId");
            axPurchLine.parmPurchQty(123);
            axPurchLine.parmLineAmount(12);
            axPurchLine.parmLineNum(1);

            axPurchLine.save();
В Ax 3.0 почти все так же, только, если помнится, методы там назывались без указания "parm"

Последний раз редактировалось someOne; 29.07.2011 в 10:17. Причина: Указал примечание для разных версий
За это сообщение автора поблагодарили: gl00mie (5).
Теги
заказ на покупку, программно, создание из кода

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание производственного заказа программно ena_ax DAX: Программирование 7 23.09.2011 11:38
Enterprise Portal - Создание Заказа Finnsky DAX: Функционал 9 27.08.2008 14:07
Программное создание новых записей Владимир Максимов DAX: Программирование 35 06.03.2006 14:08
Создание заказа? 2b4fITin DAX: Функционал 13 02.02.2004 15:52
программное создание строк заказа renat DAX: Программирование 6 22.07.2003 05:05

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:09.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.