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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.05.2012, 13:14   #1  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Обновление статуса производственного заказа программно
День добрый!
версия 2009
Есть желание создать небольшой job или даже целый класс, который проходился бы по всем заказам в ProdTable, и где статус выше "создано", но максимум "запланировано", сбрасывал его, затем сам же запускал планирование от сегодняшней даты.
Как я понимаю, сбросом статуса занимается класс ProdUpdStatusDecrease, а обновлением статуса до "запланировано" класс ProdUpdScheduling.
Но оба эти класса запускаются через формы и т.д. и требуют заполнения Query с нажатием кнопки ок. Вопрос, как это сделать программно?
я думаю, задача не нова и кто-нибудь её уже решал. Если ошибся где-нибудь, поправьте.

с уважением, Николай
Старый 03.05.2012, 13:21   #2  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,509 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Так вы же сами и написали решение
Сэмулировать Query с формы несложно, а дальше запускаете указанные классы

У меня аналогичная задача - удалённый запуск создания отгрузочной накладной - отняла совсем немного времени
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: RVS (1), niksen (1).
Старый 03.05.2012, 13:24   #3  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
ээээ, несложно, но что-то сколько не ищу, не могу найти, сколько не копаю...
или может быть воспользоваться prodtable.autoupdate() для обновления? но чем тогда сбрасывать? именно тем, что я написал? и вопрос, если честно, не в курсе, как сэмулировать, может быть есть другой способ?
как это лучше реализовывать? через пакетное задание?
Старый 03.05.2012, 13:32   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если цель перепланирования - сдвиг дат, то на сколько я понимаю статус можно не сбрасывать, а просто повторно перепланировать.

Вот нашёл у себя код:
X++:
    ProdParmScheduling  prodParmScheduling;
    ;

    prodParmScheduling.clear();
    prodParmScheduling.ParmBuffer::initParmId();
    prodParmScheduling.ProdId = _ProdId;
//    устанавливаем параметры перепланирования:
//    prodParmScheduling.SchedDirection = 
//    prodParmScheduling.SchedMethod =
//    prodParmScheduling.SchedDate =
//    ...
    prodParmScheduling.insert();

    ProdTable::find(_ProdId).status().runOperationScheduling(prodParmScheduling);

На всякий случай код, сбрасывающий статус:
X++:
    prodMultiStatusDecrease = new JmgProdMultiStatusDecrease();

    parmBuffer = prodMultiStatusDecrease.defaultParmBuffer();
    prodMultiStatusDecrease.initParmSFC();

    prodMultiStatusDecrease.insert(prodTable,parmBuffer);
    prodParmStatusDecrease = parmBuffer;
    prodParmStatusDecrease.WantedStatus = ProdStatus::Created;
    prodMultiStatusDecrease.run();

Последний раз редактировалось S.Kuskov; 03.05.2012 в 13:40.
За это сообщение автора поблагодарили: niksen (1).
Старый 03.05.2012, 13:33   #5  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,509 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Эм... давно я производством не занимался, конечно... но разве нельзя эту задачу решить инструментами сводного? вы же, по сути, пытаетесь делать динамическое перепланирование
__________________
С уважением,
Вячеслав
Старый 03.05.2012, 13:38   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от pitersky Посмотреть сообщение
Эм... давно я производством не занимался, конечно... но разве нельзя эту задачу решить инструментами сводного? вы же, по сути, пытаетесь делать динамическое перепланирование
Сводное максимум что нагенерит фьючерсов и действий. Уже утверждённые ПЗ оно не изменит.

Последний раз редактировалось S.Kuskov; 03.05.2012 в 13:47.
За это сообщение автора поблагодарили: pitersky (1).
Старый 03.05.2012, 16:41   #7  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
вот именно в этом всё и дело, в этом и состоит задача
т.к. удалять просто так производственные заказы никто не будет, они могут висеть запланированные, пока их никто не начал. А их нужно периодически перепланировать с учётом того, что сегодня уже другая дата. Перепланирование большого количества производственных заказов с утра перед началом работы может затянуть начало рабочего дня ближе к обеду а так вот ночью запускать это как пакетное задание и таким образом к началу рабочего дня уже всё есть
Старый 04.05.2012, 10:33   #8  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если цель перепланирования - сдвиг дат, то на сколько я понимаю статус можно не сбрасывать, а просто повторно перепланировать.

Вот нашёл у себя код:
X++:
    ProdParmScheduling  prodParmScheduling;
    ;

    prodParmScheduling.clear();
    prodParmScheduling.ParmBuffer::initParmId();
    prodParmScheduling.ProdId = _ProdId;
//    устанавливаем параметры перепланирования:
//    prodParmScheduling.SchedDirection = 
//    prodParmScheduling.SchedMethod =
//    prodParmScheduling.SchedDate =
//    ...
    prodParmScheduling.insert();

    ProdTable::find(_ProdId).status().runOperationScheduling(prodParmScheduling);

На всякий случай код, сбрасывающий статус:
X++:
    prodMultiStatusDecrease = new JmgProdMultiStatusDecrease();

    parmBuffer = prodMultiStatusDecrease.defaultParmBuffer();
    prodMultiStatusDecrease.initParmSFC();

    prodMultiStatusDecrease.insert(prodTable,parmBuffer);
    prodParmStatusDecrease = parmBuffer;
    prodParmStatusDecrease.WantedStatus = ProdStatus::Created;
    prodMultiStatusDecrease.run();
а что за тип данных parmBuffer?
Старый 04.05.2012, 10:37   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от niksen Посмотреть сообщение
а что за тип данных parmBuffer?
ProdParmStatusDecrease
Старый 04.05.2012, 11:56   #10  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
вот такой код у меня получился. Гуру, подскажите другой вариант остановки цикла
смысл в том, что есть заказы, которые зависят друг от друга, поэтому вот именно таким образом поступил. Может быть есть ещё что-нибудь?
У меня почему-то при первом прогоне статус становится "оценено", хотя требуемый "создано".
X++:
static void Job4(Args _args)
{

    JmgProdMultiStatusDecrease _prodMultiStatusDecrease = new JmgProdMultiStatusDecrease();
    ProdParmStatusDecrease  parmBuffer, prodParmStatusDecrease;
    ProdTable               ProdTable;
    prodId                  prodId;
    ;
    do
    {
    while select prodTable
        where (ProdTable.ProdStatus != ProdStatus::Created)
    {
    parmBuffer = null;
    _prodMultiStatusDecrease.reset();
    prodParmStatusDecrease = null;
    parmBuffer = _prodMultiStatusDecrease.defaultParmBuffer();
    _prodMultiStatusDecrease.initParmSFC();
    _prodMultiStatusDecrease.insert(prodTable,parmBuffer);
    prodParmStatusDecrease = parmBuffer;
    prodParmStatusDecrease.WantedStatus = ProdStatus::Created;
    _prodMultiStatusDecrease.run();
    }
    prodId = '1';
    select firstonly prodTable
        where (ProdTable.ProdStatus != ProdStatus::Created);
        {
            prodId = prodTable.ProdId;
        }
    }
    while (prodId!='');


}
Старый 04.05.2012, 12:02   #11  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
учите бест практис, без него никуда. Зачем do while? Еще, наверно, транзакцию влепить лучше.

Последний раз редактировалось Sada; 04.05.2012 в 12:14.
Старый 05.05.2012, 08:03   #12  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
do-while затем, что некоторые заказы не сбрасываются до желаемого статуса, а while select проходит по таблице prodTable только 1 раз и может выйти ситуация, когда остаются заказы с другими статусами. А как обойти это без ещё одного select с выборкой только по несброшенным - я пока не додумался.
Транзакцию конечно же влепить нужно это без вопросов и try-catch тоже
Старый 05.05.2012, 10:52   #13  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от niksen Посмотреть сообщение
while select проходит по таблице prodTable только 1 раз
????? значит у вас только один заказ, который не в статусе создано. По другому никак
Старый 05.05.2012, 10:54   #14  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
вот что получилось для перепланирования. Может кому понадобится.
Критикуйте
X++:
static void ProdStatusSched(Args _args)
{
    ProdParmScheduling  prodParmScheduling;
    ProdTable           prodTable;
    ;
    ttsbegin;
    while select ProdTable
        where ProdTable.ProdStatus != ProdStatus::Scheduled
    {
        prodParmScheduling.clear();
        prodParmScheduling.ParmBuffer::initParmId();
        prodParmScheduling.ProdId = ProdTable.ProdId;
//    устанавливаем параметры перепланирования:
        prodParmScheduling.SchedDirection = ProdSchedDirection::ForwardFromToday;
        prodParmScheduling.SchedMethod = ProdSchedMethod::OperationScheduling;
        prodParmScheduling.SchedDate = str2date('24/05/2012',123);
        prodParmScheduling.SchedTime = str2time('15:55');
        prodParmScheduling.CapLimited = NoYes::Yes;
        prodParmScheduling.MatLimited = NoYes::Yes;
        prodParmScheduling.SyncRef = NoYes::Yes;
        prodParmScheduling.SchedRef = NoYes::Yes;
        prodParmScheduling.CancelProcessTime = NoYes::No;
        prodParmScheduling.CancelSetupTime = NoYes::No;
        prodParmScheduling.CancelQueueTime = NoYes::No;
        prodParmScheduling.CancelTransportTime = NoYes::No;
        prodParmScheduling.CancelOverlap = NoYes::No;
        prodParmScheduling.JobStatus = ParmJobStatus::Executed;
        prodParmScheduling.AutoUpdate = NoYes::Yes;

        prodParmScheduling.insert();

        ProdTable::find(ProdTable.ProdId).status().runJobScheduling(prodParmScheduling);

    }
    ttscommit;

}
Старый 05.05.2012, 10:58   #15  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Цитата:
Сообщение от Sada Посмотреть сообщение
????? значит у вас только один заказ, который не в статусе создано. По другому никак
неа, проходит по всем заказам со статусом выше "создано", и нагло оставляет статус "оценено" некоторым.
Старый 05.05.2012, 11:05   #16  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
X++:
static void ProdStatusSched(Args _args)
{
    ProdParmScheduling  prodParmScheduling;
    ProdTable           prodTable;
    ;
    ttsbegin;
    while select prodTable
        where prodTable.ProdStatus != ProdStatus::Scheduled
    {
        prodParmScheduling.clear();
        prodParmScheduling.ParmBuffer::initParmId();
        prodParmScheduling.ProdId           = ProdTable.ProdId;
        prodParmScheduling.SchedDirection   = ProdSchedDirection::ForwardFromToday;
        prodParmScheduling.SchedMethod      = ProdSchedMethod::OperationScheduling;
        prodParmScheduling.SchedDate        = str2date('24/05/2012',123);
        prodParmScheduling.SchedTime        = str2time('15:55');
        prodParmScheduling.CapLimited       = NoYes::Yes;
        prodParmScheduling.MatLimited       = NoYes::Yes;
        prodParmScheduling.SyncRef          = NoYes::Yes;
        prodParmScheduling.SchedRef         = NoYes::Yes;
        prodParmScheduling.JobStatus        = ParmJobStatus::Executed;
        prodParmScheduling.AutoUpdate       = NoYes::Yes;
        prodParmScheduling.insert();

        prodTable.status().runJobScheduling(prodParmScheduling);

    }
    ttscommit;
}
так красивше
За это сообщение автора поблагодарили: niksen (1).
Старый 10.05.2012, 15:54   #17  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Sada, и правда красивше и понятнее. Дело в другом, правильно ли я использую тот приём с выборкой, чтобы узнать, пустая ли она? Может его как-нибудь заменить, а то совсем уж некрасиво выглядит...
Старый 10.05.2012, 17:30   #18  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Не понял...
Старый 10.05.2012, 17:51   #19  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
X++:
prodId = '1';
    select firstonly prodTable
        where (ProdTable.ProdStatus != ProdStatus::Created);
        {
            prodId = prodTable.ProdId;
        }
    }
    while (prodId!='');
вот этот кусок
можно ли его как-нибудь заменить?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание производственного заказа программно ena_ax DAX: Программирование 7 23.09.2011 11:38
Множественная калькуляция производственного заказа DYPotapchenko DAX: Функционал 15 11.03.2011 12:41
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02
Производство: проблема при обработке производственного заказа Asp DAX: Функционал 2 15.04.2004 15:48
Ошибка при сбросе статуса Производственного заказа LTA DAX: Функционал 2 29.01.2003 12:23

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

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

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