|  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). | |