17.05.2010, 11:28 | #1 |
Участник
|
Создание производственного заказа программно
Коллеги, есть задача по формированию производственного заказа автоматически по данным измерительных счетчиков.
В аксапте нужно сделать: 1. создать производственный Заказ 2. Перевести его в статус Начато 3. Создать Отгрузочную накладную С первым пунктом вроде справился. Примерно так: X++: qty = 20; _transDate = systemDateGet(); inventTable = InventTable::find("ItemID"); if (! inventTable.RecId) throw error(strfmt(InventTable::txtNotExist(),inventTable.ItemId)); if (! inventTable.inventItemType().canBeProduced()) throw error(strfmt("@SYS78161",inventTable.ItemType)); inventTableModuleInvent = InventTableModule::find(inventTable.ItemId,ModuleInventPurchSales::Invent); if (! inventTableModuleInvent.RecId) throw error(strfmt("@SYS5700",inventTable.ItemId,ModuleInventPurchSales::Invent)); if (inventTableModuleInvent.Blocked) throw error(strfmt("@SYS13295",inventTable.ItemId,ModuleInventPurchSales::Invent)); prodTable.initValue(); prodTable.initFromInventTable(inventTable); prodTable.ItemId = inventTable.ItemId; prodTable.QtySched = qty; prodTable.RemainInventPhysical = qty; prodTable.DlvDate = _transDate; prodTable.insert(); |
|
17.05.2010, 12:12 | #2 |
Участник
|
Обработкой производственных заказов занимаются класс ProdUpd и его наследники.
Для твоего случая это ProdUpdScheduling. |
|
17.05.2010, 12:43 | #3 |
MCTS
|
Привет!
1. Цитата:
создать производственный Заказ
- prodTable.SchedDate - prodTable.DlvDate - prodTable.BOMDate 2. Цитата:
Перевести его в статус Начато
Для Запуска конкретного произв заказа из кода уже есть все заточки. Создается экземпляр класс с помощью статического метода newProdId(), и потом делается ему run(). Примерно так: X++: ProdUpdStartUp::newProdId(prodTable.ProdId .........).run(); 3. Цитата:
Создать Отгрузочную накладную
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. Последний раз редактировалось e@gle; 17.05.2010 в 12:45. |
|
|
За это сообщение автора поблагодарили: ena_ax (1), Cardagant (1). |
17.05.2010, 14:07 | #4 |
Участник
|
Цитата:
На самом деле, можно поступить более изящно. В Аксе есть возможность настраивать перевод заказа в нужный статус в момент утверждения спланированного заказа. Это выполняется в методе createProdTable класса ReqTransPoMarkFirm. Там есть код: prodTable.autoUpdate(...) То есть можно сделать вызов с нужным статусом, а дальше все будет выполнено Аксой самостоятельно. |
|
|
За это сообщение автора поблагодарили: ena_ax (1). |
17.05.2010, 15:14 | #5 |
Участник
|
Цитата:
Сообщение от e@gle
Привет!
1. В вашем примере я бы еще добавил инициализацию переменных: - prodTable.SchedDate - prodTable.DlvDate - prodTable.BOMDate 2. Ни в коем случае не хочу обидеть Raven Melancholic, но он не прав. Запуск производственного заказа оcуществляется класс ProdUpdStartUp. Для Запуска конкретного произв заказа из кода уже есть все заточки. Создается экземпляр класс с помощью статического метода newProdId(), и потом делается ему run(). Примерно так: X++: ProdUpdStartUp::newProdId(prodTable.ProdId .........).run(); 3. Тут я бы Вам порекомендовал изучить механизм автоматического потребления. Есть такое дело в АХ. Может это как раз Ваш случай. Ну а если вы все-таки захотите создавать журналы вручную, то никаких проблем я не вижу. Создаете шапку журнала - ProdJournalTable, потом строки - ProdJournalBOM. Вроде никаких хитростей. По 2-му пункту я как раз и хочу, чтобы отработал весь стандартный функционал. Спасибо, буду смотреть как работает приведенный вами пример. 3-ий пункт привел в качестве завершенности задачи, как сделать журнал ОН представляю. Цитата:
Сообщение от Raven Melancholic
Посыпаю голову пеплом, действительно, указанный мной класс только спланирует.
На самом деле, можно поступить более изящно. В Аксе есть возможность настраивать перевод заказа в нужный статус в момент утверждения спланированного заказа. Это выполняется в методе createProdTable класса ReqTransPoMarkFirm. Там есть код: prodTable.autoUpdate(...) То есть можно сделать вызов с нужным статусом, а дальше все будет выполнено Аксой самостоятельно. Буду смотреть, изучать. |
|
19.05.2010, 09:44 | #6 |
Участник
|
Еще раз спасибо коллеги, все получилось.
Для информации: Второй вариант с использованием prodTable.autoUpdate(...) в итоге сводится к вызову ProdUpdStartUp::newProdId(prodTable.ProdId .........).run(); Так что эти решения идентичны. |
|
22.09.2011, 09:54 | #7 |
Участник
|
я добавил InventDimId, т.к. не хотел создавать запись без сайта, а с ним почему-то выдаёт ошибку "Код номенклатуры не может быть изменен, если уже созданы складские проводки.", я где-то что-то не учёл или забыл?
или же ошибка "Заказанное количество не может быть сокращено, так как недостаточно открытых складских проводок со статусом "Заказано"." при этом вроде номенклатура никуда не движется, никаких проводок вообще нет, все журналы пустые Последний раз редактировалось niksen; 22.09.2011 в 10:16. Причина: исправил неточность ошибки |
|
23.09.2011, 11:38 | #8 |
Участник
|
сам нашёл решение для данной ошибки: создаём экземпляр таблицы InventDim, прописываем то, что нам надо туда, используем метод findorcreate, затем прикручиваем данный InventDim к нашему ProdOrder. Таким образом, всё работает
|
|