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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.05.2010, 11:28   #1  
ena_ax is offline
ena_ax
Участник
 
254 / 46 (2) +++
Регистрация: 06.12.2006
Создание производственного заказа программно
Коллеги, есть задача по формированию производственного заказа автоматически по данным измерительных счетчиков.

В аксапте нужно сделать:
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  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Обработкой производственных заказов занимаются класс ProdUpd и его наследники.
Для твоего случая это ProdUpdScheduling.
Старый 17.05.2010, 12:43   #3  
e@gle is offline
e@gle
MCTS
MCBMSS
 
164 / 72 (3) ++++
Регистрация: 11.04.2005
Адрес: Минск
Привет!
1.
Цитата:
создать производственный Заказ
В вашем примере я бы еще добавил инициализацию переменных:
- prodTable.SchedDate
- prodTable.DlvDate
- prodTable.BOMDate

2.
Цитата:
Перевести его в статус Начато
Ни в коем случае не хочу обидеть Raven Melancholic, но он не прав. Запуск производственного заказа оcуществляется класс ProdUpdStartUp.
Для Запуска конкретного произв заказа из кода уже есть все заточки. Создается экземпляр класс с помощью статического метода newProdId(), и потом делается ему run(). Примерно так:
X++:
ProdUpdStartUp::newProdId(prodTable.ProdId .........).run();
Внимание! Запуская эту функцию надо четко понимать, что Ваш свежесозданный производственный заказ сначала будет оценен, потом спланирован (это автоматически), а уже только потом начат. А параметры оценки и планирования возьмутся из настроек этих функций и из настроек модуля. Так что внимательно все настройте.
3.
Цитата:
Создать Отгрузочную накладную
Тут я бы Вам порекомендовал изучить механизм автоматического потребления. Есть такое дело в АХ. Может это как раз Ваш случай. Ну а если вы все-таки захотите создавать журналы вручную, то никаких проблем я не вижу. Создаете шапку журнала - ProdJournalTable, потом строки - ProdJournalBOM. Вроде никаких хитростей.
__________________
С уважением, Павел Цераниди.
На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага.

Последний раз редактировалось e@gle; 17.05.2010 в 12:45.
За это сообщение автора поблагодарили: ena_ax (1), Cardagant (1).
Старый 17.05.2010, 14:07   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от e@gle Посмотреть сообщение
Ни в коем случае не хочу обидеть Raven Melancholic, но он не прав. Запуск производственного заказа оcуществляется класс ProdUpdStartUp.
Посыпаю голову пеплом, действительно, указанный мной класс только спланирует.
На самом деле, можно поступить более изящно. В Аксе есть возможность настраивать перевод заказа в нужный статус в момент утверждения спланированного заказа. Это выполняется в методе createProdTable класса ReqTransPoMarkFirm. Там есть код:
prodTable.autoUpdate(...)
То есть можно сделать вызов с нужным статусом, а дальше все будет выполнено Аксой самостоятельно.
За это сообщение автора поблагодарили: ena_ax (1).
Старый 17.05.2010, 15:14   #5  
ena_ax is offline
ena_ax
Участник
 
254 / 46 (2) +++
Регистрация: 06.12.2006
Цитата:
Сообщение от 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. Вроде никаких хитростей.
По 1-му пункту согласен, просто не стал в своем примере указывать эти строки.

По 2-му пункту я как раз и хочу, чтобы отработал весь стандартный функционал.
Спасибо, буду смотреть как работает приведенный вами пример.

3-ий пункт привел в качестве завершенности задачи, как сделать журнал ОН представляю.

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Посыпаю голову пеплом, действительно, указанный мной класс только спланирует.
На самом деле, можно поступить более изящно. В Аксе есть возможность настраивать перевод заказа в нужный статус в момент утверждения спланированного заказа. Это выполняется в методе createProdTable класса ReqTransPoMarkFirm. Там есть код:
prodTable.autoUpdate(...)
То есть можно сделать вызов с нужным статусом, а дальше все будет выполнено Аксой самостоятельно.
Действительно изящно, я как раз искал нечто подобное.
Буду смотреть, изучать.
Старый 19.05.2010, 09:44   #6  
ena_ax is offline
ena_ax
Участник
 
254 / 46 (2) +++
Регистрация: 06.12.2006
Еще раз спасибо коллеги, все получилось.

Для информации:
Второй вариант с использованием prodTable.autoUpdate(...)
в итоге сводится к вызову ProdUpdStartUp::newProdId(prodTable.ProdId .........).run();

Так что эти решения идентичны.
Старый 22.09.2011, 09:54   #7  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
я добавил InventDimId, т.к. не хотел создавать запись без сайта, а с ним почему-то выдаёт ошибку "Код номенклатуры не может быть изменен, если уже созданы складские проводки.", я где-то что-то не учёл или забыл?
или же ошибка "Заказанное количество не может быть сокращено, так как недостаточно открытых складских проводок со статусом "Заказано"."
при этом вроде номенклатура никуда не движется, никаких проводок вообще нет, все журналы пустые

Последний раз редактировалось niksen; 22.09.2011 в 10:16. Причина: исправил неточность ошибки
Старый 23.09.2011, 11:38   #8  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
сам нашёл решение для данной ошибки: создаём экземпляр таблицы InventDim, прописываем то, что нам надо туда, используем метод findorcreate, затем прикручиваем данный InventDim к нашему ProdOrder. Таким образом, всё работает
Теги
производственный заказ, создание из кода

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание строк заказа murad DAX: Программирование 2 30.05.2006 19:01
Тип производственного заказа Anais DAX: Функционал 17 26.05.2005 13:50
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02
Производство: проблема при обработке производственного заказа Asp DAX: Функционал 2 15.04.2004 15:48
программное создание строк заказа renat DAX: Программирование 6 22.07.2003 05:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:52.