28.07.2011, 16:37 | #1 |
Участник
|
Программное создание заказа на покупку
День добрый!
Пытаюсь программно создать строку заказа, как и сам заказ. Столкнулся с проблемой, что строки заказа не создаются. Вот код: 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 |
Участник
|
ошибок у вас очень много, чтоб их исправить смотрите примеры в самой аксапте.
скажу про одну, чтобы создать новую строку ее не нужно выбирать |
|
28.07.2011, 16:57 | #3 |
Участник
|
не надо вот это вызывать
X++: select forupdate _pLine; X++: _pLine = null;
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: niksen (1). |
28.07.2011, 17:04 | #4 |
Участник
|
чтобы узнать как создаются строки или заполняются те или иные поля в таблице, попробуйте создать ее через интерфейс, и пробегитесь дебагером по коду
|
|
|
За это сообщение автора поблагодарили: niksen (1). |
28.07.2011, 20:31 | #5 |
Участник
|
А еще есть простой способ получить рабочий код для вставки записи в таблицу - в паспорте записи по кнопке "Сценарий" система в буфер вставляет код, который можно прямо в джоб вставить (для инсертов, например, можно транзакцию и не открывать).
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: niksen (1). |
29.07.2011, 00:52 | #6 |
Аманд
|
А какими бизнес-требованиями вызвано программное создание заказа на покупку?
|
|
29.07.2011, 08:08 | #7 |
Участник
|
Ivanhoe
Спасибо, не знал об этом, всё галопом по европам и торопясь и побыстрее, что особо времени не было читать никаких умных книг, я туда только ради вопросов непонятных залезаю, но наверное такими темпами надо будет прочитать парочку от корки до корки и сделать много заданий для закрепления. Vals Требование простое - программный периодический перенос из одной системы в другую, т.к. начальству в некоторых смыслах нравится Dynamics AX больше других систем. Кстати, хорошие тренинги у Вас. ice Дебаггером я итак пробегаюсь всегда, даже если код работает, чтобы узнать возможные причины. А вот такую простую причину, как блокировка всей таблицы в результате select forupdate я забыл |
|
|
За это сообщение автора поблагодарили: Vals (1). |
29.07.2011, 08:37 | #8 |
Участник
|
Лучше стараться по-максимуму пользоваться стандартным API.
Изучите классы PurchAutoCreate* |
|
|
За это сообщение автора поблагодарили: niksen (1). |
29.07.2011, 08:49 | #9 |
Участник
|
jonny
PurchAutoCreare - это конечно хорошо, но записи нужно ещё и обновлять иногда. Для этого как ни крути, всё равно программно придётся создавать. Да и не для всех есть AutoCreate. Но в целом, согласен, спасибо, надо использовать |
|
29.07.2011, 09:14 | #10 |
Участник
|
Ну во всяком случае эти классы позволяют разобраться что к чему. К тому же можно создать наследника с нужной вам функциональностью.
|
|
29.07.2011, 09:16 | #11 |
Участник
|
jonny
наследники с нужной функциональностью - это конечно хорошо, но есть ли такие почти у каждой таблицы и формы? Как работать с этими классами? Например, ту же запись через PurchAutoCreate через job как создать? |
|
29.07.2011, 09:43 | #12 |
Участник
|
PurchAutoCreate - базовый класс, в функционале аксапты используются его наследники - например PurchAutoCreate_tmpPurchLine.
В случае с ним надо заполнить таблицу tmpPurchLine, подать ее на вход метода construct и вызвать метод create. Пример использования - в классе PurchCreateReleaseOrder. В вашем случае для задач интеграции можно создать наследника, который бы использовал не временную табличку, а читал бы данные из файла. Я к чему веду - никто конечно не обязывает вас использовать имеющиеся классы, я привел их для того чтобы вы могли изучить как правильно создавать заказы на покупку, по возможности по-максимуму используя имеющуюся функциональность. Я думаю преимущества такого подхода несомненны. |
|
29.07.2011, 09:58 | #13 |
Аманд
|
Цитата:
Требование простое - программный периодический перенос из одной системы в другую, т.к. начальству в некоторых смыслах нравится Dynamics AX больше других систем.
|
|
29.07.2011, 10:00 | #14 |
Участник
|
Vals
именно для планирования и была выбрана аксапта. Этого нет нигде в таких масштабах и настройках, да при такой цене |
|
29.07.2011, 10:14 | #15 |
Участник
|
У меня работает что то типа такого в 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(); Последний раз редактировалось someOne; 29.07.2011 в 10:17. Причина: Указал примечание для разных версий |
|
|
За это сообщение автора поблагодарили: gl00mie (5). |