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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.11.2010, 11:00   #1  
AxTimur is offline
AxTimur
Участник
 
21 / 11 (1) +
Регистрация: 08.08.2008
Как правильно поставить маркировку или снять ее?
Вы извините но облазил форум и не могу найти. ( Как программно поставить маркировку по заказу и снять ее.

PS
Axapta 3.0 sp1
Заранее благодарен!
Старый 17.11.2010, 11:23   #2  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,506 / 428 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Вообще-то маркировку делают по складской проводке, сопоставляя её с другой проводкой. Вам это нужно, или вы про что-то другое говорите?
__________________
С уважением,
Вячеслав
Старый 17.11.2010, 11:54   #3  
AxTimur is offline
AxTimur
Участник
 
21 / 11 (1) +
Регистрация: 08.08.2008
Вот код который я нашел ) Но я не знаю насколько он правильный т.е. он работает снимает маркировку к примеру и ставить знаю что ее можно подкорректировать под свои нужды. Мне просто интересно есть ли более простой способ ?
X++:
InventTrans         _InventTrans;
    InventTrans          InventTrans;
    InventDim           _InventDim;
    InventDim           InventDim;
    SalesLine          _SalesLine;
    Container   con;
    InventQty   qty , qty2;
    Container   res;
    Map                     recMAp = new MAp(Types::Integer, Types::Record);
    Map                     recMAp2 = new MAp(Types::String, Types::Container);
    TmpInventTransMark      tmp;

    MapIterator mti, mti2;
    Map         mapMarkNow = new map(types::Integer,types::Record);
    Str                     mapKey ;
    str mapKey(
    InventTrans invTrans,
    InventDim   invDim
    )
    {
        return invDim.mapKey()+'#'+enum2Str(invTrans.Direction);
    }

    ;
  While Select _SalesLine
        where _SalesLine.SalesId == 'КЛ10-0111435'
    {

        while select ItemId, TransType, TransRefId, InventTransId, Direction, inventDimId,   sum(qty), sum(qtySettled)  from _InventTrans
            group by ItemId, TransType, TransRefId, InventTransId, Direction, inventDimId
           where _InventTrans.InventTransId == _SalesLine.InventTransId
                  && _InventTrans.ValueOpen ==  inventTransOpen::Yes
                  && _InventTrans.TransChildType == InventTransChildType::None
                  && _InventTrans.PackingSlipReturned == noYes::No

            join // maxof(RecId) from
            _InventDim
            Where _InventDim.inventDimId == _InventTrans.inventDimId

               {
                   res = inventTrans::packTmpMark(_inventTrans.ItemId,_inventDim,_inventTrans.InventTransId,_inventTrans.Qty);
                   recMAp2.insert(mapKey, conpeek(res, 1));

               }
                    if(recMAp2 && recMAp2.elements()> 0 )
                    {
                        mti = new MapIterator(recMAp2);
                        mti.begin();
                        while (mti.more())
                        {
                            recMAp = map::create(recMAp2.lookup(mti.key()));
                            mti.next();
                        }
                     }

                        mti = new MapIterator(recMAp);
                        mti.begin();
                        while (mti.more())
                        {
                           tmp.data( recMAp.lookup(mti.key()));
                           tmp.insert();
                           mti.next();
                        }
ttsbegin;
  while select forupdate tmp
  where (tmp.TransType == InventTransType::Purch
        ||  tmp.TransType == InventTransType::InventTransfer)
        && tmp.StatusReceipt == StatusReceipt::Ordered
        && tmp.InventDimId == _SalesLine.InventDimId
      {
        Info(strfmt("%1 %2 %3",_SalesLine.ItemId,tmp.InventTransId,tmp.Qty));

        if (tmp.QtyMarked)
        {
            qty = -tmp.QtyMarked;
            qty2 = tmp.QtyMarked;
        }
         else
            {
            qty  = _SalesLine.SalesQty;
               qty2 = -_SalesLine.SalesQty;
            }

        tmp.qtyMarkNow = qty;
        tmp.update();

        mapMarkNow.insert(tmp.RecId, tmp);

        inventTrans.Qty              = qty;
      //  inventTrans.costAmountPosted = Qty;

        inventTrans.TransType        =  InventTransType::Sales;
        inventTrans.TransRefId       =  tmp.TransRefId;
        inventTrans.InventTransId    = _SalesLine.InventTransId;
        inventTrans.ItemId           = _SalesLine.ItemId;
//+ снять
//- установить
        if(qty < 0)
        inventTrans::updateTmpMark(inventTrans.InventTransId, inventDim, qty ,mapMarkNow.pack());
        else
        inventTrans::updateTmpMark(inventTrans.InventTransId, inventDim, -qty ,mapMarkNow.pack());

        //Pause;
      }
ttscommit;
delete_from tmp;
Старый 17.11.2010, 12:02   #4  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,506 / 428 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Если вы знаете маркируемый лот InventTransId и маркирующий InventRefTransId, то можно просто использовать
X++:
InventTrans::updateMarking(InventTransId, InventRefTransId, Qty)
Количество берите как минимум из двух проводок со знаком проводки по InventTransId. На выходе получите маркировку лотов и смаркированное количество.
Разумеется, оба лота должны быть несмаркированными ранее
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: Logger (1), raniel (1).
Старый 17.11.2010, 12:10   #5  
AxTimur is offline
AxTimur
Участник
 
21 / 11 (1) +
Регистрация: 08.08.2008
Спасибо значит мои догадки оправданы )
Старый 04.12.2010, 23:34   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от pitersky Посмотреть сообщение
Если вы знаете маркируемый лот InventTransId и маркирующий InventRefTransId, то можно просто использовать
X++:
InventTrans::updateMarking(InventTransId, InventRefTransId, Qty)
Количество берите как минимум из двух проводок со знаком проводки по InventTransId. На выходе получите маркировку лотов и смаркированное количество.
Разумеется, оба лота должны быть несмаркированными ранее
Не совсем так.
Предложенный вами способ пропишет ссылку на лот только в одной из проводок, а надо в обе.
Тогда уж лучше сделать как тут :
\Classes\InventUpd_Estimated\updateReservation
X++:
markNow = InventTrans::updateMarking(movement.inventRefTransId(), movement.transId(), -reservQty);
InventTrans::updateMarking(movement.transId(), movement.inventRefTransId(), markNow);
Тогда обе проводки промаркируются и будут "смотреть" друг на друга. Но если совсем строго все писать то и этот способ не годится. Если в лоте проводки расщеплены на несколько, то при таком подходе неверно могут пары подобраться.
За это сообщение автора поблагодарили: raniel (1).
Теги
маркировка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно создать в коде X++ новый planned order (ReqPO, ReqTrans) rkorchagin DAX: Программирование 5 02.06.2016 18:00
Снять задание сервера пакетной обработки fomenka DAX: Программирование 9 24.04.2007 14:33
aEremenko: Как правильно подобрать оборудование и понять, сколько оно будет стоить? Blog bot DAX Blogs 0 17.04.2007 12:00
Как правильно обращаться к элементам формы созданнй динамически из АОТ? 3oppo DAX: Программирование 2 29.11.2006 09:57
Как правильно програмно снять резерв? Hamster DAX: Программирование 2 05.04.2005 12:42

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

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

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