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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.02.2005, 11:44   #25  
slava09_imported is offline
slava09_imported
Участник
 
67 / 10 (1) +
Регистрация: 01.06.2004
Отвечаю где у меня вызывается createErrorAdjustment. Вот весь метод:

<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]protected[/color] [color=:blue]void[/color] updateReceiptAdjustmentTrans(
   InventTrans   _receipt,
   CostAmount    _adjustmentLater
   )
{
   InventSettlement        settlementReceipt;
   InventSettlement        settlementIssue;

   InventTrans             issue;

   CostAmount              allocateValue;
   InventQty               allocateQty;

   CostAmount              settleValue;
   CostAmount              settleValueDec;

   CostAmount              adjustment;
   CostAmount              errorAmount;

 ;

   [color=:blue]if[/color] (this.inventModelGroup(inventCostList.ItemId).standardCost)
   {
       adjustment = Currency::amount(_receipt.costAmountStd) - Currency::amount(_receipt.costValue());
       [color=:blue]if[/color] (adjustment != 0)
           _receipt.updateStdCostAdjust(adjustment,inventClosing.transDate,inventClosing.voucher,_receipt.dimensionF
inancial());
   }

   [color=:blue]if[/color] (_receipt.qty != 0 && _receipt.qtySettled > 0)
   {
       adjustment      = Currency::amount((_receipt.costValue() - _adjustmentLater) / _receipt.qty * _receipt.qtySettled - _receipt.costAmountSettled);

       [color=:blue]if[/color] (adjustment && abs(adjustment) < inventClosing.MinTransferValue)
       {
           this.createErrorAdjustment(_receipt,-adjustment);
           adjustment  = 0;
       }

       allocateQty     = _receipt.qtySettled;
       allocateValue   = adjustment;

       [color=:blue]if[/color] (allocateValue != 0)
       {
           [color=:blue]while[/color] [color=:blue]select[/color] forcePlaceholders [color=:blue]forceSelectOrder[/color] [color=:blue]forceNestedloop[/color] [color=:blue]forupdate[/color]
               #settlementFieldList [color=:blue]from[/color] settlementReceipt
               [color=:blue]index[/color] hint RecIdTypeIdx
               [color=:blue]where[/color] settlementReceipt.transRecId             [color=:blue]==[/color] _receipt.recId            &&
                     settlementReceipt.settleType             [color=:blue]==[/color] InventSettleType::Receipt &&
                     settlementReceipt.inventTransId          [color=:blue]==[/color] _receipt.inventTransId    &&
                     settlementReceipt.InventTransCurrency_RU [color=:blue]==[/color] inventTransCurrency       &&
                     settlementReceipt.cancelled       [color=:blue]==[/color] 0                                &&
                     settlementReceipt.qtySettled      >  0
           join [color=:blue]forupdate[/color] [color=:blue]firstOnly[/color]
               #settlementFieldList [color=:blue]from[/color] settlementIssue
               [color=:blue]index[/color] hint TransactionIdx
               [color=:blue]where[/color] settlementIssue.settleTransId     [color=:blue]==[/color] settlementReceipt.settleTransId  &&
                     settlementIssue.settleType        [color=:blue]==[/color] InventSettleType::Issue          &&
                     settlementReceipt.InventTransCurrency_RU [color=:blue]==[/color] inventTransCurrency       &&
                     settlementIssue.cancelled         [color=:blue]==[/color] 0                                &&
                     settlementIssue.QtySettled        <  0
           {
               settleValueDec  = settlementReceipt.qtySettled * adjustment / _receipt.qtySettled;
               settleValue     = Currency::amount(settleValueDec);

               [color=:blue]if[/color] (abs(settleValueDec) < abs(settleValue))
                   settleValue += (settleValueDec > 0 [color=:blue]?[/color] -roundOffUnit : roundOffUnit);

               settleValue     = abs(settleValue) > abs(allocateValue) [color=:blue]?[/color] allocateValue: settleValue;

               allocateQty         -= settlementReceipt.qtySettled;
               allocateValue       -= settleValue;

               [color=:blue]if[/color] (settleValue != 0)
               {
                   [color=:blue]if[/color] (mapInventTrans && mapInventTrans.[color=:blue]exists[/color](settlementIssue.TransRecId))
                      issue = mapInventTrans.lookup(settlementIssue.TransRecId);
                   [color=:blue]else[/color]
                      issue = settlementIssue.inventTrans([color=:blue]true[/color]);

                   [color=:blue]if[/color] (! issue.recId)
                   {
                       this.createErrorAdjustment(_receipt,-settleValue);
                   }
                   [color=:blue]else[/color]
                   {
                       [color=:blue]if[/color] (issue.costValue() - settleValue > 0)
                       {
                           errorAmount = issue.costValue() - settleValue;
                           this.createErrorAdjustment(_receipt,errorAmount);
                           settleValue -= errorAmount;
                       }

                       _receipt.costAmountSettled             += settleValue;

                       issue.costAmountSettled                -= settleValue;
                       issue.costAmountAdjustment             -= settleValue;

                       this.updateInventTrans(issue);

                       [color=:blue]if[/color] (settlementReceipt.transDate [color=:blue]==[/color] inventClosing.transDate &&
                           settlementReceipt.voucher   [color=:blue]==[/color] inventClosing.voucher)
                       {
                           settlementReceipt.costAmountSettled    += settleValue;
                           settlementReceipt.update();

                           settlementIssue.costAmountSettled      -= settleValue;
                           settlementIssue.costAmountAdjustment   -= settleValue;
                           settlementIssue.update();
                       }
                       [color=:blue]else[/color]
                       {
                           this.updateSettlementReceipt(settlementReceipt,settleValue);
                           this.updateSettlementIssue(settlementIssue,settleValue);
                       }
                       this.updateTrans(issue,-settleValue);
                   }
               }

               [color=:blue]if[/color] (allocateQty [color=:blue]==[/color] 0)
               {
                   [color=:blue]break[/color];
               }
           }

           this.updateInventTrans(_receipt);

           [color=:blue]if[/color] (allocateValue != 0)
               this.createErrorAdjustment(_receipt,-allocateValue);
       }
   } [color=:blue]return[/color];
}</div>

Так вот, в мною приведенном примере (см. приложение) в строчке:
<div class='XPPtop'>X++</div><div class='XPP'>
   adjustment      = Currency::amount((_receipt.costValue() - _adjustmentLater) / _receipt.qty * _receipt.qtySettled - _receipt.costAmountSettled);</div>
расчитывается то самое:
(1009,33/101)*39 - 389,7=0,04
и если вы заметили, то перестановка скобок (то что вы советовали), недает здесь эффекта.
Потом процедура заходит в цикл и начинает вычислять ошибку по каждому сопоставлению:
<div class='XPPtop'>X++</div><div class='XPP'>                settleValueDec  = settlementReceipt.qtySettled * adjustment / _receipt.qtySettled;
               settleValue     = Currency::amount(settleValueDec);</div>
а так как ошибка каждый раз меньше 0.005
то в этом куске:
<div class='XPPtop'>X++</div><div class='XPP'>
               allocateQty         -= settlementReceipt.qtySettled;
               allocateValue       -= settleValue;</div>

переменная allocateValue уменьшается каждый раз на 0. Т.е. учитываю что:
<div class='XPPtop'>X++</div><div class='XPP'>
       allocateValue   = adjustment;</div>
она остается равной 0,04. Затем, при выходе из цикла мы видим последник строчки:
<div class='XPPtop'>X++</div><div class='XPP'>
           [color=:blue]if[/color] (allocateValue != 0)
               this.createErrorAdjustment(_receipt,-allocateValue);</div>
таким вот образом этот метод и делает корректировку прихода на 0,04 копейки!!!

Появилась мысль: после закрытия склада, расщеплять проводки прихода, таким образом чтобы в новой проводке получившейся количество было равно сопоставленному количеству, а сумма равнялась сопоставленной сумме! Естественно что в другой проводке от соответствующих количеств и сумм, отнимать суммы и количества новой. Ну, чтобы общие суммы оставались правильными. Ну вобщем вы поняли, для того чтобы получилась одна закрытая проводка и одна открытая, и естественно в закрытой выставим ValueOpen=0 и дату закрытия Голова кипит.
Как вы смотрите на такую идею?
 


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

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

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