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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.03.2005, 23:22   #1  
dr.forex is offline
dr.forex
Участник
 
7 / 10 (1) +
Регистрация: 06.10.2004
Уважаемые господа,

Имеем: AX 3.0 SP3, авторезервирование, резервирование в закупках, нет отрицательных складов.

Ситуация 1. При создании записи в salesLine с указанием значения складской аналитики (первичной), при попытке зарезервировать этот лот появляется совершенно справедливое извещение о невозможности зарезервировать количество с такой складской аналитикой. Действительно, нет в наличии и в закупках такого количества с такой аналитикой.

Ситуация 2. При создании записи в salesLine с указанием другого значения складской аналитики (первичной), с которым есть достаточное количество, успешно осуществляется резервирование, например в закупке. В salesTrans этот лот со статусом «зарезервировано».
После этого: Меняем значение складской аналитики для этой существующей записи в salesLine на значение из ситуации 1 (того, чего нет ни в наличии, ни в закупке). При этом НЕ ПОЯВЛЯЕТСЯ извещение о невозможности зарезервировать количество с такой складской аналитикой. А в salesTrans лот меняет статус на «в заказе» с соответствующим изменением inventDimId.

Вопрос:
Как заставить систему работать «неправильно», т.е. при изменении значения аналитики в ситуации 2 не смотреть отличия между двумя лотами по количеству, а повторить путь из ситуации 1, как будто лот в salesTrans только создается?
К сожалению ответ на этот вопрос мне нужен быстрее, чем я докапаю inventUpdate и Ко.

Если вы решали такую задачу для себя, подскажите короткий путь, пожалуйста!

Спасибо.
Старый 16.03.2005, 14:00   #2  
Zan is offline
Zan
Участник
 
104 / 25 (1) +++
Регистрация: 22.07.2004
Адрес: I live in Moscow
При создании строки в SalesLine в методе таблицы createLine вызывается метод checkReservation().

<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]server[/color] [color=:blue]void[/color]  createLine(boolean         validation              = [color=:blue]false[/color],
                       boolean         initFromSalesOrderTable = [color=:blue]false[/color],
                       boolean         initFromInventTable     = [color=:blue]false[/color],
                       boolean         calcInventQty           = [color=:blue]false[/color],
                       boolean         searchMarkup            = [color=:blue]true[/color],
                       boolean         searchPrice             = [color=:blue]false[/color],
                       boolean         checkReservation        = [color=:blue]false[/color],
                       InventTransId   oldInventTransId        = [color=:red]''[/color])
{
  .....
   [color=:blue]if[/color] (checkReservation)
       this.checkReservation(); [color=:green]// Message to infolog
[/color]   ....
}</div>

При обновлении строки данный метод в штатном функионале не вызывается.
(К сожалению )) )

Предлагаю следующее решение проблемы.
Подкрутить метод update() на таблице SalesLine()

<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]public[/color] [color=:blue]void[/color]  update(boolean  dropInvent  = [color=:blue]false[/color],
                          Common   childBuffer = NULL)
{
   SalesLineType  salesLineType;
  ;

   [color=:green]// ZAN, message for infolog about reservation -->
[/color]    [color=:blue]if[/color](this.salesTable().Reservation [color=:blue]==[/color] ItemReservation::Automatic)
      this.checkReservation();
   [color=:green]// ZAN, message for infolog about reservation <--
[/color]
   salesLineType = this.type();
   salesLineType.update(dropInvent, childBuffer);
}</div>

Ломать классы InventUpdate и Ко не считаю необходимым в данной ситуации.

...................
Старый 16.03.2005, 15:35   #3  
dr.forex is offline
dr.forex
Участник
 
7 / 10 (1) +
Регистрация: 06.10.2004
Zan
Спасибо,
я наверное не совсем корректно выразился.

createLine вызывается, как я понял, при создании строк при помощи Функции/Создание строк и действительно появляется инфолог.
Я же хотел добится появления не инфолога, а формы из InventMovement.setAutoReserving:

<div class='XPPtop'>X++</div><div class='XPP'>
   [color=:blue]if[/color] (movement.inventTable().inventItemType().mustInventBeControlled())
   {
       movement_Orig = InventMovement::construct(buffer.orig());
       [color=:blue]if[/color] (movement.transQty() != movement_Orig.transQty())
       {
           reserveNow = movement.autoReserveQty(movement_Orig);

           [color=:blue]if[/color] (reserveNow > 0)
           {
               inventOnhand    = InventOnhand::newEstimatedUpdate(movement,movement.inventdim(),[color=:blue]false[/color]);

               [color=:blue]if[/color] (reserveNow > inventOnhand.availReservation(InventParameters::find().reserveOnOrdered))
               {
                   args = [color=:blue]new[/color] Args();
                   args.name([color=:blue]formstr[/color](InventOnhandCheckReserve));
                   args.caller();
                   args.record(buffer);

                   formRun = classFactory.formRunClass(args);
                   formRun.init();
                   formRun.run();
                   formRun.wait();
                   [color=:blue]return[/color] formRun.closedOk();
               }
           }
       }
   }</div>

А вот ее то мне и не заставить проявляться, она кажет себя только при создании строки посредством Ctrl-N.

Ваше решение может пригодится в будущем, спасибо.
Старый 16.03.2005, 16:55   #4  
Zan is offline
Zan
Участник
 
104 / 25 (1) +++
Регистрация: 22.07.2004
Адрес: I live in Moscow
При желании можно заставить ее появляться, но программировать придется немного побольше.

1. В Classdeclaration формы SalesTable объявляем булевую переменную.
<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]class[/color]       FormRun  [color=:blue]extends[/color]     ObjectRun
{

   .....
   boolean                         inventLocationIdUpdate;
   ....
}</div>
2. Вносим изменения в метод modify поля InventLocationId датасурса InventDIm
<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]public[/color] [color=:blue]void[/color] modified()
{
 

   [color=:blue]super[/color]();

   [color=:green]// ZAN, for open form -->
[/color]    inventLocationIdUpdate = [color=:blue]true[/color];
   [color=:green]// ZAN, for open form <--
[/color]
   salesLine.modifyItemDim(inventDim,[color=:blue]fieldNum[/color](InventDim,inventLocationId),inventTable::find(salesLine.ItemId).DimGroupId);
}</div>
3. Вносим изменения в метод setAuotoreservation класса InventMovement
<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]Client[/color] [color=:blue]static[/color] boolean  setAutoReserving(Common  buffer,
                                       [color=:green]// ZAN, for open form -->
[/color]                                        boolean _inventLocationIdUpdate = [color=:blue]false[/color])
                                       [color=:green]// ZAN, for open form <--
[/color]{
   ........

       [color=:blue]if[/color] ((movement.transQty() != movement_Orig.transQty()) [color=:blue]||[/color]
           [color=:green]// ZAN, for open form -->
[/color]            _inventLocationIdUpdate)
           [color=:green]// ZAN, for open form <--
[/color]        {
   ......
}</div>
4. Вносим изменения в метод ValidateWrite() датaсурса SalesLine
<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]public[/color] boolean validateWrite()
{
   ......
   ret = ret && InventMovement::setAutoReserving(salesLine,
                                                 [color=:green]// ZAN, for open form -->
[/color]                                                  inventLocationIdUpdate);
                                                 [color=:green]// ZAN, for open form <--
[/color]
   [color=:green]// ZAN, for open form -->
[/color]    inventLocationIdUpdate = [color=:blue]false[/color];
   [color=:green]// ZAN, for open form <--
[/color]     .....
}</div>


В таком исполнении работает, но как видете програмировать пришлось немного побольше ))
Старый 16.03.2005, 23:00   #5  
dr.forex is offline
dr.forex
Участник
 
7 / 10 (1) +
Регистрация: 06.10.2004
Уважаемый Zan ,

Выражаю Вам свою искреннюю благодарность и "респект++"
за Ваше участие и помощь.

Рад, что мысли мои двигались в правильном направлении.

То, что вы эффектно сделали успешно работает со штатными складскими аналитиками, по крайней мере с InventLocationId.

Это то, что мне было нужно!

Теперь мне осталось понять, что я упустил при изготовлении самодельной складской аналитики. Почему так не работает в ситуации 2 (при работающей ситуации 1) с моей складской аналитикой.

Еще раз огромное спасибо и успехов в творчестве.
 


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

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

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